fleetio_spark 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67f07700047f06622497d3f06747b92f5e016bf2bc9eb14c3065aa2e5cb09331
4
- data.tar.gz: 9fa1845b45a4591c8eb4375e20da9c66c0b6fae199cade5963a8533f13ba7570
3
+ metadata.gz: 17e5c914f6444600d7a70373789ed70d5c7b432016697f7698059fa909c2411c
4
+ data.tar.gz: c91c2bf65ff12f507f46ce68137a3bf6809837bfcdcf3deeb5e01b8f6ae24311
5
5
  SHA512:
6
- metadata.gz: 1c616c4a9f0b823e85c8bed20a79a2b11d82dd7df31f50f4c2b89c4cfa996f7623647d552e583116d1c8d9ff2a0fc2af5434052f0a67a1b15c519b21f0b245f0
7
- data.tar.gz: 1116a8d82b0bd67ae6334282774d9879696629447a450c0334f2778c252115948ff4638d7c432917e571a3a2c5df57440e2b3243f385a4351442fadfcba0a2ae
6
+ metadata.gz: 578bc9df6505bc905b012fc078be9986df928ce1b950d185329b206a57adfc7b181c634fd893266346329f83782f73972e956f875fd34721529ce9dbafee9101
7
+ data.tar.gz: 6258a8f2a650a18f3679adeb995da7f50cf87b1fea6fb04541ea8b2c3b42ffeb2b17ae47c6d2286ab3fed347d393b26f33a4cb0ba5b0fa4495a2b0eeba5eacf6
@@ -16,42 +16,38 @@ var Stack = {
16
16
 
17
17
  var stack = {
18
18
  root: root,
19
- current: 0,
20
19
  panels: [],
21
20
  focus: [],
21
+ current: null,
22
22
 
23
23
  add: function ( panelEl, name ) {
24
24
  panelEl.dataset.stackIndex = stack.panels.length
25
25
 
26
- // Hide all panels but the first panel
27
- if ( stack.panels.length == 0 ) {
28
- showEl( panelEl )
29
- } else {
30
- hideEl( panelEl )
31
- }
26
+ hideEl( panelEl )
32
27
 
33
28
  stack.panels.push( panelEl )
34
29
  },
35
30
 
36
31
  // Reset stack to first panel
37
32
  reset: function () {
38
-
39
33
  // Already reset? We're done.
40
34
  if ( stack.current == 0 ) return
41
35
 
42
- // If hidden, manually reset all
36
+ // If hidden or first is empty, hide all
43
37
  if ( stack.root.offsetParent == null ) {
44
38
  stack.focus = [] // Clear focus stack
45
39
 
46
40
  // Hide and reset scroll on all panels
47
- stack.panels.forEach( function( el ) {
48
- el.scrollTop = 0
49
- hideEl( el )
50
- })
41
+ stack.hidePanels()
51
42
 
52
43
  // Show first panel
53
- stack.current = 0
44
+ if ( isEmpty( panel ) ) {
45
+ stack.current = null
46
+ } else {
47
+ stack.current = 0
48
+ }
54
49
  showEl( stack.panels[0] )
50
+ stack.updateWatchers()
55
51
  }
56
52
 
57
53
  // If not hidden, dismiss current panel and reset to first panel
@@ -61,12 +57,22 @@ var Stack = {
61
57
  // Show a specific panel, hiding all others
62
58
  show: function ( name ) {
63
59
  var panel = stack.findPanel( name )
60
+ if ( !panel ) return // This panel doesn't exist
61
+
62
+ if ( isEmpty( panel ) ) {
63
+ stack.current = null
64
+ stack.hidePanels()
65
+ stack.updateWatchers()
66
+ return
67
+ }
68
+
69
+ var current = stack.currentPanel()
70
+ if ( !current ) return stack.enter( panel ) // the stack isn't currently active
64
71
 
65
72
  // If a panel isn't the current panel
66
- // dismiss it before going to the requested panel
67
- if ( panel && panel != stack.currentPanel() ) {
73
+ if ( panel != current ) {
68
74
 
69
- // Dismiss the current panel and with the callback load in the next panel
75
+ // Dismiss it with the callback load in the next panel
70
76
  return stack.dismiss( stack.direction( panel ), function() {
71
77
  stack.enter( panel )
72
78
  })
@@ -87,6 +93,8 @@ var Stack = {
87
93
  el.classList.add( 'enter' )
88
94
  showEl( el )
89
95
 
96
+ stack.updateWatchers()
97
+
90
98
  if ( direction == 'forward' ) {
91
99
  // If the previous focused element was in the stack
92
100
  //if ( toolbox.childOf( stack.lastFocus(), stack.root ) ) {
@@ -97,8 +105,10 @@ var Stack = {
97
105
 
98
106
  //}
99
107
 
100
- // Focus on the previous focused element
101
- } else if ( direction == 'reverse' && stack.focus.length > 0 ) {
108
+ }
109
+
110
+ // When reversing, focus on the previously focused element
111
+ if ( direction == 'reverse' && stack.focus.length > 0 ) {
102
112
  stack.focus.pop().focus()
103
113
  }
104
114
  },
@@ -128,6 +138,13 @@ var Stack = {
128
138
 
129
139
  },
130
140
 
141
+ hidePanels: function() {
142
+ stack.panels.forEach( function( el ) {
143
+ el.scrollTop = 0
144
+ hideEl( el )
145
+ })
146
+ },
147
+
131
148
  lastFocus: function() {
132
149
  return stack.focus[ stack.focus.length -1 ]
133
150
  },
@@ -153,12 +170,14 @@ var Stack = {
153
170
  direction: function( panel ) {
154
171
  var index = stack.panelIndex( panel )
155
172
 
156
- if ( index == stack.current ) return 'none'
173
+ if ( index == stack.current || stack.current == null ) return 'none'
157
174
  else return ( stack.current < index ) ? 'forward' : 'reverse'
158
175
 
159
176
  },
160
177
 
161
178
  currentPanel: function ( name ) {
179
+ if ( typeof stack.current == 'undefined' ) return
180
+
162
181
  if ( name ) {
163
182
  return stack.panels[ stack.current ] == stack.findPanel( name )
164
183
  }
@@ -167,14 +186,30 @@ var Stack = {
167
186
 
168
187
  panelIndex: function ( panel ) {
169
188
  return Number( panel.dataset.stackIndex )
189
+ },
190
+
191
+ updateWatchers: function () {
192
+ toolbox.each( stack.watchers, function( el ) {
193
+ if ( stack.current == null )
194
+ el.removeAttribute( 'data-active-stack' )
195
+ else
196
+ el.dataset.activeStack = stack.currentPanel().dataset.stack || stack.currentPanel().dataset.stackIndex
197
+ })
170
198
  }
171
199
  }
172
200
 
201
+ toolbox.each( root.children, stack.add )
202
+
203
+ if ( root.id ) stack.watchers = document.querySelectorAll('[data-watch-stack="#'+root.id+'"]')
204
+
205
+ // Only show the first panel if it has content.
206
+ // If it doesn't, assume async and manual panel showing.
207
+ if ( !isEmpty( stack.panels[0] ) ) stack.show(0)
208
+
173
209
  // Add a queryable stack id
174
210
  root.dataset.stackId = Stacks.length
175
211
 
176
212
  Stacks.push( stack )
177
- toolbox.each( root.children, stack.add )
178
213
 
179
214
  return stack
180
215
  }
@@ -184,6 +219,10 @@ function showEl ( el ) {
184
219
  el.setAttribute( 'aria-hidden', false )
185
220
  }
186
221
 
222
+ function isEmpty ( el ) {
223
+ return el.childElementCount == 0
224
+ }
225
+
187
226
  function hideEl ( el ) {
188
227
  el.setAttribute( 'aria-hidden', true )
189
228
  }
@@ -3,10 +3,10 @@ $modal-panel-height: 80vh;
3
3
  $modal-panel-border: rgba(#000, .1);
4
4
 
5
5
  .modal-panel {
6
+ @include elevation(4);
6
7
  border-radius: 5px;
7
8
  border: 1px solid rgba(#000, .2);
8
9
  background: $fl-white;
9
- @include elevation(4);
10
10
  position: absolute;
11
11
  left: 0;
12
12
  right: 0;
@@ -50,6 +50,7 @@ $modal-panel-border: rgba(#000, .1);
50
50
  }
51
51
  }
52
52
  }
53
+
53
54
  &-title {
54
55
  text-transform: uppercase;
55
56
  font-size: 11px;
@@ -58,6 +59,7 @@ $modal-panel-border: rgba(#000, .1);
58
59
  line-height: inherit;
59
60
  color: $fl-gray-600;
60
61
  }
62
+
61
63
  &-footer {
62
64
  border-top: 1px solid $modal-panel-border;
63
65
  }
@@ -66,6 +68,17 @@ $modal-panel-border: rgba(#000, .1);
66
68
  height: 0;
67
69
  overflow: hidden;
68
70
  }
71
+
72
+ &-content {
73
+ transition: max-height $duration $timing;
74
+ overflow-y: hidden;
75
+ [aria-hidden=true] & {
76
+ max-height: 1vh;
77
+ }
78
+ [aria-hidden=false] & {
79
+ max-height: 100vh;
80
+ }
81
+ }
69
82
  }
70
83
 
71
84
  .modal-is-opening {
@@ -259,6 +259,7 @@
259
259
  }
260
260
  }
261
261
 
262
+ // Triggered class indicates it was manually clicked, rather than restored via cookies
262
263
  .triggered .nav-tree-group {
263
264
  transition-property: max-height, opacity, padding;
264
265
  transition-duration: $duration;
@@ -12,13 +12,19 @@
12
12
  animation-duration: $duration-short;
13
13
  }
14
14
 
15
+ &:not([data-active-stack]) {
16
+ .modal-panel {
17
+ display: none;
18
+ }
19
+ }
20
+
15
21
  &.modal-active {
16
22
  position: absolute;
17
23
  left: 16px;
18
24
  width: calc( 100% - 32px );
19
25
  margin-right: 0;
20
26
 
21
- label {
27
+ &[data-active-stack] label {
22
28
  border: {
23
29
  color: transparent;
24
30
  radius: 5px;
@@ -1,3 +1,3 @@
1
1
  module FleetioSpark
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
@@ -581,11 +581,11 @@ input:checked + .check-switch-panel {
581
581
  margin-right: auto; }
582
582
 
583
583
  .modal-panel {
584
+ -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.1), 0px 16px 24px 2px rgba(0, 0, 0, 0.06), 0px 6px 32px 6px rgba(0, 0, 0, 0.08);
585
+ box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.1), 0px 16px 24px 2px rgba(0, 0, 0, 0.06), 0px 6px 32px 6px rgba(0, 0, 0, 0.08);
584
586
  border-radius: 5px;
585
587
  border: 1px solid rgba(0, 0, 0, 0.2);
586
588
  background: #FFFFFF;
587
- -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.1), 0px 16px 24px 2px rgba(0, 0, 0, 0.06), 0px 6px 32px 6px rgba(0, 0, 0, 0.08);
588
- box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.1), 0px 16px 24px 2px rgba(0, 0, 0, 0.06), 0px 6px 32px 6px rgba(0, 0, 0, 0.08);
589
589
  position: absolute;
590
590
  left: 0;
591
591
  right: 0; }
@@ -634,6 +634,14 @@ input:checked + .check-switch-panel {
634
634
  .modal-panel [aria-hidden=true] {
635
635
  height: 0;
636
636
  overflow: hidden; }
637
+ .modal-panel-content {
638
+ -webkit-transition: max-height 0.2s cubic-bezier(0.4, 0, 0.2, 1);
639
+ transition: max-height 0.2s cubic-bezier(0.4, 0, 0.2, 1);
640
+ overflow-y: hidden; }
641
+ [aria-hidden=true] .modal-panel-content {
642
+ max-height: 1vh; }
643
+ [aria-hidden=false] .modal-panel-content {
644
+ max-height: 100vh; }
637
645
 
638
646
  .modal-is-opening {
639
647
  -webkit-animation: modal-open 0.2s cubic-bezier(0.4, 0, 0.2, 1);
@@ -1406,12 +1414,14 @@ input:checked + .check-switch-panel {
1406
1414
  .search-panel .modal-is-closing {
1407
1415
  -webkit-animation-duration: 0.1s;
1408
1416
  animation-duration: 0.1s; }
1417
+ .search-panel:not([data-active-stack]) .modal-panel {
1418
+ display: none; }
1409
1419
  .search-panel.modal-active {
1410
1420
  position: absolute;
1411
1421
  left: 16px;
1412
1422
  width: calc( 100% - 32px );
1413
1423
  margin-right: 0; }
1414
- .search-panel.modal-active label {
1424
+ .search-panel.modal-active[data-active-stack] label {
1415
1425
  border-color: transparent;
1416
1426
  border-radius: 5px; }
1417
1427
  @media all and (min-width: 600px) {
Binary file
@@ -666,42 +666,38 @@ var Stack = {
666
666
 
667
667
  var stack = {
668
668
  root: root,
669
- current: 0,
670
669
  panels: [],
671
670
  focus: [],
671
+ current: null,
672
672
 
673
673
  add: function ( panelEl, name ) {
674
674
  panelEl.dataset.stackIndex = stack.panels.length
675
675
 
676
- // Hide all panels but the first panel
677
- if ( stack.panels.length == 0 ) {
678
- showEl( panelEl )
679
- } else {
680
- hideEl( panelEl )
681
- }
676
+ hideEl( panelEl )
682
677
 
683
678
  stack.panels.push( panelEl )
684
679
  },
685
680
 
686
681
  // Reset stack to first panel
687
682
  reset: function () {
688
-
689
683
  // Already reset? We're done.
690
684
  if ( stack.current == 0 ) return
691
685
 
692
- // If hidden, manually reset all
686
+ // If hidden or first is empty, hide all
693
687
  if ( stack.root.offsetParent == null ) {
694
688
  stack.focus = [] // Clear focus stack
695
689
 
696
690
  // Hide and reset scroll on all panels
697
- stack.panels.forEach( function( el ) {
698
- el.scrollTop = 0
699
- hideEl( el )
700
- })
691
+ stack.hidePanels()
701
692
 
702
693
  // Show first panel
703
- stack.current = 0
694
+ if ( isEmpty( panel ) ) {
695
+ stack.current = null
696
+ } else {
697
+ stack.current = 0
698
+ }
704
699
  showEl( stack.panels[0] )
700
+ stack.updateWatchers()
705
701
  }
706
702
 
707
703
  // If not hidden, dismiss current panel and reset to first panel
@@ -711,12 +707,22 @@ var Stack = {
711
707
  // Show a specific panel, hiding all others
712
708
  show: function ( name ) {
713
709
  var panel = stack.findPanel( name )
710
+ if ( !panel ) return // This panel doesn't exist
711
+
712
+ if ( isEmpty( panel ) ) {
713
+ stack.current = null
714
+ stack.hidePanels()
715
+ stack.updateWatchers()
716
+ return
717
+ }
718
+
719
+ var current = stack.currentPanel()
720
+ if ( !current ) return stack.enter( panel ) // the stack isn't currently active
714
721
 
715
722
  // If a panel isn't the current panel
716
- // dismiss it before going to the requested panel
717
- if ( panel && panel != stack.currentPanel() ) {
723
+ if ( panel != current ) {
718
724
 
719
- // Dismiss the current panel and with the callback load in the next panel
725
+ // Dismiss it with the callback load in the next panel
720
726
  return stack.dismiss( stack.direction( panel ), function() {
721
727
  stack.enter( panel )
722
728
  })
@@ -737,6 +743,8 @@ var Stack = {
737
743
  el.classList.add( 'enter' )
738
744
  showEl( el )
739
745
 
746
+ stack.updateWatchers()
747
+
740
748
  if ( direction == 'forward' ) {
741
749
  // If the previous focused element was in the stack
742
750
  //if ( toolbox.childOf( stack.lastFocus(), stack.root ) ) {
@@ -747,8 +755,10 @@ var Stack = {
747
755
 
748
756
  //}
749
757
 
750
- // Focus on the previous focused element
751
- } else if ( direction == 'reverse' && stack.focus.length > 0 ) {
758
+ }
759
+
760
+ // When reversing, focus on the previously focused element
761
+ if ( direction == 'reverse' && stack.focus.length > 0 ) {
752
762
  stack.focus.pop().focus()
753
763
  }
754
764
  },
@@ -778,6 +788,13 @@ var Stack = {
778
788
 
779
789
  },
780
790
 
791
+ hidePanels: function() {
792
+ stack.panels.forEach( function( el ) {
793
+ el.scrollTop = 0
794
+ hideEl( el )
795
+ })
796
+ },
797
+
781
798
  lastFocus: function() {
782
799
  return stack.focus[ stack.focus.length -1 ]
783
800
  },
@@ -803,12 +820,14 @@ var Stack = {
803
820
  direction: function( panel ) {
804
821
  var index = stack.panelIndex( panel )
805
822
 
806
- if ( index == stack.current ) return 'none'
823
+ if ( index == stack.current || stack.current == null ) return 'none'
807
824
  else return ( stack.current < index ) ? 'forward' : 'reverse'
808
825
 
809
826
  },
810
827
 
811
828
  currentPanel: function ( name ) {
829
+ if ( typeof stack.current == 'undefined' ) return
830
+
812
831
  if ( name ) {
813
832
  return stack.panels[ stack.current ] == stack.findPanel( name )
814
833
  }
@@ -817,14 +836,30 @@ var Stack = {
817
836
 
818
837
  panelIndex: function ( panel ) {
819
838
  return Number( panel.dataset.stackIndex )
839
+ },
840
+
841
+ updateWatchers: function () {
842
+ toolbox.each( stack.watchers, function( el ) {
843
+ if ( stack.current == null )
844
+ el.removeAttribute( 'data-active-stack' )
845
+ else
846
+ el.dataset.activeStack = stack.currentPanel().dataset.stack || stack.currentPanel().dataset.stackIndex
847
+ })
820
848
  }
821
849
  }
822
850
 
851
+ toolbox.each( root.children, stack.add )
852
+
853
+ if ( root.id ) stack.watchers = document.querySelectorAll('[data-watch-stack="#'+root.id+'"]')
854
+
855
+ // Only show the first panel if it has content.
856
+ // If it doesn't, assume async and manual panel showing.
857
+ if ( !isEmpty( stack.panels[0] ) ) stack.show(0)
858
+
823
859
  // Add a queryable stack id
824
860
  root.dataset.stackId = Stacks.length
825
861
 
826
862
  Stacks.push( stack )
827
- toolbox.each( root.children, stack.add )
828
863
 
829
864
  return stack
830
865
  }
@@ -834,6 +869,10 @@ function showEl ( el ) {
834
869
  el.setAttribute( 'aria-hidden', false )
835
870
  }
836
871
 
872
+ function isEmpty ( el ) {
873
+ return el.childElementCount == 0
874
+ }
875
+
837
876
  function hideEl ( el ) {
838
877
  el.setAttribute( 'aria-hidden', true )
839
878
  }
@@ -11935,4 +11974,4 @@ exports.Settings = Settings;
11935
11974
  },{}]},{},[10])(10)
11936
11975
  });
11937
11976
 
11938
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19jb29raWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19tb2RhbC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NlYXJjaC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NpZGViYXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19zdGFjay5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3RyZWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL3NoaW1zL19kYXRhc2V0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9zcGFyay5qcyIsIm5vZGVfbW9kdWxlcy9iZWFuL2JlYW4uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hZnRlci1hbmltYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYW5pbWF0aW9uLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9idWJibGUtZm9ybS1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvY2FsbGJhY2stbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWxheS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9tZWRpYS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9wYWdlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3JlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXNpemUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3NoaW1zL2N1c3RvbS1ldmVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zdWJtaXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGFwLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90aHJvdHRsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvZ2dsZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Zyb210b3AuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29va2llX2pzL2Nvb2tpZS5qcyIsIm5vZGVfbW9kdWxlcy9rZXltYXN0ZXIva2V5bWFzdGVyLmpzIiwibm9kZV9tb2R1bGVzL2x1eG9uL2J1aWxkL2Nqcy1icm93c2VyL2x1eG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGNvb2tpZSA9IHJlcXVpcmUoICdjb29raWVfanMnICkuY29va2llXG5cbmZ1bmN0aW9uIHVwZGF0ZSAoIGtleSwgZGF0YSwgb3B0aW9ucyApIHtcbiAgdmFyIG9sZF9kYXRhID0gZ2V0KCBrZXkgKVxuICBzZXQoIGtleSwgdG9vbGJveC5tZXJnZSggb2xkX2RhdGEsIGRhdGEpLCBvcHRpb25zIClcbn1cblxuZnVuY3Rpb24gZ2V0ICgga2V5ICkge1xuICB2YXIgZGF0YSA9IGNvb2tpZS5nZXQoIGtleSApXG4gIHJldHVybiBkYXRhID8gSlNPTi5wYXJzZSggZGF0YSkgOiB7fVxufVxuXG5mdW5jdGlvbiBzZXQgKCBrZXksIHZhbHVlLCBvcHRpb25zICkge1xuICBvcHRpb25zID0gdG9vbGJveC5tZXJnZSggeyBwYXRoOiAnLycgfSwgb3B0aW9ucyB8fCB7fSApXG4gIGNvb2tpZS5zZXQoIGtleSwgSlNPTi5zdHJpbmdpZnkoIHZhbHVlICksIG9wdGlvbnMgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICB1cGRhdGU6IHVwZGF0ZVxufVxuIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBuYW1lc1xuXG4gIGZ1bmN0aW9uIGF0dHIoIHNvdXJjZSwgbmFtZSApe1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09ICdvYmplY3QnKVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSsnXCIgJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZSsnXCIgJyB9XG5cbiAgZnVuY3Rpb24gZGFzaGVyaXplKCBpbnB1dCApIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW1xcXFxXLF9dL2csICctJykucmVwbGFjZSgvLXsyLH0vZywgJy0nKVxuICB9XG5cbiAgZnVuY3Rpb24gc3ZnTmFtZSggbmFtZSApIHtcbiAgICByZXR1cm4gXCJzdmctXCIrZGFzaGVyaXplKCBuYW1lIClcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZSggbmFtZSwgb3B0aW9ucyApIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHZhciBpZCA9IGRhc2hlcml6ZSggbmFtZSApXG4gICAgdmFyIHN5bWJvbCA9IHN2Z3MoKVtpZF1cblxuICAgIGlmICggc3ltYm9sICkge1xuICAgICAgdmFyIHBhcmVudCA9IHN5bWJvbC5wYXJlbnRFbGVtZW50XG4gICAgICB2YXIgcHJlZml4ID0gcGFyZW50LmRhdGFzZXQucHJlZml4XG4gICAgICB2YXIgYmFzZSAgID0gcGFyZW50LmRhdGFzZXQuc3ltYm9sQ2xhc3NcblxuICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KCAnPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCIjJyArIHByZWZpeCArICctJyArIGlkICsgJ1wiLz48L3N2Zz4nICkuZmlyc3RDaGlsZDtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIGJhc2UgKyAnICcgKyBwcmVmaXggKyAnLScgKyBpZCArICcgJyArICggb3B0aW9ucy5jbGFzcyB8fCAnJyApLnRyaW0oKSApXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsIHN5bWJvbC5nZXRBdHRyaWJ1dGUoICd2aWV3Qm94JyApIClcblxuICAgICAgaWYgKCAhKCBvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMuaGVpZ2h0IHx8IG9wdGlvbnMuc2NhbGUgKSApIHtcblxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICBzeW1ib2wuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKVxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSlcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoIG9wdGlvbnMud2lkdGggKSAgc3ZnLnNldEF0dHJpYnV0ZSggJ3dpZHRoJywgIG9wdGlvbnMud2lkdGggKVxuICAgICAgICBpZiAoIG9wdGlvbnMuaGVpZ2h0ICkgc3ZnLnNldEF0dHJpYnV0ZSggJ2hlaWdodCcsIG9wdGlvbnMuaGVpZ2h0IClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN2Z1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBcIicrbmFtZSsnXCIgc3ZnIHN5bWJvbC4gRW5zdXJlIHRoYXQgc3ZnIHNjcmlwdHMgYXJlIGxvYWRlZCcpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3Zncygpe1xuICAgIGlmICggIW5hbWVzICkge1xuICAgICAgbmFtZXMgPSB7fVxuICAgICAgdmFyIHN5bWJvbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ3N2Z1tpZF49ZXN2Z10gc3ltYm9sJyApIClcbiAgICAgIHN5bWJvbHMuZm9yRWFjaCggZnVuY3Rpb24oIHN5bWJvbCApIHtcbiAgICAgICAgbmFtZXNbc3ltYm9sLmRhdGFzZXQubmFtZV0gPSBzeW1ib2xcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBuYW1lc1xuICB9XG5cbiAgdmFyIGVzdmcgPSB7XG4gICAgc3Znczogc3ZncyxcbiAgICB1c2U6IHVzZVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oIGV2ZW50ICkgeyBuYW1lcyA9IG51bGw7IGVzdmcuc3ZncygpIH0pXG4gIH1cblxuICBpZiggdHlwZW9mKCBtb2R1bGUgKSAhPSAndW5kZWZpbmVkJyApIHsgbW9kdWxlLmV4cG9ydHMgPSBlc3ZnIH1cbiAgZWxzZSB3aW5kb3cuZXN2ZyA9IGVzdmdcblxufSkoKVxuIiwiKGZ1bmN0aW9uKCl7XG5cbiAgZnVuY3Rpb24gZW1iZWQoKSB7XG4gICAgaWYgKCAhZG9jdW1lbnQuYm9keSApIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGVtYmVkIClcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlc3ZnLXN2Zy1pY29ucycpKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgJzxzdmcgaWQ9XCJlc3ZnLXN2Zy1pY29uc1wiIGRhdGEtc3ltYm9sLWNsYXNzPVwiaWNvblwiIGRhdGEtcHJlZml4PVwic3ZnXCIgdmVyc2lvbj1cIjEuMVwiIHN0eWxlPVwiaGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGVcIiBkYXRhLXR1cmJvbGlua3MtcGVybWFuZW50PjxkZWZzPjxjbGlwUGF0aCBpZD1cImRlZi1zdmctcXVlc3Rpb24tMFwiPjxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZpbGw9XCJ3aGl0ZVwiLz48L2NsaXBQYXRoPjwvZGVmcz48c3ltYm9sIGlkPVwic3ZnLWFkZFwiIGRhdGEtbmFtZT1cImFkZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0wIDEyQzAgMTIuMzk3OCAwLjE1ODAzNSAxMi43Nzk0IDAuNDM5MzQgMTMuMDYwN0MwLjcyMDY0NCAxMy4zNDIgMS4xMDIxOCAxMy41IDEuNSAxMy41SDEwLjI1QzEwLjMxNjMgMTMuNSAxMC4zNzk5IDEzLjUyNjMgMTAuNDI2OCAxMy41NzMyQzEwLjQ3MzcgMTMuNjIwMSAxMC41IDEzLjY4MzcgMTAuNSAxMy43NVYyMi41QzEwLjUgMjIuODk3OCAxMC42NTggMjMuMjc5NCAxMC45MzkzIDIzLjU2MDdDMTEuMjIwNiAyMy44NDIgMTEuNjAyMiAyNCAxMiAyNEMxMi4zOTc4IDI0IDEyLjc3OTQgMjMuODQyIDEzLjA2MDcgMjMuNTYwN0MxMy4zNDIgMjMuMjc5NCAxMy41IDIyLjg5NzggMTMuNSAyMi41VjEzLjc1QzEzLjUgMTMuNjgzNyAxMy41MjYzIDEzLjYyMDEgMTMuNTczMiAxMy41NzMyQzEzLjYyMDEgMTMuNTI2MyAxMy42ODM3IDEzLjUgMTMuNzUgMTMuNUgyMi41QzIyLjg5NzggMTMuNSAyMy4yNzk0IDEzLjM0MiAyMy41NjA3IDEzLjA2MDdDMjMuODQyIDEyLjc3OTQgMjQgMTIuMzk3OCAyNCAxMkMyNCAxMS42MDIyIDIzLjg0MiAxMS4yMjA2IDIzLjU2MDcgMTAuOTM5M0MyMy4yNzk0IDEwLjY1OCAyMi44OTc4IDEwLjUgMjIuNSAxMC41SDEzLjc1QzEzLjY4MzcgMTAuNSAxMy42MjAxIDEwLjQ3MzcgMTMuNTczMiAxMC40MjY4QzEzLjUyNjMgMTAuMzc5OSAxMy41IDEwLjMxNjMgMTMuNSAxMC4yNVYxLjVDMTMuNSAxLjEwMjE4IDEzLjM0MiAwLjcyMDY0NCAxMy4wNjA3IDAuNDM5MzRDMTIuNzc5NCAwLjE1ODAzNSAxMi4zOTc4IDAgMTIgMEMxMS42MDIyIDAgMTEuMjIwNiAwLjE1ODAzNSAxMC45MzkzIDAuNDM5MzRDMTAuNjU4IDAuNzIwNjQ0IDEwLjUgMS4xMDIxOCAxMC41IDEuNVYxMC4yNUMxMC41IDEwLjMxNjMgMTAuNDczNyAxMC4zNzk5IDEwLjQyNjggMTAuNDI2OEMxMC4zNzk5IDEwLjQ3MzcgMTAuMzE2MyAxMC41IDEwLjI1IDEwLjVIMS41QzEuMTAyMTggMTAuNSAwLjcyMDY0NCAxMC42NTggMC40MzkzNCAxMC45MzkzQzAuMTU4MDM1IDExLjIyMDYgMCAxMS42MDIyIDAgMTJIMFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hZG1pbi11c2VyXCIgZGF0YS1uYW1lPVwiYWRtaW4tdXNlclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMy4wMTkgMTYuNUMxMy4wMTkgMTYuMjM0OCAxMi45MTM2IDE1Ljk4MDQgMTIuNzI2MSAxNS43OTI5QzEyLjUzODYgMTUuNjA1NCAxMi4yODQyIDE1LjUgMTIuMDE5IDE1LjVIOC4xMDVDOC4wNDg5NCAxNS41MDA2IDcuOTk0MzUgMTUuNDgyMSA3Ljk1MDE5IDE1LjQ0NzZDNy45MDYwMyAxNS40MTMxIDcuODc0OTMgMTUuMzY0NSA3Ljg2MiAxNS4zMUM3LjYyMDY2IDE0LjIyMzMgNy41MDE1OSAxMy4xMTMxIDcuNTA3IDEyQzcuNTA1MjcgMTEuMDYwOCA3LjU5MDI5IDEwLjEyMzUgNy43NjEgOS4yQzcuNzczMjIgOS4xNDI5NSA3LjgwNDc4IDkuMDkxODggNy44NTAzNCA5LjA1NTQzQzcuODk1OSA5LjAxODk4IDcuOTUyNjYgOC45OTk0IDguMDExIDlDMTguODg0IDkgMjEuNTY2IDkuMDA4IDIyLjI5MSA4Ljk4MkMyMi40NTM2IDguOTkxNjYgMjIuNjE1OCA4Ljk1ODc0IDIyLjc2MTggOC44ODY0OUMyMi45MDc3IDguODE0MjUgMjMuMDMyMyA4LjcwNTE4IDIzLjEyMzIgOC41NzAwNkMyMy4yMTQgOC40MzQ5NCAyMy4yNjgxIDguMjc4NDQgMjMuMjggOC4xMTYwNEMyMy4yOTE5IDcuOTUzNjMgMjMuMjYxMiA3Ljc5MDkyIDIzLjE5MSA3LjY0NEMyMi4zMTY4IDUuMzc3NDQgMjAuNzcyMSAzLjQzMTQyIDE4Ljc2MyAyLjA2NTYyQzE2Ljc1NCAwLjY5OTgzMSAxNC4zNzYyIC0wLjAyMDc2NDcgMTEuOTQ3IDEuNjU2MjRlLTA2QzguODI3NzYgMC4wNzQyNjU0IDUuODU0NjcgMS4zMzcxNCAzLjYzNTUzIDMuNTMwNDRDMS40MTYzOCA1LjcyMzc1IDAuMTE4Nzg0IDguNjgxODQgMC4wMDc5OTg1NSAxMS44Qy0wLjA1MDY1NTcgMTQuOTI2NyAxLjExNjMyIDE3Ljk1MjIgMy4yNTk0IDIwLjIyOTZDNS40MDI0NyAyMi41MDcxIDguMzUxNTQgMjMuODU1NyAxMS40NzYgMjMuOTg3SDExLjUyQzExLjc2MTggMjMuOTg3NCAxMS45OTU1IDIzLjkwMDEgMTIuMTc3OSAyMy43NDE0QzEyLjM2MDMgMjMuNTgyNyAxMi40NzkgMjMuMzYzMyAxMi41MTIxIDIzLjEyMzhDMTIuNTQ1MiAyMi44ODQyIDEyLjQ5MDMgMjIuNjQwOSAxMi4zNTc4IDIyLjQzODdDMTIuMjI1MiAyMi4yMzY1IDEyLjAyMzggMjIuMDg5MiAxMS43OTEgMjIuMDI0QzExLjU5NCAyMS45NTcxIDExLjQyNDYgMjEuODI3IDExLjMwOSAyMS42NTRDMTAuMzgxOSAyMC40NDYgOS41MzI4NyAxOS4xODAxIDguNzY3IDE3Ljg2NEM4Ljc0NjgyIDE3LjgyNTkgOC43MzY4NCAxNy43ODMyIDguNzM4MDIgMTcuNzQwMUM4LjczOTIxIDE3LjY5NyA4Ljc1MTUyIDE3LjY1NSA4Ljc3Mzc2IDE3LjYxOEM4Ljc5NjAxIDE3LjU4MTEgOC44Mjc0MiAxNy41NTA1IDguODY0OTYgMTcuNTI5M0M4LjkwMjUgMTcuNTA4MSA4Ljk0NDg4IDE3LjQ5NyA4Ljk4OCAxNy40OTdIMTIuMDE5QzEyLjI4MzcgMTcuNDk3IDEyLjUzNzYgMTcuMzkyMSAxMi43MjUgMTcuMjA1MkMxMi45MTI1IDE3LjAxODMgMTMuMDE4MiAxNi43NjQ3IDEzLjAxOSAxNi41Wk01LjggMTUuMkM1LjgwNzYxIDE1LjIzNjMgNS44MDY5OSAxNS4yNzM5IDUuNzk4MTggMTUuMzFDNS43ODkzOCAxNS4zNDYxIDUuNzcyNjMgMTUuMzc5NyA1Ljc0OTE0IDE1LjQwODVDNS43MjU2NSAxNS40MzczIDUuNjk2MDIgMTUuNDYwNCA1LjY2MjQzIDE1LjQ3NjJDNS42Mjg4NCAxNS40OTIxIDUuNTkyMTMgMTUuNTAwMiA1LjU1NSAxNS41SDIuODE4QzIuNzY2MjQgMTUuNDk5OSAyLjcxNTc5IDE1LjQ4MzggMi42NzM1NCAxNS40NTM5QzIuNjMxMjkgMTUuNDI0IDIuNTk5MzIgMTUuMzgxOCAyLjU4MiAxNS4zMzNDMS44NzgxIDEzLjM1MTIgMS44MTg5NSAxMS4xOTc1IDIuNDEzIDkuMThDMi40MjgyOSA5LjEyODE2IDIuNDU5OTEgOS4wODI2MyAyLjUwMzE1IDkuMDUwMkMyLjU0NjM5IDkuMDE3NzcgMi41OTg5NSA5LjAwMDE2IDIuNjUzIDlINS40NkM1LjQ5NTkzIDkuMDAwMzUgNS41MzEzNyA5LjAwODM3IDUuNTYzOTUgOS4wMjM1NEM1LjU5NjUyIDkuMDM4NyA1LjYyNTQ4IDkuMDYwNjYgNS42NDg4NyA5LjA4Nzk0QzUuNjcyMjYgOS4xMTUyMSA1LjY4OTU1IDkuMTQ3MTcgNS42OTk1OCA5LjE4MTY4QzUuNzA5NiA5LjIxNjE5IDUuNzEyMTMgOS4yNTI0NCA1LjcwNyA5LjI4OEM1LjU3MTYzIDEwLjE4NTYgNS41MDQ3NyAxMS4wOTIyIDUuNTA3IDEyQzUuNTA0MTkgMTMuMDczNSA1LjYwMjI5IDE0LjE0NDkgNS44IDE1LjJWMTUuMlpNMTEuODU5IDIuMjdDMTEuOTAxNSAyLjIzOTc3IDExLjk1MjMgMi4yMjM1MyAxMi4wMDQ1IDIuMjIzNTNDMTIuMDU2NiAyLjIyMzUzIDEyLjEwNzUgMi4yMzk3NyAxMi4xNSAyLjI3QzEzLjY1MjkgMy4zOTMwNyAxNC44MTU4IDQuOTEwMDIgMTUuNTEgNi42NTNDMTUuNTI2IDYuNjkxMDUgMTUuNTMyNCA2LjczMjQ4IDE1LjUyODUgNi43NzM1OEMxNS41MjQ2IDYuODE0NjggMTUuNTEwNiA2Ljg1NDE3IDE1LjQ4NzcgNi44ODg1NEMxNS40NjQ4IDYuOTIyOSAxNS40MzM4IDYuOTUxMDcgMTUuMzk3NCA2Ljk3MDUyQzE1LjM2MDkgNi45ODk5NyAxNS4zMjAzIDcuMDAwMSAxNS4yNzkgN0g4LjcyOUM4LjY4Nzk5IDcuMDAwMTQgOC42NDc2IDYuOTkwMDYgOC42MTE0NiA2Ljk3MDY4QzguNTc1MzIgNi45NTEzIDguNTQ0NTggNi45MjMyMyA4LjUyMiA2Ljg4OUM4LjQ5OTA5IDYuODU0NTUgOC40ODUwOSA2LjgxNDk2IDguNDgxMjUgNi43NzM3N0M4LjQ3NzQxIDYuNzMyNTkgOC40ODM4NSA2LjY5MTA5IDguNSA2LjY1M0M5LjE4OTEgNC45MDczOSAxMC4zNTI2IDMuMzg5MjQgMTEuODU5IDIuMjdWMi4yN1pNMjAuNDQgNi42MTRDMjAuNDY0NSA2LjY1MTgzIDIwLjQ3ODQgNi42OTU1OSAyMC40ODAxIDYuNzQwNjRDMjAuNDgxNyA2Ljc4NTY5IDIwLjQ3MTIgNi44MzAzNiAyMC40NDk2IDYuODY5OTJDMjAuNDI4IDYuOTA5NDcgMjAuMzk2MSA2Ljk0MjQ1IDIwLjM1NzIgNi45NjUzNUMyMC4zMTg0IDYuOTg4MjUgMjAuMjc0MSA3LjAwMDIyIDIwLjIyOSA3SDE3Ljk0NkMxNy44OTM0IDcuMDAwMDIgMTcuODQyMiA2Ljk4MzUyIDE3Ljc5OTQgNi45NTI4NEMxNy43NTY3IDYuOTIyMTYgMTcuNzI0OCA2Ljg3ODg0IDE3LjcwOCA2LjgyOUMxNy4yOTY2IDUuNTcyNjIgMTYuNjk3OSA0LjM4NTU3IDE1LjkzMiAzLjMwOEMxNS44OTk5IDMuMjYzMDYgMTUuODgzNSAzLjIwODc1IDE1Ljg4NTUgMy4xNTM1NEMxNS44ODc1IDMuMDk4MzMgMTUuOTA3NyAzLjA0NTM0IDE1Ljk0MyAzLjAwMjg0QzE1Ljk3ODMgMi45NjAzNSAxNi4wMjY3IDIuOTMwNzQgMTYuMDgwNiAyLjkxODY1QzE2LjEzNDUgMi45MDY1NSAxNi4xOTA5IDIuOTEyNjYgMTYuMjQxIDIuOTM2QzE3Ljk2NDUgMy43MzM4NiAxOS40MjIxIDUuMDEwNjIgMjAuNDQgNi42MTRWNi42MTRaTTcuNzQgMi45NjhDNy43OTAwMiAyLjk0NDE1IDcuODQ2NTYgMi45Mzc2IDcuOTAwNzEgMi45NDkzOEM3Ljk1NDg2IDIuOTYxMTYgOC4wMDM1NyAyLjk5MDU5IDguMDM5MTcgMy4wMzMwN0M4LjA3NDc3IDMuMDc1NTQgOC4wOTUyNSAzLjEyODYzIDguMDk3MzkgMy4xODQwMUM4LjA5OTU0IDMuMjM5MzkgOC4wODMyMSAzLjI5MzkxIDguMDUxIDMuMzM5QzcuMjk4NDUgNC40MDgxOCA2LjcwOTk1IDUuNTgzODMgNi4zMDUgNi44MjdDNi4yODg3NyA2Ljg3NzE0IDYuMjU3MTEgNi45MjA4NiA2LjIxNDU1IDYuOTUxOTNDNi4xNzE5OSA2Ljk4MyA2LjEyMDY5IDYuOTk5ODIgNi4wNjggN0gzLjgwNUMzLjc2MDE2IDYuOTk5OTMgMy43MTYxNiA2Ljk4Nzc5IDMuNjc3NjIgNi45NjQ4N0MzLjYzOTA4IDYuOTQxOTUgMy42MDc0MSA2LjkwOTA4IDMuNTg1OTQgNi44Njk3MUMzLjU2NDQ3IDYuODMwMzUgMy41NTM5OCA2Ljc4NTkzIDMuNTU1NTcgNi43NDExMkMzLjU1NzE3IDYuNjk2MyAzLjU3MDc4IDYuNjUyNzQgMy41OTUgNi42MTVDNC42MDk0MyA1LjAzNjUgNi4wNDUyIDMuNzczMjQgNy43NCAyLjk2OFYyLjk2OFpNOC4wOTEgMjAuN0M4LjEyMzEzIDIwLjc0NDkgOC4xMzk0OCAyMC43OTkzIDguMTM3NDggMjAuODU0NUM4LjEzNTQ4IDIwLjkwOTcgOC4xMTUyNSAyMC45NjI3IDguMDc5OTUgMjEuMDA1MkM4LjA0NDY1IDIxLjA0NzcgNy45OTYyNyAyMS4wNzczIDcuOTQyMzcgMjEuMDg5NEM3Ljg4ODQ2IDIxLjEwMTUgNy44MzIwNyAyMS4wOTUzIDcuNzgyIDIxLjA3MkM2LjI0NzE2IDIwLjM1OTEgNC45MTg4NSAxOS4yNjc2IDMuOTIyIDE3LjlDMy44OTQxNCAxNy44NjI5IDMuODc3MTggMTcuODE4NyAzLjg3MzAxIDE3Ljc3MjVDMy44Njg4NCAxNy43MjYyIDMuODc3NjMgMTcuNjc5NyAzLjg5ODM5IDE3LjYzODJDMy45MTkxNSAxNy41OTY3IDMuOTUxMDcgMTcuNTYxNyAzLjk5MDU3IDE3LjUzNzNDNC4wMzAwNiAxNy41MTI5IDQuMDc1NTcgMTcuNSA0LjEyMiAxNy41SDYuMjQ2QzYuMjk2OTMgMTcuNTAwMiA2LjM0NjYgMTcuNTE1OSA2LjM4ODQgMTcuNTQ1QzYuNDMwMTkgMTcuNTc0MiA2LjQ2MjE0IDE3LjYxNTMgNi40OCAxNy42NjNDNi44ODE3IDE4Ljc0MTUgNy40MjMzMyAxOS43NjI2IDguMDkxIDIwLjdWMjAuN1pcIi8+PHBhdGggZD1cIk0xOC43NjkgMTcuN0MxOS40NDQxIDE3LjcwMDIgMjAuMTA0MSAxNy41MDAyIDIwLjY2NTUgMTcuMTI1MkMyMS4yMjcgMTYuNzUwMyAyMS42NjQ2IDE2LjIxNzIgMjEuOTIzIDE1LjU5MzZDMjIuMTgxNSAxNC45Njk5IDIyLjI0OTEgMTQuMjgzNiAyMi4xMTc1IDEzLjYyMTRDMjEuOTg1OCAxMi45NTkzIDIxLjY2MDcgMTIuMzUxIDIxLjE4MzQgMTEuODczNkMyMC43MDYgMTEuMzk2MyAyMC4wOTc4IDExLjA3MTIgMTkuNDM1NiAxMC45Mzk1QzE4Ljc3MzQgMTAuODA3OSAxOC4wODcxIDEwLjg3NTUgMTcuNDYzNCAxMS4xMzRDMTYuODM5OCAxMS4zOTI0IDE2LjMwNjcgMTEuODMgMTUuOTMxOCAxMi4zOTE1QzE1LjU1NjggMTIuOTUyOSAxNS4zNTY4IDEzLjYxMjkgMTUuMzU3IDE0LjI4OEMxNS4zNTcgMTUuMTkyOSAxNS43MTY1IDE2LjA2MDggMTYuMzU2NCAxNi43MDA3QzE2Ljk5NjIgMTcuMzQwNSAxNy44NjQxIDE3LjcgMTguNzY5IDE3LjdaXCIvPjxwYXRoIGQ9XCJNMTMuNTQ4IDIzLjQ0NUMxMy41NDA1IDIzLjUxNSAxMy41NDc5IDIzLjU4NTcgMTMuNTY5NyAyMy42NTI2QzEzLjU5MTUgMjMuNzE5NiAxMy42MjcxIDIzLjc4MTEgMTMuNjc0MyAyMy44MzMzQzEzLjcyMTUgMjMuODg1NSAxMy43NzkyIDIzLjkyNzIgMTMuODQzNiAyMy45NTU2QzEzLjkwOCAyMy45ODM5IDEzLjk3NzYgMjMuOTk4NCAxNC4wNDggMjMuOTk4SDIzLjQ5NUMyMy41NjU0IDIzLjk5ODQgMjMuNjM1IDIzLjk4MzkgMjMuNjk5NCAyMy45NTU2QzIzLjc2MzggMjMuOTI3MiAyMy44MjE1IDIzLjg4NTUgMjMuODY4NyAyMy44MzMzQzIzLjkxNTkgMjMuNzgxMSAyMy45NTE1IDIzLjcxOTYgMjMuOTczMyAyMy42NTI2QzIzLjk5NTEgMjMuNTg1NyAyNC4wMDI1IDIzLjUxNSAyMy45OTUgMjMuNDQ1QzIzLjg1ODkgMjIuMTU1MiAyMy4yNTAxIDIwLjk2MTQgMjIuMjg2MSAyMC4wOTM4QzIxLjMyMjEgMTkuMjI2MSAyMC4wNzEgMTguNzQ2IDE4Ljc3NCAxOC43NDZDMTcuNDc3IDE4Ljc0NiAxNi4yMjU5IDE5LjIyNjEgMTUuMjYxOSAyMC4wOTM4QzE0LjI5NzkgMjAuOTYxNCAxMy42ODkxIDIyLjE1NTIgMTMuNTUzIDIzLjQ0NUgxMy41NDhaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hldnJvbi1kb3duXCIgZGF0YS1uYW1lPVwiY2hldnJvbi1kb3duXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuMjQ5IDcuMjA3TDEyLjIzMyAxOS42NzhDMTIuMzMyNSAxOS43ODE4IDEyLjQ1MiAxOS44NjQ0IDEyLjU4NDIgMTkuOTIwOEMxMi43MTY0IDE5Ljk3NzIgMTIuODU4NyAyMC4wMDYzIDEzLjAwMjUgMjAuMDA2M0MxMy4xNDYzIDIwLjAwNjMgMTMuMjg4NiAxOS45NzcyIDEzLjQyMDggMTkuOTIwOEMxMy41NTMgMTkuODY0NCAxMy42NzI1IDE5Ljc4MTggMTMuNzcyIDE5LjY3OEwyNC43NTEgNy4yMDdDMjQuODM4OCA3LjEwODA3IDI0LjkwNTggNi45OTI1IDI0Ljk0ODEgNi44NjcxNUMyNC45OTA0IDYuNzQxOCAyNS4wMDcgNi42MDkyNCAyNC45OTcgNi40NzczNEMyNC45ODcgNi4zNDU0MyAyNC45NTA2IDYuMjE2ODggMjQuODkgNi4wOTkzMkMyNC44Mjk0IDUuOTgxNzYgMjQuNzQ1NyA1Ljg3NzU5IDI0LjY0NCA1Ljc5M0wyMi43OTQgNC4yMzZDMjIuNTg3NyA0LjA2MjA4IDIyLjMyMTMgMy45NzYyNCAyMi4wNTIzIDMuOTk3QzIxLjc4MzIgNC4wMTc3NyAyMS41MzMyIDQuMTQzNDggMjEuMzU2IDQuMzQ3TDEzLjE5MSAxMy44QzEzLjE2NzUgMTMuODI3MyAxMy4xMzg0IDEzLjg0OTIgMTMuMTA1NyAxMy44NjQyQzEzLjA3MyAxMy44NzkyIDEzLjAzNzUgMTMuODg2OSAxMy4wMDE1IDEzLjg4NjlDMTIuOTY1NSAxMy44ODY5IDEyLjkzIDEzLjg3OTIgMTIuODk3MyAxMy44NjQyQzEyLjg2NDYgMTMuODQ5MiAxMi44MzU1IDEzLjgyNzMgMTIuODEyIDEzLjhMNC42NDQgNC4zNDZDNC40NjY2OSA0LjE0MzQyIDQuMjE2NTQgNC4wMTkwNiAzLjk0OCA0QzMuODE0ODUgMy45ODgxMyAzLjY4MDY3IDQuMDAzMDggMy41NTM0IDQuMDQzOTZDMy40MjYxMiA0LjA4NDgzIDMuMzA4MzQgNC4xNTA4MiAzLjIwNyA0LjIzOEwxLjM1NiA1Ljc5M0MxLjI1MzcyIDUuODc3NDQgMS4xNjk0OSA1Ljk4MTYxIDEuMTA4MzMgNi4wOTkyOUMxLjA0NzE3IDYuMjE2OTggMS4wMTAzMiA2LjM0NTc3IDEgNi40NzhDMC45ODk5OSA2LjYxMDA0IDEuMDA2OSA2Ljc0Mjc0IDEuMDQ5NyA2Ljg2ODA1QzEuMDkyNSA2Ljk5MzM2IDEuMTYwMzEgNy4xMDg2OCAxLjI0OSA3LjIwN1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jaGV2cm9uLXVwXCIgZGF0YS1uYW1lPVwiY2hldnJvbi11cFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMy43NTEgMTYuNzkzTDEyLjc2NyA0LjMyMkMxMi42Njc1IDQuMjE4MjIgMTIuNTQ4IDQuMTM1NjMgMTIuNDE1OCA0LjA3OTIyQzEyLjI4MzYgNC4wMjI4IDEyLjE0MTMgMy45OTM3MiAxMS45OTc1IDMuOTkzNzJDMTEuODUzNyAzLjk5MzcyIDExLjcxMTQgNC4wMjI4IDExLjU3OTIgNC4wNzkyMkMxMS40NDcgNC4xMzU2MyAxMS4zMjc1IDQuMjE4MjIgMTEuMjI4IDQuMzIyTDAuMjQ4OTk4IDE2Ljc5M0MwLjE2MTE4OCAxNi44OTE5IDAuMDk0MTU5OSAxNy4wMDc1IDAuMDUxODk3NSAxNy4xMzI5QzAuMDA5NjM1MTUgMTcuMjU4MiAtMC4wMDY5OTk2IDE3LjM5MDggMC4wMDI5ODE3MyAxNy41MjI3QzAuMDEyOTYzMSAxNy42NTQ2IDAuMDQ5MzU2OCAxNy43ODMxIDAuMTEgMTcuOTAwN0MwLjE3MDY0NCAxOC4wMTgyIDAuMjU0MyAxOC4xMjI0IDAuMzU1OTk4IDE4LjIwN0wyLjIwNiAxOS43NjRDMi40MTIyOSAxOS45Mzc5IDIuNjc4NyAyMC4wMjM4IDIuOTQ3NzMgMjAuMDAzQzMuMjE2NzYgMTkuOTgyMiAzLjQ2Njg0IDE5Ljg1NjUgMy42NDQgMTkuNjUzTDExLjgwOSAxMC4yQzExLjgzMjUgMTAuMTcyNyAxMS44NjE1IDEwLjE1MDggMTEuODk0MyAxMC4xMzU4QzExLjkyNyAxMC4xMjA4IDExLjk2MjUgMTAuMTEzMSAxMS45OTg1IDEwLjExMzFDMTIuMDM0NSAxMC4xMTMxIDEyLjA3IDEwLjEyMDggMTIuMTAyNyAxMC4xMzU4QzEyLjEzNTQgMTAuMTUwOCAxMi4xNjQ1IDEwLjE3MjcgMTIuMTg4IDEwLjJMMjAuMzU2IDE5LjY1QzIwLjQ0NCAxOS43NTEzIDIwLjU1MTEgMTkuODM0MyAyMC42NzEzIDE5Ljg5NDJDMjAuNzkxNCAxOS45NTQxIDIwLjkyMjEgMTkuOTg5NyAyMS4wNTYgMTkuOTk5QzIxLjE4OTEgMjAuMDEwOSAyMS4zMjMzIDE5Ljk5NTkgMjEuNDUwNiAxOS45NTVDMjEuNTc3OSAxOS45MTQyIDIxLjY5NTcgMTkuODQ4MiAyMS43OTcgMTkuNzYxTDIzLjY0OCAxOC4yMDNDMjMuNzQ5NSAxOC4xMTgyIDIzLjgzMjkgMTguMDE0IDIzLjg5MzQgMTcuODk2NUMyMy45NTM5IDE3Ljc3ODkgMjMuOTkwMiAxNy42NTA0IDI0LjAwMDEgMTcuNTE4NkMyNC4wMTAxIDE3LjM4NjggMjMuOTkzNiAxNy4yNTQzIDIzLjk1MTUgMTcuMTI5QzIzLjkwOTQgMTcuMDAzNyAyMy44NDI1IDE2Ljg4ODEgMjMuNzU1IDE2Ljc4OUwyMy43NTEgMTYuNzkzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNsb3NlXCIgZGF0YS1uYW1lPVwiY2xvc2VcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMC40MzkwMDUgMjEuNDRDMC4xNTc3NDMgMjEuNzIxNCAtMC4wMDAyMTU3NzEgMjIuMTAzIC0wLjAwMDEyMTk5NyAyMi41MDA5Qy0yLjgyMjI5ZS0wNSAyMi44OTg3IDAuMTU4MTEgMjMuMjgwMiAwLjQzOTUwNSAyMy41NjE1QzAuNzIwOSAyMy44NDI4IDEuMTAyNSAyNC4wMDA3IDEuNTAwMzYgMjQuMDAwNkMxLjg5ODIyIDI0LjAwMDUgMi4yNzk3NCAyMy44NDI0IDIuNTYxMDEgMjMuNTYxTDExLjgyMyAxNC4zQzExLjg0NjIgMTQuMjc2NyAxMS44NzM4IDE0LjI1ODIgMTEuOTA0MiAxNC4yNDU2QzExLjkzNDYgMTQuMjMzIDExLjk2NzEgMTQuMjI2NiAxMiAxNC4yMjY2QzEyLjAzMjkgMTQuMjI2NiAxMi4wNjU0IDE0LjIzMyAxMi4wOTU4IDE0LjI0NTZDMTIuMTI2MiAxNC4yNTgyIDEyLjE1MzggMTQuMjc2NyAxMi4xNzcgMTQuM0wyMS40MzkgMjMuNTYzQzIxLjU3ODMgMjMuNzAyMyAyMS43NDM2IDIzLjgxMjkgMjEuOTI1NiAyMy44ODgzQzIyLjEwNzYgMjMuOTYzNyAyMi4zMDI3IDI0LjAwMjYgMjIuNDk5NyAyNC4wMDI2QzIyLjY5NjcgMjQuMDAyNyAyMi44OTE3IDIzLjk2MzkgMjMuMDczOCAyMy44ODg2QzIzLjI1NTggMjMuODEzMiAyMy40MjEyIDIzLjcwMjggMjMuNTYwNSAyMy41NjM1QzIzLjY5OTggMjMuNDI0MiAyMy44MTA0IDIzLjI1ODkgMjMuODg1OCAyMy4wNzY5QzIzLjk2MTIgMjIuODk0OSAyNC4wMDAxIDIyLjY5OTkgMjQuMDAwMSAyMi41MDI5QzI0LjAwMDIgMjIuMzA1OSAyMy45NjE0IDIyLjExMDggMjMuODg2MSAyMS45Mjg4QzIzLjgxMDcgMjEuNzQ2NyAyMy43MDAzIDIxLjU4MTMgMjMuNTYxIDIxLjQ0MkwxNC4zIDEyLjE3N0MxNC4yNzY3IDEyLjE1MzggMTQuMjU4MyAxMi4xMjYyIDE0LjI0NTYgMTIuMDk1OEMxNC4yMzMgMTIuMDY1NCAxNC4yMjY2IDEyLjAzMjkgMTQuMjI2NiAxMkMxNC4yMjY2IDExLjk2NzEgMTQuMjMzIDExLjkzNDYgMTQuMjQ1NiAxMS45MDQyQzE0LjI1ODMgMTEuODczOCAxNC4yNzY3IDExLjg0NjIgMTQuMyAxMS44MjNMMjMuNTYzIDIuNTYxQzIzLjg0NDMgMi4yNzkzNCAyNC4wMDIxIDEuODk3NDkgMjQuMDAxOCAxLjQ5OTQ0QzI0LjAwMTYgMS4xMDEzOSAyMy44NDMyIDAuNzE5NzYyIDIzLjU2MTUgMC40Mzg1QzIzLjI3OTggMC4xNTcyMzggMjIuODk4IC0wLjAwMDYxNTY2NCAyMi40OTk5IC0wLjAwMDMzNDM2NEMyMi4xMDE5IC01LjMwNjQ5ZS0wNSAyMS43MjAzIDAuMTU4MzQgMjEuNDM5IDAuNDRMMTIuMTc3IDkuN0MxMi4xNTM4IDkuNzIzMjggMTIuMTI2MiA5Ljc0MTc1IDEyLjA5NTggOS43NTQzNkMxMi4wNjU0IDkuNzY2OTYgMTIuMDMyOSA5Ljc3MzQ1IDEyIDkuNzczNDVDMTEuOTY3MSA5Ljc3MzQ1IDExLjkzNDYgOS43NjY5NiAxMS45MDQyIDkuNzU0MzZDMTEuODczOCA5Ljc0MTc1IDExLjg0NjIgOS43MjMyOCAxMS44MjMgOS43TDIuNTYxMDEgMC40NEMyLjQyMTc0IDAuMzAwNjY3IDIuMjU2MzkgMC4xOTAxMyAyLjA3NDQxIDAuMTE0Njk4QzEuODkyNDIgMC4wMzkyNjcgMS42OTczNiAwLjAwMDQxOTE0NCAxLjUwMDM2IDAuMDAwMzcyNzE1QzEuMTAyNSAwLjAwMDI3ODk0NyAwLjcyMDkgMC4xNTgyMzggMC40Mzk1MDUgMC40Mzk1QzAuMTU4MTEgMC43MjA3NjIgLTIuODI2MDRlLTA1IDEuMTAyMjkgLTAuMDAwMTIyMDI5IDEuNTAwMTVDLTAuMDAwMjE1Nzk3IDEuODk4IDAuMTU3NzQzIDIuMjc5NjEgMC40MzkwMDUgMi41NjFMOS43IDExLjgyM0M5LjcyMzI5IDExLjg0NjIgOS43NDE3NiAxMS44NzM4IDkuNzU0MzYgMTEuOTA0MkM5Ljc2Njk2IDExLjkzNDYgOS43NzM0NSAxMS45NjcxIDkuNzczNDUgMTJDOS43NzM0NSAxMi4wMzI5IDkuNzY2OTYgMTIuMDY1NCA5Ljc1NDM2IDEyLjA5NThDOS43NDE3NiAxMi4xMjYyIDkuNzIzMjkgMTIuMTUzOCA5LjcgMTIuMTc3TDAuNDM5MDA1IDIxLjQ0WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNvbnRhY3RcIiBkYXRhLW5hbWU9XCJjb250YWN0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTI0LjAwMDEgMjFDMjMuOTk3OSAxOS4wMTE1IDIzLjIwNzEgMTcuMTA1MSAyMS44MDEgMTUuNjk5QzIwLjM5NSAxNC4yOTMgMTguNDg4NSAxMy41MDIxIDE2LjUwMDEgMTMuNUMxNS42OTE2IDEzLjUwMDMgMTQuODg4NiAxMy42MzMgMTQuMTIzMSAxMy44OTNDMTQuMDQyOCAxMy45MTk4IDEzLjk3MDYgMTMuOTY2NSAxMy45MTMzIDE0LjAyODhDMTMuODU2IDE0LjA5MTEgMTMuODE1NSAxNC4xNjcgMTMuNzk1NSAxNC4yNDkyQzEzLjc3NTUgMTQuMzMxNCAxMy43NzY3IDE0LjQxNzQgMTMuNzk5MSAxNC40OTkxQzEzLjgyMTQgMTQuNTgwNyAxMy44NjQgMTQuNjU1MyAxMy45MjMxIDE0LjcxNkMxNS41NzM3IDE2LjM5MTEgMTYuNDk5MyAxOC42NDgzIDE2LjUwMDEgMjFWMjEuMDI0QzE2LjQ5OTEgMjEuMDg2MiAxNi41MTA2IDIxLjE0NzkgMTYuNTMzNyAyMS4yMDU2QzE2LjU1NjkgMjEuMjYzMyAxNi41OTEzIDIxLjMxNTkgMTYuNjM0OSAyMS4zNjAyQzE2LjY3ODYgMjEuNDA0NSAxNi43MzA2IDIxLjQzOTYgMTYuNzg3OSAyMS40NjM2QzE2Ljg0NTMgMjEuNDg3NiAxNi45MDY5IDIxLjUgMTYuOTY5MSAyMS41SDIzLjUwMDFDMjMuNjMyNyAyMS41IDIzLjc1OTggMjEuNDQ3MyAyMy44NTM2IDIxLjM1MzZDMjMuOTQ3NCAyMS4yNTk4IDI0LjAwMDEgMjEuMTMyNiAyNC4wMDAxIDIxWlwiLz48cGF0aCBkPVwiTTEzLjY3NSA1LjUzMDAxQzEzLjgwNzggNS45NDA1NCAxMy45MDEyIDYuMzYyNzggMTMuOTU0IDYuNzkxMDFDMTMuOTYzNCA2Ljg2OTQxIDEzLjk5MTIgNi45NDQ0NiAxNC4wMzUyIDcuMDEwMDNDMTQuMDc5MiA3LjA3NTYxIDE0LjEzODEgNy4xMjk4MyAxNC4yMDcxIDcuMTY4MjZDMTQuMjc2IDcuMjA2NyAxNC4zNTMxIDcuMjI4MjYgMTQuNDMyIDcuMjMxMTdDMTQuNTEwOSA3LjIzNDA4IDE0LjU4OTQgNy4yMTgyNiAxNC42NjEgNy4xODUwMUMxNS4zMjc1IDYuODc1OTcgMTUuOTMwMiA2LjQ0NDg4IDE2LjQzOCA1LjkxNDAxQzE2LjQ2MTQgNS44ODk2MyAxNi40ODk2IDUuODcwMjQgMTYuNTIwNyA1Ljg1Njk5QzE2LjU1MTggNS44NDM3NCAxNi41ODUyIDUuODM2OTEgMTYuNjE5IDUuODM2OTFDMTYuNjUyOCA1LjgzNjkxIDE2LjY4NjMgNS44NDM3NCAxNi43MTc0IDUuODU2OTlDMTYuNzQ4NSA1Ljg3MDI0IDE2Ljc3NjYgNS44ODk2MyAxNi44IDUuOTE0MDFDMTcuNDgwNSA2LjYyNjYyIDE4LjMyOTIgNy4xNTY4NSAxOS4yNjggNy40NTYwMUMxOS4zODE0IDcuNDkyMjUgMTkuNDc4MSA3LjU2Nzc1IDE5LjU0MDggNy42Njg5NEMxOS42MDM1IDcuNzcwMTIgMTkuNjI4MSA3Ljg5MDM1IDE5LjYxIDguMDA4MDFDMTkuNDk5MSA4LjcyNzA5IDE5LjEzNDggOS4zODI4MiAxOC41ODI4IDkuODU2ODVDMTguMDMwOCAxMC4zMzA5IDE3LjMyNzYgMTAuNTkyIDE2LjYgMTAuNTkzQzE2LjE4NzkgMTAuNTkzNCAxNS43OCAxMC41MDk0IDE1LjQwMTYgMTAuMzQ2QzE1LjAyMzIgMTAuMTgyNiAxNC42ODIzIDkuOTQzMzMgMTQuNCA5LjY0MzAxQzE0LjM0MTkgOS41ODE2NCAxNC4yNjkyIDkuNTM2IDE0LjE4ODYgOS41MTAzNkMxNC4xMDgxIDkuNDg0NzIgMTQuMDIyNCA5LjQ3OTkxIDEzLjkzOTUgOS40OTY0QzEzLjg1NjYgOS41MTI4OCAxMy43NzkyIDkuNTUwMSAxMy43MTQ2IDkuNjA0NkMxMy42NSA5LjY1OTA5IDEzLjYwMDIgOS43MjkwOCAxMy41NyA5LjgwODAxQzEzLjQ1MzQgMTAuMTEyNCAxMy4zMTQgMTAuNDA3NiAxMy4xNTMgMTAuNjkxQzEzLjA5NjMgMTAuNzkwMiAxMy4wNzUzIDEwLjkwNTkgMTMuMDkzNSAxMS4wMTg3QzEzLjExMTcgMTEuMTMxNSAxMy4xNjggMTEuMjM0NyAxMy4yNTMgMTEuMzExQzE0LjEzOTYgMTIuMTA5MSAxNS4yODI4IDEyLjU2MyAxNi40NzU0IDEyLjU5MDRDMTcuNjY4IDEyLjYxNzcgMTguODMwOCAxMi4yMTY3IDE5Ljc1MyAxMS40NkMxOS43ODM0IDExLjQzNSAxOS44MTkyIDExLjQxNzUgMTkuODU3NiAxMS40MDlDMTkuODk2IDExLjQwMDQgMTkuOTM1OCAxMS40MDEgMTkuOTczOSAxMS40MTA4QzIwLjAxMiAxMS40MjA1IDIwLjA0NzMgMTEuNDM5MSAyMC4wNzY4IDExLjQ2NUMyMC4xMDY0IDExLjQ5MSAyMC4xMjk0IDExLjUyMzUgMjAuMTQ0IDExLjU2QzIwLjI3MTUgMTEuODk2OSAyMC40MzMgMTIuMjE5OSAyMC42MjYgMTIuNTI0QzIwLjY5NTUgMTIuNjM3OSAyMC43ODcxIDEyLjczNjggMjAuODk1NCAxMi44MTQ4QzIxLjAwMzcgMTIuODkyNyAyMS4xMjY1IDEyLjk0ODIgMjEuMjU2NiAxMi45NzhDMjEuMzg2NyAxMy4wMDc4IDIxLjUyMTQgMTMuMDExMiAyMS42NTI4IDEyLjk4ODFDMjEuNzg0MyAxMi45NjUgMjEuOTA5NyAxMi45MTU4IDIyLjAyMTkgMTIuODQzNUMyMi4xMzQgMTIuNzcxMSAyMi4yMzA1IDEyLjY3NzEgMjIuMzA1NyAxMi41NjY4QzIyLjM4MDkgMTIuNDU2NiAyMi40MzMzIDEyLjMzMjQgMjIuNDU5OCAxMi4yMDE2QzIyLjQ4NjMgMTIuMDcwOSAyMi40ODYzIDExLjkzNjEgMjIuNDU5OSAxMS44MDUzQzIyLjQzMzUgMTEuNjc0NSAyMi4zODEyIDExLjU1MDMgMjIuMzA2IDExLjQ0QzIxLjgzNjIgMTAuNjUzNCAyMS42MDQyIDkuNzQ3NjEgMjEuNjM4IDguODMyMDFWNy41NDYwMUMyMS42NCA2LjU3NjE5IDIxLjM2MTkgNS42MjY0MiAyMC44MzcxIDQuODEwODdDMjAuMzEyMyAzLjk5NTMxIDE5LjU2MzEgMy4zNDg2OSAxOC42Nzk2IDIuOTQ4NzFDMTcuNzk2MSAyLjU0ODczIDE2LjgxNTkgMi40MTI0MiAxNS44NTY4IDIuNTU2MTdDMTQuODk3NiAyLjY5OTkxIDE0LjAwMDQgMy4xMTc2IDEzLjI3MyAzLjc1OTAxQzEzLjE4NjggMy44MzU2NiAxMy4xMjk4IDMuOTM5NzcgMTMuMTExNSA0LjA1MzY3QzEzLjA5MzMgNC4xNjc1OCAxMy4xMTUgNC4yODQyOSAxMy4xNzMgNC4zODQwMUMxMy4zODEyIDQuNzQ2NzkgMTMuNTQ5NSA1LjEzMTAzIDEzLjY3NSA1LjUzMDAxVjUuNTMwMDFaXCIvPjxwYXRoIGQ9XCJNMTIuNSA3LjVDMTIuNSA2LjUxMTEgMTIuMjA2OCA1LjU0NDQgMTEuNjU3MyA0LjcyMjE1QzExLjEwNzkgMy44OTk5MSAxMC4zMjcgMy4yNTkwNCA5LjQxMzQyIDIuODgwNkM4LjQ5OTc5IDIuNTAyMTcgNy40OTQ0NiAyLjQwMzE1IDYuNTI0NTUgMi41OTYwOEM1LjU1NDY1IDIuNzg5IDQuNjYzNzMgMy4yNjUyMSAzLjk2NDQ3IDMuOTY0NDdDMy4yNjUyMSA0LjY2MzczIDIuNzg5IDUuNTU0NjUgMi41OTYwOCA2LjUyNDU1QzIuNDAzMTUgNy40OTQ0NiAyLjUwMjE3IDguNDk5NzkgMi44ODA2IDkuNDEzNDJDMy4yNTkwNCAxMC4zMjcgMy44OTk5MSAxMS4xMDc5IDQuNzIyMTUgMTEuNjU3M0M1LjU0NDQgMTIuMjA2OCA2LjUxMTEgMTIuNSA3LjUgMTIuNUM4LjgyNTYgMTIuNDk4NCAxMC4wOTY0IDExLjk3MTEgMTEuMDMzOCAxMS4wMzM4QzExLjk3MTEgMTAuMDk2NCAxMi40OTg0IDguODI1NiAxMi41IDcuNVY3LjVaTTQuNiA2Ljc1N0M0LjYxOTkyIDYuNjgyMDYgNC42NTY5OSA2LjYxMjc4IDQuNzA4MjkgNi41NTQ2NEM0Ljc1OTYgNi40OTY0OSA0LjgyMzcyIDYuNDUxMDcgNC44OTU1OSA2LjQyMTk3QzQuOTY3NDcgNi4zOTI4NyA1LjA0NTEyIDYuMzgwODkgNS4xMjI0MyA2LjM4Njk3QzUuMTk5NzMgNi4zOTMwNSA1LjI3NDU2IDYuNDE3MDMgNS4zNDEgNi40NTdDNi40Mjg1MyA3LjEzMDcxIDcuNjgwNzMgNy40OTE1OSA4Ljk2IDcuNUM5LjI3MDk2IDcuNDk5NDEgOS41ODE0NiA3LjQ3NjAyIDkuODg5IDcuNDNDOS45NjU5NCA3LjQxODUxIDEwLjA0NDUgNy40MjUxMyAxMC4xMTg0IDcuNDQ5MzNDMTAuMTkyMyA3LjQ3MzUzIDEwLjI1OTYgNy41MTQ2NSAxMC4zMTQ4IDcuNTY5NDFDMTAuMzcwMSA3LjYyNDE3IDEwLjQxMTggNy42OTEwNiAxMC40MzY2IDcuNzY0NzdDMTAuNDYxNSA3LjgzODQ4IDEwLjQ2ODggNy45MTY5NyAxMC40NTggNy45OTRDMTAuMzMyNyA4LjczNTE1IDkuOTMzNjkgOS40MDIyNCA5LjM0MDAxIDkuODYzMjdDOC43NDYzMiAxMC4zMjQzIDguMDAxMiAxMC41NDU3IDcuMjUyMTEgMTAuNDgzNUM2LjUwMzAxIDEwLjQyMTQgNS44MDQ1MiAxMC4wODA0IDUuMjk0ODcgOS41Mjc4N0M0Ljc4NTIyIDguOTc1MzYgNC41MDE1NiA4LjI1MTY3IDQuNSA3LjVDNC41MDAzNyA3LjI0OTAxIDQuNTMzOTkgNi45OTkxNiA0LjYgNi43NTdWNi43NTdaXCIvPjxwYXRoIGQ9XCJNMTUgMjFDMTUgMTkuMDEwOSAxNC4yMDk4IDE3LjEwMzIgMTIuODAzMyAxNS42OTY3QzExLjM5NjggMTQuMjkwMiA5LjQ4OTEyIDEzLjUgNy41IDEzLjVDNS41MTA4OCAxMy41IDMuNjAzMjIgMTQuMjkwMiAyLjE5NjcgMTUuNjk2N0MwLjc5MDE3NiAxNy4xMDMyIDAgMTkuMDEwOSAwIDIxQzAgMjEuMTMyNiAwLjA1MjY3ODQgMjEuMjU5OCAwLjE0NjQ0NyAyMS4zNTM2QzAuMjQwMjE1IDIxLjQ0NzMgMC4zNjczOTIgMjEuNSAwLjUgMjEuNUgxNC41QzE0LjYzMjYgMjEuNSAxNC43NTk4IDIxLjQ0NzMgMTQuODUzNiAyMS4zNTM2QzE0Ljk0NzMgMjEuMjU5OCAxNSAyMS4xMzI2IDE1IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRhc2hib2FyZFwiIGRhdGEtbmFtZT1cImRhc2hib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMiAwQzkuNjI2NjMgMCA3LjMwNjU1IDAuNzAzNzg4IDUuMzMzMTYgMi4wMjIzNkMzLjM1OTc3IDMuMzQwOTQgMS44MjE3IDUuMjE1MDkgMC45MTM0NTEgNy40MDc4QzAuMDA1MTk5NDMgOS42MDA1MSAtMC4yMzI0NDEgMTIuMDEzMyAwLjIzMDU4MiAxNC4zNDExQzAuNjkzNjA1IDE2LjY2ODkgMS44MzY0OSAxOC44MDcxIDMuNTE0NzIgMjAuNDg1M0M1LjE5Mjk1IDIyLjE2MzUgNy4zMzExNSAyMy4zMDY0IDkuNjU4OTIgMjMuNzY5NEMxMS45ODY3IDI0LjIzMjQgMTQuMzk5NSAyMy45OTQ4IDE2LjU5MjIgMjMuMDg2NkMxOC43ODQ5IDIyLjE3ODMgMjAuNjU5MSAyMC42NDAyIDIxLjk3NzYgMTguNjY2OEMyMy4yOTYyIDE2LjY5MzUgMjQgMTQuMzczNCAyNCAxMkMyMy45OTY2IDguODE4NDYgMjIuNzMxMiA1Ljc2ODIxIDIwLjQ4MTUgMy41MTg1MkMxOC4yMzE4IDEuMjY4ODMgMTUuMTgxNSAwLjAwMzQ0MTA4IDEyIDBWMFpNNS4xNDUwMSA4LjkxTDQuMjc5MDEgOC40MUM0LjEwNjYxIDguMzEwNTQgMy45ODA3OSA4LjE0NjY4IDMuOTI5MjIgNy45NTQ0NUMzLjg3NzY1IDcuNzYyMjMgMy45MDQ1NSA3LjU1NzM5IDQuMDA0MDEgNy4zODVDNC4xMDM0NiA3LjIxMjYxIDQuMjY3MzMgNy4wODY3OSA0LjQ1OTU1IDcuMDM1MjJDNC42NTE3OCA2Ljk4MzY0IDQuODU2NjEgNy4wMTA1NCA1LjAyOTAxIDcuMTFMNS44OTUwMSA3LjYxQzYuMDM4MyA3LjY5MjQ5IDYuMTUwMzIgNy44MjAwMSA2LjIxMzY1IDcuOTcyNzRDNi4yNzY5OCA4LjEyNTQ4IDYuMjg4MDYgOC4yOTQ4NiA2LjI0NTE3IDguNDU0NTRDNi4yMDIyOSA4LjYxNDIyIDYuMTA3ODQgOC43NTUyNSA1Ljk3NjUxIDguODU1NzFDNS44NDUxOSA4Ljk1NjE2IDUuNjg0MzUgOS4wMTA0MSA1LjUxOTAxIDkuMDFDNS4zODc2NiA5LjAxMDU0IDUuMjU4NTUgOC45NzYwMiA1LjE0NTAxIDguOTFWOC45MVpNNS4yNTAwMSAxMS45OTFDNS4yNTAwMSAxMi4xODk5IDUuMTcwOTkgMTIuMzgwNyA1LjAzMDM0IDEyLjUyMTNDNC44ODk2OCAxMi42NjIgNC42OTg5MiAxMi43NDEgNC41MDAwMSAxMi43NDFIMy41MDAwMUMzLjMwMTA5IDEyLjc0MSAzLjExMDMzIDEyLjY2MiAyLjk2OTY4IDEyLjUyMTNDMi44MjkwMiAxMi4zODA3IDIuNzUwMDEgMTIuMTg5OSAyLjc1MDAxIDExLjk5MUMyLjc1MDAxIDExLjc5MjEgMi44MjkwMiAxMS42MDEzIDIuOTY5NjggMTEuNDYwN0MzLjExMDMzIDExLjMyIDMuMzAxMDkgMTEuMjQxIDMuNTAwMDEgMTEuMjQxSDQuNTAwMDFDNC42OTg5MiAxMS4yNDEgNC44ODk2OCAxMS4zMiA1LjAzMDM0IDExLjQ2MDdDNS4xNzA5OSAxMS42MDEzIDUuMjUwMDEgMTEuNzkyMSA1LjI1MDAxIDExLjk5MVpNMTQuMjQgMTJDMTQuMjQgMTIuNDQ1IDE0LjEwOCAxMi44OCAxMy44NjA4IDEzLjI1QzEzLjYxMzYgMTMuNjIgMTMuMjYyMiAxMy45MDg0IDEyLjg1MSAxNC4wNzg3QzEyLjQzOTkgMTQuMjQ5IDExLjk4NzUgMTQuMjkzNiAxMS41NTExIDE0LjIwNjhDMTEuMTE0NiAxNC4xMiAxMC43MTM3IDEzLjkwNTcgMTAuMzk5IDEzLjU5MUMxMC4wODQzIDEzLjI3NjMgOS44NzAwNiAxMi44NzU0IDkuNzgzMjQgMTIuNDM5QzkuNjk2NDIgMTIuMDAyNSA5Ljc0MDk4IDExLjU1MDEgOS45MTEyOCAxMS4xMzlDMTAuMDgxNiAxMC43Mjc4IDEwLjM3IDEwLjM3NjQgMTAuNzQgMTAuMTI5MkMxMS4xMSA5Ljg4MTk2IDExLjU0NSA5Ljc1IDExLjk5IDkuNzVDMTIuMDE1NCA5Ljc1MDE0IDEyLjA0MDggOS43NTE4MSAxMi4wNjYgOS43NTVDMTIuMTExMiA5Ljc1OTU1IDEyLjE1NjcgOS43NTE3MSAxMi4xOTc4IDkuNzMyMzNDMTIuMjM4OCA5LjcxMjk1IDEyLjI3MzggOS42ODI3NiAxMi4yOTkgOS42NDVMMTUuNjk5IDQuNTcxQzE1Ljc3MTkgNC40NjEyOCAxNS44NjU3IDQuMzY3MDQgMTUuOTc1MSA0LjI5MzY5QzE2LjA4NDUgNC4yMjAzMyAxNi4yMDczIDQuMTY5MyAxNi4zMzY0IDQuMTQzNTRDMTYuNDY1NiA0LjExNzc3IDE2LjU5ODYgNC4xMTc3OCAxNi43Mjc3IDQuMTQzNTVDMTYuODU2OSA0LjE2OTMyIDE2Ljk3OTcgNC4yMjAzNSAxNy4wODkgNC4yOTM3MUMxNy4xOTg0IDQuMzY3MDcgMTcuMjkyMiA0LjQ2MTMxIDE3LjM2NTEgNC41NzEwM0MxNy40MzggNC42ODA3NSAxNy40ODg0IDQuODAzNzggMTcuNTEzNiA0LjkzMzA2QzE3LjUzODggNS4wNjIzMyAxNy41MzgyIDUuMTk1MzEgMTcuNTExOCA1LjMyNDM1QzE3LjQ4NTUgNS40NTMzOSAxNy40MzM5IDUuNTc1OTUgMTcuMzYgNS42ODVMMTMuOTkzIDEwLjcxQzEzLjk2NzkgMTAuNzQ3NSAxMy45NTM1IDEwLjc5MTEgMTMuOTUxMiAxMC44MzYyQzEzLjk0ODkgMTAuODgxMyAxMy45NTg5IDEwLjkyNjEgMTMuOTggMTAuOTY2QzE0LjE0OTYgMTEuMjg0MyAxNC4yMzg5IDExLjYzOTMgMTQuMjQgMTJWMTJaTTEyLjc1OCA0LjU1OEMxMi43NTggNC43NTY5MSAxMi42NzkgNC45NDc2OCAxMi41MzgzIDUuMDg4MzNDMTIuMzk3NyA1LjIyODk4IDEyLjIwNjkgNS4zMDggMTIuMDA4IDUuMzA4QzExLjgwOTEgNS4zMDggMTEuNjE4MyA1LjIyODk4IDExLjQ3NzcgNS4wODgzM0MxMS4zMzcgNC45NDc2OCAxMS4yNTggNC43NTY5MSAxMS4yNTggNC41NThWMy41NThDMTEuMjU4IDMuMzU5MDkgMTEuMzM3IDMuMTY4MzIgMTEuNDc3NyAzLjAyNzY3QzExLjYxODMgMi44ODcwMiAxMS44MDkxIDIuODA4IDEyLjAwOCAyLjgwOEMxMi4yMDY5IDIuODA4IDEyLjM5NzcgMi44ODcwMiAxMi41MzgzIDMuMDI3NjdDMTIuNjc5IDMuMTY4MzIgMTIuNzU4IDMuMzU5MDkgMTIuNzU4IDMuNTU4VjQuNTU4Wk03LjM5MzAxIDQuMDI1QzcuNDc4MjQgMy45NzU1OSA3LjU3MjQgMy45NDM1IDcuNjcwMDcgMy45MzA1OUM3Ljc2Nzc0IDMuOTE3NjcgNy44NjcgMy45MjQxNyA3Ljk2MjE1IDMuOTQ5NzNDOC4wNTczIDMuOTc1MjggOC4xNDY0NiA0LjAxOTM4IDguMjI0NTIgNC4wNzk0OUM4LjMwMjU4IDQuMTM5NiA4LjM2Nzk5IDQuMjE0NTQgOC40MTcwMSA0LjNMOC45MTcwMSA1LjE2NkM4Ljk2NjQ2IDUuMjUxMTggOC45OTg2IDUuMzQ1MjggOS4wMTE1OSA1LjQ0MjkxQzkuMDI0NTggNS41NDA1NCA5LjAxODE2IDUuNjM5NzcgOC45OTI3MSA1LjczNDkxQzguOTY3MjUgNS44MzAwNiA4LjkyMzI1IDUuOTE5MjQgOC44NjMyNCA1Ljk5NzMzQzguODAzMjMgNi4wNzU0MyA4LjcyODM5IDYuMTQwOSA4LjY0MzAxIDYuMTlDOC41Mjk0NiA2LjI1NjAyIDguNDAwMzUgNi4yOTA1NCA4LjI2OTAxIDYuMjlDOC4xMzcyMyA2LjI5MDI5IDguMDA3NzIgNi4yNTU3NiA3Ljg5MzU4IDYuMTg5OTFDNy43Nzk0NCA2LjEyNDA2IDcuNjg0NzIgNi4wMjkyMiA3LjYxOTAxIDUuOTE1TDcuMTE5MDEgNS4wNDlDNy4wNjk2OSA0Ljk2Mzc5IDcuMDM3NjUgNC44Njk2OSA3LjAyNDczIDQuNzcyMDlDNy4wMTE4MSA0LjY3NDQ5IDcuMDE4MjYgNC41NzUzIDcuMDQzNzEgNC40ODAxOUM3LjA2OTE2IDQuMzg1MDkgNy4xMTMxIDQuMjk1OTMgNy4xNzMwNCA0LjIxNzgyQzcuMjMyOTggNC4xMzk3MiA3LjMwNzcyIDQuMDc0MTkgNy4zOTMwMSA0LjAyNVY0LjAyNVpNNy41MDAwMSAxN0M3LjUwMDAxIDE2Ljg2NzQgNy41NTI2OCAxNi43NDAyIDcuNjQ2NDUgMTYuNjQ2NEM3Ljc0MDIyIDE2LjU1MjcgNy44Njc0IDE2LjUgOC4wMDAwMSAxNi41SDE2QzE2LjEzMjYgMTYuNSAxNi4yNTk4IDE2LjU1MjcgMTYuMzUzNiAxNi42NDY0QzE2LjQ0NzMgMTYuNzQwMiAxNi41IDE2Ljg2NzQgMTYuNSAxN1YxOUMxNi41IDE5LjEzMjYgMTYuNDQ3MyAxOS4yNTk4IDE2LjM1MzYgMTkuMzUzNkMxNi4yNTk4IDE5LjQ0NzMgMTYuMTMyNiAxOS41IDE2IDE5LjVIOC4wMDAwMUM3Ljg2NzQgMTkuNSA3Ljc0MDIyIDE5LjQ0NzMgNy42NDY0NSAxOS4zNTM2QzcuNTUyNjggMTkuMjU5OCA3LjUwMDAxIDE5LjEzMjYgNy41MDAwMSAxOVYxN1pNMTcuODA5IDguN0MxNy43MDk3IDguNTI3ODUgMTcuNjgyNyA4LjMyMzMgMTcuNzM0MSA4LjEzMTNDMTcuNzg1NSA3LjkzOTMgMTcuOTExIDcuNzc1NTQgMTguMDgzIDcuNjc2TDE4Ljk0OSA3LjE3NkMxOS4xMjE0IDcuMDc2NTQgMTkuMzI2MiA3LjA0OTY0IDE5LjUxODUgNy4xMDEyMkMxOS43MTA3IDcuMTUyNzkgMTkuODc0NiA3LjI3ODYxIDE5Ljk3NCA3LjQ1MUMyMC4wNzM1IDcuNjIzMzkgMjAuMTAwNCA3LjgyODIzIDIwLjA0ODggOC4wMjA0NUMxOS45OTcyIDguMjEyNjggMTkuODcxNCA4LjM3NjU0IDE5LjY5OSA4LjQ3NkwxOC44MzIgOC45NzZDMTguNjU5NyA5LjA3NDg1IDE4LjQ1NTIgOS4xMDEzMSAxOC4yNjM0IDkuMDQ5NTZDMTguMDcxNiA4Ljk5NzgyIDE3LjkwODIgOC44NzIxIDE3LjgwOSA4LjdaTTE4LjY5IDEyLjA2NUMxOC42OSAxMS44NjYxIDE4Ljc2OSAxMS42NzUzIDE4LjkwOTcgMTEuNTM0N0MxOS4wNTAzIDExLjM5NCAxOS4yNDExIDExLjMxNSAxOS40NCAxMS4zMTVIMjAuNDRDMjAuNjM4OSAxMS4zMTUgMjAuODI5NyAxMS4zOTQgMjAuOTcwMyAxMS41MzQ3QzIxLjExMSAxMS42NzUzIDIxLjE5IDExLjg2NjEgMjEuMTkgMTIuMDY1QzIxLjE5IDEyLjI2MzkgMjEuMTExIDEyLjQ1NDcgMjAuOTcwMyAxMi41OTUzQzIwLjgyOTcgMTIuNzM2IDIwLjYzODkgMTIuODE1IDIwLjQ0IDEyLjgxNUgxOS40NEMxOS4yNDEzIDEyLjgxNSAxOS4wNTA3IDEyLjczNjEgMTguOTEgMTIuNTk1N0MxOC43Njk0IDEyLjQ1NTIgMTguNjkwMyAxMi4yNjQ3IDE4LjY5IDEyLjA2NlYxMi4wNjVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZnVlbFwiIGRhdGEtbmFtZT1cImZ1ZWxcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMy45OSAzLjM1ODU4QzI0LjAyNzUgMy42MjExMyAyMy45NTkxIDMuODg3ODMgMjMuOCA0LjFMMjEuNzUgNi44MzNWOEgyM0MyMy4xMzI2IDggMjMuMjU5OCA4LjA1MjY4IDIzLjM1MzYgOC4xNDY0NUMyMy40NDczIDguMjQwMjEgMjMuNSA4LjM2NzM5IDIzLjUgOC41VjExQzIzLjUgMTEuMDgyMyAyMy40Nzk2IDExLjE2MzQgMjMuNDQwNyAxMS4yMzZDMjMuNDAxOCAxMS4zMDg1IDIzLjM0NTYgMTEuMzcwNCAyMy4yNzcgMTEuNDE2TDIxLjc3NyAxMi40MTZMMjEuNzUgMTIuNDMzVjE1LjVDMjEuNzUgMTYuMjk1NiAyMS40MzM5IDE3LjA1ODcgMjAuODcxMyAxNy42MjEzQzIwLjMwODcgMTguMTgzOSAxOS41NDU2IDE4LjUgMTguNzUgMTguNUgxOC41QzE4LjM2NzQgMTguNSAxOC4yNDAyIDE4LjU1MjcgMTguMTQ2NCAxOC42NDY0QzE4LjA1MjcgMTguNzQwMiAxOCAxOC44Njc0IDE4IDE5VjIyLjVDMTggMjIuODk3OCAxNy44NDIgMjMuMjc5NCAxNy41NjA3IDIzLjU2MDdDMTcuMjc5NCAyMy44NDIgMTYuODk3OCAyNCAxNi41IDI0SDMuNUMzLjEwMjE4IDI0IDIuNzIwNjQgMjMuODQyIDIuNDM5MzQgMjMuNTYwN0MyLjE1ODA0IDIzLjI3OTQgMiAyMi44OTc4IDIgMjIuNVYxLjVDMiAxLjEwMjE4IDIuMTU4MDQgMC43MjA2NDQgMi40MzkzNCAwLjQzOTM0QzIuNzIwNjQgMC4xNTgwMzUgMy4xMDIxOCAwIDMuNSAwSDE2LjVDMTYuODk3OCAwIDE3LjI3OTQgMC4xNTgwMzUgMTcuNTYwNyAwLjQzOTM0QzE3Ljg0MiAwLjcyMDY0NCAxOCAxLjEwMjE4IDE4IDEuNVYxNkMxOCAxNi4xMzI2IDE4LjA1MjcgMTYuMjU5OCAxOC4xNDY0IDE2LjM1MzZDMTguMjQwMiAxNi40NDczIDE4LjM2NzQgMTYuNSAxOC41IDE2LjVIMTguNzVDMTkuMDE1MiAxNi41IDE5LjI2OTYgMTYuMzk0NiAxOS40NTcxIDE2LjIwNzFDMTkuNjQ0NiAxNi4wMTk2IDE5Ljc1IDE1Ljc2NTIgMTkuNzUgMTUuNVY2LjVDMTkuNzUgNi4yODM2MyAxOS44MjAyIDYuMDczMSAxOS45NSA1LjlMMjIuMiAyLjlDMjIuMzU5MSAyLjY4NzgzIDIyLjU5NiAyLjU0NzU2IDIyLjg1ODYgMi41MTAwNUMyMi45ODg2IDIuNDkxNDggMjMuMTIxIDIuNDk4NjkgMjMuMjQ4MiAyLjUzMTI5QzIzLjM3NTQgMi41NjM4OCAyMy40OTQ5IDIuNjIxMjEgMjMuNiAyLjdDMjMuODEyMiAyLjg1OTEzIDIzLjk1MjQgMy4wOTYwMyAyMy45OSAzLjM1ODU4Wk0xNS44NTM2IDcuODUzNTVDMTUuOTQ3MyA3Ljc1OTc5IDE2IDcuNjMyNjEgMTYgNy41VjIuNUMxNiAyLjM2NzM5IDE1Ljk0NzMgMi4yNDAyMSAxNS44NTM2IDIuMTQ2NDVDMTUuNzU5OCAyLjA1MjY4IDE1LjYzMjYgMiAxNS41IDJINC41QzQuMzY3MzkgMiA0LjI0MDIxIDIuMDUyNjggNC4xNDY0NSAyLjE0NjQ1QzQuMDUyNjggMi4yNDAyMSA0IDIuMzY3MzkgNCAyLjVWNy41QzQgNy42MzI2MSA0LjA1MjY4IDcuNzU5NzkgNC4xNDY0NSA3Ljg1MzU1QzQuMjQwMjEgNy45NDczMiA0LjM2NzM5IDggNC41IDhIMTUuNUMxNS42MzI2IDggMTUuNzU5OCA3Ljk0NzMyIDE1Ljg1MzYgNy44NTM1NVpNMTMgMTFDMTIuNDQ3NyAxMSAxMiAxMS40NDc3IDEyIDEyVjE2QzEyIDE2LjU1MjMgMTIuNDQ3NyAxNyAxMyAxN0gxNEMxNC41NTIzIDE3IDE1IDE2LjU1MjMgMTUgMTZWMTJDMTUgMTEuNDQ3NyAxNC41NTIzIDExIDE0IDExSDEzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWluc3BlY3Rpb25cIiBkYXRhLW5hbWU9XCJpbnNwZWN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEyIDBDOS42MjY2MyAwIDcuMzA2NTUgMC43MDM3ODggNS4zMzMxNiAyLjAyMjM2QzMuMzU5NzcgMy4zNDA5NCAxLjgyMTcgNS4yMTUwOSAwLjkxMzQ1MSA3LjQwNzhDMC4wMDUxOTk0MyA5LjYwMDUxIC0wLjIzMjQ0MSAxMi4wMTMzIDAuMjMwNTgyIDE0LjM0MTFDMC42OTM2MDUgMTYuNjY4OSAxLjgzNjQ5IDE4LjgwNzEgMy41MTQ3MiAyMC40ODUzQzUuMTkyOTUgMjIuMTYzNSA3LjMzMTE1IDIzLjMwNjQgOS42NTg5MiAyMy43Njk0QzExLjk4NjcgMjQuMjMyNCAxNC4zOTk1IDIzLjk5NDggMTYuNTkyMiAyMy4wODY2QzE4Ljc4NDkgMjIuMTc4MyAyMC42NTkxIDIwLjY0MDIgMjEuOTc3NiAxOC42NjY4QzIzLjI5NjIgMTYuNjkzNSAyNCAxNC4zNzM0IDI0IDEyQzIzLjk5NjMgOC44MTg1NCAyMi43MzA4IDUuNzY4NDQgMjAuNDgxMiAzLjUxODgxQzE4LjIzMTYgMS4yNjkxOCAxNS4xODE1IDAuMDAzNzA1MjIgMTIgMFYwWk0xOC45MjcgOC4yTDEyLjA4MiAxNy40ODlDMTIuMDAxMiAxNy41OTYyIDExLjg5OTggMTcuNjg2MyAxMS43ODM4IDE3Ljc1MzlDMTEuNjY3OCAxNy44MjE1IDExLjUzOTUgMTcuODY1NCAxMS40MDY0IDE3Ljg4MjlDMTEuMjczMyAxNy45MDA0IDExLjEzOCAxNy44OTEyIDExLjAwODUgMTcuODU1OEMxMC44NzkgMTcuODIwNSAxMC43NTc4IDE3Ljc1OTcgMTAuNjUyIDE3LjY3N0w1Ljc2NDAxIDEzLjc2OUM1LjY2MTQ0IDEzLjY4NjkgNS41NzYwNSAxMy41ODU1IDUuNTEyNyAxMy40NzA0QzUuNDQ5MzYgMTMuMzU1MyA1LjQwOTMgMTMuMjI4OSA1LjM5NDgxIDEzLjA5ODNDNS4zNjU1NiAxMi44MzQ2IDUuNDQyMjQgMTIuNTcwMSA1LjYwODAxIDEyLjM2M0M1Ljc3Mzc3IDEyLjE1NTkgNi4wMTUwMiAxMi4wMjMxIDYuMjc4NyAxMS45OTM4QzYuNTQyMzcgMTEuOTY0NiA2LjgwNjg3IDEyLjA0MTIgNy4wMTQwMSAxMi4yMDdMMTEuMDkgMTUuNDY4TDE3LjMxNyA3LjAxN0MxNy4zOTIgNi45MDQ1MSAxNy40ODkgNi44MDgzOCAxNy42MDIxIDYuNzM0NDNDMTcuNzE1MyA2LjY2MDQ4IDE3Ljg0MjMgNi42MTAyNSAxNy45NzU0IDYuNTg2NzZDMTguMTA4NSA2LjU2MzI3IDE4LjI0NSA2LjU2NzAyIDE4LjM3NjcgNi41OTc3N0MxOC41MDgzIDYuNjI4NTMgMTguNjMyMyA2LjY4NTY1IDE4Ljc0MTMgNi43NjU3QzE4Ljg1MDIgNi44NDU3NCAxOC45NDE4IDYuOTQ3MDUgMTkuMDEwNSA3LjA2MzQ4QzE5LjA3OTIgNy4xNzk5MiAxOS4xMjM1IDcuMzA5MDcgMTkuMTQwOSA3LjQ0MzEzQzE5LjE1ODIgNy41NzcxOSAxOS4xNDgyIDcuNzEzMzkgMTkuMTExNSA3Ljg0MzQ3QzE5LjA3NDcgNy45NzM1NiAxOS4wMTIgOC4wOTQ4NSAxOC45MjcgOC4yWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWlzc3VlXCIgZGF0YS1uYW1lPVwiaXNzdWVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMgMTAuNTg2TDEzLjQxNCAxQzEzLjAzODkgMC42MjUwNTkgMTIuNTMwMyAwLjQxNDQyOSAxMiAwLjQxNDQyOUMxMS40Njk3IDAuNDE0NDI5IDEwLjk2MTEgMC42MjUwNTkgMTAuNTg2IDFMMSAxMC41ODdDMC42MjUwNTkgMTAuOTYyMSAwLjQxNDQyOSAxMS40NzA3IDAuNDE0NDI5IDEyLjAwMUMwLjQxNDQyOSAxMi41MzEzIDAuNjI1MDU5IDEzLjAzOTkgMSAxMy40MTVMMTAuNTg2IDIzQzEwLjk2MTEgMjMuMzc0OSAxMS40Njk3IDIzLjU4NTYgMTIgMjMuNTg1NkMxMi41MzAzIDIzLjU4NTYgMTMuMDM4OSAyMy4zNzQ5IDEzLjQxNCAyM0wyMyAxMy40MTVDMjMuMTg1OCAxMy4yMjkzIDIzLjMzMzIgMTMuMDA4OCAyMy40MzM4IDEyLjc2NjFDMjMuNTM0MyAxMi41MjM0IDIzLjU4NjEgMTIuMjYzMiAyMy41ODYxIDEyLjAwMDVDMjMuNTg2MSAxMS43Mzc4IDIzLjUzNDMgMTEuNDc3NyAyMy40MzM4IDExLjIzNDlDMjMuMzMzMiAxMC45OTIyIDIzLjE4NTggMTAuNzcxNyAyMyAxMC41ODZaTTExLjA2OCA2LjQxN0MxMS4wNjggNi4xNTE3OCAxMS4xNzM0IDUuODk3NDMgMTEuMzYwOSA1LjcwOTg5QzExLjU0ODQgNS41MjIzNiAxMS44MDI4IDUuNDE3IDEyLjA2OCA1LjQxN0MxMi4zMzMyIDUuNDE3IDEyLjU4NzYgNS41MjIzNiAxMi43NzUxIDUuNzA5ODlDMTIuOTYyNiA1Ljg5NzQzIDEzLjA2OCA2LjE1MTc4IDEzLjA2OCA2LjQxN1YxMi40MTdDMTMuMDY4IDEyLjY4MjIgMTIuOTYyNiAxMi45MzY2IDEyLjc3NTEgMTMuMTI0MUMxMi41ODc2IDEzLjMxMTYgMTIuMzMzMiAxMy40MTcgMTIuMDY4IDEzLjQxN0MxMS44MDI4IDEzLjQxNyAxMS41NDg0IDEzLjMxMTYgMTEuMzYwOSAxMy4xMjQxQzExLjE3MzQgMTIuOTM2NiAxMS4wNjggMTIuNjgyMiAxMS4wNjggMTIuNDE3VjYuNDE3Wk0xMi4xMTkgMTcuOTI3SDEyLjA5MUMxMS42OTY3IDE3LjkyNTUgMTEuMzE4MyAxNy43NzE3IDExLjAzNDYgMTcuNDk3OEMxMC43NTEgMTcuMjIzOSAxMC41ODQyIDE2Ljg1MSAxMC41NjkgMTYuNDU3QzEwLjU2MTcgMTYuMjYxIDEwLjU5MzUgMTYuMDY1NSAxMC42NjI2IDE1Ljg4MTlDMTAuNzMxOCAxNS42OTgzIDEwLjgzNjggMTUuNTMwNCAxMC45NzE3IDE1LjM4NzlDMTEuMTA2NSAxNS4yNDU0IDExLjI2ODQgMTUuMTMxMyAxMS40NDc5IDE1LjA1MjFDMTEuNjI3NCAxNC45NzMgMTEuODIwOSAxNC45MzA1IDEyLjAxNyAxNC45MjdIMTIuMDQ1QzEyLjQzOTQgMTQuOTI4IDEyLjgxODIgMTUuMDgxNiAxMy4xMDE5IDE1LjM1NTZDMTMuMzg1NiAxNS42Mjk3IDEzLjU1MjMgMTYuMDAyOCAxMy41NjcgMTYuMzk3QzEzLjU3NDMgMTYuNTkzIDEzLjU0MjUgMTYuNzg4NSAxMy40NzM0IDE2Ljk3MjFDMTMuNDA0MiAxNy4xNTU3IDEzLjI5OTIgMTcuMzIzNiAxMy4xNjQzIDE3LjQ2NjFDMTMuMDI5NSAxNy42MDg2IDEyLjg2NzYgMTcuNzIyNyAxMi42ODgxIDE3LjgwMTlDMTIuNTA4NiAxNy44ODEgMTIuMzE1MSAxNy45MjM1IDEyLjExOSAxNy45MjdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbGVhZGVyYm9hcmRcIiBkYXRhLW5hbWU9XCJsZWFkZXJib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk01LjUgOS41SDEuNUMxLjEwMjE4IDkuNSAwLjcyMDY0NCA5LjY1ODA0IDAuNDM5MzQgOS45MzkzNEMwLjE1ODAzNSAxMC4yMjA2IDAgMTAuNjAyMiAwIDExTDAgMjBDMCAyMC4zOTc4IDAuMTU4MDM1IDIwLjc3OTQgMC40MzkzNCAyMS4wNjA3QzAuNzIwNjQ0IDIxLjM0MiAxLjEwMjE4IDIxLjUgMS41IDIxLjVINS41QzUuNjMyNjEgMjEuNSA1Ljc1OTc5IDIxLjQ0NzMgNS44NTM1NSAyMS4zNTM2QzUuOTQ3MzIgMjEuMjU5OCA2IDIxLjEzMjYgNiAyMVYxMEM2IDkuODY3MzkgNS45NDczMiA5Ljc0MDIxIDUuODUzNTUgOS42NDY0NUM1Ljc1OTc5IDkuNTUyNjggNS42MzI2MSA5LjUgNS41IDkuNVpcIi8+PHBhdGggZD1cIk0yMi41IDEzLjVIMTguNUMxOC4zNjc0IDEzLjUgMTguMjQwMiAxMy41NTI3IDE4LjE0NjQgMTMuNjQ2NEMxOC4wNTI3IDEzLjc0MDIgMTggMTMuODY3NCAxOCAxNFYyMUMxOCAyMS4xMzI2IDE4LjA1MjcgMjEuMjU5OCAxOC4xNDY0IDIxLjM1MzZDMTguMjQwMiAyMS40NDczIDE4LjM2NzQgMjEuNSAxOC41IDIxLjVIMjIuNUMyMi44OTc4IDIxLjUgMjMuMjc5NCAyMS4zNDIgMjMuNTYwNyAyMS4wNjA3QzIzLjg0MiAyMC43Nzk0IDI0IDIwLjM5NzggMjQgMjBWMTVDMjQgMTQuNjAyMiAyMy44NDIgMTQuMjIwNiAyMy41NjA3IDEzLjkzOTNDMjMuMjc5NCAxMy42NTggMjIuODk3OCAxMy41IDIyLjUgMTMuNVpcIi8+PHBhdGggZD1cIk0xNSAyLjVIOUM4LjYwMjE4IDIuNSA4LjIyMDY0IDIuNjU4MDQgNy45MzkzNCAyLjkzOTM0QzcuNjU4MDQgMy4yMjA2NCA3LjUgMy42MDIxOCA3LjUgNFYyMUM3LjUgMjEuMTMyNiA3LjU1MjY4IDIxLjI1OTggNy42NDY0NSAyMS4zNTM2QzcuNzQwMjEgMjEuNDQ3MyA3Ljg2NzM5IDIxLjUgOCAyMS41SDE2QzE2LjEzMjYgMjEuNSAxNi4yNTk4IDIxLjQ0NzMgMTYuMzUzNiAyMS4zNTM2QzE2LjQ0NzMgMjEuMjU5OCAxNi41IDIxLjEzMjYgMTYuNSAyMVY0QzE2LjUgMy42MDIxOCAxNi4zNDIgMy4yMjA2NCAxNi4wNjA3IDIuOTM5MzRDMTUuNzc5NCAyLjY1ODA0IDE1LjM5NzggMi41IDE1IDIuNVpNMTMgMTAuNzVIMTFDMTAuODAxMSAxMC43NSAxMC42MTAzIDEwLjY3MSAxMC40Njk3IDEwLjUzMDNDMTAuMzI5IDEwLjM4OTcgMTAuMjUgMTAuMTk4OSAxMC4yNSAxMEMxMC4yNSA5LjgwMTA5IDEwLjMyOSA5LjYxMDMyIDEwLjQ2OTcgOS40Njk2N0MxMC42MTAzIDkuMzI5MDIgMTAuODAxMSA5LjI1IDExIDkuMjVDMTEuMDY2MyA5LjI1IDExLjEyOTkgOS4yMjM2NiAxMS4xNzY4IDkuMTc2NzhDMTEuMjIzNyA5LjEyOTg5IDExLjI1IDkuMDY2MyAxMS4yNSA5VjdDMTEuMjUgNi45MzM3IDExLjIyMzcgNi44NzAxMSAxMS4xNzY4IDYuODIzMjJDMTEuMTI5OSA2Ljc3NjM0IDExLjA2NjMgNi43NSAxMSA2Ljc1QzEwLjgwMTEgNi43NSAxMC42MTAzIDYuNjcwOTggMTAuNDY5NyA2LjUzMDMzQzEwLjMyOSA2LjM4OTY4IDEwLjI1IDYuMTk4OTEgMTAuMjUgNkMxMC4yNSA1LjgwMTA5IDEwLjMyOSA1LjYxMDMyIDEwLjQ2OTcgNS40Njk2N0MxMC42MTAzIDUuMzI5MDIgMTAuODAxMSA1LjI1IDExIDUuMjVIMTEuNUMxMS44MzE0IDUuMjUwNTMgMTIuMTQ5IDUuMzgyMzkgMTIuMzgzMyA1LjYxNjdDMTIuNjE3NiA1Ljg1MTAxIDEyLjc0OTUgNi4xNjg2NCAxMi43NSA2LjVWOUMxMi43NSA5LjA2NjMgMTIuNzc2MyA5LjEyOTg5IDEyLjgyMzIgOS4xNzY3OEMxMi44NzAxIDkuMjIzNjYgMTIuOTMzNyA5LjI1IDEzIDkuMjVDMTMuMTk4OSA5LjI1IDEzLjM4OTcgOS4zMjkwMiAxMy41MzAzIDkuNDY5NjdDMTMuNjcxIDkuNjEwMzIgMTMuNzUgOS44MDEwOSAxMy43NSAxMEMxMy43NSAxMC4xOTg5IDEzLjY3MSAxMC4zODk3IDEzLjUzMDMgMTAuNTMwM0MxMy4zODk3IDEwLjY3MSAxMy4xOTg5IDEwLjc1IDEzIDEwLjc1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA4OC40MiA1Mi4yOFwiIHdpZHRoPVwiODhcIiBoZWlnaHQ9XCI1MlwiPjx0aXRsZT5mbGVldGlvLWxvZ28tbWFyay1vbmx5PC90aXRsZT48Zz48Zz48cGF0aCBkPVwiTTc2LjQ0LDE2LjE1QTQuNDksNC40OSwwLDAsMCw3MiwxOS44OUw2NC4zLDBIMTcuNzZMMTAsMTkuODlhNC40OSw0LjQ5LDAsMSwwLTQuNDIsNS4yNlY0OGwxMC42Ny03Ljc0aC0uMjNhNiw2LDAsMSwxLDUuNjItMy45MmwuMTEtLjA4TDU0LDQ4LjU3bDIyLjQ2LTEzVjI1LjE1YTQuNSw0LjUsMCwwLDAsMC05Wm0tMzMsNC41SDE0TDIwLjUsNEg2MS41Nkw2OCwyMC42NUg2NC40NWMwLS4wNiwwLS4xMiwwLS4xOGExMC41LDEwLjUsMCwxLDAtMjEsMEM0My40NiwyMC41Myw0My40NywyMC41OSw0My40NywyMC42NVptMy41LDBjMC0uMDYsMC0uMTIsMC0uMThhNyw3LDAsMCwxLDE0LDBjMCwuMDYsMCwuMTIsMCwuMThaTTY2LDQwLjMyYTYsNiwwLDEsMSw2LTZBNiw2LDAsMCwxLDY2LDQwLjMyWlwiIGZpbGw9XCIjMjQyYjJlXCIvPjxwb2x5Z29uIHBvaW50cz1cIjg4LjQyIDI4LjM0IDg0LjY4IDM3LjU2IDgzLjE5IDM1LjA3IDUzLjk2IDUyLjI4IDIxLjczIDM5LjUxIDAgNTIuMjggMjEuNzMgMzIuMzcgNTMuOTYgNDUuMTIgNzkuOTcgMjkuNzEgNzguNTIgMjcuMjcgODguNDIgMjguMzRcIiBmaWxsPVwiIzE4Y2M2Y1wiLz48L2c+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbWFwXCIgZGF0YS1uYW1lPVwibWFwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuNzk5OTcgMTguMDI1TDAuNDY2OTY2IDIyLjAyNUMwLjM5MTc1OCAyMi4yNTAzIDAuMzcxMTE3IDIyLjQ5MDIgMC40MDY3NDIgMjIuNzI1QzAuNDQyMzY4IDIyLjk1OTggMC41MzMyNDEgMjMuMTgyOCAwLjY3MTg4NSAyMy4zNzU2QzAuODEwNTI4IDIzLjU2ODUgMC45OTI5NzkgMjMuNzI1NiAxLjIwNDIyIDIzLjgzNDJDMS40MTU0NyAyMy45NDI3IDEuNjQ5NDcgMjMuOTk5NiAxLjg4Njk3IDI0SDIyLjExM0MyMi4zNTA2IDIzLjk5OTkgMjIuNTg0OSAyMy45NDMzIDIyLjc5NjQgMjMuODM0OUMyMy4wMDc5IDIzLjcyNjQgMjMuMTkwNiAyMy41NjkzIDIzLjMyOTUgMjMuMzc2NUMyMy40NjgzIDIzLjE4MzYgMjMuNTU5NCAyMi45NjA1IDIzLjU5NTEgMjIuNzI1NUMyMy42MzA4IDIyLjQ5MDUgMjMuNjEwMiAyMi4yNTA0IDIzLjUzNSAyMi4wMjVMMjIuMjAyIDE4LjAyNUMyMi4xMDI0IDE3LjcyNjYgMjEuOTExNSAxNy40NjcxIDIxLjY1NjMgMTcuMjgzMkMyMS40MDExIDE3LjA5OTIgMjEuMDk0NSAxNy4wMDAyIDIwLjc4IDE3SDE1LjIxMUMxNS4xNjg0IDE3LjAwMDEgMTUuMTI2NSAxNy4wMTA5IDE1LjA4OTMgMTcuMDMxNkMxNS4wNTIgMTcuMDUyMiAxNS4wMjA2IDE3LjA4MTkgMTQuOTk4IDE3LjExOEMxNC4yMTIgMTguMzg4IDEzLjU1NCAxOS4zOCAxMy4yNDQgMTkuODRDMTMuMTA2NyAyMC4wNDM4IDEyLjkyMTQgMjAuMjEwNyAxMi43MDQ1IDIwLjMyNjFDMTIuNDg3NiAyMC40NDE1IDEyLjI0NTcgMjAuNTAxOSAxMiAyMC41MDE5QzExLjc1NDMgMjAuNTAxOSAxMS41MTIzIDIwLjQ0MTUgMTEuMjk1NCAyMC4zMjYxQzExLjA3ODUgMjAuMjEwNyAxMC44OTMzIDIwLjA0MzggMTAuNzU2IDE5Ljg0QzEwLjQ0NiAxOS4zOCA5Ljc4Nzk3IDE4LjM4OCA5LjAwMTk3IDE3LjExOEM4Ljk3OTI1IDE3LjA4MiA4Ljk0NzgzIDE3LjA1MjMgOC45MTA2IDE3LjAzMTdDOC44NzMzNiAxNy4wMTExIDguODMxNTMgMTcuMDAwMiA4Ljc4ODk3IDE3SDMuMjIwOTdDMi45MDY1NyAxNy4wMDA0IDIuNjAwMjQgMTcuMDk5NSAyLjM0NTI2IDE3LjI4MzVDMi4wOTAyNyAxNy40Njc0IDEuODk5NTMgMTcuNzI2OCAxLjc5OTk3IDE4LjAyNVYxOC4wMjVaXCIvPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMi4xMTg0IDE4Ljc3MDFDMTIuMDgyIDE4Ljc4OTYgMTIuMDQxMyAxOC43OTk5IDEyIDE4LjhDMTEuOTU4OSAxOC44IDExLjkxODQgMTguNzkwMiAxMS44ODIgMTguNzcxMkMxMS44NDU2IDE4Ljc1MjIgMTEuODE0NCAxOC43MjQ3IDExLjc5MSAxOC42OTFDMTAuNjk3IDE3LjAzMSA1LjY3Mzk1IDkuMjQ4OTcgNS42NzM5NSA2LjE5OTk3QzUuNjgxOTIgNS4zNzc0MiA1Ljg1MTkgNC41NjQ0OSA2LjE3NDE5IDMuODA3NjZDNi40OTY0NyAzLjA1MDgyIDYuOTY0NzMgMi4zNjQ5MSA3LjU1MjIyIDEuNzg5MTNDOC4xMzk3IDEuMjEzMzUgOC44MzQ4OSAwLjc1ODk3NyA5LjU5ODA1IDAuNDUxOTg0QzEwLjM2MTIgMC4xNDQ5OTIgMTEuMTc3NCAtMC4wMDg2MDQyOSAxMiAtMi41NzExMWUtMDVDMTIuODIyNSAtMC4wMDg0NzI0NyAxMy42Mzg2IDAuMTQ1MjE0IDE0LjQwMTcgMC40NTIyNTNDMTUuMTY0OCAwLjc1OTI5MyAxNS44NTk5IDEuMjEzNjcgMTYuNDQ3NCAxLjc4OTQzQzE3LjAzNDkgMi4zNjUxOCAxNy41MDMxIDMuMDUxMDQgMTcuODI1NCAzLjgwNzgyQzE4LjE0NzggNC41NjQ1OSAxOC4zMTc5IDUuMzc3NDUgMTguMzI2IDYuMTk5OTdDMTguMzI2IDkuMjQ1OTcgMTMuMyAxNy4wMjkgMTIuMjA5IDE4LjY4OEMxMi4xODYgMTguNzIyNCAxMi4xNTQ5IDE4Ljc1MDYgMTIuMTE4NCAxOC43NzAxWk0xMiA4Ljk5OTk3QzEzLjY1NjkgOC45OTk5NyAxNSA3LjY1NjgyIDE1IDUuOTk5OTdDMTUgNC4zNDMxMiAxMy42NTY5IDIuOTk5OTcgMTIgMi45OTk5N0MxMC4zNDMxIDIuOTk5OTcgOSA0LjM0MzEyIDkgNS45OTk5N0M5IDcuNjU2ODIgMTAuMzQzMSA4Ljk5OTk3IDEyIDguOTk5OTdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbmF2LW1lbnVcIiBkYXRhLW5hbWU9XCJuYXYtbWVudVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMi45NTY1IDNIMS4wNDM0OEMwLjQ2NzE4MSAzIDAgMy40NDc3MiAwIDRWNUMwIDUuNTUyMjggMC40NjcxODEgNiAxLjA0MzQ4IDZIMjIuOTU2NUMyMy41MzI4IDYgMjQgNS41NTIyOCAyNCA1VjRDMjQgMy40NDc3MiAyMy41MzI4IDMgMjIuOTU2NSAzWlwiLz48cGF0aCBkPVwiTTIyLjk1NjUgMTAuNUgxLjA0MzQ4QzAuNDY3MTgxIDEwLjUgMCAxMC45NDc3IDAgMTEuNVYxMi41QzAgMTMuMDUyMyAwLjQ2NzE4MSAxMy41IDEuMDQzNDggMTMuNUgyMi45NTY1QzIzLjUzMjggMTMuNSAyNCAxMy4wNTIzIDI0IDEyLjVWMTEuNUMyNCAxMC45NDc3IDIzLjUzMjggMTAuNSAyMi45NTY1IDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjIuOTU2NSAxOEgxLjA0MzQ4QzAuNDY3MTgxIDE4IDAgMTguNDQ3NyAwIDE5VjIwQzAgMjAuNTUyMyAwLjQ2NzE4MSAyMSAxLjA0MzQ4IDIxSDIyLjk1NjVDMjMuNTMyOCAyMSAyNCAyMC41NTIzIDI0IDIwVjE5QzI0IDE4LjQ0NzcgMjMuNTMyOCAxOCAyMi45NTY1IDE4WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBhcnRcIiBkYXRhLW5hbWU9XCJwYXJ0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE1Ljk3MyA4LjI3MUMxNi4wMTY2IDguMjUxMTEgMTYuMDUzNiA4LjIxOTA5IDE2LjA3OTYgOC4xNzg3NUMxNi4xMDU1IDguMTM4NDEgMTYuMTE5MyA4LjA5MTQ2IDE2LjExOTMgOC4wNDM1QzE2LjExOTMgNy45OTU1NCAxNi4xMDU1IDcuOTQ4NTggMTYuMDc5NiA3LjkwODI1QzE2LjA1MzYgNy44Njc5MSAxNi4wMTY2IDcuODM1ODkgMTUuOTczIDcuODE2TDYuMjE1OTYgMy4zNjhDNi4xNTIwNSAzLjMzOTYxIDYuMDgyOSAzLjMyNDk0IDYuMDEyOTYgMy4zMjQ5NEM1Ljk0MzAzIDMuMzI0OTQgNS44NzM4NyAzLjMzOTYxIDUuODA5OTYgMy4zNjhMMS45OTI5NiA1LjAyNEMxLjk0Nzg3IDUuMDQzMjEgMS45MDk0MSA1LjA3NTI2IDEuODgyMzggNS4xMTYxNUMxLjg1NTM1IDUuMTU3MDQgMS44NDA5NCA1LjIwNDk4IDEuODQwOTQgNS4yNTRDMS44NDA5NCA1LjMwMzAyIDEuODU1MzUgNS4zNTA5NiAxLjg4MjM4IDUuMzkxODVDMS45MDk0MSA1LjQzMjc0IDEuOTQ3ODcgNS40NjQ3OSAxLjk5Mjk2IDUuNDg0TDEyLjI4MyA5Ljc3MkMxMi4zNDY1IDkuNzk4NTkgMTIuNDE0OCA5LjgxMTc4IDEyLjQ4MzYgOS44MTA3NUMxMi41NTI0IDkuODA5NzEgMTIuNjIwMyA5Ljc5NDQ4IDEyLjY4MyA5Ljc2NkwxNS45NzMgOC4yNzFaXCIvPjxwYXRoIGQ9XCJNMjIuMDYyIDUuNUMyMi4xMDU5IDUuNDgwMjUgMjIuMTQzMiA1LjQ0ODIyIDIyLjE2OTQgNS40MDc3N0MyMi4xOTU2IDUuMzY3MzIgMjIuMjA5NSA1LjMyMDE3IDIyLjIwOTUgNS4yNzJDMjIuMjA5NSA1LjIyMzgzIDIyLjE5NTYgNS4xNzY2OSAyMi4xNjk0IDUuMTM2MjRDMjIuMTQzMiA1LjA5NTc5IDIyLjEwNTkgNS4wNjM3NiAyMi4wNjIgNS4wNDRMMTIuNCAwLjg0NzAwNEMxMi4yNzM5IDAuNzkxOTQxIDEyLjEzNzcgMC43NjM1MTkgMTIgMC43NjM1MTlDMTEuODYyNCAwLjc2MzUxOSAxMS43MjYyIDAuNzkxOTQxIDExLjYgMC44NDcwMDRMOC4zODAwMiAyLjI0N0M4LjMzNTggMi4yNjY2MyA4LjI5ODIzIDIuMjk4NjcgOC4yNzE4NSAyLjMzOTIzQzguMjQ1NDggMi4zNzk3OSA4LjIzMTQ1IDIuNDI3MTMgOC4yMzE0NSAyLjQ3NTVDOC4yMzE0NSAyLjUyMzg4IDguMjQ1NDggMi41NzEyMiA4LjI3MTg1IDIuNjExNzhDOC4yOTgyMyAyLjY1MjM0IDguMzM1OCAyLjY4NDM4IDguMzgwMDIgMi43MDRMMTguMDggNy4xMjZDMTguMTQ1IDcuMTU1NTcgMTguMjE1NiA3LjE3MDg3IDE4LjI4NyA3LjE3MDg3QzE4LjM1ODQgNy4xNzA4NyAxOC40MjkgNy4xNTU1NyAxOC40OTQgNy4xMjZMMjIuMDYyIDUuNVpcIi8+PHBhdGggZD1cIk0wLjg0NiA2LjYzMDAxQzAuODA3OTk4IDYuNjE0MiAwLjc2NjY4MyA2LjYwODAyIDAuNzI1NzIgNi42MTIwMkMwLjY4NDc1OCA2LjYxNjAyIDAuNjQ1NDE2IDYuNjMwMDcgMC42MTExODYgNi42NTI5MkMwLjU3Njk1NyA2LjY3NTc3IDAuNTQ4ODk5IDYuNzA2NzIgMC41Mjk1MDMgNi43NDMwMkMwLjUxMDEwNyA2Ljc3OTMyIDAuNDk5OTczIDYuODE5ODUgMC41IDYuODYxMDFWMTguMDA3QzAuNDk5OTg0IDE4LjIwNDQgMC41NTgzNzIgMTguMzk3MyAwLjY2NzgxMSAxOC41NjE2QzAuNzc3MjUgMTguNzI1OCAwLjkzMjg0NiAxOC44NTQgMS4xMTUgMTguOTNMMTEuNCAyMy4yMTdDMTEuNDM4IDIzLjIzMjggMTEuNDc5MyAyMy4yMzkgMTEuNTIwMyAyMy4yMzVDMTEuNTYxMiAyMy4yMzEgMTEuNjAwNiAyMy4yMTY5IDExLjYzNDggMjMuMTk0MUMxMS42NjkgMjMuMTcxMiAxMS42OTcxIDIzLjE0MDMgMTEuNzE2NSAyMy4xMDRDMTEuNzM1OSAyMy4wNjc3IDExLjc0NiAyMy4wMjcyIDExLjc0NiAyMi45ODZWMTEuMzRDMTEuNzQ1OSAxMS4yOTA2IDExLjczMTIgMTEuMjQyNCAxMS43MDM4IDExLjIwMTNDMTEuNjc2NSAxMS4xNjAyIDExLjYzNzUgMTEuMTI4MSAxMS41OTIgMTEuMTA5TDAuODQ2IDYuNjMwMDFaXCIvPjxwYXRoIGQ9XCJNMTMuMjUgMjIuOTQ0QzEzLjI1MDIgMjIuOTg1NyAxMy4yNjA4IDIzLjAyNjcgMTMuMjgwOSAyMy4wNjMzQzEzLjMwMDkgMjMuMDk5OSAxMy4zMjk4IDIzLjEzMDkgMTMuMzY0OCAyMy4xNTM1QzEzLjM5OTkgMjMuMTc2MSAxMy40NCAyMy4xODk3IDEzLjQ4MTYgMjMuMTkyOUMxMy41MjMyIDIzLjE5NjEgMTMuNTY0OSAyMy4xODkgMTMuNjAzIDIzLjE3MkwyMi45MTQgMTguOTRDMjMuMDg4NyAxOC44NjA2IDIzLjIzNjggMTguNzMyNSAyMy4zNDA4IDE4LjU3MTFDMjMuNDQ0NyAxOC40MDk4IDIzLjQ5OTkgMTguMjIxOSAyMy41IDE4LjAzVjYuODg2MDFDMjMuNSA2Ljg0NDIgMjMuNDg5NiA2LjgwMzA1IDIzLjQ2OTYgNi43NjYzM0MyMy40NDk2IDYuNzI5NjEgMjMuNDIwOCA2LjY5ODQ4IDIzLjM4NTYgNi42NzU4QzIzLjM1MDUgNi42NTMxMiAyMy4zMTAzIDYuNjM5NiAyMy4yNjg2IDYuNjM2NUMyMy4yMjY5IDYuNjMzMzkgMjMuMTg1MSA2LjY0MDc4IDIzLjE0NyA2LjY1ODAxTDEzLjQgMTEuMDlDMTMuMzU2MiAxMS4xMDk2IDEzLjMxODkgMTEuMTQxNCAxMy4yOTI4IDExLjE4MTdDMTMuMjY2NyAxMS4yMjIgMTMuMjUyOSAxMS4yNjkgMTMuMjUzIDExLjMxN0wxMy4yNSAyMi45NDRaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGxhY2VcIiBkYXRhLW5hbWU9XCJwbGFjZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk04IDBDNS44NzkgMC4wMDIzODIxMSAzLjg0NTU1IDAuODQ2MDAyIDIuMzQ1NzggMi4zNDU3OEMwLjg0NjAwMiAzLjg0NTU1IDAuMDAyMzgyMTEgNS44NzkgMCA4QzAgMTEuMzQzIDQuNTA5IDE4LjkxMiA2LjU3NiAyMi4yQzYuNjMzMzEgMjIuMjkxNyA2LjcxODgxIDIyLjM2MjQgNi44MTk2OCAyMi40MDE0QzYuOTIwNTUgMjIuNDQwNCA3LjAzMTM1IDIyLjQ0NTYgNy4xMzU0NiAyMi40MTYzQzcuMjM5NTYgMjIuMzg3MSA3LjMzMTM3IDIyLjMyNDggNy4zOTcwOSAyMi4yMzg5QzcuNDYyODIgMjIuMTUzIDcuNDk4OTMgMjIuMDQ4MSA3LjUgMjEuOTRWMTZDNy40OTk5MiAxNS42Mjg2IDcuNjAzMjUgMTUuMjY0NSA3Ljc5ODQyIDE0Ljk0ODZDNy45OTM1OCAxNC42MzI2IDguMjcyODcgMTQuMzc3MiA4LjYwNSAxNC4yMTFMMTEuNjA1IDEyLjcxMUMxMS44ODMgMTIuNTcyNCAxMi4xODk0IDEyLjUwMDMgMTIuNSAxMi41MDAzQzEyLjgxMDYgMTIuNTAwMyAxMy4xMTcgMTIuNTcyNCAxMy4zOTUgMTIuNzExTDEzLjk0IDEyLjk4NEMxNC4wMDA2IDEzLjAxNDQgMTQuMDY2OCAxMy4wMzIyIDE0LjEzNDUgMTMuMDM2MkMxNC4yMDIyIDEzLjA0MDIgMTQuMjcgMTMuMDMwNCAxNC4zMzM4IDEzLjAwNzRDMTQuMzk3NiAxMi45ODQ0IDE0LjQ1NjEgMTIuOTQ4NiAxNC41MDU2IDEyLjkwMjNDMTQuNTU1MSAxMi44NTYgMTQuNTk0NyAxMi44MDAxIDE0LjYyMiAxMi43MzhDMTUuMzY3OSAxMS4yNTY1IDE1LjgzNSA5LjY1MDQ1IDE2IDhDMTUuOTk3NiA1Ljg3OSAxNS4xNTQgMy44NDU1NSAxMy42NTQyIDIuMzQ1NzhDMTIuMTU0NCAwLjg0NjAwMiAxMC4xMjEgMC4wMDIzODIxMSA4IDBWMFpNOCAxMUM3LjQwNjY2IDExIDYuODI2NjQgMTAuODI0MSA2LjMzMzI5IDEwLjQ5NDRDNS44Mzk5NCAxMC4xNjQ4IDUuNDU1NDIgOS42OTYyMyA1LjIyODM2IDkuMTQ4MDVDNS4wMDEzIDguNTk5ODcgNC45NDE4OSA3Ljk5NjY3IDUuMDU3NjQgNy40MTQ3M0M1LjE3MzQgNi44MzI3OSA1LjQ1OTEyIDYuMjk4MjQgNS44Nzg2OCA1Ljg3ODY4QzYuMjk4MjQgNS40NTkxMiA2LjgzMjc5IDUuMTczNCA3LjQxNDczIDUuMDU3NjRDNy45OTY2NyA0Ljk0MTg5IDguNTk5ODcgNS4wMDEzIDkuMTQ4MDUgNS4yMjgzNkM5LjY5NjIzIDUuNDU1NDIgMTAuMTY0OCA1LjgzOTk0IDEwLjQ5NDQgNi4zMzMyOUMxMC44MjQxIDYuODI2NjQgMTEgNy40MDY2NiAxMSA4QzExIDguNzk1NjUgMTAuNjgzOSA5LjU1ODcxIDEwLjEyMTMgMTAuMTIxM0M5LjU1ODcxIDEwLjY4MzkgOC43OTU2NSAxMSA4IDExWlwiLz48cGF0aCBkPVwiTTE1LjcyNCAxNS41NTNMMTIuNzI0IDE0LjA1M0MxMi42NTQ1IDE0LjAxODIgMTIuNTc3OCAxNCAxMi41IDE0QzEyLjQyMjIgMTQgMTIuMzQ1NSAxNC4wMTgyIDEyLjI3NiAxNC4wNTNMOS4yNzYgMTUuNTUzQzkuMTkzMDUgMTUuNTk0NiA5LjEyMzMxIDE1LjY1ODQgOS4wNzQ1NiAxNS43MzczQzkuMDI1ODIgMTUuODE2MyA5IDE1LjkwNzIgOSAxNlYyMy41QzkgMjMuNjMyNiA5LjA1MjY4IDIzLjc1OTggOS4xNDY0NSAyMy44NTM2QzkuMjQwMjEgMjMuOTQ3MyA5LjM2NzM5IDI0IDkuNSAyNEgxMUMxMS4xMzI2IDI0IDExLjI1OTggMjMuOTQ3MyAxMS4zNTM2IDIzLjg1MzZDMTEuNDQ3MyAyMy43NTk4IDExLjUgMjMuNjMyNiAxMS41IDIzLjVWMjIuNUMxMS41IDIyLjM2NzQgMTEuNTUyNyAyMi4yNDAyIDExLjY0NjQgMjIuMTQ2NEMxMS43NDAyIDIyLjA1MjcgMTEuODY3NCAyMiAxMiAyMkgxM0MxMy4xMzI2IDIyIDEzLjI1OTggMjIuMDUyNyAxMy4zNTM2IDIyLjE0NjRDMTMuNDQ3MyAyMi4yNDAyIDEzLjUgMjIuMzY3NCAxMy41IDIyLjVWMjMuNUMxMy41IDIzLjYzMjYgMTMuNTUyNyAyMy43NTk4IDEzLjY0NjQgMjMuODUzNkMxMy43NDAyIDIzLjk0NzMgMTMuODY3NCAyNCAxNCAyNEgxNS41QzE1LjYzMjYgMjQgMTUuNzU5OCAyMy45NDczIDE1Ljg1MzYgMjMuODUzNkMxNS45NDczIDIzLjc1OTggMTYgMjMuNjMyNiAxNiAyMy41VjE2QzE2IDE1LjkwNzIgMTUuOTc0MiAxNS44MTYzIDE1LjkyNTQgMTUuNzM3M0MxNS44NzY3IDE1LjY1ODQgMTUuODA2OSAxNS41OTQ2IDE1LjcyNCAxNS41NTNaTTE0IDIwSDExQzEwLjg2NzQgMjAgMTAuNzQwMiAxOS45NDczIDEwLjY0NjQgMTkuODUzNkMxMC41NTI3IDE5Ljc1OTggMTAuNSAxOS42MzI2IDEwLjUgMTkuNUMxMC41IDE5LjM2NzQgMTAuNTUyNyAxOS4yNDAyIDEwLjY0NjQgMTkuMTQ2NEMxMC43NDAyIDE5LjA1MjcgMTAuODY3NCAxOSAxMSAxOUgxNEMxNC4xMzI2IDE5IDE0LjI1OTggMTkuMDUyNyAxNC4zNTM2IDE5LjE0NjRDMTQuNDQ3MyAxOS4yNDAyIDE0LjUgMTkuMzY3NCAxNC41IDE5LjVDMTQuNSAxOS42MzI2IDE0LjQ0NzMgMTkuNzU5OCAxNC4zNTM2IDE5Ljg1MzZDMTQuMjU5OCAxOS45NDczIDE0LjEzMjYgMjAgMTQgMjBaTTE0IDE3LjVIMTFDMTAuODY3NCAxNy41IDEwLjc0MDIgMTcuNDQ3MyAxMC42NDY0IDE3LjM1MzZDMTAuNTUyNyAxNy4yNTk4IDEwLjUgMTcuMTMyNiAxMC41IDE3QzEwLjUgMTYuODY3NCAxMC41NTI3IDE2Ljc0MDIgMTAuNjQ2NCAxNi42NDY0QzEwLjc0MDIgMTYuNTUyNyAxMC44Njc0IDE2LjUgMTEgMTYuNUgxNEMxNC4xMzI2IDE2LjUgMTQuMjU5OCAxNi41NTI3IDE0LjM1MzYgMTYuNjQ2NEMxNC40NDczIDE2Ljc0MDIgMTQuNSAxNi44Njc0IDE0LjUgMTdDMTQuNSAxNy4xMzI2IDE0LjQ0NzMgMTcuMjU5OCAxNC4zNTM2IDE3LjM1MzZDMTQuMjU5OCAxNy40NDczIDE0LjEzMjYgMTcuNSAxNCAxNy41WlwiLz48cGF0aCBkPVwiTTIzLjY5MiAxMi4wMzhMMTcuNjkyIDkuNTM4QzE3LjYxNiA5LjUwNjM5IDE3LjUzMzQgOS40OTQwMyAxNy40NTE0IDkuNTAyMDNDMTcuMzY5NSA5LjUxMDAyIDE3LjI5MDggOS41MzgxMiAxNy4yMjI0IDkuNTgzODJDMTcuMTUzOSA5LjYyOTUzIDE3LjA5NzggOS42OTE0MyAxNy4wNTkgOS43NjQwM0MxNy4wMjAyIDkuODM2NjMgMTYuOTk5OSA5LjkxNzY4IDE3IDEwVjIzLjVDMTcgMjMuNjMyNiAxNy4wNTI3IDIzLjc1OTggMTcuMTQ2NCAyMy44NTM2QzE3LjI0MDIgMjMuOTQ3MyAxNy4zNjc0IDI0IDE3LjUgMjRIMjMuNUMyMy42MzI2IDI0IDIzLjc1OTggMjMuOTQ3MyAyMy44NTM2IDIzLjg1MzZDMjMuOTQ3MyAyMy43NTk4IDI0IDIzLjYzMjYgMjQgMjMuNVYxMi41QzI0LjAwMDEgMTIuNDAxMiAyMy45NzA4IDEyLjMwNDUgMjMuOTE2IDEyLjIyMjNDMjMuODYxMiAxMi4xNDAxIDIzLjc4MzIgMTIuMDc1OSAyMy42OTIgMTIuMDM4Wk0yMiAyMEgxOUMxOC44Njc0IDIwIDE4Ljc0MDIgMTkuOTQ3MyAxOC42NDY0IDE5Ljg1MzZDMTguNTUyNyAxOS43NTk4IDE4LjUgMTkuNjMyNiAxOC41IDE5LjVDMTguNSAxOS4zNjc0IDE4LjU1MjcgMTkuMjQwMiAxOC42NDY0IDE5LjE0NjRDMTguNzQwMiAxOS4wNTI3IDE4Ljg2NzQgMTkgMTkgMTlIMjJDMjIuMTMyNiAxOSAyMi4yNTk4IDE5LjA1MjcgMjIuMzUzNiAxOS4xNDY0QzIyLjQ0NzMgMTkuMjQwMiAyMi41IDE5LjM2NzQgMjIuNSAxOS41QzIyLjUgMTkuNjMyNiAyMi40NDczIDE5Ljc1OTggMjIuMzUzNiAxOS44NTM2QzIyLjI1OTggMTkuOTQ3MyAyMi4xMzI2IDIwIDIyIDIwWk0yMiAxNy41SDE5QzE4Ljg2NzQgMTcuNSAxOC43NDAyIDE3LjQ0NzMgMTguNjQ2NCAxNy4zNTM2QzE4LjU1MjcgMTcuMjU5OCAxOC41IDE3LjEzMjYgMTguNSAxN0MxOC41IDE2Ljg2NzQgMTguNTUyNyAxNi43NDAyIDE4LjY0NjQgMTYuNjQ2NEMxOC43NDAyIDE2LjU1MjcgMTguODY3NCAxNi41IDE5IDE2LjVIMjJDMjIuMTMyNiAxNi41IDIyLjI1OTggMTYuNTUyNyAyMi4zNTM2IDE2LjY0NjRDMjIuNDQ3MyAxNi43NDAyIDIyLjUgMTYuODY3NCAyMi41IDE3QzIyLjUgMTcuMTMyNiAyMi40NDczIDE3LjI1OTggMjIuMzUzNiAxNy4zNTM2QzIyLjI1OTggMTcuNDQ3MyAyMi4xMzI2IDE3LjUgMjIgMTcuNVpNMjIgMTVIMTlDMTguODY3NCAxNSAxOC43NDAyIDE0Ljk0NzMgMTguNjQ2NCAxNC44NTM2QzE4LjU1MjcgMTQuNzU5OCAxOC41IDE0LjYzMjYgMTguNSAxNC41QzE4LjUgMTQuMzY3NCAxOC41NTI3IDE0LjI0MDIgMTguNjQ2NCAxNC4xNDY0QzE4Ljc0MDIgMTQuMDUyNyAxOC44Njc0IDE0IDE5IDE0SDIyQzIyLjEzMjYgMTQgMjIuMjU5OCAxNC4wNTI3IDIyLjM1MzYgMTQuMTQ2NEMyMi40NDczIDE0LjI0MDIgMjIuNSAxNC4zNjc0IDIyLjUgMTQuNUMyMi41IDE0LjYzMjYgMjIuNDQ3MyAxNC43NTk4IDIyLjM1MzYgMTQuODUzNkMyMi4yNTk4IDE0Ljk0NzMgMjIuMTMyNiAxNSAyMiAxNVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1xdWVzdGlvblwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48ZyBjbGlwLXBhdGg9XCJ1cmwoI2RlZi1zdmctcXVlc3Rpb24tMClcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTAuMTYxOCAzLjQ0NzQ3QzEwLjgxMzIgMy4xMTA0NSAxMS41NDQ2IDIuOTU4OTUgMTIuMjc2MiAzLjAwOTUzQzEzLjAwNzggMy4wNjAxMSAxMy43MTE0IDMuMzEwODMgMTQuMzEwMSAzLjczNDI5QzE0LjkwODkgNC4xNTc3NCAxNS4zNzk3IDQuNzM3NjMgMTUuNjcxMSA1LjQxMDU4QzE1Ljk2MjUgNi4wODM1MyAxNi4wNjM0IDYuODIzNjUgMTUuOTYyNiA3LjU1MDAzQzE1Ljg2MTggOC4yNzY0MiAxNS41NjMzIDguOTYxMTIgMTUuMDk5NiA5LjUyOTMxQzE0LjYzNiAxMC4wOTc1IDE0LjAyNTEgMTAuNTI3MyAxMy4zMzM3IDEwLjc3MTdDMTIuNTA0NyAxMS4wNjQ4IDExLjc4NyAxMS42MDc4IDExLjI3OTUgMTIuMzI1OUMxMC43NzIyIDEzLjA0MzggMTAuNSAxMy45MDIgMTAuNTAwMyAxNC43ODFMMTAuNSAxNS41QzEwLjUgMTYuMzI4NCAxMS4xNzE2IDE3IDEyIDE3QzEyLjgyODQgMTcgMTMuNSAxNi4zMjg0IDEzLjUgMTUuNUwxMy41MDAzIDE0Ljc3OTVDMTMuNTAwMSAxNC41MjA4IDEzLjU4MDIgMTQuMjY4NSAxMy43Mjk1IDE0LjA1NzNDMTMuODc4NyAxMy44NDYxIDE0LjA4OTggMTMuNjg2NCAxNC4zMzM3IDEzLjYwMDJDMTUuNTQzNiAxMy4xNzI0IDE2LjYxMjcgMTIuNDIwMyAxNy40MjQgMTEuNDI2QzE4LjIzNTMgMTAuNDMxNyAxOC43NTc3IDkuMjMzNDcgMTguOTM0MSA3Ljk2MjMzQzE5LjExMDUgNi42OTExOSAxOC45MzQgNS4zOTYwMyAxOC40MjQgNC4yMTg0QzE3LjkxNDEgMy4wNDA3NyAxNy4wOTAyIDIuMDI1OTggMTYuMDQyNCAxLjI4NDk2QzE0Ljk5NDcgMC41NDM5MzggMTMuNzYzNCAwLjEwNTE5MiAxMi40ODMxIDAuMDE2Njc0NUMxMS4yMDI4IC0wLjA3MTg0MjYgOS45MjI4OSAwLjE5MzI3NyA4Ljc4MzEzIDAuNzgzMDU1QzcuNjQzMzYgMS4zNzI4MyA2LjY4NzY1IDIuMjY0NTcgNi4wMjA0NiAzLjM2MDgyQzUuMzUzMjYgNC40NTcwNiA1LjAwMDI1IDUuNzE1NjEgNSA2Ljk5ODkzQzQuOTk5ODQgNy44MjczNiA1LjY3MTI5IDguNDk5MDYgNi40OTk3MSA4LjQ5OTIyQzcuMzI4MTQgOC40OTkzNyA3Ljk5OTg0IDcuODI3OTMgOCA2Ljk5OTVDOC4wMDAxNCA2LjI2NjE2IDguMjAxODcgNS41NDY5NiA4LjU4MzEzIDQuOTIwNTJDOC45NjQ0IDQuMjk0MDggOS41MTA1MyAzLjc4NDUgMTAuMTYxOCAzLjQ0NzQ3Wk0xMiAyNEMxMy4yNDI2IDI0IDE0LjI1IDIyLjk5MjYgMTQuMjUgMjEuNzVDMTQuMjUgMjAuNTA3NCAxMy4yNDI2IDE5LjUgMTIgMTkuNUMxMC43NTc0IDE5LjUgOS43NSAyMC41MDc0IDkuNzUgMjEuNzVDOS43NSAyMi45OTI2IDEwLjc1NzQgMjQgMTIgMjRaXCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlbWluZGVyXCIgZGF0YS1uYW1lPVwicmVtaW5kZXJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMy41IDMuMTgyNjJWMS41QzEzLjUgMS4xMDIxOCAxMy4zNDIgMC43MjA2NDQgMTMuMDYwNyAwLjQzOTM0QzEyLjc3OTQgMC4xNTgwMzUgMTIuMzk3OCAwIDEyIDBDMTEuNjAyMiAwIDExLjIyMDYgMC4xNTgwMzUgMTAuOTM5MyAwLjQzOTM0QzEwLjY1OCAwLjcyMDY0NCAxMC41IDEuMTAyMTggMTAuNSAxLjVWMy4xODI2MkM4LjgzMzEyIDMuNjA0NjkgNy4zNDI3NCA0LjU1NzA2IDYuMjU3OTggNS45MDNDNS4wNjU4MyA3LjM4MjE4IDQuNDQyMjYgOS4yMzkwOSA0LjUgMTEuMTM4VjE2QzQuNSAxNi4zOTc4IDQuMzQxOTYgMTYuNzc5NCA0LjA2MDY2IDE3LjA2MDdDMy43NzkzNiAxNy4zNDIgMy4zOTc4MiAxNy41IDMgMTcuNUMyLjczNDc4IDE3LjUgMi40ODA0MyAxNy42MDU0IDIuMjkyODkgMTcuNzkyOUMyLjEwNTM2IDE3Ljk4MDQgMiAxOC4yMzQ4IDIgMTguNUMyIDE4Ljc2NTIgMi4xMDUzNiAxOS4wMTk2IDIuMjkyODkgMTkuMjA3MUMyLjQ4MDQzIDE5LjM5NDYgMi43MzQ3OCAxOS41IDMgMTkuNUgyMUMyMS4yNjUyIDE5LjUgMjEuNTE5NiAxOS4zOTQ2IDIxLjcwNzEgMTkuMjA3MUMyMS44OTQ2IDE5LjAxOTYgMjIgMTguNzY1MiAyMiAxOC41QzIyIDE4LjIzNDggMjEuODk0NiAxNy45ODA0IDIxLjcwNzEgMTcuNzkyOUMyMS41MTk2IDE3LjYwNTQgMjEuMjY1MiAxNy41IDIxIDE3LjVDMjAuNjAyMiAxNy41IDIwLjIyMDYgMTcuMzQyIDE5LjkzOTMgMTcuMDYwN0MxOS42NTggMTYuNzc5NCAxOS41IDE2LjM5NzggMTkuNSAxNlYxMS4xMzhDMTkuNTU3NyA5LjIzOTA5IDE4LjkzNDIgNy4zODIxOCAxNy43NDIgNS45MDNDMTYuNjU3MyA0LjU1NzA2IDE1LjE2NjkgMy42MDQ2OSAxMy41IDMuMTgyNjJaTTE0LjIzNiAyMUg5Ljc2NDAxQzkuNzAyNjMgMjEuMDAwMSA5LjY0MzQzIDIxLjAyMjggOS41OTc2OSAyMS4wNjM3QzkuNTUxOTYgMjEuMTA0NyA5LjUyMjg4IDIxLjE2MSA5LjUxNjAxIDIxLjIyMkM5LjUwNTExIDIxLjMxNDMgOS40OTk3NyAyMS40MDcxIDkuNTAwMDEgMjEuNUM5LjUwMDAxIDIyLjE2MyA5Ljc2MzQgMjIuNzk4OSAxMC4yMzIyIDIzLjI2NzhDMTAuNzAxMSAyMy43MzY2IDExLjMzNyAyNCAxMiAyNEMxMi42NjMgMjQgMTMuMjk4OSAyMy43MzY2IDEzLjc2NzggMjMuMjY3OEMxNC4yMzY2IDIyLjc5ODkgMTQuNSAyMi4xNjMgMTQuNSAyMS41QzE0LjUwMDIgMjEuNDA3MSAxNC40OTQ5IDIxLjMxNDMgMTQuNDg0IDIxLjIyMkMxNC40Nzc2IDIxLjE2MDggMTQuNDQ4NiAyMS4xMDQyIDE0LjQwMjggMjEuMDYzMkMxNC4zNTcgMjEuMDIyMiAxNC4yOTc1IDIwLjk5OTcgMTQuMjM2IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlcG9ydFwiIGRhdGEtbmFtZT1cInJlcG9ydFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMyAxMC41QzIzLjEzMjYgMTAuNSAyMy4yNTk4IDEwLjQ0NzMgMjMuMzUzNiAxMC4zNTM2QzIzLjQ0NzMgMTAuMjU5OCAyMy41IDEwLjEzMjYgMjMuNSAxMEMyMy40OTY4IDcuMzQ4ODEgMjIuNDQyMiA0LjgwNzEyIDIwLjU2NzYgMi45MzI0NEMxOC42OTI5IDEuMDU3NzYgMTYuMTUxMiAwLjAwMzE3NTcyIDEzLjUgMEMxMy4zNjc0IDAgMTMuMjQwMiAwLjA1MjY3ODQgMTMuMTQ2NCAwLjE0NjQ0N0MxMy4wNTI3IDAuMjQwMjE1IDEzIDAuMzY3MzkyIDEzIDAuNVY5LjUyNUMxMy4wMDAzIDkuNzgzNiAxMy4xMDMgMTAuMDMxNSAxMy4yODU4IDEwLjIxNDVDMTMuNDY4NiAxMC4zOTc0IDEzLjcxNjQgMTAuNTAwNSAxMy45NzUgMTAuNTAxTDIzIDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjMuNSAxMkgxNEMxMy44NTI3IDExLjk4MTIgMTMuNzAzMiAxMi4wMTE0IDEzLjU3NDcgMTIuMDg1OUMxMy40NDYxIDEyLjE2MDUgMTMuMzQ1NyAxMi4yNzUyIDEzLjI4ODggMTIuNDEyNUMxMy4yMzIgMTIuNTQ5NyAxMy4yMjE5IDEyLjcwMTkgMTMuMjYgMTIuODQ1NUMxMy4yOTgyIDEyLjk4OSAxMy4zODI1IDEzLjExNjEgMTMuNSAxMy4yMDdMMjAuMjE4IDE5LjkyNUMyMC4zMTE4IDIwLjAxODcgMjAuNDM4OSAyMC4wNzE0IDIwLjU3MTUgMjAuMDcxNEMyMC43MDQxIDIwLjA3MTQgMjAuODMxMyAyMC4wMTg3IDIwLjkyNSAxOS45MjVDMjEuOTAzIDE4Ljk1MjEgMjIuNjc4MyAxNy43OTUgMjMuMjA2MiAxNi41MjA1QzIzLjczNCAxNS4yNDYgMjQuMDAzOCAxMy44Nzk1IDI0IDEyLjVDMjQgMTIuMzY3NCAyMy45NDc0IDEyLjI0MDIgMjMuODUzNiAxMi4xNDY0QzIzLjc1OTggMTIuMDUyNyAyMy42MzI2IDEyIDIzLjUgMTJaXCIvPjxwYXRoIGQ9XCJNMTAuNTg4IDI0QzExLjk1NDIgMjMuOTk3MSAxMy4zMDYyIDIzLjcyMyAxNC41NjU3IDIzLjE5MzZDMTUuODI1MiAyMi42NjQyIDE2Ljk2NyAyMS44OSAxNy45MjUgMjAuOTE2QzE4LjAxODggMjAuODIyMiAxOC4wNzE0IDIwLjY5NTEgMTguMDcxNCAyMC41NjI1QzE4LjA3MTQgMjAuNDI5OSAxOC4wMTg4IDIwLjMwMjggMTcuOTI1IDIwLjIwOUwxMS4yMDcgMTMuNDkxQzExLjA4ODkgMTMuMzQ5MiAxMS4wMTY3IDEzLjE3NDggMTEgMTIuOTkxVjMuNDkxQzExIDMuMzU4MzkgMTAuOTQ3MyAzLjIzMTIxIDEwLjg1MzYgMy4xMzc0NEMxMC43NTk4IDMuMDQzNjggMTAuNjMyNiAyLjk5MSAxMC41IDIuOTkxQzcuNzE0MDUgMy4wMDI2NyA1LjA0NjgzIDQuMTIwNTggMy4wODUxMSA2LjA5ODgxQzEuMTIzMzggOC4wNzcwMyAwLjAyNzg1MTUgMTAuNzUzNSAwLjAzOTUyMSAxMy41Mzk1QzAuMDUxMTkwNSAxNi4zMjU1IDEuMTY5MSAxOC45OTI3IDMuMTQ3MzMgMjAuOTU0NEM1LjEyNTU2IDIyLjkxNjEgNy44MDIwNSAyNC4wMTE3IDEwLjU4OCAyNFYyNFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZWFyY2hcIiBkYXRhLW5hbWU9XCJzZWFyY2hcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMjQuNDE0IDIxLjU5MUwxOS43NjkgMTYuOTQ2QzIxLjE4MzMgMTQuODI4OSAyMS43NTk2IDEyLjI2MTMgMjEuMzg1NyA5Ljc0Mjg1QzIxLjAxMTggNy4yMjQzNSAxOS43MTQ1IDQuOTM0OTcgMTcuNzQ2MSAzLjMyMDAyQzE1Ljc3NzggMS43MDUwNiAxMy4yNzkgMC44ODAwMDggMTAuNzM2IDEuMDA1MzRDOC4xOTMwMyAxLjEzMDY3IDUuNzg3NTYgMi4xOTc0MiAzLjk4NzUyIDMuOTk4MUMyLjE4NzQ4IDUuNzk4NzggMS4xMjE1NyA4LjIwNDYzIDAuOTk3MTQzIDEwLjc0NzdDMC44NzI3MTIgMTMuMjkwNyAxLjY5ODY1IDE1Ljc4OTEgMy4zMTQzIDE3Ljc1N0M0LjkyOTk1IDE5LjcyNDggNy4yMTk3OSAyMS4wMjEzIDkuNzM4NDEgMjEuMzk0M0MxMi4yNTcgMjEuNzY3MiAxNC44MjQ0IDIxLjE5MDEgMTYuOTQxIDE5Ljc3NUwyMS41ODYgMjQuNDE5QzIxLjk2NDIgMjQuNzg3OSAyMi40NzE2IDI0Ljk5NDQgMjMgMjQuOTk0NEMyMy41Mjg0IDI0Ljk5NDQgMjQuMDM1OCAyNC43ODc5IDI0LjQxNCAyNC40MTlDMjQuNzg4OSAyNC4wNDM5IDI0Ljk5OTYgMjMuNTM1MyAyNC45OTk2IDIzLjAwNUMyNC45OTk2IDIyLjQ3NDcgMjQuNzg4OSAyMS45NjYxIDI0LjQxNCAyMS41OTFaTTExLjI1IDQuMDA1QzEyLjY4MzkgNC4wMDUgMTQuMDg1NiA0LjQzMDIxIDE1LjI3NzkgNS4yMjY4NUMxNi40NzAxIDYuMDIzNDkgMTcuMzk5NCA3LjE1NTc4IDE3Ljk0ODEgOC40ODA1NUMxOC40OTY5IDkuODA1MzEgMTguNjQwNCAxMS4yNjMgMTguMzYwNyAxMi42Njk0QzE4LjA4MDkgMTQuMDc1OCAxNy4zOTA1IDE1LjM2NzYgMTYuMzc2NSAxNi4zODE1QzE1LjM2MjYgMTcuMzk1NSAxNC4wNzA4IDE4LjA4NTkgMTIuNjY0NCAxOC4zNjU3QzExLjI1OCAxOC42NDU0IDkuODAwMzEgMTguNTAxOSA4LjQ3NTU0IDE3Ljk1MzFDNy4xNTA3OCAxNy40MDQ0IDYuMDE4NDggMTYuNDc1MSA1LjIyMTg0IDE1LjI4MjlDNC40MjUyIDE0LjA5MDYgNCAxMi42ODg5IDQgMTEuMjU1QzQuMDAyMTEgOS4zMzI4MyA0Ljc2NjYzIDcuNDg5OTkgNi4xMjU4MSA2LjEzMDgxQzcuNDg0OTkgNC43NzE2MyA5LjMyNzgzIDQuMDA3MTIgMTEuMjUgNC4wMDVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2VydmljZVwiIGRhdGEtbmFtZT1cInNlcnZpY2VcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMuNTgyIDQuOTg2QzIzLjU1NTggNC45MDQyIDIzLjUwOSA0LjgzMDUxIDIzLjQ0NjEgNC43NzIwNUMyMy4zODMyIDQuNzEzNTggMjMuMzA2MyA0LjY3MjMxIDIzLjIyMjggNC42NTIyMUMyMy4xMzkzIDQuNjMyMTIgMjMuMDUyIDQuNjMzODcgMjIuOTY5NCA0LjY1NzNDMjIuODg2NyA0LjY4MDc0IDIyLjgxMTUgNC43MjUwNiAyMi43NTEgNC43ODZMMTkuMTk0IDguMzQxQzE5LjE0MiA4LjM5MjkyIDE5LjA3OTIgOC40MzI3NCAxOS4wMTAxIDguNDU3NjNDMTguOTQwOSA4LjQ4MjUyIDE4Ljg2NzIgOC40OTE4NiAxOC43OTQgOC40ODVMMTYuMiA4LjI0OUMxNi4wODM2IDguMjM4NTEgMTUuOTc0NSA4LjE4NzU0IDE1Ljg5MTcgOC4xMDQ5NkMxNS44MDkgOC4wMjIzOSAxNS43NTc4IDcuOTEzNDIgMTUuNzQ3IDcuNzk3TDE1LjUxMyA1LjJDMTUuNTA2MyA1LjEyNjc3IDE1LjUxNTggNS4wNTI5NSAxNS41NDA4IDQuOTgzODFDMTUuNTY1OSA0LjkxNDY3IDE1LjYwNTkgNC44NTE5MSAxNS42NTggNC44TDE5LjIxNiAxLjI0MkMxOS4yNzY3IDEuMTgxNDYgMTkuMzIwOCAxLjEwNjMzIDE5LjM0NDEgMS4wMjM4MkMxOS4zNjc0IDAuOTQxMzEzIDE5LjM2OTEgMC44NTQyMDQgMTkuMzQ5IDAuNzcwODU4QzE5LjMyODkgMC42ODc1MTIgMTkuMjg3NyAwLjYxMDczMSAxOS4yMjk0IDAuNTQ3ODg4QzE5LjE3MTEgMC40ODUwNDQgMTkuMDk3NiAwLjQzODI1MSAxOS4wMTYgMC40MTIwMDFDMTcuNzcwNyAwLjA0NjIwNjcgMTYuNDQ5NiAwLjAyNDY4NzkgMTUuMTkzMSAwLjM0OTczM0MxMy45MzY2IDAuNjc0Nzc3IDEyLjc5MTcgMS4zMzQyNCAxMS44OCAyLjI1OEMxMC45MTMgMy4yMTcyMiAxMC4yNDc1IDQuNDM4MiA5Ljk2NTMzIDUuNzcwNzJDOS42ODMxOSA3LjEwMzI0IDkuNzk2NzQgOC40ODkxNyAxMC4yOTIgOS43NThDMTAuMzI5NCA5Ljg0NjY5IDEwLjMzOTkgOS45NDQ0NSAxMC4zMjIxIDEwLjAzOTFDMTAuMzA0MyAxMC4xMzM3IDEwLjI1OTEgMTAuMjIxIDEwLjE5MiAxMC4yOUwwLjkxMjAwMSAxOS41NjNDMC41Mzc0MzYgMTkuOTIyMyAwLjI3OTgzOCAyMC4zODYxIDAuMTcyODA4IDIwLjg5MzlDMC4wNjU3NzgzIDIxLjQwMTggMC4xMTQyODUgMjEuOTMwMSAwLjMxMjAwMSAyMi40MUMwLjQ3ODQ5NCAyMi43NzkxIDAuNzMxNjY0IDIzLjEwMjUgMS4wNDk5OCAyMy4zNTI3QzEuMzY4MjkgMjMuNjAyOSAxLjc0MjMyIDIzLjc3MjUgMi4xNDAyNyAyMy44NDcxQzIuNTM4MjIgMjMuOTIxOCAyLjk0ODMgMjMuODk5MiAzLjMzNTY0IDIzLjc4MTNDMy43MjI5OCAyMy42NjM0IDQuMDc2MTEgMjMuNDUzNyA0LjM2NSAyMy4xN0wxMy43IDEzLjgzNEMxMy43NjkzIDEzLjc2NzMgMTMuODU2NSAxMy43MjIyIDEzLjk1MSAxMy43MDQ1QzE0LjA0NTYgMTMuNjg2NyAxNC4xNDMyIDEzLjY5NyAxNC4yMzIgMTMuNzM0QzE1LjQ5ODUgMTQuMjMzNyAxNi44ODM2IDE0LjM1MTcgMTguMjE2NCAxNC4wNzM0QzE5LjU0OTEgMTMuNzk1MSAyMC43NzEzIDEzLjEzMjcgMjEuNzMyIDEyLjE2OEMyMi42NjEgMTEuMjUwMSAyMy4zMjM3IDEwLjA5NzQgMjMuNjQ5NSA4LjgzMjY1QzIzLjk3NTMgNy41Njc5MyAyMy45NTE5IDYuMjM4NTIgMjMuNTgyIDQuOTg2VjQuOTg2WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNldHRpbmdzXCIgZGF0YS1uYW1lPVwic2V0dGluZ3NcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjIuNSA5LjVIMjAuNjM4QzIwLjQ1MjkgOC44NjAyIDIwLjE5NyA4LjI0MzA1IDE5Ljg3NSA3LjY2TDIxLjE5MiA2LjM0NEMyMS4zMzE0IDYuMjA0NyAyMS40NDIgNi4wMzkzIDIxLjUxNzQgNS44NTcyNUMyMS41OTI4IDUuNjc1MiAyMS42MzE3IDUuNDgwMDYgMjEuNjMxNyA1LjI4M0MyMS42MzE3IDUuMDg1OTQgMjEuNTkyOCA0Ljg5MDggMjEuNTE3NCA0LjcwODc1QzIxLjQ0MiA0LjUyNjcgMjEuMzMxNCA0LjM2MTMgMjEuMTkyIDQuMjIyTDE5Ljc3NyAyLjgwOUMxOS40OTU3IDIuNTI3NzkgMTkuMTE0MiAyLjM2OTgyIDE4LjcxNjUgMi4zNjk4MkMxOC4zMTg4IDIuMzY5ODIgMTcuOTM3MyAyLjUyNzc5IDE3LjY1NiAyLjgwOUwxNi4zMzggNC4xMjZDMTUuNzU1OCAzLjgwMzggMTUuMTM5MiAzLjU0Nzg3IDE0LjUgMy4zNjNWMS41QzE0LjUgMS4xMDIxOCAxNC4zNDIgMC43MjA2NDQgMTQuMDYwNyAwLjQzOTM0QzEzLjc3OTQgMC4xNTgwMzUgMTMuMzk3OCAwIDEzIDBMMTEgMEMxMC42MDIyIDAgMTAuMjIwNiAwLjE1ODAzNSA5LjkzOTM0IDAuNDM5MzRDOS42NTgwNCAwLjcyMDY0NCA5LjUgMS4xMDIxOCA5LjUgMS41VjMuMzYzQzguODYwNTggMy41NDgzIDguMjQzNzggMy44MDQyIDcuNjYxIDQuMTI2TDYuMzQzIDIuODA5QzYuMDYxNzEgMi41Mjc3OSA1LjY4MDI1IDIuMzY5ODIgNS4yODI1IDIuMzY5ODJDNC44ODQ3NSAyLjM2OTgyIDQuNTAzMjkgMi41Mjc3OSA0LjIyMiAyLjgwOUwyLjgwNyA0LjIyM0MyLjY2NzYxIDQuMzYyMyAyLjU1NzA0IDQuNTI3NyAyLjQ4MTU5IDQuNzA5NzVDMi40MDYxNSA0Ljg5MTggMi4zNjczMiA1LjA4Njk0IDIuMzY3MzIgNS4yODRDMi4zNjczMiA1LjQ4MTA2IDIuNDA2MTUgNS42NzYyIDIuNDgxNTkgNS44NTgyNUMyLjU1NzA0IDYuMDQwMyAyLjY2NzYxIDYuMjA1NyAyLjgwNyA2LjM0NUw0LjEyNSA3LjY2MkMzLjgwMjU5IDguMjQ0MTQgMy41NDY2NSA4Ljg2MDY3IDMuMzYyIDkuNUgxLjVDMS4xMDIxOCA5LjUgMC43MjA2NDQgOS42NTgwNCAwLjQzOTM0IDkuOTM5MzRDMC4xNTgwMzUgMTAuMjIwNiAwIDEwLjYwMjIgMCAxMUwwIDEzQzAgMTMuMzk3OCAwLjE1ODAzNSAxMy43Nzk0IDAuNDM5MzQgMTQuMDYwN0MwLjcyMDY0NCAxNC4zNDIgMS4xMDIxOCAxNC41IDEuNSAxNC41SDMuMzYyQzMuNTQ2NTcgMTUuMTM5NyAzLjgwMjUyIDE1Ljc1NjUgNC4xMjUgMTYuMzM5TDIuODA2IDE3LjY1OEMyLjUyNDc5IDE3LjkzOTMgMi4zNjY4MiAxOC4zMjA4IDIuMzY2ODIgMTguNzE4NUMyLjM2NjgyIDE5LjExNjIgMi41MjQ3OSAxOS40OTc3IDIuODA2IDE5Ljc3OUw0LjIyIDIxLjE5M0M0LjUwNjgyIDIxLjQ2NCA0Ljg4NjQzIDIxLjYxNDkgNS4yODEgMjEuNjE0OUM1LjY3NTU3IDIxLjYxNDkgNi4wNTUxOCAyMS40NjQgNi4zNDIgMjEuMTkzTDcuNjYgMTkuODc2QzguMjQzMDkgMjAuMTk4MSA4Ljg2MDIyIDIwLjQ1NDQgOS41IDIwLjY0VjIyLjVDOS41IDIyLjg5NzggOS42NTgwNCAyMy4yNzk0IDkuOTM5MzQgMjMuNTYwN0MxMC4yMjA2IDIzLjg0MiAxMC42MDIyIDI0IDExIDI0SDEzQzEzLjM5NzggMjQgMTMuNzc5NCAyMy44NDIgMTQuMDYwNyAyMy41NjA3QzE0LjM0MiAyMy4yNzk0IDE0LjUgMjIuODk3OCAxNC41IDIyLjVWMjAuNjRDMTUuMTM5NCAyMC40NTQ3IDE1Ljc1NjIgMjAuMTk4OCAxNi4zMzkgMTkuODc3TDE3LjY1NyAyMS4xOTRDMTcuOTM4MyAyMS40NzUyIDE4LjMxOTggMjEuNjMzMiAxOC43MTc1IDIxLjYzMzJDMTkuMTE1MiAyMS42MzMyIDE5LjQ5NjcgMjEuNDc1MiAxOS43NzggMjEuMTk0TDIxLjE5MiAxOS43OEMyMS40NzMyIDE5LjQ5ODcgMjEuNjMxMiAxOS4xMTcyIDIxLjYzMTIgMTguNzE5NUMyMS42MzEyIDE4LjMyMTggMjEuNDczMiAxNy45NDAzIDIxLjE5MiAxNy42NTlMMTkuODc1IDE2LjM0MkMyMC4xOTczIDE1Ljc1OTEgMjAuNDUzMiAxNS4xNDE5IDIwLjYzOCAxNC41MDJIMjIuNUMyMi42OTcyIDE0LjUwMiAyMi44OTI0IDE0LjQ2MzEgMjMuMDc0NSAxNC4zODc2QzIzLjI1NjYgMTQuMzEyMSAyMy40MjIxIDE0LjIwMTUgMjMuNTYxNCAxNC4wNjJDMjMuNzAwNyAxMy45MjI1IDIzLjgxMTEgMTMuNzU2OSAyMy44ODY0IDEzLjU3NDZDMjMuOTYxNyAxMy4zOTI0IDI0LjAwMDMgMTMuMTk3MiAyNCAxM1YxMUMyNCAxMC42MDIyIDIzLjg0MiAxMC4yMjA2IDIzLjU2MDcgOS45MzkzNEMyMy4yNzk0IDkuNjU4MDQgMjIuODk3OCA5LjUgMjIuNSA5LjVaTTEyIDE3QzExLjAxMTEgMTcgMTAuMDQ0NCAxNi43MDY4IDkuMjIyMTUgMTYuMTU3M0M4LjM5OTkgMTUuNjA3OSA3Ljc1OTA0IDE0LjgyNyA3LjM4MDYgMTMuOTEzNEM3LjAwMjE2IDEyLjk5OTggNi45MDMxNSAxMS45OTQ1IDcuMDk2MDcgMTEuMDI0NUM3LjI4OSAxMC4wNTQ2IDcuNzY1MiA5LjE2MzczIDguNDY0NDcgOC40NjQ0N0M5LjE2MzczIDcuNzY1MiAxMC4wNTQ2IDcuMjg5IDExLjAyNDUgNy4wOTYwN0MxMS45OTQ1IDYuOTAzMTUgMTIuOTk5OCA3LjAwMjE2IDEzLjkxMzQgNy4zODA2QzE0LjgyNyA3Ljc1OTA0IDE1LjYwNzkgOC4zOTk5IDE2LjE1NzMgOS4yMjIxNUMxNi43MDY4IDEwLjA0NDQgMTcgMTEuMDExMSAxNyAxMkMxNi45OTg0IDEzLjMyNTYgMTYuNDcxMSAxNC41OTY0IDE1LjUzMzggMTUuNTMzOEMxNC41OTY0IDE2LjQ3MTEgMTMuMzI1NiAxNi45OTg0IDEyIDE3VjE3WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRyaXBcIiBkYXRhLW5hbWU9XCJ0cmlwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE5LjAxMiAxNC41NTJDMTguOTk4OCAxNC41MTk4IDE4Ljk3ODcgMTQuNDkwOCAxOC45NTMxIDE0LjQ2NzFDMTguOTI3NiAxNC40NDM1IDE4Ljg5NzEgMTQuNDI1NyAxOC44NjQgMTQuNDE1QzE4LjU1MDEgMTQuMzEzNCAxOC4yNjY3IDE0LjEzNDYgMTguMDQgMTMuODk1QzE2LjM0IDEyLjA4IDEzLjUgOC42MDkgMTMuNSA1Ljc1QzEzLjUgNS41NzkgMTMuNTA5IDUuNDExIDEzLjUyNCA1LjI0NEMxMy41MzkgNS4wNzcgMTMuNjA0IDQuNzUgMTMuMjc1IDQuNzVIMTJDMTEuOTMzNyA0Ljc1IDExLjg3MDEgNC43NzYzNCAxMS44MjMyIDQuODIzMjJDMTEuNzc2MyA0Ljg3MDExIDExLjc1IDQuOTMzNyAxMS43NSA1VjcuNzVDMTEuNzUgNy45NDg5MSAxMS42NzA5IDguMTM5NjggMTEuNTMwMyA4LjI4MDMzQzExLjM4OTYgOC40MjA5OCAxMS4xOTg5IDguNSAxMSA4LjVDMTAuODAxIDguNSAxMC42MTAzIDguNDIwOTggMTAuNDY5NiA4LjI4MDMzQzEwLjMyOSA4LjEzOTY4IDEwLjI1IDcuOTQ4OTEgMTAuMjUgNy43NVY1QzEwLjI1IDQuOTMzNyAxMC4yMjM2IDQuODcwMTEgMTAuMTc2NyA0LjgyMzIyQzEwLjEyOTkgNC43NzYzNCAxMC4wNjYzIDQuNzUgOS45OTk5NiA0Ljc1SDcuMTgwOTZDNy4wODA1OSA0Ljc1MDA2IDYuOTgyNTYgNC43ODAzMyA2Ljg5OTYzIDQuODM2ODdDNi44MTY2OSA0Ljg5MzQgNi43NTI3IDQuOTczNTkgNi43MTU5NiA1LjA2N0wwLjAzMzk2MDUgMjIuMDY3QzAuMDA0MTIyOTEgMjIuMTQyOSAtMC4wMDY3MTE0NiAyMi4yMjQ5IDAuMDAyNDAxMjIgMjIuMzA1OUMwLjAxMTUxMzkgMjIuMzg2OSAwLjA0MDI5NzIgMjIuNDY0NSAwLjA4NjI0MzYgMjIuNTMxOEMwLjEzMjE5IDIyLjU5OTEgMC4xOTM5MDYgMjIuNjU0MiAwLjI2NjAxNCAyMi42OTIzQzAuMzM4MTIzIDIyLjczMDMgMC40MTg0MzcgMjIuNzUwMSAwLjQ5OTk2IDIyLjc1SDkuOTk5OTZDMTAuMDY2MyAyMi43NSAxMC4xMjk5IDIyLjcyMzcgMTAuMTc2NyAyMi42NzY4QzEwLjIyMzYgMjIuNjI5OSAxMC4yNSAyMi41NjYzIDEwLjI1IDIyLjVWMTkuNzVDMTAuMjUgMTkuNTUxMSAxMC4zMjkgMTkuMzYwMyAxMC40Njk2IDE5LjIxOTdDMTAuNjEwMyAxOS4wNzkgMTAuODAxIDE5IDExIDE5QzExLjE5ODkgMTkgMTEuMzg5NiAxOS4wNzkgMTEuNTMwMyAxOS4yMTk3QzExLjY3MDkgMTkuMzYwMyAxMS43NSAxOS41NTExIDExLjc1IDE5Ljc1VjIyLjVDMTEuNzUgMjIuNTY2MyAxMS43NzYzIDIyLjYyOTkgMTEuODIzMiAyMi42NzY4QzExLjg3MDEgMjIuNzIzNyAxMS45MzM3IDIyLjc1IDEyIDIyLjc1SDIxLjVDMjEuNTgxNSAyMi43NTAxIDIxLjY2MTggMjIuNzMwMyAyMS43MzM5IDIyLjY5MjNDMjEuODA2IDIyLjY1NDIgMjEuODY3NyAyMi41OTkxIDIxLjkxMzcgMjIuNTMxOEMyMS45NTk2IDIyLjQ2NDUgMjEuOTg4NCAyMi4zODY5IDIxLjk5NzUgMjIuMzA1OUMyMi4wMDY2IDIyLjIyNDkgMjEuOTk1OCAyMi4xNDI5IDIxLjk2NiAyMi4wNjdMMTkuMDEyIDE0LjU1MlpNMTEuNzUgMTUuNzUyQzExLjc1IDE1Ljk1MDkgMTEuNjcwOSAxNi4xNDE3IDExLjUzMDMgMTYuMjgyM0MxMS4zODk2IDE2LjQyMyAxMS4xOTg5IDE2LjUwMiAxMSAxNi41MDJDMTAuODAxIDE2LjUwMiAxMC42MTAzIDE2LjQyMyAxMC40Njk2IDE2LjI4MjNDMTAuMzI5IDE2LjE0MTcgMTAuMjUgMTUuOTUwOSAxMC4yNSAxNS43NTJWMTEuNzUyQzEwLjI1IDExLjU1MzEgMTAuMzI5IDExLjM2MjMgMTAuNDY5NiAxMS4yMjE3QzEwLjYxMDMgMTEuMDgxIDEwLjgwMSAxMS4wMDIgMTEgMTEuMDAyQzExLjE5ODkgMTEuMDAyIDExLjM4OTYgMTEuMDgxIDExLjUzMDMgMTEuMjIxN0MxMS42NzA5IDExLjM2MjMgMTEuNzUgMTEuNTUzMSAxMS43NSAxMS43NTJWMTUuNzUyWlwiLz48cGF0aCBkPVwiTTE5Ljg2NCAxMi44N0MyMC45MzUgMTEuNzIzIDI0IDguMjI2IDI0IDUuNzVDMjQgNC41NTY1MyAyMy41MjU5IDMuNDExOTMgMjIuNjgyIDIuNTY4MDJDMjEuODM4MSAxLjcyNDExIDIwLjY5MzUgMS4yNSAxOS41IDEuMjVDMTguMzA2NSAxLjI1IDE3LjE2MTkgMS43MjQxMSAxNi4zMTggMi41NjgwMkMxNS40NzQxIDMuNDExOTMgMTUgNC41NTY1MyAxNSA1Ljc1QzE1IDguMjI2IDE4LjA2NSAxMS43MjMgMTkuMTM2IDEyLjg3QzE5LjE4MjcgMTIuOTE5NiAxOS4yMzkyIDEyLjk1OTIgMTkuMzAxOCAxMi45ODYyQzE5LjM2NDMgMTMuMDEzMyAxOS40MzE4IDEzLjAyNzIgMTkuNSAxMy4wMjcyQzE5LjU2ODIgMTMuMDI3MiAxOS42MzU3IDEzLjAxMzMgMTkuNjk4MiAxMi45ODYyQzE5Ljc2MDggMTIuOTU5MiAxOS44MTczIDEyLjkxOTYgMTkuODY0IDEyLjg3VjEyLjg3Wk0xOCA1Ljc1QzE4IDUuNDUzMzMgMTguMDg4IDUuMTYzMzIgMTguMjUyOCA0LjkxNjY0QzE4LjQxNzYgNC42Njk5NyAxOC42NTE5IDQuNDc3NzEgMTguOTI2IDQuMzY0MThDMTkuMjAwMSA0LjI1MDY1IDE5LjUwMTcgNC4yMjA5NCAxOS43OTI2IDQuMjc4ODJDMjAuMDgzNiA0LjMzNjcgMjAuMzUwOSA0LjQ3OTU2IDIwLjU2MDcgNC42ODkzNEMyMC43NzA0IDQuODk5MTIgMjAuOTEzMyA1LjE2NjM5IDIwLjk3MTIgNS40NTczNkMyMS4wMjkxIDUuNzQ4MzQgMjAuOTk5MyA2LjA0OTk0IDIwLjg4NTggNi4zMjQwM0MyMC43NzIzIDYuNTk4MTEgMjAuNTggNi44MzIzOCAyMC4zMzM0IDYuOTk3MkMyMC4wODY3IDcuMTYyMDMgMTkuNzk2NyA3LjI1IDE5LjUgNy4yNUMxOS4xMDIyIDcuMjUgMTguNzIwNiA3LjA5MTk2IDE4LjQzOTMgNi44MTA2NkMxOC4xNTggNi41MjkzNiAxOCA2LjE0NzgyIDE4IDUuNzVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVoaWNsZVwiIGRhdGEtbmFtZT1cInZlaGljbGVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMi4xOTI5IDEwLjMzMDhDMjIuMjA0OCAxMC4zNTc4IDIyLjIyMTQgMTAuMzgyNiAyMi4yNDIgMTAuNDA0QzIzLjA0OCAxMS4yMzM5IDIzLjQ5OTIgMTIuMzQ1MSAyMy41IDEzLjUwMlYxNS41MDJDMjMuNDk4NCAxNi4wMDMyIDIzLjM0NTcgMTYuNDkyNCAyMy4wNjE4IDE2LjkwNTVDMjIuNzk2NiAxNy4yOTE2IDIyLjQyODQgMTcuNTk0NiAyMiAxNy43ODA2VjIwQzIyIDIwLjU1MjMgMjEuNTUyMyAyMSAyMSAyMUgxOUMxOC40NDc3IDIxIDE4IDIwLjU1MjMgMTggMjBWMTcuODE3Mkw2IDE3LjgxNDhWMjBDNiAyMC41NTIzIDUuNTUyMjggMjEgNSAyMUgzQzIuNDQ3NzIgMjEgMiAyMC41NTIzIDIgMjBWMTcuNzc2NkMxLjU3MTU2IDE3LjU5MDYgMS4yMDMzNCAxNy4yODc2IDAuOTM4MTE1IDE2LjkwMTVDMC42NTQyOTkgMTYuNDg4NCAwLjUwMTYxMyAxNS45OTkyIDAuNDk5OTgzIDE1LjQ5OFYxMy40OThDMC41MDE1MTQgMTIuMzQzNiAwLjk1MTUwNiAxMS4yMzQ5IDEuNzU0OTggMTAuNDA2QzEuNzgxMzcgMTAuMzc4NiAxLjgwMTE5IDEwLjM0NTUgMS44MTI5NyAxMC4zMDkzTDEuODEzNDEgMTAuMzA4OEMxLjgxNDUzIDEwLjMwNDIgMS44MTU1MyAxMC4yOTk1IDEuODE2MzkgMTAuMjk0N0MxLjgyNTE3IDEwLjI0NjUgMS44MTk1NiAxMC4xOTY3IDEuODAwMjcgMTAuMTUxN0MxLjc4MDk4IDEwLjEwNjYgMS43NDg4NSAxMC4wNjgxIDEuNzA3ODkgMTAuMDQxMkMxLjY2NjkzIDEwLjAxNDIgMS42MTg5NCA5Ljk5OTkgMS41Njk5IDEwSDEuMjgxOThDMS4wMTY3NyAxMCAwLjc2MjQxMSA5Ljg5NDY0IDAuNTc0ODc1IDkuNzA3MTFDMC4zODczMzggOS41MTk1NyAwLjI4MTk4MiA5LjI2NTIyIDAuMjgxOTgyIDlWOEMwLjI4MTk4MiA3LjczNDc4IDAuMzg3MzM4IDcuNDgwNDMgMC41NzQ4NzUgNy4yOTI4OUMwLjc2MjQxMSA3LjEwNTM2IDEuMDE2NzcgNyAxLjI4MTk4IDdIMi42MzE5OEMyLjg2NDc0IDcuMDAwNjIgMy4wOTQyIDcuMDU1MSAzLjMwMjM4IDcuMTU5MkMzLjQ4MzggNy4yNDk5MSAzLjY0NDc3IDcuMzc2MTQgMy43NzU5MSA3LjUzMDA3TDMuNzg3NTggNy41MDE2NUMzLjgxMTk3IDcuNDY5NDUgMy44MjgyMyA3LjQzMTg0IDMuODM0OTggNy4zOTIwMUw0LjIzNDk4IDUuMDA5MDFDNC4zNDk1NSA0LjMwNzM3IDQuNzEwMjkgMy42Njk0OCA1LjI1MjUzIDMuMjA5N0M1Ljc5NDc3IDIuNzQ5OTIgNi40ODMwNSAyLjQ5ODMyIDcuMTkzOTggMi41MDAwMUgxNi44MDJDMTcuNTEyNiAyLjQ5ODI1IDE4LjIwMDcgMi43NDk1NiAxOC43NDI5IDMuMjA4OTRDMTkuMjg1MSAzLjY2ODMyIDE5LjY0NiA0LjMwNTc0IDE5Ljc2MSA1LjAwNzAxTDIwLjE2MSA3LjM5MDAxQzIwLjE2NzYgNy40Mjk4MSAyMC4xODM3IDcuNDY3NDMgMjAuMjA4IDcuNDk5NjRDMjAuMjE0NSA3LjUwODI5IDIwLjIyMTYgNy41MTY0OCAyMC4yMjkxIDcuNTI0MTdDMjAuMzU5MyA3LjM3MjkxIDIwLjUxODUgNy4yNDg3NCAyMC42OTc2IDcuMTU5MkMyMC45MDU4IDcuMDU1MSAyMS4xMzUyIDcuMDAwNjIgMjEuMzY4IDdIMjIuNzE4QzIyLjk4MzIgNyAyMy4yMzc2IDcuMTA1MzYgMjMuNDI1MSA3LjI5Mjg5QzIzLjYxMjYgNy40ODA0MyAyMy43MTggNy43MzQ3OCAyMy43MTggOFY5QzIzLjcxOCA5LjI2NTIyIDIzLjYxMjYgOS41MTk1NyAyMy40MjUxIDkuNzA3MTFDMjMuMjM3NiA5Ljg5NDY0IDIyLjk4MzIgMTAgMjIuNzE4IDEwSDIyLjQzMDFDMjIuMzgxIDkuOTk5OSAyMi4zMzMgMTAuMDE0MiAyMi4yOTIxIDEwLjA0MTJDMjIuMjUxMSAxMC4wNjgxIDIyLjIxOSAxMC4xMDY2IDIyLjE5OTcgMTAuMTUxN0MyMi4xODA0IDEwLjE5NjcgMjIuMTc0OCAxMC4yNDY1IDIyLjE4MzYgMTAuMjk0N0MyMi4xODU4IDEwLjMwNyAyMi4xODg5IDEwLjMxOTEgMjIuMTkyOSAxMC4zMzA4Wk03LjE5Mzk4IDQuNTAyMDFIMTYuODA2QzE3LjA0MjcgNC41MDIxMiAxNy4yNzE3IDQuNTg2MTkgMTcuNDUyMiA0LjczOTI3QzE3LjYzMjggNC44OTIzNSAxNy43NTMyIDUuMTA0NTEgMTcuNzkyIDUuMzM4MDFMMTguMjcxIDguMjExMDFDMTguMjc2MyA4LjI0NjQxIDE4LjI3NDEgOC4yODI1NCAxOC4yNjQ1IDguMzE3MDJDMTguMjU0OCA4LjM1MTUgMTguMjM3OSA4LjM4MzUzIDE4LjIxNSA4LjQxMTAxQzE4LjE5MTUgOC40Mzg2NyAxOC4xNjIyIDguNDYwODcgMTguMTI5MiA4LjQ3NjA3QzE4LjA5NjIgOC40OTEyNyAxOC4wNjAzIDguNDk5MDkgMTguMDI0IDguNDk5MDFINS45NzU5OEM1LjkzOTY1IDguNDk5MDcgNS45MDM3NCA4LjQ5MTIgNS44NzA3NiA4LjQ3NTk3QzUuODM3NzggOC40NjA3MyA1LjgwODUxIDguNDM4NDkgNS43ODUgOC40MTA3OUM1Ljc2MTQ5IDguMzgzMDkgNS43NDQzIDguMzUwNiA1LjczNDYyIDguMzE1NThDNS43MjQ5NSA4LjI4MDU2IDUuNzIzMDIgOC4yNDM4NSA1LjcyODk4IDguMjA4MDFMNi4yMDc5OCA1LjMzNTAxQzYuMjQ3NDQgNS4xMDIwNiA2LjM2ODEgNC44OTA2IDYuNTQ4NTkgNC43MzgxMkM2LjcyOTA3IDQuNTg1NjUgNi45NTc3MSA0LjUwMiA3LjE5Mzk4IDQuNTAyMDFaTTcgMTMuNUM3IDE0LjMyODQgNi4zMjg0MyAxNSA1LjUgMTVDNC42NzE1NyAxNSA0IDE0LjMyODQgNCAxMy41QzQgMTIuNjcxNiA0LjY3MTU3IDEyIDUuNSAxMkM2LjMyODQzIDEyIDcgMTIuNjcxNiA3IDEzLjVaTTE4LjUgMTVDMTkuMzI4NCAxNSAyMCAxNC4zMjg0IDIwIDEzLjVDMjAgMTIuNjcxNiAxOS4zMjg0IDEyIDE4LjUgMTJDMTcuNjcxNiAxMiAxNyAxMi42NzE2IDE3IDEzLjVDMTcgMTQuMzI4NCAxNy42NzE2IDE1IDE4LjUgMTVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVuZG9yXCIgZGF0YS1uYW1lPVwidmVuZG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIxLjM3OSAxMS45QzIwLjgwNzQgMTEuODkxNSAyMC4yNDU1IDExLjc1MDYgMTkuNzM3NSAxMS40ODg0QzE5LjIyOTUgMTEuMjI2MyAxOC43ODkxIDEwLjg0OTkgMTguNDUxIDEwLjM4OUMxOC40Mjc3IDEwLjM1OCAxOC4zOTc1IDEwLjMzMjggMTguMzYyOCAxMC4zMTU0QzE4LjMyODEgMTAuMjk4IDE4LjI4OTggMTAuMjg5IDE4LjI1MSAxMC4yODlDMTguMjEyMiAxMC4yODkgMTguMTczOSAxMC4yOTggMTguMTM5MiAxMC4zMTU0QzE4LjEwNDUgMTAuMzMyOCAxOC4wNzQzIDEwLjM1OCAxOC4wNTEgMTAuMzg5QzE3LjcxODkgMTAuODU2MyAxNy4yNzk5IDExLjIzNzMgMTYuNzcwNSAxMS41MDAyQzE2LjI2MTEgMTEuNzYzMSAxNS42OTYyIDExLjkwMDMgMTUuMTIzIDExLjkwMDNDMTQuNTQ5OCAxMS45MDAzIDEzLjk4NDkgMTEuNzYzMSAxMy40NzU1IDExLjUwMDJDMTIuOTY2MSAxMS4yMzczIDEyLjUyNyAxMC44NTYzIDEyLjE5NSAxMC4zODlDMTIuMTcxNyAxMC4zNTggMTIuMTQxNSAxMC4zMzI4IDEyLjEwNjggMTAuMzE1NEMxMi4wNzIxIDEwLjI5OCAxMi4wMzM4IDEwLjI4OSAxMS45OTUgMTAuMjg5QzExLjk1NjIgMTAuMjg5IDExLjkxNzkgMTAuMjk4IDExLjg4MzIgMTAuMzE1NEMxMS44NDg1IDEwLjMzMjggMTEuODE4MyAxMC4zNTggMTEuNzk1IDEwLjM4OUMxMS40NTc2IDEwLjg0OSAxMS4wMTgzIDExLjIyNDggMTAuNTExNiAxMS40ODY5QzEwLjAwNDkgMTEuNzQ5IDkuNDQ0NDEgMTEuODkwNCA4Ljg3Mzk5IDExLjlDOC4zMDIyMSAxMS44OTE2IDcuNzQwMTYgMTEuNzUwOCA3LjIzMTk2IDExLjQ4ODZDNi43MjM3NiAxMS4yMjY1IDYuMjgzMjQgMTAuODUwMSA1Ljk0NDk5IDEwLjM4OUM1LjkyMTcgMTAuMzU4IDUuODkxNTEgMTAuMzMyOCA1Ljg1Njc5IDEwLjMxNTRDNS44MjIwOCAxMC4yOTggNS43ODM4IDEwLjI4OSA1Ljc0NDk5IDEwLjI4OUM1LjcwNjE4IDEwLjI4OSA1LjY2NzkgMTAuMjk4IDUuNjMzMTkgMTAuMzE1NEM1LjU5ODQ3IDEwLjMzMjggNS41NjgyOCAxMC4zNTggNS41NDQ5OSAxMC4zODlDNS4yMDcyNSAxMC44NDk0IDQuNzY3NTMgMTEuMjI1NCA0LjI2MDI1IDExLjQ4NzVDMy43NTI5OCAxMS43NDk3IDMuMTkxOTIgMTEuODkwOCAyLjYyMDk5IDExLjlDMi40OTI2OCAxMS44OTk4IDIuMzY0NDkgMTEuODkyNCAyLjIzNjk5IDExLjg3OEMyLjIwMTk0IDExLjg3MzkgMi4xNjY0MiAxMS44NzczIDIuMTMyNzggMTEuODg3OUMyLjA5OTEzIDExLjg5ODYgMi4wNjgxNCAxMS45MTYzIDIuMDQxODYgMTEuOTM5OEMyLjAxNTU3IDExLjk2MzQgMS45OTQ1OSAxMS45OTIyIDEuOTgwMyAxMi4wMjQ1QzEuOTY2MDEgMTIuMDU2OCAxLjk1ODc1IDEyLjA5MTcgMS45NTg5OSAxMi4xMjdWMjEuMTVDMS45NTg5OSAyMS41NDc4IDIuMTE3MDMgMjEuOTI5NCAyLjM5ODMzIDIyLjIxMDdDMi42Nzk2MyAyMi40OTIgMy4wNjExNyAyMi42NSAzLjQ1ODk5IDIyLjY1SDIwLjQ1OUMyMC44NTY4IDIyLjY1IDIxLjIzODMgMjIuNDkyIDIxLjUxOTcgMjIuMjEwN0MyMS44MDEgMjEuOTI5NCAyMS45NTkgMjEuNTQ3OCAyMS45NTkgMjEuMTVWMTIuMTM0QzIxLjk1ODggMTIuMDk5MiAyMS45NTE1IDEyLjA2NDggMjEuOTM3NCAxMi4wMzI5QzIxLjkyMzMgMTIuMDAxMSAyMS45MDI3IDExLjk3MjUgMjEuODc3IDExLjk0OUMyMS44NTE0IDExLjkyNTYgMjEuODIxMiAxMS45MDc4IDIxLjc4ODMgMTEuODk2N0MyMS43NTU0IDExLjg4NTcgMjEuNzIwNSAxMS44ODE3IDIxLjY4NiAxMS44ODVDMjEuNTg0IDExLjg5NCAyMS40ODIgMTEuOSAyMS4zNzkgMTEuOVpNMTQuOTU3IDE1LjAxQzE0Ljk2MjQgMTQuOTA5MiAxNS4wMDc1IDE0LjgxNDYgMTUuMDgyNSAxNC43NDdDMTUuMTU3NSAxNC42NzkzIDE1LjI1NjEgMTQuNjQ0MSAxNS4zNTcgMTQuNjQ5SDE4LjU1N0MxOC42NTc4IDE0LjY0NDEgMTguNzU2NSAxNC42NzkzIDE4LjgzMTUgMTQuNzQ3QzE4LjkwNjQgMTQuODE0NiAxOC45NTE2IDE0LjkwOTIgMTguOTU3IDE1LjAxVjIwLjE0OUMxOC45NTcgMjAuMjgxNiAxOC45MDQzIDIwLjQwODggMTguODEwNSAyMC41MDI2QzE4LjcxNjggMjAuNTk2MyAxOC41ODk2IDIwLjY0OSAxOC40NTcgMjAuNjQ5SDE1LjQ1N0MxNS4zMjQ0IDIwLjY0OSAxNS4xOTcyIDIwLjU5NjMgMTUuMTAzNCAyMC41MDI2QzE1LjAwOTcgMjAuNDA4OCAxNC45NTcgMjAuMjgxNiAxNC45NTcgMjAuMTQ5VjE1LjAxWk01LjQ1Njk5IDE0Ljk4MkM1LjQ2MjY2IDE0Ljg4ODMgNS41MDUxOSAxNC44MDA3IDUuNTc1MjcgMTQuNzM4M0M1LjY0NTM2IDE0LjY3NTkgNS43MzczIDE0LjY0MzggNS44MzA5OSAxNC42NDlIMTEuMDc4QzExLjE3MTggMTQuNjQzOCAxMS4yNjM4IDE0LjY3NTkgMTEuMzM0MSAxNC43MzgzQzExLjQwNDMgMTQuODAwNiAxMS40NDcxIDE0Ljg4ODIgMTEuNDUzIDE0Ljk4MlYxOC4zMTZDMTEuNDQ3MSAxOC40MDk4IDExLjQwNDMgMTguNDk3NCAxMS4zMzQxIDE4LjU1OTdDMTEuMjYzOCAxOC42MjIxIDExLjE3MTggMTguNjU0MiAxMS4wNzggMTguNjQ5SDUuODMwOTlDNS43MzczIDE4LjY1NDIgNS42NDUzNiAxOC42MjIxIDUuNTc1MjcgMTguNTU5N0M1LjUwNTE5IDE4LjQ5NzMgNS40NjI2NiAxOC40MDk3IDUuNDU2OTkgMTguMzE2VjE0Ljk4MlpcIi8+PHBhdGggZD1cIk0yMS4zNzkgMTAuNEMyMS45MDE4IDEwLjM2NTggMjIuMzk5OSAxMC4xNjU0IDIyLjgwMDcgOS44MjgxMkMyMy4yMDE2IDkuNDkwODEgMjMuNDg0MSA5LjAzNDIxIDIzLjYwNyA4LjUyNDk5QzIzLjc0NDMgOC4wNzc5NCAyMy43Mzk4IDcuNTk5MzUgMjMuNTk0IDcuMTU0OTlMMjEuNzk0IDEuNjg0OTlDMjEuNzc1NyAxLjYwMTAxIDIxLjczMjcgMS41MjQ0MyAyMS42NzA1IDEuNDY1MDlDMjEuNjA4MyAxLjQwNTc1IDIxLjUyOTggMS4zNjYzNyAyMS40NDUgMS4zNTE5OUgyLjU1MTA0QzIuNDY2MjkgMS4zNjYzNyAyLjM4Nzc4IDEuNDA1NzUgMi4zMjU1OSAxLjQ2NTA5QzIuMjYzNCAxLjUyNDQzIDIuMjIwMzcgMS42MDEwMSAyLjIwMjA0IDEuNjg0OTlMMC40MDUwMzggNy4xNTI5OUMwLjI2MDE0OSA3LjU5Nzg4IDAuMjU1OTU5IDguMDc2NjMgMC4zOTMwMzggOC41MjM5OUMwLjUxNTgyNyA5LjAzMzQgMC43OTgyNTkgOS40OTAyMSAxLjE5OTA5IDkuODI3NzJDMS41OTk5MiAxMC4xNjUyIDIuMDk4MTYgMTAuMzY1NyAyLjYyMTA0IDEwLjRDMy4zMTUzOCAxMC4zMjc2IDMuOTUzNTkgOS45ODU2NCA0LjM5ODQ2IDkuNDQ3NjRDNC44NDMzMyA4LjkwOTY1IDUuMDU5MzQgOC4yMTg1NyA1LjAwMDA0IDcuNTIyOTlDNS4wMDAwNCA3LjMyNDA4IDUuMDc5MDYgNy4xMzMzMSA1LjIxOTcxIDYuOTkyNjZDNS4zNjAzNiA2Ljg1MjAxIDUuNTUxMTMgNi43NzI5OSA1Ljc1MDA0IDYuNzcyOTlDNS45NDg5NSA2Ljc3Mjk5IDYuMTM5NzIgNi44NTIwMSA2LjI4MDM3IDYuOTkyNjZDNi40MjEwMiA3LjEzMzMxIDYuNTAwMDQgNy4zMjQwOCA2LjUwMDA0IDcuNTIyOTlDNi40NDA2NyA4LjIxNzc5IDYuNjU2IDguOTA4MTggNy4wOTk4MiA5LjQ0NjA0QzcuNTQzNjQgOS45ODM5IDguMTgwNiAxMC4zMjY0IDguODc0MDQgMTAuNEM5LjU2Nzg0IDEwLjMyNjkgMTAuMjA1MyA5Ljk4NDYgMTAuNjQ5NSA5LjQ0NjY4QzExLjA5MzggOC45MDg3NyAxMS4zMDk0IDguMjE4MSAxMS4yNSA3LjUyMjk5QzExLjI1IDcuMzI0MDggMTEuMzI5MSA3LjEzMzMxIDExLjQ2OTcgNi45OTI2NkMxMS42MTA0IDYuODUyMDEgMTEuODAxMSA2Ljc3Mjk5IDEyIDYuNzcyOTlDMTIuMTk5IDYuNzcyOTkgMTIuMzg5NyA2Ljg1MjAxIDEyLjUzMDQgNi45OTI2NkMxMi42NzEgNy4xMzMzMSAxMi43NSA3LjMyNDA4IDEyLjc1IDcuNTIyOTlDMTIuNjkwNyA4LjIxODI2IDEyLjkwNjQgOC45MDkwNiAxMy4zNTA5IDkuNDQ3QzEzLjc5NTMgOS45ODQ5NCAxNC40MzMxIDEwLjMyNzEgMTUuMTI3IDEwLjRDMTUuODIwNCAxMC4zMjY0IDE2LjQ1NzMgOS45ODM4NyAxNi45MDA5IDkuNDQ1OThDMTcuMzQ0NiA4LjkwODA4IDE3LjU1OTcgOC4yMTc2OSAxNy41IDcuNTIyOTlDMTcuNSA3LjMyNDA4IDE3LjU3OTEgNy4xMzMzMSAxNy43MTk3IDYuOTkyNjZDMTcuODYwNCA2Ljg1MjAxIDE4LjA1MTEgNi43NzI5OSAxOC4yNSA2Ljc3Mjk5QzE4LjQ0OSA2Ljc3Mjk5IDE4LjYzOTcgNi44NTIwMSAxOC43ODA0IDYuOTkyNjZDMTguOTIxIDcuMTMzMzEgMTkgNy4zMjQwOCAxOSA3LjUyMjk5QzE4Ljk0MSA4LjIxODUxIDE5LjE1NzEgOC45MDk0NSAxOS42MDE5IDkuNDQ3MzlDMjAuMDQ2NyA5Ljk4NTMyIDIwLjY4NDggMTAuMzI3MyAyMS4zNzkgMTAuNFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hbGVydC10cmlhbmdsZVwiIGRhdGEtbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIzLjExOSAxOUwxMy43NzIgMS4xNUMxMy42MDI2IDAuODI2NzM5IDEzLjM0OCAwLjU1NTk5MyAxMy4wMzU3IDAuMzY3MDg4QzEyLjcyMzUgMC4xNzgxODQgMTIuMzY1NSAwLjA3ODMyMzQgMTIuMDAwNSAwLjA3ODMyMzRDMTEuNjM1NSAwLjA3ODMyMzQgMTEuMjc3NSAwLjE3ODE4NCAxMC45NjUzIDAuMzY3MDg4QzEwLjY1MyAwLjU1NTk5MyAxMC4zOTg0IDAuODI2NzM5IDEwLjIyOSAxLjE1TDAuODgxMDAyIDE5QzAuNzIxMzIyIDE5LjMwNDggMC42NDMwMDYgMTkuNjQ1NyAwLjY1MzYyNCAxOS45ODk3QzAuNjY0MjQzIDIwLjMzMzcgMC43NjM0MzggMjAuNjY5MSAwLjk0MTYxNyAyMC45NjM1QzEuMTE5OCAyMS4yNTc5IDEuMzcwOTMgMjEuNTAxNCAxLjY3MDczIDIxLjY3MDRDMS45NzA1NCAyMS44MzkzIDIuMzA4ODcgMjEuOTI4MSAyLjY1MyAyMS45MjhIMjEuMzQ3QzIxLjY5MTEgMjEuOTI4MSAyMi4wMjk1IDIxLjgzOTMgMjIuMzI5MyAyMS42NzA0QzIyLjYyOTEgMjEuNTAxNCAyMi44ODAyIDIxLjI1NzkgMjMuMDU4NCAyMC45NjM1QzIzLjIzNjYgMjAuNjY5MSAyMy4zMzU4IDIwLjMzMzcgMjMuMzQ2NCAxOS45ODk3QzIzLjM1NyAxOS42NDU3IDIzLjI3ODcgMTkuMzA0OCAyMy4xMTkgMTlaTTExIDcuNDIzQzExIDcuMTU3NzggMTEuMTA1NCA2LjkwMzQzIDExLjI5MjkgNi43MTU4OUMxMS40ODA0IDYuNTI4MzYgMTEuNzM0OCA2LjQyMyAxMiA2LjQyM0MxMi4yNjUyIDYuNDIzIDEyLjUxOTYgNi41MjgzNiAxMi43MDcxIDYuNzE1ODlDMTIuODk0NiA2LjkwMzQzIDEzIDcuMTU3NzggMTMgNy40MjNWMTMuNDIzQzEzIDEzLjY4ODIgMTIuODk0NiAxMy45NDI2IDEyLjcwNzEgMTQuMTMwMUMxMi41MTk2IDE0LjMxNzYgMTIuMjY1MiAxNC40MjMgMTIgMTQuNDIzQzExLjczNDggMTQuNDIzIDExLjQ4MDQgMTQuMzE3NiAxMS4yOTI5IDE0LjEzMDFDMTEuMTA1NCAxMy45NDI2IDExIDEzLjY4ODIgMTEgMTMuNDIzVjcuNDIzWk0xMi4wNSAxOC45MzNIMTIuMDIyQzExLjYyNzYgMTguOTMxNyAxMS4yNDkgMTguNzc4IDEwLjk2NTQgMTguNTA0MUMxMC42ODE3IDE4LjIzMDEgMTAuNTE1IDE3Ljg1NzEgMTAuNSAxNy40NjNDMTAuNDkyOCAxNy4yNjcgMTAuNTI0NyAxNy4wNzE1IDEwLjU5MzkgMTYuODg4QzEwLjY2MzEgMTYuNzA0NSAxMC43NjgyIDE2LjUzNjYgMTAuOTAzIDE2LjM5NDJDMTEuMDM3OCAxNi4yNTE3IDExLjE5OTYgMTYuMTM3NiAxMS4zNzkxIDE2LjA1ODRDMTEuNTU4NSAxNS45NzkyIDExLjc1MTkgMTUuOTM2NiAxMS45NDggMTUuOTMzSDExLjk3NkMxMi4zNzAzIDE1LjkzMzUgMTIuNzQ5MSAxNi4wODY0IDEzLjAzMzIgMTYuMzU5OUMxMy4zMTcyIDE2LjYzMzMgMTMuNDg0NSAxNy4wMDYgMTMuNSAxNy40QzEzLjUwNzggMTcuNTk2NCAxMy40NzYyIDE3Ljc5MjQgMTMuNDA3MSAxNy45NzY1QzEzLjMzOCAxOC4xNjA1IDEzLjIzMjggMTguMzI4OSAxMy4wOTc3IDE4LjQ3MThDMTIuOTYyNiAxOC42MTQ2IDEyLjgwMDQgMTguNzI5IDEyLjYyMDQgMTguODA4MkMxMi40NDA1IDE4Ljg4NzQgMTIuMjQ2NiAxOC45Mjk4IDEyLjA1IDE4LjkzM1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pbmRpY2F0b3ItZG90XCIgZGF0YS1uYW1lPVwiaW5kaWNhdG9yLWRvdFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMS41XCIvPjwvc3ltYm9sPjwvc3ZnPicpXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvbGlua3M6bG9hZFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWJlZCgpIH0pXG4gIH1cblxuICBlbWJlZCgpXG59KSgpXG4iLCJ2YXIgdG9vbGJveCAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIEV2ZW50TWFuYWdlciA9IEV2ZW50LmNhbGxiYWNrTWFuYWdlcixcbiAgICBTdGFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcbiAgICBpbml0aWFsaXplZCAgPSBmYWxzZSxcbiAgICBNb2RhbHMgICAgICAgPSBbXSxcbiAgICBTdGFjayAgICAgICAgPSBbXSxcbiAgICBGb2N1c1N0YWNrICAgPSBbXVxuXG4vLyBDU1Mgc3R5bGVzIHRvIGhlbHAgcHJldmVudCBzdHJheSBtb2RhbCBjbGlja3MgKGRvZXNuJ3Qgd29yayBpbiBsZXNzIHRoYW4gSUUgMTEpXG52YXIgc3R5bGUgICAgICAgID0gJzxzdHlsZSBpZD1cIm1vZGFsLXRvZ2dsZS1zdHlsZVwiPmJvZHlbZGF0YS1hY3RpdmUtbW9kYWxdICogeyBwb2ludGVyLWV2ZW50czogbm9uZSB9IC5hY3RpdmUtbW9kYWwsIC5hY3RpdmUtbW9kYWwgKiB7IHBvaW50ZXItZXZlbnRzOiBhbGwgfTwvc3R5bGU+J1xuXG4vLyB0eXBlcyBvZiBtb2RhbHNcbi8vIE1lbnUgLSB0cmlnZ2VyIHRvZ2dsZXMsIGNsaWNraW5nIG91dHNpZGUgY2xvc2VzXG4vLyBQYW5lbCAtIHRyaWdnZXIgb3BlbnMsIGJ1dCBkb2VzIG5vdCBjbG9zZSwgY2xpY2tpbmcgb3V0c2lkZSBjbG9zZXNcbi8vIERpYWxvZyAtIHRyaWdnZXIgb3BlbnMsIGNsaWNraW5nIG91dHNpZGUgaXMgaWdub3JlZCwgbXVzdCBiZSBjbG9zZWQgYnkgY2xpY2tpbmcgYSBjbG9zZSBidXR0b24gb3IgdGhlIGVzY2FwZSBrZXlcblxuXG52YXIgTW9kYWwgPSB7XG4gIG5ldzogZnVuY3Rpb24oIGVsLCB0eXBlLCB0cmlnZ2VyICkge1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBtb2RhbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHRyaWdnZXIgZm9yIGEgbW9kYWxcbiAgICB2YXIgbSA9IGdldE1vZGFsKCBlbCApXG4gICAgaWYgKCBtICkge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHRyaWdnZXIgYW5kIHJldHVyblxuICAgICAgaWYgKCB0cmlnZ2VyICkgbS50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcbiAgICAgIHJldHVybiBnZXRNb2RhbCggZWwgKVxuICAgIH1cblxuICAgIHZhciBtb2RhbCA9IHtcbiAgICAgIHRyaWdnZXJzOiBbXSxcbiAgICAgIF9tb2RhbDogICB0cnVlLFxuICAgICAgdHlwZTogICAgIHR5cGUsXG4gICAgICBpZDogICAgICAgTW9kYWxzLmxlbmd0aCxcbiAgICAgIGVsOiAgICAgICBlbCxcblxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIG9wZW46IEV2ZW50TWFuYWdlci5uZXcoKSxcbiAgICAgICAgY2xvc2U6IEV2ZW50TWFuYWdlci5uZXcoKVxuICAgICAgfSxcblxuICAgICAgaXNPcGVuOiBmYWxzZVxuICAgIH1cblxuICAgIG1vZGFsWyB0eXBlIF0gPSB0cnVlIC8vIGNvbnZlbmllbmNlIHR5cGUgY2hlY2tcbiAgICBNb2RhbHMucHVzaCggbW9kYWwgKVxuXG4gICAgLy8gVGFnIG1vZGFsIGVsZW1lbnQgd2l0aCBhbiBpZFxuICAgIGVsLmRhdGFzZXQubW9kYWxJZCA9IG1vZGFsLmlkXG4gICAgLy8gSGlkZSBtb2RhbCBieSBkZWZhdWx0XG4gICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG4gICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1tb2RhbCcsIHRydWUgKVxuXG4gICAgLy8gUmVnaXN0ZXIgZWxlbWVudHMgd2hpY2ggdHJpZ2dlciB0aGUgbW9kYWxcbiAgICBpZiAoIHRyaWdnZXIgKSBtb2RhbC50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcblxuICAgIG1vZGFsLm9uID0gZnVuY3Rpb24gKCB0eXBlLCBjYWxsYmFjayApIHtcbiAgICAgIGlmICggbW9kYWwuZXZlbnRzW3R5cGVdICkge1xuICAgICAgICBtb2RhbC5ldmVudHNbdHlwZV0uYWRkKCBjYWxsYmFjayApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGRlZmF1bHQgb3BlbmluZyBiZWhhdmlvclxuICAgIG1vZGFsLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIG1vZGFsLmlzT3BlbiApIHJldHVyblxuICAgICAgbW9kYWwuaXNPcGVuID0gdHJ1ZVxuICAgICAgbW9kYWwuZXZlbnRzLm9wZW4uc3RhcnQoKVxuICAgICAgbW9kYWwuZXZlbnRzLmNsb3NlLnN0b3AoKVxuXG4gICAgICAvLyBMaXN0ZW4gdG8gZXNjYXBlIGtleSBwcmVzc2VzIGluICdtb2RhbC1hY3RpdmUnIHNjb3BlXG4gICAgICBpZiAoICFTdGFjay5sZW5ndGggKSBFdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5UHJlc3MgKVxuXG4gICAgICBGb2N1c1N0YWNrLnB1c2goIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKVxuICAgICAgU3RhY2sucHVzaCggbW9kYWwgKVxuXG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICdtb2RhbC1hY3RpdmUnIClcbiAgICAgIGRvY3VtZW50LmJvZHkuZGF0YXNldC5tb2RhbCA9IGVsLmlkIHx8ICcnXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgZmFsc2UgKVxuXG4gICAgICAvLyBTZXQgc3RhdGUgb24gbW9kYWwgdHJpZ2dlcnNcbiAgICAgIG1vZGFsLnRyaWdnZXJzLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ21vZGFsLWFjdGl2ZScgKVxuICAgICAgfSlcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdtb2RhbC1pcy1vcGVuaW5nJyApXG5cbiAgICAgIC8vIEFmdGVyIG9wZW5pbmcgYW5pbWF0aW9uLCByZW1vdmUgYW5pbWF0aW9uIGNsYXNzXG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIG1vZGFsLmV2ZW50cy5vcGVuLmZpcmUsIDUwKVxuICAgIH1cblxuICAgIC8vIEFkZCBmaXJzdCBvcGVuIGNhbGxiYWNrXG4gICAgbW9kYWwuZXZlbnRzLm9wZW4uYWRkKCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtaXMtb3BlbmluZycgKVxuICAgIH0pXG5cbiAgICBtb2RhbC5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICggIW1vZGFsLmlzT3BlbiApIHJldHVyblxuXG4gICAgICAvLyBUb2dnbGUgZXZlbnQgY2FsbGJhY2tzXG4gICAgICBtb2RhbC5ldmVudHMub3Blbi5zdG9wKClcbiAgICAgIG1vZGFsLmV2ZW50cy5jbG9zZS5zdGFydCgpXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1pcy1vcGVuaW5nJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnbW9kYWwtaXMtY2xvc2luZycgKVxuICAgICAgXG4gICAgICAvLyBBZnRlciBjbG9zaW5nIGFuaW1hdGlvbiwgaGlkZSwgcG9wIHN0YWNrLCBmaXJlIGNsb3NlIGV2ZW50cy5cbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgbW9kYWwuZXZlbnRzLmNsb3NlLmZpcmUsIDUwIClcbiAgICB9XG5cbiAgICAvLyBBZGQgZmlyc3QgY2xvc2UgY2FsbGJhY2tcbiAgICBtb2RhbC5ldmVudHMuY2xvc2UuYWRkKCBmdW5jdGlvbigpe1xuICAgICAgbW9kYWwuaXNPcGVuID0gZmFsc2VcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG5cbiAgICAgIC8vIFNldCBzdGF0ZSBvbiBtb2RhbCB0cmlnZ2Vyc1xuICAgICAgbW9kYWwudHJpZ2dlcnMuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICB9KVxuICAgICAgXG4gICAgICAvLyBSZW1vdmUgdGhpcyBtb2RhbCBmcm9tIHRoZSBzdGFja1xuICAgICAgU3RhY2sucG9wKClcblxuICAgICAgLy8gUmVzdG9yZSBmb3VjcyBmb3IgZGlhbG9ncyBhbmQgbW9kYWwgbWVudXNcbiAgICAgIC8vIFRoaXMgcmV0dXJucyB1c2VycyB0byB0aGVpciBwbGFjZSBvbiB0aGUgcGFnZVxuICAgICAgLy8gVGhpcyBkb2Vzbid0IG9jY3VyIG9uIG1vZGFsIHBhbmVscyBiZWNhdXNlIGZvY3VzaW5nXG4gICAgICAvLyBvcGVucyBwYW5lbHMuIFRoZXJlIG1heSBiZSBhIGdvb2QgZml4IGZvciB0aGlzIGF0IHNvbWUgcG9pbnQuXG4gICAgICB2YXIgZm9jdXNFbCA9IEZvY3VzU3RhY2sucG9wKClcbiAgICAgIGlmICggbW9kYWwuZGlhbG9nIHx8IG1vZGFsLm1lbnUgKSBmb2N1c0VsLmZvY3VzKClcblxuICAgICAgLy8gSWYgaXQncyB0aGUgbGFzdCBtb2RhbCBvcGVuLCByZXN0b3JlIG5vbi1tb2RhbCBzdGF0ZVxuICAgICAgaWYgKCAhU3RhY2subGVuZ3RoICkge1xuICAgICAgICBFdmVudC5vZmYoIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVByZXNzIClcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICAgIGRvY3VtZW50LmJvZHkuZGF0YXNldC5tb2RhbCA9ICcnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmRhdGFzZXQubW9kYWwgPSBhY3RpdmVNb2RhbCgpLmVsLmlkXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBtb2RhbFxuICB9XG59XG5cbi8vIEFkZCBldmVudHMgdG8gbW9kYWxcbmZ1bmN0aW9uIG9uICggc2VsZWN0b3IsIGV2ZW50LCBjYWxsYmFjayApIHtcbiAgdmFyIG1vZGFsID0gZ2V0TW9kYWwoIHNlbGVjdG9yIClcbiAgaWYgKCBtb2RhbCAmJiBtb2RhbC5ldmVudHNbZXZlbnRdICkge1xuICAgIG1vZGFsLmV2ZW50c1tldmVudF0uYWRkKCBjYWxsYmFjayApXG4gICAgcmV0dXJuIG1vZGFsXG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2UgKCBtb2RhbCApIHtcbiAgLy8gRGlkIHRoZXkgc3BlY2lmeSBhIG1vZGFsIHRvIGNsb3NlP1xuICBpZiAoIHR5cGVvZiBtb2RhbCAhPSAndW5kZWZpbmVkJyApIHtcbiAgICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gICAgaWYgKCBtb2RhbCApIG1vZGFsLmNsb3NlKClcblxuICAvLyBObz8gQXNzdW1lIGN1cnJlbnQgbW9kYWwgc2hvdWxkIGJlIGNsb3NlZFxuICB9IGVsc2Uge1xuICAgIG1vZGFsID0gYWN0aXZlTW9kYWwoKVxuICAgIGlmICggbW9kYWwgKSBtb2RhbC5jbG9zZSgpXG4gIH1cblxuICByZXR1cm4gbW9kYWxcbn1cblxuZnVuY3Rpb24gb3BlbiAoIG1vZGFsICkge1xuICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gIGlmICggbW9kYWwgKSBtb2RhbC5vcGVuKClcblxuICByZXR1cm4gbW9kYWxcbn1cblxuLy8gQ2xpY2tzIHdoaWNoIG9jY3VyIHdoZW4gYSBtb2RhbCBpcyBhY3RpdmVcbmZ1bmN0aW9uIGFjdGl2ZUNsaWNrICggZXZlbnQgKSB7XG4gIHZhciBtb2RhbCA9IGFjdGl2ZU1vZGFsKClcblxuICAvLyBEaWQgdGhlIGNsaWNrIGhhcHBlbiBpbiBzaWRlIHRoZSBtb2RhbCwgb3IgaW4gYSBtb2RhbCBzYWZlIGNvbnRyb2w/XG4gIHZhciBtb2RhbENsaWNrID0gdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdbZGF0YS1tb2RhbC1pZD1cIicrbW9kYWwuaWQrJ1wiXScgKVxuICB2YXIgcGFuZWxDbGljayA9IG1vZGFsLnBhbmVsICYmIHRvb2xib3guZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnW2RhdGEtZm9yLW1vZGFsPVwiJyttb2RhbC5pZCsnXCJdJyApXG5cbiAgLy8gU3RvcCB0aGUgY2xpY2sgaWYgaXQgaGFwcGVuZWQgb3V0c2lkZSB0aGUgbW9kYWwgb3IgcGFuZWwgY29udHJvbFxuICBpZiAoICFtb2RhbENsaWNrICYmICFwYW5lbENsaWNrICkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgaWYgKCBtb2RhbC5wYW5lbCApIG1vZGFsLmNsb3NlKClcbiAgfVxufVxuXG4vLyBVc2UgdGhlIHN0YWNrIHBvc2l0aW9uIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBtb2RhbFxuZnVuY3Rpb24gYWN0aXZlTW9kYWwgKCkge1xuICByZXR1cm4gU3RhY2tbIFN0YWNrLmxlbmd0aCAtIDEgXVxufVxuXG5mdW5jdGlvbiBhY3RpdmVQYW5lbCAoKSB7XG4gIHJldHVybiBhY3RpdmVNb2RhbCgpLnF1ZXJ5U2VsZWN0b3IoICdbYXJpYS1tb2RhbD10cnVlXVthcmlhLWV4cGFuZGVkPXRydWVdJyApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG4vLyBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYnkgaWQgb3Igc2VsZWN0b3JcbmZ1bmN0aW9uIGdldE1vZGFsICggc2VhcmNoICkge1xuXG4gIC8vIERvbid0IGFjY2VwdCBnYXJiYWdlIGlucHV0XG4gIGlmICggIXNlYXJjaCApIHJldHVyblxuXG4gIC8vIFdhcyBhIG1vZGFsIG9iamVjdCBwYXNzZWQgaW4/IEp1c3QgcmV0dXJuIGl0XG4gIGlmICggc2VhcmNoLl9tb2RhbCApIHJldHVybiBzZWFyY2hcblxuICAvLyBJcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/IChwYXNzZWQgYW4gaWQpXG4gIGlmICggTW9kYWxzWyBzZWFyY2ggXSApIHJldHVybiBNb2RhbHNbIHNlYXJjaCBdXG5cbiAgLy8gVHJ5IG1vZGFsIHRyaWdnZXJzXG4gIGlmICggaXNFbGVtZW50KCBzZWFyY2ggKSApIHtcbiAgICAvLyBJcyBpdCBhIG1vZGFsIHRyaWdnZXI/XG4gICAgaWYgKCBzZWFyY2guZGF0YXNldC5mb3JNb2RhbCApIHJldHVybiBNb2RhbHNbIHNlYXJjaC5kYXRhc2V0LmZvck1vZGFsIF1cbiAgICBcbiAgICAvLyBJcyBpdCB0aGUgY2hpbGQgb2YgYSBtb2RhbCB0cmlnZ2VyP1xuICAgIHZhciBwYXJlbnQgPSB0b29sYm94LmdldENsb3Nlc3QoIHNlYXJjaCAsICdbZGF0YS1mb3ItbW9kYWxdJyApXG4gICAgaWYgKCBwYXJlbnQgKSByZXR1cm4gTW9kYWxzWyBwYXJlbnQuZGF0YXNldC5mb3JNb2RhbCBdXG4gIH1cblxuICBpZiAoIHR5cGVvZiBzZWFyY2ggPT09ICdzdHJpbmcnICkge1xuXG4gICAgLy8gV2VsbCwgbGV0J3MgaG9wZSBpdCdzIGEgRE9NIHNlbGVjdG9yXG4gICAgdmFyIG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VhcmNoIClcblxuICAgIC8vIElmIGl0IGlzIHdvbyBob29cbiAgICBpZiAoIG1vZGFsICYmIG1vZGFsLmRhdGFzZXQubW9kYWxJZCApIHtcbiAgICAgIHJldHVybiBNb2RhbHNbIG1vZGFsLmRhdGFzZXQubW9kYWxJZCBdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKCkge1xuICAvLyBTZWFyY2ggZm9yIHRocmVlIHR5cGVzIG9mIG1vZGFsc1xuICBbJ3BhbmVsJywgJ21lbnUnLCAnZGlhbG9nJ10uZm9yRWFjaCggZnVuY3Rpb24oIHR5cGUgKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtc2hvdy0nK3R5cGUrJ10nICksIGZ1bmN0aW9uKCB0cmlnZ2VyRWwgKSB7XG4gICAgICB2YXIgbW9kYWxFbFxuXG4gICAgICAvLyBHZXQgc2VsZWN0b3JcbiAgICAgIHZhciBzZWxlY3RvciA9IHRyaWdnZXJFbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNob3ctJyt0eXBlIClcbiAgICAgIGlmICggc2VsZWN0b3IgKSBtb2RhbEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKVxuXG4gICAgICBpZiAoIG1vZGFsRWwgKSB7XG4gICAgICAgIHZhciBtb2RhbCA9IE1vZGFsLm5ldyggbW9kYWxFbCwgdHlwZSwgdHJpZ2dlckVsIClcblxuICAgICAgICAvLyBBc3NpZ24gdGhlIHRyaWdnZXIgdG8gdGhpcyBtb2RhbElkIGZvciBlYXN5IHJlZmVyZW5jZSBsYXRlclxuICAgICAgICB0cmlnZ2VyRWwuZGF0YXNldC5mb3JNb2RhbCA9IG1vZGFsLmlkXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoIE1vZGFscy5sZW5ndGggPiAwICYmICFpbml0aWFsaXplZCApIHtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyYmVnaW4nLCBzdHlsZSApIFxuICAgIGluaXRpYWxpemVkID0gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCAoIGV2ZW50ICkge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCggZXZlbnQuY3VycmVudFRhcmdldCApXG4gIHZhciBlbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICBpZiAoIGVsLnRhZ05hbWUgPT0gJ0lOUFVUJyApIHtcblxuICAgIC8vIERvbid0IG9wZW4gd2hlbiBpbnB1dCBpcyBmb2N1c2VkXG4gICAgLy9pZiAoIGV2ZW50LnR5cGUgPT0gJ2ZvY3VzaW4nICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG5cbiAgICAvLyBEbyBub3QgdHJpZ2dlciBvcGVuIGlmIGlucHV0IGV2ZW50IGNsZWFycyBpbnB1dCB2YWx1ZVxuICAgIGlmICggZXZlbnQudHlwZSA9PSAnaW5wdXQnICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG4gIH1cblxuICAvLyBEb24ndCBmb2xsb3cgbGlua3MgdXNlZCB0byB0cmlnZ2VyIG1vZGFsc1xuICBpZiAoIGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYScgJiYgZWwuaHJlZiA9PSAnIycgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cblxuICBvcGVuKCBtb2RhbCApXG5cbn1cblxuZnVuY3Rpb24ga2V5UHJlc3MgKCBldmVudCApIHtcbiAgdmFyIGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gIC8vIEVTQyB3YXMgcHJlc3NlZFxuICBpZiAoIEV2ZW50LmtleS5pc1ByZXNzZWQoXCJlc2NcIikgKSB7XG4gICAgLy8gQSB3YXkgdG8gc3RvcCBjbGVhcmluZyB0aGUgaW5wdXQgdmFsdWVcbiAgICAvL2lmICggYWN0aXZlRWwudGFnTmFtZSA9PSAnSU5QVVQnICYmIGFjdGl2ZUVsLnZhbHVlICE9ICcnICkge1xuICAgICAgLy9ldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgLy99XG4gICAgcmV0dXJuIGNsb3NlKClcbiAgfVxuXG4gIGlmICggYWN0aXZlTW9kYWwoKS5tb2RhbCAmJiBFdmVudC5rZXkuaXNQcmVzc2VkKFwidGFiXCIpICkge1xuICAgIGZvY3VzTmV4dCggZXZlbnQgKVxuICB9XG5cbiAgLy8gXG4gIGlmICggYWN0aXZlTW9kYWwoKS5wYW5lbCB8fCBhY3RpdmVNb2RhbCgpLm1lbnUgKSB7XG4gICAgdmFyIGxpbmtcblxuICAgIGlmICggRXZlbnQua2V5LmlzUHJlc3NlZChcImRvd25cIikgKSB7XG4gICAgICAvLyBQcmV2ZW50IHBhZ2Ugc2Nyb2xsaW5nIGFzIGEgcmVzdWx0IG9mIGtleXByZXNzXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsaW5rID0gZ2V0TmV4dExpbmsoKVxuICAgIH1cblxuICAgIGlmICggRXZlbnQua2V5LmlzUHJlc3NlZChcInVwXCIpICkge1xuICAgICAgLy8gUHJldmVudCBwYWdlIHNjcm9sbGluZyBhcyBhIHJlc3VsdCBvZiBrZXlwcmVzc1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgbGluayA9IGdldFByZXZpb3VzTGluaygpXG4gICAgfVxuXG4gICAgLy8gT25seSBmb2N1cyBpZiB0aGVyZSBpcyBhIG5leHQgb3IgcHJldmlvdXMgbGluayB0byBtb3ZlIHRvXG4gICAgLy8gQXQgdG9wIG9yIGJvdHRvbSBvZiBhIGxpc3QgdGhlcmUgaXMgbm8gXCJuZXh0XCIgb3IgXCJwcmV2aW91c1wiXG4gICAgaWYgKCBsaW5rICkgbGluay5mb2N1cygpXG5cbiAgfVxufVxuXG5mdW5jdGlvbiBmb2N1c05leHQoIGV2ZW50ICkge1xuICB2YXIgbW9kYWxFbCAgICAgPSBhY3RpdmVNb2RhbCgpLmVsLFxuICAgICAgZm9jdXNhYmxlICAgPSBtb2RhbEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uJyksXG4gICAgICBmaXJzdCAgICAgICA9IGZvY3VzYWJsZVswXSxcbiAgICAgIGxhc3QgICAgICAgID0gZm9jdXNhYmxlW2ZvY3VzYWJsZS5sZW5ndGggLSAxXSxcbiAgICAgIGZvY3VzZWQgICAgID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gIC8vIElmIGZvY3VzZWQgb24gdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsIHRhYiB0byB0aGUgZmlyc3QgZWxlbWVudC5cbiAgaWYgKCBmb2N1c2VkID09IGxhc3QgJiYgIUV2ZW50LmtleS5zaGlmdCApIHtcbiAgICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuICAgIGZpcnN0LmZvY3VzKClcbiAgfVxuXG4gIGlmICggZm9jdXNlZCA9PSBmaXJzdCAmJiBFdmVudC5rZXkuc2hpZnQgKSB7XG4gICAgaWYgKCBldmVudCApeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cbiAgICBsYXN0LmZvY3VzKClcbiAgfVxuXG4gIC8vIEZvY3VzIG9uIHRoZSBmaXJzdCBlbGVtZW50IGlmIHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIG1vZGFsXG4gIGlmICggIWZvY3VzZWQgfHwgIXRvb2xib3guY2hpbGRPZiggZm9jdXNlZCwgbW9kYWxFbCApICkge1xuICAgIGZpcnN0LmZvY3VzKClcbiAgfVxufVxuXG4vLyBGaW5kIHRoZSBuZXh0IGZvY3VzYWJsZSBsaW5rXG5mdW5jdGlvbiBnZXROZXh0TGluayAoZWwpIHtcbiAgdmFyIGl0ZW1zID0gbGlua3MoKVxuICB2YXIgcG9zID0gYWN0aXZlUG9zaXRpb24oKVxuXG4gIC8vIE5vIGFjdGl2ZSBlbGVtZW50OiByZXR1cm4gZmlyc3QgZWxlbWVudFxuICBpZiAoIHBvcyA9PSAtMSApIHJldHVybiBpdGVtc1sgMCBdXG5cbiAgLy8gTGFzdCBlbGVtZW50IGZvY3VzZWQsIHJldHVybiBub3RoaW5nIChubyBuZXh0IGVsZW1lbnQpXG4gIGVsc2UgaWYgKCBwb3MgPT0gaXRlbXMubGVuZ3RoICkgcmV0dXJuXG5cbiAgLy8gcmV0dXJuIG5leHQgZm9jdXNhYmxlIGxpbmtcbiAgZWxzZSByZXR1cm4gaXRlbXNbIHBvcyArIDEgXVxufVxuXG4vLyBGaW5kIHRoZSBwcmV2aW91cyBmb2N1c2FibGUgbGlua1xuZnVuY3Rpb24gZ2V0UHJldmlvdXNMaW5rIChlbCkge1xuICB2YXIgaXRlbXMgPSBsaW5rcygpXG4gIHZhciBwb3MgPSBhY3RpdmVQb3NpdGlvbigpXG5cbiAgLy8gTm8gcHJldmlvdXMgZWxlbWVudCB0byBzZWxlY3RcbiAgaWYgKCBwb3MgPT0gLTEgfHwgcG9zID09IDAgKSByZXR1cm5cblxuICAvLyByZXR1cm4gcHJldmlvdXMgZm9jdXNhYmxlIGxpbmtcbiAgZWxzZSByZXR1cm4gaXRlbXNbIHBvcyAtIDEgXVxufVxuXG4vLyBTZWFyY2ggbGlua3MgaW4gdGhlIGN1cnJlbnQgbW9kYWwgZm9yIGFuIGFjdGl2ZSAoZm9jdXNlZCkgZWxlbWVudFxuZnVuY3Rpb24gYWN0aXZlUG9zaXRpb24gKCkge1xuICByZXR1cm4gbGlua3MoKS5pbmRleE9mKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IClcbn1cblxuLy8gUmV0dXJuIGFsbCBsaW5rcyBpbiBjdXJyZW50IG1vZGFsXG5mdW5jdGlvbiBsaW5rcyAoKSB7XG4gIHJldHVybiB0b29sYm94LnNsaWNlKCBhY3RpdmVNb2RhbCgpLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoICdhJyApICkuZmlsdGVyKCBmdW5jdGlvbiggYSApIHtcbiAgICByZXR1cm4gIXRvb2xib3guZ2V0Q2xvc2VzdCggYSwgJ1thcmlhLWhpZGRlbj1cInRydWVcIl0nIClcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0dXAgKCkge1xuICBFdmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIGluaXQoKVxuXG4gICAgLy8gQ2hlY2sgYWxsIGJvZHkgY2xpY2tzIHRvIHNlZSBpZiB0aGV5IHNob3VsZCBiZSBwZXJtaXR0ZWRcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdib2R5Lm1vZGFsLWFjdGl2ZScsIGFjdGl2ZUNsaWNrLCB7IHVzZUNhcHR1cmU6IHRydWUgfSkgXG5cbiAgICAvLyBUcmlnZ2VyIG1vZGFscyBvbiBpbnB1dCBldmVudHMgKGxpa2UgYSBzZWFyY2ggcmVzdWx0cyBwYW5lbCB0aGF0IHdhaXRzIHVudGlsIHR5cGluZyB0byBzaG93KVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ2lucHV0W2RhdGEtZm9yLW1vZGFsXSwgW2RhdGEtZm9yLW1vZGFsXSBpbnB1dCcsIEV2ZW50LmRlYm91bmNlKCB0cmlnZ2VyRXZlbnQsIDUwLCB7IGxlYWRpbmc6IHRydWUgfSkgKVxuICAgIFxuICAgIC8vIFRyaWdnZXIgbW9kYWxzIG9uIGtleXVwIGV2ZW50cyBpbiBpbnB1dHMgKGxpa2UgYSBzZWFyY2ggcmVzdWx0cyBwYW5lbCB0aGF0IHdhaXRzIHVudGlsIHR5cGluZyB0byBzaG93KVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrIGZvY3VzaW4nLCAnaW5wdXRbZGF0YS1mb3ItbW9kYWxdLCBbZGF0YS1mb3ItbW9kYWxdIGlucHV0JywgdHJpZ2dlckV2ZW50IClcblxuICAgIC8vIFRyaWdnZXIgbW9kYWxzIG9uIGNsaWNrIGV2ZW50cyBmb3IgYW5jaG9ycyBhbmQgYnV0dG9uc1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ2FbZGF0YS1mb3ItbW9kYWxdLCBidXR0b25bZGF0YS1mb3ItbW9kYWxdLCBbZGF0YS1mb3ItbW9kYWxdIGEsIFtkYXRhLWZvci1tb2RhbF0gYnV0dG9uJywgdHJpZ2dlckV2ZW50IClcblxuICAgIEV2ZW50LmtleU9uKCAnZXNjJywgY2xvc2UgKVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV3OiBNb2RhbC5uZXcsXG4gIGxpbmtzOiBsaW5rcyxcbiAgc2V0dXA6IHNldHVwLFxuICBtb2RhbHM6IE1vZGFscyxcbiAgaW5pdDogaW5pdCxcbiAgZ2V0OiBnZXRNb2RhbCxcbiAgYWN0aXZlOiBhY3RpdmVNb2RhbCxcbiAgb246IG9uLFxuICBpc0VsZW1lbnQ6IGlzRWxlbWVudFxufVxuIiwidmFyIHRvb2xib3ggID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgbW9kYWwgICAgPSByZXF1aXJlKCAnLi9fbW9kYWwnICksXG4gICAgc3RhY2sgICAgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcblxuLy8gRm9jdXMgb24gc2VhcmNoIHdoZW4gYC9gIGtleSBpcyBwcmVzc2VkXG5FdmVudC5rZXlPbiggJy8nLCBmdW5jdGlvbihldmVudCl7IFxuICB2YXIgcSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXFdJylcbiAgaWYgKCBxICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBxLmZvY3VzKClcbiAgfVxufSlcblxuLy8gUmVzZXQgc2VhcmNoIHJlc3VsdHMgcGFuZWwgd2hlbiBxdWVyeSBpcyBjbGVhcmVkXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKSB7XG4gIHZhciBzZWFyY2hTdGFjayA9IHN0YWNrLmdldCggJyNzZWFyY2gtc3RhY2snIClcbiAgdmFyIHEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1xXScpXG4gIHZhciBzZWFyY2hNb2RhbCA9IG1vZGFsLmdldCggJyNzZWFyY2gtcmVzdWx0cycgKVxuXG4gIGlmICggIXNlYXJjaE1vZGFsIHx8ICFxICkgcmV0dXJuXG5cbiAgZnVuY3Rpb24ga2V5V2F0Y2hlciAoIGV2ZW50ICkge1xuICAgIHZhciBmb2N1c0VsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gICAgLy8gSWYgYSBsZXR0ZXIsIG51bWJlciwgb3IgYmFja3NwYWNlIGlzIHByZXNzZWQgZm9jdXMgb24gc2VhcmNoIGlucHV0XG4gICAgaWYgKCBmb2N1c0VsICE9IHEgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSB8fCBFdmVudC5rZXkuaXNQcmVzc2VkKFwiYmFja3NwYWNlXCIpICkge1xuICAgICAgcS5mb2N1cygpXG5cbiAgICAvLyBSZXN0b3JlIGRlZmF1bHQgc2VhcmNoIGlucHV0IGJlaGF2aW9yXG4gICAgLy8gV2hlbiBmb3Vjc2VkLCBlc2MgY2xlYXJzIGlucHV0XG4gICAgfSBlbHNlIGlmICggZm9jdXNFbCA9PSBxICYmIEV2ZW50LmtleS5pc1ByZXNzZWQoIFwiZXNjXCIgKSApIHtcbiAgICAgIHEudmFsdWUgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIC8vIFNjcm9sbCBhbGwgbmF2cyBiYWNrIHRvIHRvcFxuICBmdW5jdGlvbiByZXNldFNjcm9sbCAoKSB7XG4gICAgdG9vbGJveC5lYWNoKCBzZWFyY2hTdGFjay5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoICduYXYnICksIGZ1bmN0aW9uIChuYXYpIHtcbiAgICAgIG5hdi5zY3JvbGxUb3AgPSAwXG4gICAgfSlcbiAgfVxuXG4gIHNlYXJjaE1vZGFsLm9uKCAnb3BlbicsIGZ1bmN0aW9uKCkge1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2tleWRvd24nLCBrZXlXYXRjaGVyIClcbiAgfSlcblxuICAvLyBSZXNldCBzdGFjayB3aGVuIG1vZGFsIGlzIGNsb3NlZCBhbmQgcXVlcnkgaXMgY2xlYXJcbiAgc2VhcmNoTW9kYWwub24oICdjbG9zZScsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFJlc3RvcmUgc3RhdGUgb2Ygc2VhcmNoIHBhbmVsXG4gICAgaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbbmFtZT1xXScgKS52YWx1ZSA9PSAnJyApIHtcbiAgICAgIHNlYXJjaFN0YWNrLnJlc2V0KClcbiAgICAgIHJlc2V0U2Nyb2xsKClcbiAgICB9XG5cbiAgICBFdmVudC5vZmYoIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVdhdGNoZXIgKVxuICB9KVxuXG4gIC8vIFNob3cgZmlyc3QgcGFuZWwgc3RhY2sgd2hlbiBxdWVyeSBpcyBjbGVhcmVkXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ1tuYW1lPXFdJywgRXZlbnQuZGVib3VuY2UoIGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgaWYgKCBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlID09ICcnICkge1xuICAgICAgc2VhcmNoU3RhY2suc2hvdyggMCApXG4gICAgICByZXNldFNjcm9sbCgpXG4gICAgfVxuICB9LCA1MCApKVxuXG4gIC8vIFdpcmUgdXAgY2xlYXIgc2VhcmNoIGlucHV0IGJlaGF2aW9yXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5jbGVhci1zZWFyY2gnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIHZhciBzZWFyY2hJbnB1dCA9IHRvb2xib3guZ2V0Q2xvc2VzdCggYnV0dG9uLCAnbGFiZWwnICkucXVlcnlTZWxlY3RvciggJy5pbnB1dC1jb250YWluZXIgaW5wdXQnIClcbiAgICBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnXG4gICAgRXZlbnQuZmlyZSggc2VhcmNoSW5wdXQsICdpbnB1dCcgKVxuXG4gICAgc2VhcmNoSW5wdXQuZm9jdXMoKVxuICB9LCB7IHVzZUNhcHR1cmU6IHRydWUgfSlcbn0pXG4iLCJ2YXIgdG9vbGJveCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGNvb2tpZSAgICAgID0gcmVxdWlyZSggJy4vX2Nvb2tpZScgKSxcbiAgICBFdmVudCAgICAgICA9IHRvb2xib3guZXZlbnRcblxuRXZlbnQucmVhZHkoIGZ1bmN0aW9uKCkge1xuICBFdmVudC5rZXlPbiggJ2VzYycsICdzaWRlYmFyJywgdG9nZ2xlIClcbiAgRXZlbnQua2V5T24oICddLFssXFxcXCcsIHRvZ2dsZSApXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5zaWRlYmFyLW5hdi10b2dnbGUnLCB0b2dnbGUgKVxufSlcblxuZnVuY3Rpb24gdG9nZ2xlKCkge1xuXG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSggJ3Nob3ctc2lkZWJhcicgKVxuXG4gIGlmICggZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoICdzaG93LXNpZGViYXInICkgKVxuICAgIEV2ZW50LmtleS5zZXRTY29wZSggJ3NpZGViYXInIClcbiAgZWxzZVxuICAgIEV2ZW50LmtleS5zZXRTY29wZSggJ2FsbCcgKVxufVxuIiwidmFyIHRvb2xib3ggICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgICAgICAgID0gdG9vbGJveC5ldmVudCxcbiAgICBTdGFja3MgICAgICAgPSBbXVxuXG52YXIgU3RhY2sgPSB7XG4gIG5ldzogZnVuY3Rpb24oIHJvb3QgKSB7XG5cbiAgICBpZiAoICFpc0VsZW1lbnQoIHJvb3QgKSApIHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCByb290IClcblxuICAgIC8vIERvbid0IGFkZCBhIG5ldyBzdGFjayBpZiBubyBlbGVtZW50IGZvdW5kIG9yIGlmIHN0YWNrIGFscmVhZHkgZXhpc3RzXG4gICAgaWYgKCAhaXNFbGVtZW50KCByb290ICkgfHwgcm9vdC5kYXRhc2V0LnN0YWNrSWQgKSByZXR1cm5cblxuICAgIC8vIFNldCB1cCBzdGFjayBieSBzZWFyY2hpbmcgRE9NIG5vZGUgdW5kZXIgaXQuXG4gICAgLy8gVGhlIGZpcnN0IGNoaWxkIGZvdW5kIHdpbGwgYmUgc2V0IHVwIGFzIGEgZGVmYXVsdFxuICAgIC8vIEFmdGVyIHRoYXQgZWFjaCBjaGlsZCB3aWxsIGJlIGFkZGVkIGFzIGEgc3RhY2sgcHVzaFxuXG4gICAgdmFyIHN0YWNrID0ge1xuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICBwYW5lbHM6IFtdLFxuICAgICAgZm9jdXM6IFtdLFxuXG4gICAgICBhZGQ6IGZ1bmN0aW9uICggcGFuZWxFbCwgbmFtZSApIHtcbiAgICAgICAgcGFuZWxFbC5kYXRhc2V0LnN0YWNrSW5kZXggPSBzdGFjay5wYW5lbHMubGVuZ3RoXG5cbiAgICAgICAgLy8gSGlkZSBhbGwgcGFuZWxzIGJ1dCB0aGUgZmlyc3QgcGFuZWxcbiAgICAgICAgaWYgKCBzdGFjay5wYW5lbHMubGVuZ3RoID09IDAgKSB7IFxuICAgICAgICAgIHNob3dFbCggcGFuZWxFbCApXG4gICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgIGhpZGVFbCggcGFuZWxFbCApXG4gICAgICAgIH1cblxuICAgICAgICBzdGFjay5wYW5lbHMucHVzaCggcGFuZWxFbCApXG4gICAgICB9LFxuXG4gICAgICAvLyBSZXNldCBzdGFjayB0byBmaXJzdCBwYW5lbFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvLyBBbHJlYWR5IHJlc2V0PyBXZSdyZSBkb25lLlxuICAgICAgICBpZiAoIHN0YWNrLmN1cnJlbnQgPT0gMCApIHJldHVyblxuXG4gICAgICAgIC8vIElmIGhpZGRlbiwgbWFudWFsbHkgcmVzZXQgYWxsXG4gICAgICAgIGlmICggc3RhY2sucm9vdC5vZmZzZXRQYXJlbnQgPT0gbnVsbCApIHtcbiAgICAgICAgICBzdGFjay5mb2N1cyA9IFtdIC8vIENsZWFyIGZvY3VzIHN0YWNrXG5cbiAgICAgICAgICAvLyBIaWRlIGFuZCByZXNldCBzY3JvbGwgb24gYWxsIHBhbmVsc1xuICAgICAgICAgIHN0YWNrLnBhbmVscy5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7IFxuICAgICAgICAgICAgZWwuc2Nyb2xsVG9wID0gMFxuICAgICAgICAgICAgaGlkZUVsKCBlbCApXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFNob3cgZmlyc3QgcGFuZWxcbiAgICAgICAgICBzdGFjay5jdXJyZW50ID0gMFxuICAgICAgICAgIHNob3dFbCggc3RhY2sucGFuZWxzWzBdIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vdCBoaWRkZW4sIGRpc21pc3MgY3VycmVudCBwYW5lbCBhbmQgcmVzZXQgdG8gZmlyc3QgcGFuZWxcbiAgICAgICAgZWxzZSBzdGFjay5zaG93KCAwIClcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNob3cgYSBzcGVjaWZpYyBwYW5lbCwgaGlkaW5nIGFsbCBvdGhlcnNcbiAgICAgIHNob3c6IGZ1bmN0aW9uICggbmFtZSApIHtcbiAgICAgICAgdmFyIHBhbmVsID0gc3RhY2suZmluZFBhbmVsKCBuYW1lIClcblxuICAgICAgICAvLyBJZiBhIHBhbmVsIGlzbid0IHRoZSBjdXJyZW50IHBhbmVsXG4gICAgICAgIC8vIGRpc21pc3MgaXQgYmVmb3JlIGdvaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcGFuZWxcbiAgICAgICAgaWYgKCBwYW5lbCAmJiBwYW5lbCAhPSBzdGFjay5jdXJyZW50UGFuZWwoKSApIHtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBEaXNtaXNzIHRoZSBjdXJyZW50IHBhbmVsIGFuZCB3aXRoIHRoZSBjYWxsYmFjayBsb2FkIGluIHRoZSBuZXh0IHBhbmVsXG4gICAgICAgICAgcmV0dXJuIHN0YWNrLmRpc21pc3MoIHN0YWNrLmRpcmVjdGlvbiggcGFuZWwgKSwgZnVuY3Rpb24oKSB7IFxuICAgICAgICAgICAgc3RhY2suZW50ZXIoIHBhbmVsIClcbiAgICAgICAgICB9KVxuXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVudGVyOiBmdW5jdGlvbiAoIGVsICkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gc3RhY2suZGlyZWN0aW9uKCBlbCApXG4gICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG4gICAgICAgIHN0YWNrLmN1cnJlbnQgPSBOdW1iZXIoIGVsLmRhdGFzZXQuc3RhY2tJbmRleCApXG5cbiAgICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbC5kYXRhc2V0LmRpcmVjdGlvbiA9ICcnXG4gICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2VudGVyJyApXG4gICAgICAgIH0sIDUwIClcblxuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnZW50ZXInIClcbiAgICAgICAgc2hvd0VsKCBlbCApXG5cbiAgICAgICAgaWYgKCBkaXJlY3Rpb24gPT0gJ2ZvcndhcmQnICkge1xuICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnQgd2FzIGluIHRoZSBzdGFja1xuICAgICAgICAgIC8vaWYgKCB0b29sYm94LmNoaWxkT2YoIHN0YWNrLmxhc3RGb2N1cygpLCBzdGFjay5yb290ICkgKSB7XG5cbiAgICAgICAgICAgIC8vIGZvY3VzIG9uIHRoZSBmaXJzdCBpbnB1dFxuICAgICAgICAgICAgLy92YXIgZmlyc3RJdGVtID0gZWwucXVlcnlTZWxlY3RvciggJ2lucHV0Om5vdChbaGlkZGVuXSksIHRleHRhcmVhLCBzZWxlY3QsIGFbdGFiaW5kZXhdJyApXG4gICAgICAgICAgICAvL2lmICggZmlyc3RJdGVtICkgZmlyc3RJdGVtLmZvY3VzKClcbiAgICAgICAgICBcbiAgICAgICAgICAvL31cblxuICAgICAgICAvLyBGb2N1cyBvbiB0aGUgcHJldmlvdXMgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgIH0gZWxzZSBpZiAoIGRpcmVjdGlvbiA9PSAncmV2ZXJzZScgJiYgc3RhY2suZm9jdXMubGVuZ3RoID4gMCApIHtcbiAgICAgICAgICBzdGFjay5mb2N1cy5wb3AoKS5mb2N1cygpXG4gICAgICAgIH0gICAgICBcbiAgICAgIH0sXG5cbiAgICAgIGRpc21pc3M6IGZ1bmN0aW9uICggZGlyZWN0aW9uLCBjYWxsYmFjayApIHtcblxuICAgICAgICB2YXIgZWwgPSBzdGFjay5jdXJyZW50UGFuZWwoKVxuXG4gICAgICAgIGlmICggZGlyZWN0aW9uID09ICdmb3J3YXJkJyApXG4gICAgICAgICAgc3RhY2suZm9jdXMucHVzaCggZG9jdW1lbnQuYWN0aXZlRWxlbWVudCApXG5cbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2VudGVyJyApXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdleGl0JyApXG4gICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBFbnN1cmUgcGFuZWwgaXMgc2Nyb2xsZWQgdG8gdG9wXG4gICAgICAgICAgaWYgKCBkaXJlY3Rpb24gPT0gJ3JldmVyc2UnICkgZWwuc2Nyb2xsVG9wID0gMFxuXG4gICAgICAgICAgaGlkZUVsKCBlbCApXG4gICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2V4aXQnIClcbiAgICAgICAgICBlbC5kYXRhc2V0LmRpcmVjdGlvbiA9ICcnXG5cbiAgICAgICAgICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIGNhbGxiYWNrKClcblxuICAgICAgICB9LCA1MCApXG5cbiAgICAgIH0sXG5cbiAgICAgIGxhc3RGb2N1czogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdGFjay5mb2N1c1sgc3RhY2suZm9jdXMubGVuZ3RoIC0xIF0gXG4gICAgICB9LFxuXG4gICAgICAvLyBGaW5kIGEgcGFuZWwgYnkgbmFtZSBvciBpbmRleFxuICAgICAgZmluZFBhbmVsOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG4gICAgICAgIGlmICggaXNFbGVtZW50KCBuYW1lICkgKSBcbiAgICAgICAgICByZXR1cm4gbmFtZSBcbiAgICAgICAgZWxzZSBcbiAgICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtc3RhY2s9XCInK25hbWUrJ1wiXSwgW2RhdGEtc3RhY2staW5kZXg9XCInK25hbWUrJ1wiXScgKVxuICAgICAgfSxcblxuICAgICAgLy8gV2FsayBiYWNrd2FyZHMgaW4gdGhlIHN0YWNrLCBzaG93aW5nIHRoZSBwYW5lbCBwcmV2aW91cyB0byB0aGUgY3VycmVudCBwYW5lbFxuICAgICAgYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFjay5zaG93KCBzdGFjay5wYW5lbHNbIHN0YWNrLmN1cnJlbnQgLSAxIF0gKVxuICAgICAgfSxcblxuICAgICAgLy8gYWRkIGFyaWEtaGlkZGVuPWZhbHNlIHRvIHRoZSBmaXJzdCBoaWRkZW4gZWxlbWVudFxuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFjay5zaG93KCBzdGFjay5wYW5lbHNbIHN0YWNrLmN1cnJlbnQgKyAxIF0gKVxuICAgICAgfSxcblxuICAgICAgZGlyZWN0aW9uOiBmdW5jdGlvbiggcGFuZWwgKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHN0YWNrLnBhbmVsSW5kZXgoIHBhbmVsIClcblxuICAgICAgICBpZiAoIGluZGV4ID09IHN0YWNrLmN1cnJlbnQgKSByZXR1cm4gJ25vbmUnXG4gICAgICAgIGVsc2UgcmV0dXJuICggc3RhY2suY3VycmVudCA8IGluZGV4ICkgPyAnZm9yd2FyZCcgOiAncmV2ZXJzZSdcbiAgICAgICBcbiAgICAgIH0sXG5cbiAgICAgIGN1cnJlbnRQYW5lbDogZnVuY3Rpb24gKCBuYW1lICkge1xuICAgICAgICBpZiAoIG5hbWUgKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCBdID09IHN0YWNrLmZpbmRQYW5lbCggbmFtZSApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCBdXG4gICAgICB9LFxuXG4gICAgICBwYW5lbEluZGV4OiBmdW5jdGlvbiAoIHBhbmVsICkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKCBwYW5lbC5kYXRhc2V0LnN0YWNrSW5kZXggKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhIHF1ZXJ5YWJsZSBzdGFjayBpZFxuICAgIHJvb3QuZGF0YXNldC5zdGFja0lkID0gU3RhY2tzLmxlbmd0aFxuXG4gICAgU3RhY2tzLnB1c2goIHN0YWNrIClcbiAgICB0b29sYm94LmVhY2goIHJvb3QuY2hpbGRyZW4sIHN0YWNrLmFkZCApXG5cbiAgICByZXR1cm4gc3RhY2tcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93RWwgKCBlbCApIHtcbiAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCBmYWxzZSApXG59XG5cbmZ1bmN0aW9uIGhpZGVFbCAoIGVsICkge1xuICBlbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsIHRydWUgKVxufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQgKCBpdGVtICkge1xuICByZXR1cm4gaXRlbS5jb25zdHJ1Y3Rvci50b1N0cmluZygpLnNlYXJjaCgvSFRNTC4rRWxlbWVudC8pID4gLTFcbn1cblxuZnVuY3Rpb24gbmF2Q2xpY2sgKCBldmVudCApIHtcbiAgdmFyIGVsID0gZXZlbnQuY3VycmVudFRhcmdldFxuICB2YXIgcGFuZWwgPSBlbC5kYXRhc2V0LnN0YWNrTmF2XG4gIHZhciBzdGFjayA9IGdldFN0YWNrKCB0b29sYm94LmdldENsb3Nlc3QoIGVsLCAnW2RhdGEtc3RhY2s9XCJyb290XCJdJyApIClcbiAgaWYgKCAhc3RhY2sgKSByZXR1cm5cblxuICBpZiAoIHBhbmVsID09ICduZXh0JyApIHN0YWNrLm5leHQoKVxuICBlbHNlIGlmICggcGFuZWwgPT0gJ2JhY2snICkgc3RhY2suYmFjaygpXG4gIGVsc2UgaWYgKCBzdGFjay5maW5kUGFuZWwoIHBhbmVsICkgKSBzdGFjay5zaG93KCBwYW5lbCApXG4gIGVsc2UgcmV0dXJuXG5cbiAgLy9ldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIHByZXZQYW5lbCAoIGV2ZW50ICkge1xuICB2YXIgc3RhY2sgPSBnZXRTdGFjayggdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nICkgKVxuICBzdGFjay5iYWNrKClcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxufVxuXG5mdW5jdGlvbiBzZXR1cCAoKSB7XG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtc3RhY2s9XCJyb290XCJdJyksIFN0YWNrLm5ldyApXG4gIH0pXG5cbiAgLy8gTG9jYWxpc2UgY2xpY2tzIHRvIGEgc3RhY2sgcm9vdFxuICAvLyBGdXR1cmU6IGNvbnNpZGVyIGV4cGFuZGluZyB0aGlzIHRvIGFsbG93IGNvbnRyb2xzIHRvIGxpdmUgYW55d2hlcmUgYW5kIHBvaW50IHRvIGEgc3RhY2tcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtc3RhY2s9XCJyb290XCJdIFtkYXRhLXN0YWNrLW5hdl0nLCBuYXZDbGljayApXG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrICggc2VhcmNoICkge1xuXG4gIGlmICggaXNFbGVtZW50KCBzZWFyY2ggKSApIHtcbiAgICBpZiAoIHNlYXJjaC5kYXRhc2V0LnN0YWNrSWQgKSByZXR1cm4gU3RhY2tzWyBzZWFyY2guZGF0YXNldC5zdGFja0lkIF1cbiAgfVxuXG4gIGlmICggdHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycgKSB7XG5cbiAgICAvLyBXZWxsLCBsZXQncyBob3BlIGl0J3MgYSBET00gc2VsZWN0b3JcbiAgICB2YXIgc3RhY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBzZWFyY2ggKVxuXG4gICAgLy8gSWYgaXQgaXMgd29vIGhvb1xuICAgIGlmICggc3RhY2sgJiYgc3RhY2suZGF0YXNldC5zdGFja0lkICkge1xuICAgICAgcmV0dXJuIFN0YWNrc1sgc3RhY2suZGF0YXNldC5zdGFja0lkIF1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG5ldzogU3RhY2submV3LFxuICBzZXR1cDogc2V0dXAsXG4gIGdldDogZ2V0U3RhY2ssXG4gIHN0YWNrczogU3RhY2tzXG59XG4iLCIvLyBQdXJwb3NlOiBUb2dnbGVzIGV4cGFuc2lvbiBvZiB0cmVlIG5hdiBhbmQgc3RvcmVzIGNvb2tpZXMgdG8gcmV0YWluIHN0YXRlXG4vL1xuLy8gVXNhZ2U6XG4vLyAtIFRyZWVzIG11c3QgaGF2ZSBhIFtkYXRhLXRyZWU9J3RyZWUta2V5J11cbi8vIC0gTm9kZXMgYXJlIG5hbWVkIGJ5IFtkYXRhLW5vZGU9J25vZGUtbmFtZSddXG4vL1xuLy8gQ29va2llcyBhcmUgc3RvcmVkIGFzIHRyZWUta2V5ID0+IHsgbm9kZS1uYW1lOiB0cnVlIH1cbi8vIG5vZGUgYm9vbGVhbiBtYXRjaGVzIGFyaWEtZXhwYW5kZWQgc3RhdGVcbi8vXG5cbnZhciB0b29sYm94ICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgY29va2llICAgICAgPSByZXF1aXJlKCAnLi9fY29va2llJyApLFxuICAgIEV2ZW50ICAgICAgID0gdG9vbGJveC5ldmVudFxuXG5mdW5jdGlvbiBzZXRDb29raWUgKCBub2RlICkge1xuICBpZiAoIG5vZGUuZGF0YXNldC5ub2RlICkge1xuICAgIHZhciB0cmVlID0gdG9vbGJveC5nZXRDbG9zZXN0KCBub2RlLCAnW2RhdGEtdHJlZV0nIClcbiAgICBpZiAoIHRyZWUgKSB7XG4gICAgICBkYXRhID0ge31cbiAgICAgIGRhdGFbIG5vZGUuZGF0YXNldC5ub2RlIF0gPSBub2RlLmdldEF0dHJpYnV0ZSggJ2FyaWEtZXhwYW5kZWQnICkgPT0gJ3RydWUnXG4gICAgICBjb29raWUudXBkYXRlKCB0cmVlLmRhdGFzZXQudHJlZSwgZGF0YSApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsaWNrICggZXZlbnQgKSB7XG4gIHZhciB0YXJnZXQgICA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICBwYXJlbnQgICA9IHRhcmdldC5wYXJlbnRFbGVtZW50LFxuICAgICAgZXhwYW5kZWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcgKVxuXG4gIC8vIEFkZCBhIGNsYXNzbmFtZSB0byBpbmRpY2F0ZSB0aGF0IGl0IHdhcyBtYW51YWxseSB0cmlnZ2VyZWRcbiAgLy8gVGhpcyBhbGxvd3MgZm9yIGFuaW1hdGluZyBpbnRlcmFjdGlvbnMsIGJ1dCBub3Qgb3RoZXIgYXR0cmlidXRlIGNoYW5nZXNcbiAgcGFyZW50LmNsYXNzTGlzdC5hZGQoICd0cmlnZ2VyZWQnIClcbiAgcGFyZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtZXhwYW5kZWQnLCBleHBhbmRlZCAhPSAndHJ1ZScgKVxuXG4gIHNldENvb2tpZSggcGFyZW50IClcbn1cblxuLy8gU2V0cyB0cmVlIG5hdiBzdGF0ZSBiYXNlZCBvZmYgb2YgY29va2llc1xuZnVuY3Rpb24gcmVzdG9yZU5hdiAoKSB7XG4gIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXRyZWVdJyApLCBmdW5jdGlvbiggdHJlZSApIHtcbiAgICB2YXIga2V5ID0gdHJlZS5kYXRhc2V0LnRyZWVcbiAgICBpZiAoIGtleSApIHtcbiAgICAgIHZhciBkYXRhID0gY29va2llLmdldCgga2V5IClcblxuICAgICAgT2JqZWN0LmtleXMoIGRhdGEgKS5mb3JFYWNoKCBmdW5jdGlvbiggbm9kZSApIHtcbiAgICAgICAgdmFyIG5vZGVFbCA9IHRyZWUucXVlcnlTZWxlY3RvciggJ1tkYXRhLW5vZGU9Jytub2RlKyddJyApXG4gICAgICAgIC8vIFVzZSBjb29raWVzIHRvIGV4cGFuZC5cbiAgICAgICAgaWYgKCBub2RlRWwgJiYgZGF0YVtub2RlXSA9PSAndHJ1ZScgKSBub2RlRWwuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsIGRhdGFbbm9kZV0gKVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNldHVwKCkge1xuICBFdmVudC5yZWFkeSggZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUaGUgZmlyc3QgY2hpbGQgb2YgYSBub2RlIGlzIHRoZSB0cmlnZ2VyXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2FyaWEtZXhwYW5kZWRdID4gKjpmaXJzdC1jaGlsZCcsIGNsaWNrIClcblxuICAgIC8vIFNldCBzdGF0ZXMgYWNjb3JkaW5nIHRvIGNvb2tpZXNcbiAgICAvL3Jlc3RvcmVOYXYoKVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0dXA6IHNldHVwXG59XG4iLCIvKipcbiAqIEFkZCBkYXRhc2V0IHN1cHBvcnQgdG8gZWxlbWVudHNcbiAqIE5vIGdsb2JhbHMsIG5vIG92ZXJyaWRpbmcgcHJvdG90eXBlIHdpdGggbm9uLXN0YW5kYXJkIG1ldGhvZHMsIFxuICogICBoYW5kbGVzIENhbWVsQ2FzZSBwcm9wZXJseSwgYXR0ZW1wdHMgdG8gdXNlIHN0YW5kYXJkIFxuICogICBPYmplY3QuZGVmaW5lUHJvcGVydHkoKSAoYW5kIEZ1bmN0aW9uIGJpbmQoKSkgbWV0aG9kcywgXG4gKiAgIGZhbGxzIGJhY2sgdG8gbmF0aXZlIGltcGxlbWVudGF0aW9uIHdoZW4gZXhpc3RpbmdcbiAqIEluc3BpcmVkIGJ5IGh0dHA6Ly9jb2RlLmVsaWdyZXkuY29tL2h0bWw1L2RhdGFzZXQvIFxuICogICAodmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9hZGFsZ2lzby9odG1sNS1kYXRhc2V0L2Jsb2IvbWFzdGVyL2h0bWw1LWRhdGFzZXQuanMgKVxuICogRGVwZW5kcyBvbiBGdW5jdGlvbi5iaW5kIGFuZCBPYmplY3QuZGVmaW5lUHJvcGVydHkvT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAoc2hpbXMgYmVsb3cpXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgWDExL01JVCBMaWNlbnNlXG4qL1xuXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2JpbmQjQ29tcGF0aWJpbGl0eVxuaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkge1xuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKG9UaGlzKSB7XG4gICAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNsb3Nlc3QgdGhpbmcgcG9zc2libGUgdG8gdGhlIEVDTUFTY3JpcHQgNSBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgLSB3aGF0IGlzIHRyeWluZyB0byBiZSBib3VuZCBpcyBub3QgY2FsbGFibGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuICAgICAgICAgICAgZlRvQmluZCA9IHRoaXMsXG4gICAgICAgICAgICBGTk9QID0gZnVuY3Rpb24gKCkge30sXG4gICAgICAgICAgICBmQm91bmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBGTk9QICYmIG9UaGlzID8gdGhpcyA6IG9UaGlzLFxuICAgICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgRk5PUC5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICAgICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBGTk9QKCk7XG5cbiAgICAgICAgcmV0dXJuIGZCb3VuZDtcbiAgICB9O1xufVxuXG4vKlxuICogWGNjZXNzb3JzIFN0YW5kYXJkOiBDcm9zcy1icm93c2VyIEVDTUFTY3JpcHQgNSBhY2Nlc3NvcnNcbiAqIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9YY2Nlc3NvcnNcbiAqIFxuICogMjAxMC0wNi0yMVxuICogXG4gKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4gKiBcbiAqIEEgc2hpbSB0aGF0IHBhcnRpYWxseSBpbXBsZW1lbnRzIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAqIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGFuZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyBpbiBicm93c2VycyB0aGF0IGhhdmVcbiAqIGxlZ2FjeSBfXyhkZWZpbmV8bG9va3VwKVtHU11ldHRlcl9fIHN1cHBvcnQuXG4gKiBcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBYMTEvTUlUIExpY2Vuc2VcbiAqICAgU2VlIExJQ0VOU0UubWRcbiovXG5cbi8vIFJlbW92ZWQgYSBmZXcgSlNMaW50IG9wdGlvbnMgYXMgTm90ZXBhZCsrIEpTTGludCB2YWxpZGF0b3IgY29tcGxhaW5pbmcgYW5kIFxuLy8gICBtYWRlIGNvbXBseSB3aXRoIEpTTGludDsgYWxzbyBtb3ZlZCAndXNlIHN0cmljdCcgaW5zaWRlIGZ1bmN0aW9uXG4vKmpzbGludCB3aGl0ZTogdHJ1ZSwgdW5kZWY6IHRydWUsIHBsdXNwbHVzOiB0cnVlLFxuICBiaXR3aXNlOiB0cnVlLCByZWdleHA6IHRydWUsIG5ld2NhcDogdHJ1ZSwgbWF4bGVuOiA5MCAqL1xuXG4vKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvWGNjZXNzb3JzL2Jsb2IvbWFzdGVyL3hjY2Vzc29ycy1zdGFuZGFyZC5qcyovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgZGVmaW5lR2V0dGVyID0gT2JqZWN0UHJvdG8uX19kZWZpbmVHZXR0ZXJfXyxcbiAgICBkZWZpbmVTZXR0ZXIgPSBPYmplY3RQcm90by5fX2RlZmluZVNldHRlcl9fLFxuICAgIGxvb2t1cEdldHRlciA9IE9iamVjdFByb3RvLl9fbG9va3VwR2V0dGVyX18sXG4gICAgbG9va3VwU2V0dGVyID0gT2JqZWN0UHJvdG8uX19sb29rdXBTZXR0ZXJfXyxcbiAgICBoYXNPd25Qcm9wID0gT2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG4gICAgXG4gICAgaWYgKGRlZmluZUdldHRlciAmJiBkZWZpbmVTZXR0ZXIgJiYgbG9va3VwR2V0dGVyICYmIGxvb2t1cFNldHRlcikge1xuXG4gICAgICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7IC8vIGFsbCBhcmd1bWVudHMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50cyBub3Qgb3B0aW9uYWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByb3AgKz0gXCJcIjsgLy8gY29udmVydCBwcm9wIHRvIHN0cmluZ1xuXG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9va3VwR2V0dGVyLmNhbGwob2JqLCBwcm9wKSAmJiAhbG9va3VwU2V0dGVyLmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBwcm9wZXJ0eSBkZWZpbmVkIGFuZCBubyBwcmUtZXhpc3RpbmcgYWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChoYXNPd25Qcm9wLmNhbGwoZGVzY3JpcHRvciwgXCJnZXRcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPd25Qcm9wLmNhbGwoZGVzY3JpcHRvciwgXCJzZXRcIikpKSBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvciBoYXMgYSB2YWx1ZSBwcm9wIGJ1dCBhY2Nlc3NvciBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGFuIGFjY2Vzc29yIGFuZCBhIHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY2FuJ3Qgc3dpdGNoIG9mZiB0aGVzZSBmZWF0dXJlcyBpbiBFQ01BU2NyaXB0IDNcbiAgICAgICAgICAgICAgICAvLyBzbyB0aHJvdyBhIFR5cGVFcnJvciBpZiBhbnkgYXJlIGZhbHNlXG4gICAgICAgICAgICAgICAgaWYgKCEoZGVzY3JpcHRvci53cml0YWJsZSAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUgJiYgXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlRoaXMgaW1wbGVtZW50YXRpb24gb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnRcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBmYWxzZSBmb3IgY29uZmlndXJhYmxlLCBlbnVtZXJhYmxlLCBvciB3cml0YWJsZS5cIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lR2V0dGVyLmNhbGwob2JqLCBwcm9wLCBkZXNjcmlwdG9yLmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnNldCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIuY2FsbChvYmosIHByb3AsIGRlc2NyaXB0b3Iuc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsgLy8gYWxsIGFyZ3VtZW50cyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIG5vdCBvcHRpb25hbC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByb3AgKz0gXCJcIjsgLy8gY29udmVydCBwcm9wIHRvIHN0cmluZ1xuXG4gICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZSAgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZSAgICA6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldHRlciA9IGxvb2t1cEdldHRlci5jYWxsKG9iaiwgcHJvcCksXG4gICAgICAgICAgICAgICAgc2V0dGVyID0gbG9va3VwU2V0dGVyLmNhbGwob2JqLCBwcm9wKTtcblxuICAgICAgICAgICAgICAgIGlmICghaGFzT3duUHJvcC5jYWxsKG9iaiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgZG9lc24ndCBleGlzdCBvciBpcyBpbmhlcml0ZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZ2V0dGVyICYmICFzZXR0ZXIpIHsgLy8gbm90IGFuIGFjY2Vzc29yIHNvIHJldHVybiBwcm9wXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBvYmpbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGFjY2Vzc29yLCByZW1vdmUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICAgICAgICAgICAgICAvLyBwb3B1bGF0ZSBkZXNjcmlwdG9yLmdldCBhbmQgZGVzY3JpcHRvci5zZXQgKElFJ3MgYmVoYXZpb3IpXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRlc2NyaXB0b3Iud3JpdGFibGU7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXQgPSBkZXNjcmlwdG9yLnNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0ID0gZ2V0dGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3A7XG4gICAgICAgICAgICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwocHJvcHMsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBwcm9wc1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufSgpKTtcblxuLy8gQmVnaW4gZGF0YXNldCBjb2RlXG5cbmlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQgJiYgXG4gICAgICAgICAvLyBGRiBpcyBlbXB0eSB3aGlsZSBJRSBnaXZlcyBlbXB0eSBvYmplY3RcbiAgICAgICAgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcpICB8fFxuICAgICAgICAhT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ2RhdGFzZXQnKS5nZXQpXG4gICAgKSB7XG4gICAgdmFyIHByb3BEZXNjcmlwdG9yID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgICAgICAgIHZhciBpLCBcbiAgICAgICAgICAgICAgICB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAsIFxuICAgICAgICAgICAgICAgIGF0dHJWYWwsIGF0dHJOYW1lLCBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBhdHRzTGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdG9VcHBlckNhc2UgPSBmdW5jdGlvbiAobjApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4wLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldHRlciA9IGZ1bmN0aW9uIChhdHRyTmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSA/IFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlKSA6IFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cnkgeyAvLyBTaW11bGF0ZSBET01TdHJpbmdNYXAgdy9hY2Nlc3NvciBzdXBwb3J0XG4gICAgICAgICAgICAgICAgLy8gVGVzdCBzZXR0aW5nIGFjY2Vzc29yIG9uIG5vcm1hbCBvYmplY3RcbiAgICAgICAgICAgICAgICAoe30pLl9fZGVmaW5lR2V0dGVyX18oJ3Rlc3QnLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgICAgICAgICAgSFRNTDVfRE9NU3RyaW5nTWFwID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZTEpIHsgLy8gVXNlIGEgRE9NIG9iamVjdCBmb3IgSUU4XG4gICAgICAgICAgICAgICAgSFRNTDVfRE9NU3RyaW5nTWFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXR0c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBGaXg6IFRoaXMgdGVzdCByZWFsbHkgc2hvdWxkIGFsbG93IGFueSBYTUwgTmFtZSB3aXRob3V0IFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgY29sb25zIChhbmQgbm9uLXVwcGVyY2FzZSBmb3IgWEhUTUwpXG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUubmFtZSAmJiBcbiAgICAgICAgICAgICAgICAgICAgKC9eZGF0YS1cXHdbXFx3XFwtXSokLykudGVzdChhdHRyaWJ1dGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0clZhbCA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRvIENhbWVsQ2FzZVxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSA9IGF0dHJOYW1lLnN1YnN0cig1KS5yZXBsYWNlKC8tLi9nLCB0b1VwcGVyQ2FzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTDVfRE9NU3RyaW5nTWFwLCBwcm9wTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRoaXMuZW51bWVyYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGdldHRlci5iaW5kKGF0dHJWYWwgfHwgJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogc2V0dGVyLmJpbmQodGhhdCwgYXR0ck5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZTIpIHsgLy8gaWYgYWNjZXNzb3JzIGFyZSBub3Qgd29ya2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgSFRNTDVfRE9NU3RyaW5nTWFwW3Byb3BOYW1lXSA9IGF0dHJWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSFRNTDVfRE9NU3RyaW5nTWFwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgICAvLyBGRiBlbnVtZXJhdGVzIG92ZXIgZWxlbWVudCdzIGRhdGFzZXQsIGJ1dCBub3QgXG4gICAgICAgIC8vICAgRWxlbWVudC5wcm90b3R5cGUuZGF0YXNldDsgSUU5IGl0ZXJhdGVzIG92ZXIgYm90aFxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsICdkYXRhc2V0JywgcHJvcERlc2NyaXB0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJvcERlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlOyAvLyBJRTggZG9lcyBub3QgYWxsb3cgc2V0dGluZyB0byB0cnVlXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ2RhdGFzZXQnLCBwcm9wRGVzY3JpcHRvcik7XG4gICAgfVxufVxuIiwiLy8gUmVxdWlyZSBtb2R1bGVzLCBhZGQgY29kZSwgZXRjXG5yZXF1aXJlKCAnLi9zaGltcy9fZGF0YXNldCcgKVxudmFyIGVzdmcgICAgID0gcmVxdWlyZSggJy4vX2VzdmcnIClcbnZhciBpY29ucyAgICA9IHJlcXVpcmUoICcuL19pY29ucycgKVxudmFyIHRvZ2dsZXIgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9nZ2xlcicgKVxudmFyIHRvb2xib3ggID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIG1vZGFsICAgID0gcmVxdWlyZSggJy4vX21vZGFsJyApXG52YXIgc3RhY2sgICAgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcbnZhciBzZWFyY2ggICA9IHJlcXVpcmUoICcuL19zZWFyY2gnIClcbnZhciB0cmVlICAgICA9IHJlcXVpcmUoICcuL190cmVlJyApXG52YXIgY29va2llICAgPSByZXF1aXJlKCAnLi9fY29va2llJyApXG5cbnJlcXVpcmUoICcuL19zaWRlYmFyJyApXG5cbm1vZGFsLnNldHVwKClcbnN0YWNrLnNldHVwKClcbnRyZWUuc2V0dXAoKVxuXG53aW5kb3cuc3BhcmsgPSBtb2R1bGUuZXhwb3J0cyA9IHRvb2xib3gubWVyZ2Uoe1xuICBlc3ZnOiBlc3ZnLFxuICB0b2dnbGVyOiB0b2dnbGVyLFxuICBtb2RhbDogbW9kYWwsXG4gIHN0YWNrOiBzdGFjayxcbiAgY29va2llOiBjb29raWUsXG4gIGJlYW46IHJlcXVpcmUoICdiZWFuJyApXG59LCB0b29sYm94IClcblxuLy8gU2ltcGxlIGlnbm9yZSBjbGljayBvbiBhbmNob3IgdHJpZ2dlcnNcbnRvb2xib3guZXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2hyZWY9XCIjXCJdJywgZnVuY3Rpb24oIGV2ZW50ICkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufSlcbiIsIi8qIVxuICAqIEJlYW4gLSBjb3B5cmlnaHQgKGMpIEphY29iIFRob3JudG9uIDIwMTEtMjAxMlxuICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXQvYmVhblxuICAqIE1JVCBsaWNlbnNlXG4gICovXG4oZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQsIGRlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpXG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoZGVmaW5pdGlvbilcbiAgZWxzZSBjb250ZXh0W25hbWVdID0gZGVmaW5pdGlvbigpXG59KSgnYmVhbicsIHRoaXMsIGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0KSB7XG4gIG5hbWUgICAgPSBuYW1lICAgIHx8ICdiZWFuJ1xuICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzXG5cbiAgdmFyIHdpbiAgICAgICAgICAgID0gd2luZG93XG4gICAgLCBvbGQgICAgICAgICAgICA9IGNvbnRleHRbbmFtZV1cbiAgICAsIG5hbWVzcGFjZVJlZ2V4ID0gL1teXFwuXSooPz1cXC4uKilcXC58LiovXG4gICAgLCBuYW1lUmVnZXggICAgICA9IC9cXC4uKi9cbiAgICAsIGFkZEV2ZW50ICAgICAgID0gJ2FkZEV2ZW50TGlzdGVuZXInXG4gICAgLCByZW1vdmVFdmVudCAgICA9ICdyZW1vdmVFdmVudExpc3RlbmVyJ1xuICAgICwgZG9jICAgICAgICAgICAgPSBkb2N1bWVudCB8fCB7fVxuICAgICwgcm9vdCAgICAgICAgICAgPSBkb2MuZG9jdW1lbnRFbGVtZW50IHx8IHt9XG4gICAgLCBXM0NfTU9ERUwgICAgICA9IHJvb3RbYWRkRXZlbnRdXG4gICAgLCBldmVudFN1cHBvcnQgICA9IFczQ19NT0RFTCA/IGFkZEV2ZW50IDogJ2F0dGFjaEV2ZW50J1xuICAgICwgT05FICAgICAgICAgICAgPSB7fSAvLyBzaW5nbGV0b24gZm9yIHF1aWNrIG1hdGNoaW5nIG1ha2luZyBhZGQoKSBkbyBvbmUoKVxuXG4gICAgLCBzbGljZSAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICwgc3RyMmFyciAgICAgICAgPSBmdW5jdGlvbiAocywgZCkgeyByZXR1cm4gcy5zcGxpdChkIHx8ICcgJykgfVxuICAgICwgaXNTdHJpbmcgICAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ3N0cmluZycgfVxuICAgICwgaXNGdW5jdGlvbiAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ2Z1bmN0aW9uJyB9XG4gICAgLCBpc09iamVjdCAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnb2JqZWN0JyB9XG5cbiAgICAvLyBUcnkgdG8gYnVpbGQgYW4gb3B0aW9ucyBvYmplY3QuIElmIGFueSBrZXkgaW4gYG1heWJlT3B0aW9uc2BcbiAgICAvLyBtYXRjaGVzIGEga2V5IGluIGBkZWZhdWx0c2AsIGl0IHdpbGwgYmUgY29waWVkIGludG8gYSBjbG9uZVxuICAgIC8vIG9mIGBkZWZhdWx0c2AsIHRodXMgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdC5cbiAgICAsIGJ1aWxkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcmlnaW5hbERlZmF1bHRzLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge31cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3JpZ2luYWxEZWZhdWx0cykge1xuICAgICAgICAgIGlmIChvcmlnaW5hbERlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBvcmlnaW5hbERlZmF1bHRzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc09iamVjdChtYXliZU9wdGlvbnMpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBtYXliZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG1heWJlT3B0aW9uc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzXG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZW50cyB0aGF0IHdlIGNvbnNpZGVyIHRvIGJlICduYXRpdmUnLCBhbnl0aGluZyBub3QgaW4gdGhpcyBsaXN0IHdpbGxcbiAgICAgIC8vIGJlIHRyZWF0ZWQgYXMgYSBjdXN0b20gZXZlbnRcbiAgICAsIHN0YW5kYXJkTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ2NsaWNrIGRibGNsaWNrIG1vdXNldXAgbW91c2Vkb3duIGNvbnRleHRtZW51ICcgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ21vdXNld2hlZWwgbW91c2VtdWx0aXdoZWVsIERPTU1vdXNlU2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIHdoZWVsXG4gICAgICAgICdtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIHNlbGVjdHN0YXJ0IHNlbGVjdGVuZCAnICAgICAgICAgICAgKyAvLyBtb3VzZSBtb3ZlbWVudFxuICAgICAgICAna2V5ZG93biBrZXlwcmVzcyBrZXl1cCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8ga2V5Ym9hcmRcbiAgICAgICAgJ29yaWVudGF0aW9uY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vYmlsZVxuICAgICAgICAnZm9jdXMgYmx1ciBjaGFuZ2UgcmVzZXQgc2VsZWN0IHN1Ym1pdCAnICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAnbG9hZCB1bmxvYWQgYmVmb3JldW5sb2FkIHJlc2l6ZSBtb3ZlIERPTUNvbnRlbnRMb2FkZWQgJyAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdyZWFkeXN0YXRlY2hhbmdlIG1lc3NhZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2Vycm9yIGFib3J0IHNjcm9sbCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc2NcbiAgICAgIC8vIGVsZW1lbnQuZmlyZUV2ZW50KCdvblhZWicuLi4gaXMgbm90IGZvcmdpdmluZyBpZiB3ZSB0cnkgdG8gZmlyZSBhbiBldmVudFxuICAgICAgLy8gdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCBzbyBtYWtlIHN1cmUgd2Ugb25seSBkbyB0aGVzZSBvbiBuZXdlciBicm93c2Vyc1xuICAgICwgdzNjTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ3Nob3cgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ2lucHV0IGludmFsaWQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGZvcm0gZWxlbWVudHNcbiAgICAgICAgJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsICcgICAgICAgICAgICAgICAgICAgICArIC8vIHRvdWNoXG4gICAgICAgICdnZXN0dXJlc3RhcnQgZ2VzdHVyZWNoYW5nZSBnZXN0dXJlZW5kICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBnZXN0dXJlXG4gICAgICAgICd0ZXh0aW5wdXQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBUZXh0RXZlbnRcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgcGFnZXNob3cgcGFnZWhpZGUgcG9wc3RhdGUgJyAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnaGFzaGNoYW5nZSBvZmZsaW5lIG9ubGluZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdhZnRlcnByaW50IGJlZm9yZXByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBwcmludGluZ1xuICAgICAgICAnZHJhZ3N0YXJ0IGRyYWdlbnRlciBkcmFnb3ZlciBkcmFnbGVhdmUgZHJhZyBkcm9wIGRyYWdlbmQgJyAgICAgICsgLy8gZG5kXG4gICAgICAgICdsb2Fkc3RhcnQgcHJvZ3Jlc3Mgc3VzcGVuZCBlbXB0aWVkIHN0YWxsZWQgbG9hZG1ldGFkYXRhICcgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnbG9hZGVkZGF0YSBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIHBsYXlpbmcgd2FpdGluZyBzZWVraW5nICcgICAgICsgLy8gbWVkaWFcbiAgICAgICAgJ3NlZWtlZCBlbmRlZCBkdXJhdGlvbmNoYW5nZSB0aW1ldXBkYXRlIHBsYXkgcGF1c2UgcmF0ZWNoYW5nZSAnICArIC8vIG1lZGlhXG4gICAgICAgICd2b2x1bWVjaGFuZ2UgY3VlY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnY2hlY2tpbmcgbm91cGRhdGUgZG93bmxvYWRpbmcgY2FjaGVkIHVwZGF0ZXJlYWR5IG9ic29sZXRlICcgICAgICAgLy8gYXBwY2FjaGVcblxuICAgICAgLy8gY29udmVydCB0byBhIGhhc2ggZm9yIHF1aWNrIGxvb2t1cHNcbiAgICAsIG5hdGl2ZUV2ZW50cyA9IChmdW5jdGlvbiAoaGFzaCwgZXZlbnRzLCBpKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIGV2ZW50c1tpXSAmJiAoaGFzaFtldmVudHNbaV1dID0gMSlcbiAgICAgICAgcmV0dXJuIGhhc2hcbiAgICAgIH0oe30sIHN0cjJhcnIoc3RhbmRhcmROYXRpdmVFdmVudHMgKyAoVzNDX01PREVMID8gdzNjTmF0aXZlRXZlbnRzIDogJycpKSkpXG5cbiAgICAgIC8vIGN1c3RvbSBldmVudHMgYXJlIGV2ZW50cyB0aGF0IHdlICpmYWtlKiwgdGhleSBhcmUgbm90IHByb3ZpZGVkIG5hdGl2ZWx5IGJ1dFxuICAgICAgLy8gd2UgY2FuIHVzZSBuYXRpdmUgZXZlbnRzIHRvIGdlbmVyYXRlIHRoZW1cbiAgICAsIGN1c3RvbUV2ZW50cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc0FuY2VzdG9yID0gJ2NvbXBhcmVEb2N1bWVudFBvc2l0aW9uJyBpbiByb290XG4gICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQpICYgMTYpID09PSAxNlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiAnY29udGFpbnMnIGluIHJvb3RcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLm5vZGVUeXBlID09PSA5IHx8IGNvbnRhaW5lciA9PT0gd2luZG93ID8gcm9vdCA6IGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyICE9PSBlbGVtZW50ICYmIGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgaWYgKGVsZW1lbnQgPT09IGNvbnRhaW5lcikgcmV0dXJuIDFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGNoZWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICByZXR1cm4gIXJlbGF0ZWRcbiAgICAgICAgICAgICAgICA/IHJlbGF0ZWQgPT0gbnVsbFxuICAgICAgICAgICAgICAgIDogKHJlbGF0ZWQgIT09IHRoaXMgJiYgcmVsYXRlZC5wcmVmaXggIT09ICd4dWwnICYmICEvZG9jdW1lbnQvLnRlc3QodGhpcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAmJiAhaXNBbmNlc3RvcihyZWxhdGVkLCB0aGlzKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW91c2VlbnRlcjogeyBiYXNlOiAnbW91c2VvdmVyJywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZWxlYXZlOiB7IGJhc2U6ICdtb3VzZW91dCcsIGNvbmRpdGlvbjogY2hlY2sgfVxuICAgICAgICAgICwgbW91c2V3aGVlbDogeyBiYXNlOiAvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcgfVxuICAgICAgICB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIHByb3ZpZGUgYSBjb25zaXN0ZW50IEV2ZW50IG9iamVjdCBhY3Jvc3MgYnJvd3NlcnMgYnkgdGFraW5nIHRoZSBhY3R1YWwgRE9NXG4gICAgICAvLyBldmVudCBvYmplY3QgYW5kIGdlbmVyYXRpbmcgYSBuZXcgb25lIGZyb20gaXRzIHByb3BlcnRpZXMuXG4gICAgLCBFdmVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBhIHdoaXRlbGlzdCBvZiBwcm9wZXJ0aWVzIChmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzKSB0ZWxscyB1cyB3aGF0IHRvIGNoZWNrIGZvciBhbmQgY29weVxuICAgICAgICB2YXIgY29tbW9uUHJvcHMgID0gc3RyMmFycignYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCAnICtcbiAgICAgICAgICAgICAgJ2RldGFpbCBldmVudFBoYXNlIGdldE1vZGlmaWVyU3RhdGUgaXNUcnVzdGVkIG1ldGFLZXkgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzaGlmdEtleSAnICArXG4gICAgICAgICAgICAgICdzcmNFbGVtZW50IHRhcmdldCB0aW1lU3RhbXAgdHlwZSB2aWV3IHdoaWNoIHByb3BlcnR5TmFtZSBwYXRoJylcbiAgICAgICAgICAsIG1vdXNlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZGF0YVRyYW5zZmVyICcgICAgICArXG4gICAgICAgICAgICAgICdmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCBtb3ZlbWVudFggbW92ZW1lbnRZIHJlZ2lvbicpKVxuICAgICAgICAgICwgbW91c2VXaGVlbFByb3BzID0gbW91c2VQcm9wcy5jb25jYXQoc3RyMmFycignd2hlZWxEZWx0YSB3aGVlbERlbHRhWCB3aGVlbERlbHRhWSB3aGVlbERlbHRhWiAnICtcbiAgICAgICAgICAgICAgJ2F4aXMnKSkgLy8gJ2F4aXMnIGlzIEZGIHNwZWNpZmljXG4gICAgICAgICAgLCBrZXlQcm9wcyAgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSBrZXlJZGVudGlmaWVyICcgICAgICAgICAgK1xuICAgICAgICAgICAgICAna2V5TG9jYXRpb24gbG9jYXRpb24gaXNDb21wb3NpbmcgY29kZScpKVxuICAgICAgICAgICwgdGV4dFByb3BzICAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEnKSlcbiAgICAgICAgICAsIHRvdWNoUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCd0b3VjaGVzIHRhcmdldFRvdWNoZXMgY2hhbmdlZFRvdWNoZXMgc2NhbGUgcm90YXRpb24nKSlcbiAgICAgICAgICAsIG1lc3NhZ2VQcm9wcyA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdkYXRhIG9yaWdpbiBzb3VyY2UnKSlcbiAgICAgICAgICAsIHN0YXRlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdzdGF0ZScpKVxuICAgICAgICAgICwgb3Zlck91dFJlZ2V4ID0gL292ZXJ8b3V0L1xuICAgICAgICAgICAgLy8gc29tZSBldmVudCB0eXBlcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgYW5kIHNvbWUgbmVlZCBzcGVjaWFsIHByb3BlcnRpZXMsIGRvIHRoYXQgYWxsIGhlcmVcbiAgICAgICAgICAsIHR5cGVGaXhlcnMgICA9IFtcbiAgICAgICAgICAgICAgICB7IC8vIGtleSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAva2V5L2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQua2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIG1vdXNlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9jbGlja3xtb3VzZSg/ISguKndoZWVsfHNjcm9sbCkpfG1lbnV8ZHJhZ3xkcm9wL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50LCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucmlnaHRDbGljayA9IGV2ZW50LndoaWNoID09PSAzIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnBvcyA9IHsgeDogMCwgeTogMCB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnBhZ2VYIHx8IGV2ZW50LnBhZ2VZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQucGFnZVhcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5wYWdlWVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpZW50WCB8fCBldmVudC5jbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQuY2xpZW50WCArIGRvYy5ib2R5LnNjcm9sbExlZnQgKyByb290LnNjcm9sbExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5jbGllbnRZICsgZG9jLmJvZHkuc2Nyb2xsVG9wICsgcm9vdC5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJPdXRSZWdleC50ZXN0KHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFsodHlwZSA9PSAnbW91c2VvdmVyJyA/ICdmcm9tJyA6ICd0bycpICsgJ0VsZW1lbnQnXVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW91c2VQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2Ugd2hlZWwgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL21vdXNlLiood2hlZWx8c2Nyb2xsKS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW91c2VXaGVlbFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBUZXh0RXZlbnRcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRleHQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gdG91Y2ggYW5kIGdlc3R1cmUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL150b3VjaHxeZ2VzdHVyZS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdG91Y2hQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbWVzc2FnZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXm1lc3NhZ2UkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIHBvcHN0YXRlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ecG9wc3RhdGUkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdGF0ZVByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvLiovXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tbW9uUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICAsIHR5cGVGaXhlck1hcCA9IHt9IC8vIHVzZWQgdG8gbWFwIGV2ZW50IHR5cGVzIHRvIGZpeGVyIGZ1bmN0aW9ucyAoYWJvdmUpLCBhIGJhc2ljIGNhY2hlIG1lY2hhbmlzbVxuXG4gICAgICAgICAgLCBFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudCwgaXNOYXRpdmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm5cbiAgICAgICAgICAgICAgZXZlbnQgPSBldmVudCB8fCAoKGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQpLnBhcmVudFdpbmRvdyB8fCB3aW4pLmV2ZW50XG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICAgPSBpc05hdGl2ZVxuICAgICAgICAgICAgICB0aGlzLmlzQmVhbiAgICAgICAgID0gdHJ1ZVxuXG4gICAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVyblxuXG4gICAgICAgICAgICAgIHZhciB0eXBlICAgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgLCB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudFxuICAgICAgICAgICAgICAgICwgaSwgbCwgcCwgcHJvcHMsIGZpeGVyXG5cbiAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXRcblxuICAgICAgICAgICAgICBpZiAoaXNOYXRpdmUpIHsgLy8gd2Ugb25seSBuZWVkIGJhc2ljIGF1Z21lbnRhdGlvbiBvbiBjdXN0b20gZXZlbnRzLCB0aGUgcmVzdCBleHBlbnNpdmUgJiBwb2ludGxlc3NcbiAgICAgICAgICAgICAgICBmaXhlciA9IHR5cGVGaXhlck1hcFt0eXBlXVxuICAgICAgICAgICAgICAgIGlmICghZml4ZXIpIHsgLy8gaGF2ZW4ndCBlbmNvdW50ZXJlZCB0aGlzIGV2ZW50IHR5cGUgYmVmb3JlLCBtYXAgYSBmaXhlciBmdW5jdGlvbiBmb3IgaXRcbiAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0eXBlRml4ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUZpeGVyc1tpXS5yZWcudGVzdCh0eXBlKSkgeyAvLyBndWFyYW50ZWVkIHRvIG1hdGNoIGF0IGxlYXN0IG9uZSwgbGFzdCBpcyAuKlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVGaXhlck1hcFt0eXBlXSA9IGZpeGVyID0gdHlwZUZpeGVyc1tpXS5maXhcbiAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvcHMgPSBmaXhlcihldmVudCwgdGhpcywgdHlwZSlcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBwcm9wcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghKChwID0gcHJvcHNbaV0pIGluIHRoaXMpICYmIHAgaW4gZXZlbnQpIHRoaXNbcF0gPSBldmVudFtwXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnREZWZhdWx0KCkgYW5kIHN0b3BQcm9wYWdhdGlvbigpIGFyZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHRvIHRob3NlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBvbiB0aGUgRE9NLCBzdG9wKCkgaXMgYW4gYWxpYXMgZm9yIGJvdGggb2YgdGhlbSB0b2dldGhlclxuICAgICAgICBFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCkgdGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgZWxzZSB0aGlzLm9yaWdpbmFsRXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIHRvIGJlIGhhbmRsZWQgaW50ZXJuYWxseSBiZWNhdXNlIHdlIG1hbmFnZSB0aGUgZXZlbnQgbGlzdCBmb3JcbiAgICAgICAgLy8gZWFjaCBlbGVtZW50XG4gICAgICAgIC8vIG5vdGUgdGhhdCBvcmlnaW5hbEVsZW1lbnQgbWF5IGJlIGEgQmVhbiNFdmVudCBvYmplY3QgaW4gc29tZSBzaXR1YXRpb25zXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlIH1cbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCAmJiB0aGlzLm9yaWdpbmFsRXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgLy9UT0RPOiB0aGlzIGlzIHJpcGUgZm9yIG9wdGltaXNhdGlvbiwgbmV3IGV2ZW50cyBhcmUgKmV4cGVuc2l2ZSpcbiAgICAgICAgICAvLyBpbXByb3ZpbmcgdGhpcyB3aWxsIHNwZWVkIHVwIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICB2YXIgbmUgPSBuZXcgRXZlbnQodGhpcywgdGhpcy5lbGVtZW50LCB0aGlzLmlzTmF0aXZlKVxuICAgICAgICAgIG5lLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgcmV0dXJuIG5lXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRcbiAgICAgIH0oKSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gb2xkIElFIHdlIGNhbid0IGRvIG9ucHJvcGVydHljaGFuZ2Ugb24gZG9jIG9yIHdpbiBzbyB3ZSB1c2UgZG9jLmRvY3VtZW50RWxlbWVudCBmb3IgYm90aFxuICAgICwgdGFyZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICByZXR1cm4gIVczQ19NT0RFTCAmJiAhaXNOYXRpdmUgJiYgKGVsZW1lbnQgPT09IGRvYyB8fCBlbGVtZW50ID09PSB3aW4pID8gcm9vdCA6IGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogQmVhbiBtYWludGFpbnMgYW4gaW50ZXJuYWwgcmVnaXN0cnkgZm9yIGV2ZW50IGxpc3RlbmVycy4gV2UgZG9uJ3QgdG91Y2ggZWxlbWVudHMsIG9iamVjdHNcbiAgICAgICAgKiBvciBmdW5jdGlvbnMgdG8gaWRlbnRpZnkgdGhlbSwgaW5zdGVhZCB3ZSBzdG9yZSBldmVyeXRoaW5nIGluIHRoZSByZWdpc3RyeS5cbiAgICAgICAgKiBFYWNoIGV2ZW50IGxpc3RlbmVyIGhhcyBhIFJlZ0VudHJ5IG9iamVjdCwgd2UgaGF2ZSBvbmUgJ3JlZ2lzdHJ5JyBmb3IgdGhlIHdob2xlIGluc3RhbmNlLlxuICAgICAgICAqL1xuICAgICwgUmVnRW50cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlYWNoIGhhbmRsZXIgaXMgd3JhcHBlZCBzbyB3ZSBjYW4gaGFuZGxlIGRlbGVnYXRpb24gYW5kIGN1c3RvbSBldmVudHNcbiAgICAgICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZuLCBjb25kaXRpb24sIGFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBjYWxsID0gZnVuY3Rpb24gKGV2ZW50LCBlYXJncykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIGFyZ3MgPyBzbGljZS5jYWxsKGVhcmdzLCBldmVudCA/IDAgOiAxKS5jb25jYXQoYXJncykgOiBlYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgZmluZFRhcmdldCA9IGZ1bmN0aW9uIChldmVudCwgZXZlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uX19iZWFuRGVsID8gZm4uX19iZWFuRGVsLmZ0KGV2ZW50LnRhcmdldCwgZWxlbWVudCkgOiBldmVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgaGFuZGxlciA9IGNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZmluZFRhcmdldChldmVudCwgdGhpcykgLy8gZGVsZWF0ZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50KSBldmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZm4uX19iZWFuRGVsKSBldmVudCA9IGV2ZW50LmNsb25lKGZpbmRUYXJnZXQoZXZlbnQpKSAvLyBkZWxlZ2F0ZWQgZXZlbnQsIGZpeCB0aGUgZml4XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlci5fX2JlYW5EZWwgPSBmbi5fX2JlYW5EZWxcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICAgICAgfVxuXG4gICAgICAgICwgUmVnRW50cnkgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwsIG5hbWVzcGFjZXMsIGFyZ3MsIHJvb3QpIHtcbiAgICAgICAgICAgIHZhciBjdXN0b21UeXBlICAgICA9IGN1c3RvbUV2ZW50c1t0eXBlXVxuICAgICAgICAgICAgICAsIGlzTmF0aXZlXG5cbiAgICAgICAgICAgIGlmICh0eXBlID09ICd1bmxvYWQnKSB7XG4gICAgICAgICAgICAgIC8vIHNlbGYgY2xlYW4tdXBcbiAgICAgICAgICAgICAgaGFuZGxlciA9IG9uY2UocmVtb3ZlTGlzdGVuZXIsIGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9yaWdpbmFsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tVHlwZSkge1xuICAgICAgICAgICAgICBpZiAoY3VzdG9tVHlwZS5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY3VzdG9tVHlwZS5jb25kaXRpb24sIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHlwZSA9IGN1c3RvbVR5cGUuYmFzZSB8fCB0eXBlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICA9IGlzTmF0aXZlID0gbmF0aXZlRXZlbnRzW3R5cGVdICYmICEhZWxlbWVudFtldmVudFN1cHBvcnRdXG4gICAgICAgICAgICB0aGlzLmN1c3RvbVR5cGUgICAgPSAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiB0eXBlXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgPSBlbGVtZW50XG4gICAgICAgICAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsICAgICAgPSBvcmlnaW5hbFxuICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzICAgID0gbmFtZXNwYWNlc1xuICAgICAgICAgICAgdGhpcy5ldmVudFR5cGUgICAgID0gVzNDX01PREVMIHx8IGlzTmF0aXZlID8gdHlwZSA6ICdwcm9wZXJ0eWNoYW5nZSdcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgICAgICB0aGlzW2V2ZW50U3VwcG9ydF0gPSAhIXRoaXMudGFyZ2V0W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMucm9vdCAgICAgICAgICA9IHJvb3RcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlciAgICAgICA9IHdyYXBwZWRIYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmVuIGEgbGlzdCBvZiBuYW1lc3BhY2VzLCBpcyBvdXIgZW50cnkgaW4gYW55IG9mIHRoZW0/XG4gICAgICAgIFJlZ0VudHJ5LnByb3RvdHlwZS5pbk5hbWVzcGFjZXMgPSBmdW5jdGlvbiAoY2hlY2tOYW1lc3BhY2VzKSB7XG4gICAgICAgICAgdmFyIGksIGosIGMgPSAwXG4gICAgICAgICAgaWYgKCFjaGVja05hbWVzcGFjZXMpIHJldHVybiB0cnVlXG4gICAgICAgICAgaWYgKCF0aGlzLm5hbWVzcGFjZXMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGZvciAoaSA9IGNoZWNrTmFtZXNwYWNlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IHRoaXMubmFtZXNwYWNlcy5sZW5ndGg7IGotLTspIHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrTmFtZXNwYWNlc1tpXSA9PSB0aGlzLm5hbWVzcGFjZXNbal0pIGMrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aCA9PT0gY1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF0Y2ggYnkgZWxlbWVudCwgb3JpZ2luYWwgZm4gKG9wdCksIGhhbmRsZXIgZm4gKG9wdClcbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLm1hdGNoZXMgPSBmdW5jdGlvbiAoY2hlY2tFbGVtZW50LCBjaGVja09yaWdpbmFsLCBjaGVja0hhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ID09PSBjaGVja0VsZW1lbnQgJiZcbiAgICAgICAgICAgICghY2hlY2tPcmlnaW5hbCB8fCB0aGlzLm9yaWdpbmFsID09PSBjaGVja09yaWdpbmFsKSAmJlxuICAgICAgICAgICAgKCFjaGVja0hhbmRsZXIgfHwgdGhpcy5oYW5kbGVyID09PSBjaGVja0hhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVnRW50cnlcbiAgICAgIH0oKSlcblxuICAgICwgcmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBvdXIgbWFwIHN0b3JlcyBhcnJheXMgYnkgZXZlbnQgdHlwZSwganVzdCBiZWNhdXNlIGl0J3MgYmV0dGVyIHRoYW4gc3RvcmluZ1xuICAgICAgICAvLyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIGFycmF5LlxuICAgICAgICAvLyB1c2VzICckJyBhcyBhIHByZWZpeCBmb3IgdGhlIGtleXMgZm9yIHNhZmV0eSBhbmQgJ3InIGFzIGEgc3BlY2lhbCBwcmVmaXggZm9yXG4gICAgICAgIC8vIHJvb3RMaXN0ZW5lcnMgc28gd2UgY2FuIGxvb2sgdGhlbSB1cCBmYXN0XG4gICAgICAgIHZhciBtYXAgPSB7fVxuXG4gICAgICAgICAgLy8gZ2VuZXJpYyBmdW5jdGlvbmFsIHNlYXJjaCBvZiBvdXIgcmVnaXN0cnkgZm9yIG1hdGNoaW5nIGxpc3RlbmVycyxcbiAgICAgICAgICAvLyBgZm5gIHJldHVybnMgZmFsc2UgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wXG4gICAgICAgICAgLCBmb3JBbGwgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKSB7XG4gICAgICAgICAgICAgIHZhciBwZnggPSByb290ID8gJ3InIDogJyQnXG4gICAgICAgICAgICAgIGlmICghdHlwZSB8fCB0eXBlID09ICcqJykge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCB0aGUgd2hvbGUgcmVnaXN0cnlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHQuY2hhckF0KDApID09IHBmeCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdC5zdWJzdHIoMSksIG9yaWdpbmFsLCBoYW5kbGVyLCByb290LCBmbilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwLCBsLCBsaXN0ID0gbWFwW3BmeCArIHR5cGVdLCBhbGwgPSBlbGVtZW50ID09ICcqJ1xuICAgICAgICAgICAgICAgIGlmICghbGlzdCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgZm9yIChsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIGlmICgoYWxsIHx8IGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgaGFuZGxlcikpICYmICFmbihsaXN0W2ldLCBsaXN0LCBpLCB0eXBlKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIGhhcyA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgcm9vdCkge1xuICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgdXNpbmcgZm9yQWxsIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQncyBhIGJpdCBzbG93ZXIgYW5kIHRoaXNcbiAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgZmFzdFxuICAgICAgICAgICAgICB2YXIgaSwgbGlzdCA9IG1hcFsocm9vdCA/ICdyJyA6ICckJykgKyB0eXBlXVxuICAgICAgICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWxpc3RbaV0ucm9vdCAmJiBsaXN0W2ldLm1hdGNoZXMoZWxlbWVudCwgb3JpZ2luYWwsIG51bGwpKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yQWxsKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCBudWxsLCByb290LCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBwdXQgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgdmFyIGhhcyA9ICFlbnRyeS5yb290ICYmICF0aGlzLmhhcyhlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAsIGtleSA9IChlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVcbiAgICAgICAgICAgICAgOyhtYXBba2V5XSB8fCAobWFwW2tleV0gPSBbXSkpLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIHJldHVybiBoYXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZGVsID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIGZvckFsbChlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBlbnRyeS5oYW5kbGVyLCBlbnRyeS5yb290LCBmdW5jdGlvbiAoZW50cnksIGxpc3QsIGkpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSBkZWxldGUgbWFwWyhlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVdXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGR1bXAgYWxsIGVudHJpZXMsIHVzZWQgZm9yIG9udW5sb2FkXG4gICAgICAgICAgLCBlbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgdCwgZW50cmllcyA9IFtdXG4gICAgICAgICAgICAgIGZvciAodCBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gJyQnKSBlbnRyaWVzID0gZW50cmllcy5jb25jYXQobWFwW3RdKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgaGFzOiBoYXMsIGdldDogZ2V0LCBwdXQ6IHB1dCwgZGVsOiBkZWwsIGVudHJpZXM6IGVudHJpZXMgfVxuICAgICAgfSgpKVxuXG4gICAgICAvLyB3ZSBuZWVkIGEgc2VsZWN0b3IgZW5naW5lIGZvciBkZWxlZ2F0ZWQgZXZlbnRzLCB1c2UgcXVlcnlTZWxlY3RvckFsbCBpZiBpdCBleGlzdHNcbiAgICAgIC8vIGJ1dCBmb3Igb2xkZXIgYnJvd3NlcnMgd2UgbmVlZCBRd2VyeSwgU2l6emxlIG9yIHNpbWlsYXJcbiAgICAsIHNlbGVjdG9yRW5naW5lXG4gICAgLCBzZXRTZWxlY3RvckVuZ2luZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKHMsIHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5xdWVyeVNlbGVjdG9yQWxsKHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmVhbjogTm8gc2VsZWN0b3IgZW5naW5lIGluc3RhbGxlZCcpIC8vIGVlZWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGF0dGFjaCB0aGlzIGxpc3RlbmVyIHRvIGVhY2ggRE9NIGV2ZW50IHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8sIG9ubHkgb25jZVxuICAgICAgLy8gcGVyIGV2ZW50IHR5cGUgcGVyIERPTSBlbGVtZW50XG4gICAgLCByb290TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHR5cGUpIHtcbiAgICAgICAgaWYgKCFXM0NfTU9ERUwgJiYgdHlwZSAmJiBldmVudCAmJiBldmVudC5wcm9wZXJ0eU5hbWUgIT0gJ19vbicgKyB0eXBlKSByZXR1cm5cblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gcmVnaXN0cnkuZ2V0KHRoaXMsIHR5cGUgfHwgZXZlbnQudHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcblxuICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgdGhpcywgdHJ1ZSlcbiAgICAgICAgaWYgKHR5cGUpIGV2ZW50LnR5cGUgPSB0eXBlXG5cbiAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIGNhbGxpbmcgdGhlbSB1bmxlc3MgdGhleSBoYXZlXG4gICAgICAgIC8vIGJlZW4gcmVtb3ZlZCBieSBhIHByZXZpb3VzIGhhbmRsZXIgb3Igc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgIGZvciAoOyBpIDwgbCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbaV0ucmVtb3ZlZCkgbGlzdGVuZXJzW2ldLmhhbmRsZXIuY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYW5kIHJlbW92ZSBsaXN0ZW5lcnMgdG8gRE9NIGVsZW1lbnRzXG4gICAgLCBsaXN0ZW5lciA9IFczQ19NT0RFTFxuICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhZGQsIGN1c3RvbSwgdXNlQ2FwdHVyZSkge1xuICAgICAgICAgICAgLy8gbmV3IGJyb3dzZXJzXG4gICAgICAgICAgICBlbGVtZW50W2FkZCA/IGFkZEV2ZW50IDogcmVtb3ZlRXZlbnRdKHR5cGUsIHJvb3RMaXN0ZW5lciwgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tIC8qLCB1c2VDYXB0dXJlICovKSB7XG4gICAgICAgICAgICAvLyBJRTggYW5kIGJlbG93LCB1c2UgYXR0YWNoRXZlbnQvZGV0YWNoRXZlbnQgYW5kIHdlIGhhdmUgdG8gcGlnZ3ktYmFjayBwcm9wZXJ0eWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgIC8vIHRvIHNpbXVsYXRlIGV2ZW50IGJ1YmJsaW5nIGV0Yy5cbiAgICAgICAgICAgIHZhciBlbnRyeVxuICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICByZWdpc3RyeS5wdXQoZW50cnkgPSBuZXcgUmVnRW50cnkoXG4gICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgLCBjdXN0b20gfHwgdHlwZVxuICAgICAgICAgICAgICAgICwgZnVuY3Rpb24gKGV2ZW50KSB7IC8vIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgcm9vdExpc3RlbmVyLmNhbGwoZWxlbWVudCwgZXZlbnQsIGN1c3RvbSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAsIHJvb3RMaXN0ZW5lclxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgdHJ1ZSAvLyBpcyByb290XG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIGlmIChjdXN0b20gJiYgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPT0gbnVsbCkgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPSAwXG4gICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5hdHRhY2hFdmVudCgnb24nICsgZW50cnkuZXZlbnRUeXBlLCBlbnRyeS5oYW5kbGVyKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cnkgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgY3VzdG9tIHx8IHR5cGUsIHJvb3RMaXN0ZW5lciwgdHJ1ZSlbMF1cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGVudHJ5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgLCBvbmNlID0gZnVuY3Rpb24gKHJtLCBlbGVtZW50LCB0eXBlLCBmbiwgb3JpZ2luYWxGbikge1xuICAgICAgICAvLyB3cmFwIHRoZSBoYW5kbGVyIGluIGEgaGFuZGxlciB0aGF0IGRvZXMgYSByZW1vdmUgYXMgd2VsbFxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICBybShlbGVtZW50LCB0eXBlLCBvcmlnaW5hbEZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAsIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9yZ1R5cGUsIGhhbmRsZXIsIG5hbWVzcGFjZXMsIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgdmFyIHR5cGUgICAgID0gb3JnVHlwZSAmJiBvcmdUeXBlLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICAsIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGVsZW1lbnQsIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgcmVtb3ZlZCAgPSB7fVxuICAgICAgICAgICwgaSwgbFxuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoKCFoYW5kbGVyIHx8IGhhbmRsZXJzW2ldLm9yaWdpbmFsID09PSBoYW5kbGVyKSAmJiBoYW5kbGVyc1tpXS5pbk5hbWVzcGFjZXMobmFtZXNwYWNlcykpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmxlbWF0aWMsIHdlIGhhdmUgYSByZWdpc3RyeS5nZXQoKSBhbmQgcmVnaXN0cnkuZGVsKCkgdGhhdFxuICAgICAgICAgICAgLy8gYm90aCBkbyByZWdpc3RyeSBzZWFyY2hlcyBzbyB3ZSB3YXN0ZSBjeWNsZXMgZG9pbmcgdGhpcy4gTmVlZHMgdG8gYmUgcm9sbGVkIGludG9cbiAgICAgICAgICAgIC8vIGEgc2luZ2xlIHJlZ2lzdHJ5LmZvckFsbChmbikgdGhhdCByZW1vdmVzIHdoaWxlIGZpbmRpbmcsIGJ1dCB0aGUgY2F0Y2ggaXMgdGhhdFxuICAgICAgICAgICAgLy8gd2UnbGwgYmUgc3BsaWNpbmcgdGhlIGFycmF5cyB0aGF0IHdlJ3JlIGl0ZXJhdGluZyBvdmVyLiBOZWVkcyBleHRyYSB0ZXN0cyB0b1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IHNjcmV3IGl0IHVwLiBAcnZhZ2dcbiAgICAgICAgICAgIHJlZ2lzdHJ5LmRlbChoYW5kbGVyc1tpXSlcbiAgICAgICAgICAgIGlmICghcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdICYmIGhhbmRsZXJzW2ldW2V2ZW50U3VwcG9ydF0pXG4gICAgICAgICAgICAgIHJlbW92ZWRbaGFuZGxlcnNbaV0uZXZlbnRUeXBlXSA9IHsgdDogaGFuZGxlcnNbaV0uZXZlbnRUeXBlLCBjOiBoYW5kbGVyc1tpXS50eXBlIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgZWFjaCB0eXBlL2VsZW1lbnQgZm9yIHJlbW92ZWQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIHJvb3RMaXN0ZW5lciB3aGVyZSBpdCdzIG5vIGxvbmdlciBuZWVkZWRcbiAgICAgICAgZm9yIChpIGluIHJlbW92ZWQpIHtcbiAgICAgICAgICBpZiAoIXJlZ2lzdHJ5LmhhcyhlbGVtZW50LCByZW1vdmVkW2ldLnQsIG51bGwsIGZhbHNlKSkge1xuICAgICAgICAgICAgLy8gbGFzdCBsaXN0ZW5lciBvZiB0aGlzIHR5cGUsIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCByZW1vdmVkW2ldLnQsIGZhbHNlLCByZW1vdmVkW2ldLmMsIHVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB1cCBhIGRlbGVnYXRlIGhlbHBlciB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IsIHdyYXAgdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAgICAsIGRlbGVnYXRlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBmbikge1xuICAgICAgICAvL1RPRE86IGZpbmRUYXJnZXQgKHRoZXJlZm9yZSAkKSBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIG1hdGNoIGFuZCBvbmNlIGZvclxuICAgICAgICAvLyBzZXR0aW5nIGUuY3VycmVudFRhcmdldCwgZml4IHRoaXMgc28gaXQncyBvbmx5IG5lZWRlZCBvbmNlXG4gICAgICAgIHZhciBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgcm9vdCkge1xuICAgICAgICAgICAgICB2YXIgaSwgYXJyYXkgPSBpc1N0cmluZyhzZWxlY3RvcikgPyBzZWxlY3RvckVuZ2luZShzZWxlY3Rvciwgcm9vdCkgOiBzZWxlY3RvclxuICAgICAgICAgICAgICBmb3IgKDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gcm9vdDsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gdGFyZ2V0KSByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLCBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFRhcmdldChlLnRhcmdldCwgdGhpcylcbiAgICAgICAgICAgICAgaWYgKG1hdGNoKSBmbi5hcHBseShtYXRjaCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIF9fYmVhbkRlbCBpc24ndCBwbGVhc2FudCBidXQgaXQncyBhIHByaXZhdGUgZnVuY3Rpb24sIG5vdCBleHBvc2VkIG91dHNpZGUgb2YgQmVhblxuICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IHtcbiAgICAgICAgICAgIGZ0ICAgICAgIDogZmluZFRhcmdldCAvLyBhdHRhY2ggaXQgaGVyZSBmb3IgY3VzdG9tRXZlbnRzIHRvIHVzZSB0b29cbiAgICAgICAgICAsIHNlbGVjdG9yIDogc2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgICAgfVxuXG4gICAgLCBmaXJlTGlzdGVuZXIgPSBXM0NfTU9ERUwgPyBmdW5jdGlvbiAoaXNOYXRpdmUsIHR5cGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBkbyBhIHByb3BlciBkaXNwYXRjaEV2ZW50KClcbiAgICAgICAgdmFyIGV2dCA9IGRvYy5jcmVhdGVFdmVudChpc05hdGl2ZSA/ICdIVE1MRXZlbnRzJyA6ICdVSUV2ZW50cycpXG4gICAgICAgIGV2dFtpc05hdGl2ZSA/ICdpbml0RXZlbnQnIDogJ2luaXRVSUV2ZW50J10odHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luLCAxKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgICAgfSA6IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBvbGQgYnJvd3NlciB1c2Ugb25wcm9wZXJ0eWNoYW5nZSwganVzdCBpbmNyZW1lbnQgYSBjdXN0b20gcHJvcGVydHkgdG8gdHJpZ2dlciB0aGUgZXZlbnRcbiAgICAgICAgZWxlbWVudCA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgIGlzTmF0aXZlID8gZWxlbWVudC5maXJlRXZlbnQoJ29uJyArIHR5cGUsIGRvYy5jcmVhdGVFdmVudE9iamVjdCgpKSA6IGVsZW1lbnRbJ19vbicgKyB0eXBlXSsrXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIFB1YmxpYyBBUEk6IG9mZigpLCBvbigpLCBhZGQoKSwgKHJlbW92ZSgpKSwgb25lKCksIGZpcmUoKSwgY2xvbmUoKVxuICAgICAgICAqL1xuXG4gICAgICAvKipcbiAgICAgICAgKiBvZmYoZWxlbWVudFssIGV2ZW50VHlwZShzKVssIGhhbmRsZXIgXSwgb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvZmYgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZVNwZWMsIGZuKSB7XG4gICAgICAgIHZhciBpc1R5cGVTdHIgPSBpc1N0cmluZyh0eXBlU3BlYyksXG4gICAgICAgICAgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICAsIG9wdHMgPSBidWlsZE9wdGlvbnMoZGVmYXVsdE9wdHMsIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgLCBrLCB0eXBlLCBuYW1lc3BhY2VzLCBpXG5cbiAgICAgICAgaWYgKGlzVHlwZVN0ciAmJiB0eXBlU3BlYy5pbmRleE9mKCcgJykgPiAwKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCAndDEgdDIgdDMnLCBmbikgb3Igb2ZmKGVsLCAndDEgdDIgdDMnKVxuICAgICAgICAgIHR5cGVTcGVjID0gc3RyMmFycih0eXBlU3BlYylcbiAgICAgICAgICBmb3IgKGkgPSB0eXBlU3BlYy5sZW5ndGg7IGktLTspXG4gICAgICAgICAgICBvZmYoZWxlbWVudCwgdHlwZVNwZWNbaV0sIGZuKVxuICAgICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgaWYgKHR5cGUgJiYgY3VzdG9tRXZlbnRzW3R5cGVdKSB0eXBlID0gY3VzdG9tRXZlbnRzW3R5cGVdLmJhc2VcblxuICAgICAgICBpZiAoIXR5cGVTcGVjIHx8IGlzVHlwZVN0cikge1xuICAgICAgICAgIC8vIG9mZihlbCkgb3Igb2ZmKGVsLCB0MS5ucykgb3Igb2ZmKGVsLCAubnMpIG9yIG9mZihlbCwgLm5zMS5uczIubnMzKVxuICAgICAgICAgIGlmIChuYW1lc3BhY2VzID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSkgbmFtZXNwYWNlcyA9IHN0cjJhcnIobmFtZXNwYWNlcywgJy4nKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGZuLCBuYW1lc3BhY2VzLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0eXBlU3BlYykpIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIGZuKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIG51bGwsIHR5cGVTcGVjLCBudWxsLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCB7IHQxOiBmbjEsIHQyLCBmbjIgfSlcbiAgICAgICAgICBmb3IgKGsgaW4gdHlwZVNwZWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlU3BlYy5oYXNPd25Qcm9wZXJ0eShrKSkgb2ZmKGVsZW1lbnQsIGssIHR5cGVTcGVjW2tdKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uKGVsZW1lbnQsIGV2ZW50VHlwZShzKVssIHNlbGVjdG9yXSwgaGFuZGxlclssIGFyZ3MgXSwgW29wdGlvbnNdKVxuICAgICAgICAqL1xuICAgICwgb24gPSBmdW5jdGlvbihlbGVtZW50LCBldmVudHMsIHNlbGVjdG9yLCBmbikge1xuICAgICAgICB2YXIgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWxGbiwgdHlwZSwgdHlwZXMsIGksIGFyZ3MsIGVudHJ5LCBmaXJzdCwgb3B0c1xuXG4gICAgICAgIC8vVE9ETzogdGhlIHVuZGVmaW5lZCBjaGVjayBtZWFucyB5b3UgY2FuJ3QgcGFzcyBhbiAnYXJncycgYXJndW1lbnQsIGZpeCB0aGlzIHBlcmhhcHM/XG4gICAgICAgIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBldmVudHMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgY2FuJ3QgaGFuZGxlIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICBmb3IgKHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgICAgICAgIG9uLmNhbGwodGhpcywgZWxlbWVudCwgdHlwZSwgZXZlbnRzW3R5cGVdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgICAgICAvLyBkZWxlZ2F0ZWQgZXZlbnRcbiAgICAgICAgICBvcmlnaW5hbEZuID0gZm5cbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDQpXG4gICAgICAgICAgZm4gICAgICAgICA9IGRlbGVnYXRlKHNlbGVjdG9yLCBvcmlnaW5hbEZuLCBzZWxlY3RvckVuZ2luZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpXG4gICAgICAgICAgZm4gICAgICAgICA9IG9yaWdpbmFsRm4gPSBzZWxlY3RvclxuICAgICAgICB9XG5cbiAgICAgICAgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJnc1thcmdzLmxlbmd0aCAtIDFdKVxuICAgICAgICB0eXBlcyA9IHN0cjJhcnIoZXZlbnRzKVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igb25lKCksIHdyYXAgaW4gYSBzZWxmLXJlbW92aW5nIGhhbmRsZXJcbiAgICAgICAgaWYgKHRoaXMgPT09IE9ORSkge1xuICAgICAgICAgIGZuID0gb25jZShvZmYsIGVsZW1lbnQsIGV2ZW50cywgZm4sIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSB0eXBlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAvLyBhZGQgbmV3IGhhbmRsZXIgdG8gdGhlIHJlZ2lzdHJ5IGFuZCBjaGVjayBpZiBpdCdzIHRoZSBmaXJzdCBmb3IgdGhpcyBlbGVtZW50L3R5cGVcbiAgICAgICAgICBmaXJzdCA9IHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgLCB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpIC8vIGV2ZW50IHR5cGVcbiAgICAgICAgICAgICwgZm5cbiAgICAgICAgICAgICwgb3JpZ2luYWxGblxuICAgICAgICAgICAgLCBzdHIyYXJyKHR5cGVzW2ldLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSwgJy4nKSAvLyBuYW1lc3BhY2VzXG4gICAgICAgICAgICAsIGFyZ3NcbiAgICAgICAgICAgICwgZmFsc2UgLy8gbm90IHJvb3RcbiAgICAgICAgICApKVxuICAgICAgICAgIGlmIChlbnRyeVtldmVudFN1cHBvcnRdICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBldmVudCBvZiB0aGlzIHR5cGUgb24gdGhpcyBlbGVtZW50LCBhZGQgcm9vdCBsaXN0ZW5lclxuICAgICAgICAgICAgbGlzdGVuZXIoZWxlbWVudCwgZW50cnkuZXZlbnRUeXBlLCB0cnVlLCBlbnRyeS5jdXN0b21UeXBlLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogYWRkKGVsZW1lbnRbLCBzZWxlY3Rvcl0sIGV2ZW50VHlwZShzKSwgaGFuZGxlclssIGFyZ3MgXSlcbiAgICAgICAgKlxuICAgICAgICAqIERlcHJlY2F0ZWQ6IGtlcHQgKGZvciBub3cpIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5XG4gICAgICAgICovXG4gICAgLCBhZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnRzLCBmbiwgZGVsZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG9uLmFwcGx5KFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICwgIWlzU3RyaW5nKGZuKVxuICAgICAgICAgICAgICA/IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICAgICAgICA6IFsgZWxlbWVudCwgZm4sIGV2ZW50cywgZGVsZm4gXS5jb25jYXQoYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgNCkgOiBbXSlcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBvbmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqL1xuICAgICwgb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoT05FLCBhcmd1bWVudHMpXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIGZpcmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogVGhlIG9wdGlvbmFsICdhcmdzJyBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LCBpZiBubyAnYXJncycgYXJndW1lbnQgaXMgcHJvdmlkZWRcbiAgICAgICAgKiB0aGVuIHdlIGNhbiB1c2UgdGhlIGJyb3dzZXIncyBET00gZXZlbnQgc3lzdGVtLCBvdGhlcndpc2Ugd2UgdHJpZ2dlciBoYW5kbGVycyBtYW51YWxseVxuICAgICAgICAqL1xuICAgICwgZmlyZSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhcmdzKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IHN0cjJhcnIodHlwZSlcbiAgICAgICAgICAsIGksIGosIGwsIG5hbWVzLCBoYW5kbGVyc1xuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIHR5cGUgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpXG4gICAgICAgICAgaWYgKG5hbWVzID0gdHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lcyA9IHN0cjJhcnIobmFtZXMsICcuJylcbiAgICAgICAgICBpZiAoIW5hbWVzICYmICFhcmdzICYmIGVsZW1lbnRbZXZlbnRTdXBwb3J0XSkge1xuICAgICAgICAgICAgZmlyZUxpc3RlbmVyKG5hdGl2ZUV2ZW50c1t0eXBlXSwgdHlwZSwgZWxlbWVudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9uLW5hdGl2ZSBldmVudCwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBuYW1lc3BhY2UsIGFyZ3VtZW50cyBvciBhIG5vbiBET00gZWxlbWVudFxuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBsaXN0ZW5lcnMgYW5kIG1hbnVhbGx5ICdmaXJlJ1xuICAgICAgICAgICAgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICBhcmdzID0gW2ZhbHNlXS5jb25jYXQoYXJncylcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGogPCBsOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzW2pdLmluTmFtZXNwYWNlcyhuYW1lcykpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5oYW5kbGVyLmFwcGx5KGVsZW1lbnQsIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogY2xvbmUoZHN0RWxlbWVudCwgc3JjRWxlbWVudFssIGV2ZW50VHlwZSBdKVxuICAgICAgICAqXG4gICAgICAgICogVE9ETzogcGVyaGFwcyBmb3IgY29uc2lzdGVuY3kgd2Ugc2hvdWxkIGFsbG93IHRoZSBzYW1lIGZsZXhpYmlsaXR5IGluIHR5cGUgc3BlY2lmaWVycz9cbiAgICAgICAgKi9cbiAgICAsIGNsb25lID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZyb20sIHR5cGUpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGZyb20sIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgbCA9IGhhbmRsZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcbiAgICAgICAgICAsIGFyZ3MsIGJlYW5EZWxcblxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmIChoYW5kbGVyc1tpXS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgYXJncyA9IFsgZWxlbWVudCwgaGFuZGxlcnNbaV0udHlwZSBdXG4gICAgICAgICAgICBpZiAoYmVhbkRlbCA9IGhhbmRsZXJzW2ldLmhhbmRsZXIuX19iZWFuRGVsKSBhcmdzLnB1c2goYmVhbkRlbC5zZWxlY3RvcilcbiAgICAgICAgICAgIGFyZ3MucHVzaChoYW5kbGVyc1tpXS5vcmlnaW5hbClcbiAgICAgICAgICAgIG9uLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAsIGJlYW4gPSB7XG4gICAgICAgICAgJ29uJyAgICAgICAgICAgICAgICA6IG9uXG4gICAgICAgICwgJ2FkZCcgICAgICAgICAgICAgICA6IGFkZFxuICAgICAgICAsICdvbmUnICAgICAgICAgICAgICAgOiBvbmVcbiAgICAgICAgLCAnb2ZmJyAgICAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ3JlbW92ZScgICAgICAgICAgICA6IG9mZlxuICAgICAgICAsICdjbG9uZScgICAgICAgICAgICAgOiBjbG9uZVxuICAgICAgICAsICdmaXJlJyAgICAgICAgICAgICAgOiBmaXJlXG4gICAgICAgICwgJ0V2ZW50JyAgICAgICAgICAgICA6IEV2ZW50XG4gICAgICAgICwgJ3NldFNlbGVjdG9yRW5naW5lJyA6IHNldFNlbGVjdG9yRW5naW5lXG4gICAgICAgICwgJ25vQ29uZmxpY3QnICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRleHRbbmFtZV0gPSBvbGRcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gIC8vIGZvciBJRSwgY2xlYW4gdXAgb24gdW5sb2FkIHRvIGF2b2lkIGxlYWtzXG4gIGlmICh3aW4uYXR0YWNoRXZlbnQpIHtcbiAgICB2YXIgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpLCBlbnRyaWVzID0gcmVnaXN0cnkuZW50cmllcygpXG4gICAgICBmb3IgKGkgaW4gZW50cmllcykge1xuICAgICAgICBpZiAoZW50cmllc1tpXS50eXBlICYmIGVudHJpZXNbaV0udHlwZSAhPT0gJ3VubG9hZCcpIG9mZihlbnRyaWVzW2ldLmVsZW1lbnQsIGVudHJpZXNbaV0udHlwZSlcbiAgICAgIH1cbiAgICAgIHdpbi5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICAgICAgd2luLkNvbGxlY3RHYXJiYWdlICYmIHdpbi5Db2xsZWN0R2FyYmFnZSgpXG4gICAgfVxuICAgIHdpbi5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSBzZWxlY3RvciBlbmdpbmUgdG8gaW50ZXJuYWwgZGVmYXVsdCAocVNBIG9yIHRocm93IEVycm9yKVxuICBzZXRTZWxlY3RvckVuZ2luZSgpXG5cbiAgcmV0dXJuIGJlYW5cbn0pO1xuIiwicmVxdWlyZSggJy4vbGliL3NoaW1zL2N1c3RvbS1ldmVudCcgKVxuXG52YXIgYmVhbiA9IHJlcXVpcmUoICdiZWFuJyApLFxuICAgIGtleSAgPSByZXF1aXJlKCAna2V5bWFzdGVyJyApLFxuICAgIGFuaW1hdGlvbkV2ZW50ICAgID0gcmVxdWlyZSggJy4vbGliL2FuaW1hdGlvbi1ldmVudHMnICksXG4gICAgYWZ0ZXJBbmltYXRpb24gICAgPSByZXF1aXJlKCAnLi9saWIvYWZ0ZXItYW5pbWF0aW9uJyApLFxuICAgIHBhZ2UgICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3BhZ2UnICksXG4gICAgdGFwICAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvdGFwLWV2ZW50cycgKSxcbiAgICBkZWJvdW5jZSAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9kZWJvdW5jZScgKSxcbiAgICB0aHJvdHRsZSAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90aHJvdHRsZScgKSxcbiAgICBkZWxheSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9kZWxheScgKSxcbiAgICByZXBlYXQgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXBlYXQnICksXG4gICAgYnViYmxlRm9ybUV2ZW50cyAgPSByZXF1aXJlKCAnLi9saWIvYnViYmxlLWZvcm0tZXZlbnRzJyApLFxuICAgIHN1Ym1pdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3N1Ym1pdCcgKSxcbiAgICBzY3JvbGwgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGwnICksXG4gICAgcmVzaXplICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcmVzaXplJyApLFxuICAgIGNhbGxiYWNrTWFuYWdlciAgID0gcmVxdWlyZSggJy4vbGliL2NhbGxiYWNrLW1hbmFnZXInICksXG4gICAgbWVkaWEgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvbWVkaWEnICksXG5cbiAgICBzbGljZSAgICAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZSxcbiAgICBmb3JtQnViYmxpbmcgICAgICA9IGZhbHNlLFxuICAgIHdhdGNoQW5pbWF0aW9uICAgID0gdHJ1ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvLyBET00gZXZlbnRzXG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIG9uZTogb25lLFxuICBmaXJlOiBmaXJlLFxuICBjbG9uZTogYmVhbi5jbG9uZSxcbiAgcmVhZHk6IHBhZ2UucmVhZHksXG4gIGNoYW5nZTogcGFnZS5jaGFuZ2UsXG4gIGFmdGVyQW5pbWF0aW9uOiBhZnRlckFuaW1hdGlvbixcbiAgd2F0Y2hBbmltYXRpb246IHdhdGNoQW5pbWF0aW9uLFxuXG4gIC8vIE1lZGlhIHF1ZXJ5IGV2ZW50c1xuICBtZWRpYTogbWVkaWEsXG5cbiAgLy8gS2V5Ym9hcmQgZXZlbnRzXG4gIGtleToga2V5LFxuICBrZXlPbjoga2V5LFxuICBrZXlPZmY6IGtleS51bmJpbmQsXG4gIGtleU9uZToga2V5T25lLFxuXG4gIC8vIFRpbWluZyB1dGlsaXRpZXNcbiAgZGVib3VuY2U6IGRlYm91bmNlLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGRlbGF5OiAgICBkZWxheSxcbiAgcmVwZWF0OiAgIHJlcGVhdCxcblxuICAvLyBPcHRpbWl6ZWQgRXZlbnQgTWFuYWdlcnNcbiAgc2Nyb2xsOiAgICAgIHNjcm9sbCxcbiAgcmVzaXplOiAgICAgIHJlc2l6ZSxcblxuICBjYWxsYmFja01hbmFnZXI6IGNhbGxiYWNrTWFuYWdlcixcbiAgY2FsbGJhY2s6IGNhbGxiYWNrTWFuYWdlci5jYWxsYmFjayxcblxuICAvLyBCdWJibGluZyBmaXhcbiAgYnViYmxlRm9ybUV2ZW50czogYnViYmxlRm9ybUV2ZW50cyxcblxuICBzdWJtaXQ6IHN1Ym1pdFxufVxuXG5wYWdlLnJlYWR5KCBmdW5jdGlvbigpIHtcbiAgaWYgKCB3YXRjaEFuaW1hdGlvbiApIGFmdGVyQW5pbWF0aW9uLndhdGNoKClcbn0pXG5cbi8vIEJlYW4gZG9lc24ndCBhY2NvdW50IGZvciBjcm9zcy1icm93c2VyIHN1cHBvcnQgb24gYW5pbWF0aW9uIGV2ZW50c1xuLy8gU28gcmF0aGVyIHRoYW4gcGFzcyB0aHJvdWdoIGV2ZW50cyB0byBiZWFuLCB3ZSBwcm9jZXNzIHRoZW0gdG8gYWRkXG4vLyB2ZW5kb3IgcHJlZml4ZXMgb3IgcmVtb3ZlIGV2ZW50cyBpZiBicm93c2VycyBkbyBub3Qgc3VwcG9yIHRoZW1cbi8vXG5mdW5jdGlvbiBvbiAoKSB7XG4gIHNldEV2ZW50KCAnb24nLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9mZiAoKSB7XG4gIHNldEV2ZW50KCAnb2ZmJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBvbmUgKCkge1xuICBzZXRFdmVudCggJ29uZScsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gZmlyZSAoKSB7XG5cbiAgYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApXG4gIHZhciBlbCA9IGFyZ3NbMF1cbiAgdmFyIGV2ZW50cyA9IFtdXG5cbiAgYXJnc1sxXS5zcGxpdCgnICcpLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudCApIHtcblxuICAgIHZhciBldmVudCA9IGFuaW1hdGlvbkV2ZW50LnRyYW5zZm9ybSggZXZlbnQgKVxuICAgIGlmICggIWlzRW1wdHkoIGV2ZW50ICkgKSBldmVudHMucHVzaCggZXZlbnQgKVxuXG4gIH0pXG5cbiAgaWYgKCAhaXNFbXB0eSggZXZlbnRzICkgKSB7XG5cbiAgICBhcmdzWzFdID0gZXZlbnRzLmpvaW4oICcgJyApXG4gICAgYmVhbi5maXJlLmFwcGx5KCB0aGlzLCBhcmdzIClcblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEV2ZW50KCByZWdpc3RlclR5cGUsIGFyZ3MgKSB7XG4gIHRyYW5zZm9ybUFyZ3MoIGFyZ3MgKS5mb3JFYWNoKCBmdW5jdGlvbiggYXJnICkge1xuICAgIGJlYW5bIHJlZ2lzdGVyVHlwZSBdLmFwcGx5KCBudWxsLCBhcmcgKVxuICB9KVxuXG59XG5cbi8vIEFkZCBzdXBwb3J0IGZvciB1bmJpbmRpbmcgYSBrZXkgZXZlbnQgYWZ0ZXIgaXQgaXMgY2FsbGVkXG4vL1xuZnVuY3Rpb24ga2V5T25lICgga2V5cywgc2NvcGUsIGZuICkge1xuXG4gIGlmICggdHlwZW9mIHNjb3BlID09ICdmdW5jdGlvbicgKSB7XG4gICAgZm4gPSBzY29wZVxuICAgIHNjb3BlID0gJ2FsbCdcbiAgfVxuXG4gIGtleSgga2V5cywgc2NvcGUsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBrZXkudW5iaW5kKCBrZXlzLCBzY29wZSApXG4gICAgZm4oIGV2ZW50IClcbiAgfSlcbn1cblxuLy8gVHJhbnNmb3JtIGV2ZW50IGFyZ3VtZW50cyB0byBoYW5kbGUgdGFwIGV2ZW50IGFuZCBjcm9zcy1icm93c2VyIGFuaW1hdGlvbiBldmVudHNcbi8vIFJldHVybnMgYW4gYXJyYXkgb2YgZXZlbnRzIHRvIGJlIHJlZ2lzdGVyZWQgaW5kaXZpZHVhbGx5XG4vL1xuZnVuY3Rpb24gdHJhbnNmb3JtQXJncyggYXJncyApIHtcblxuICB2YXIgdHJhbnNmb3JtZWRBcmdzID0gW11cbiAgdmFyIG5ld0V2ZW50cyA9IHt9XG4gIHZhciBlbGVtZW50ID0gYXJncy5zaGlmdCgpIC8vIHJldHJpZXZlIGVsZW1lbnRcbiAgdmFyIGV2ZW50cyA9IGFyZ3Muc2hpZnQoKVxuXG4gIC8vIGRldGVjdCBldmVudCBkZWxlZ2F0ZSBzZWxlY3RvclxuICBpZiAoIHR5cGVvZiBhcmdzWzBdICE9ICdmdW5jdGlvbicgKSB7XG4gICAgdmFyIGRlbGVnYXRlID0gYXJncy5zaGlmdCgpXG4gIH1cblxuICAvLyBjb252ZXJ0IGV2ZW50IHN0cmluZ3MgdG8gb2JqZWN0IGJhc2VkIGV2ZW50cyBmb3IgY29kZSBzaW1wbGlmaWNhdGlvblxuICAvLyBleGFtcGxlOiBhcmd1bWVudHMgKCdob3ZlciBmb2N1cycsIGZ1bmN0aW9uKSB3b3VsZCBiZWNvbWUgKHsgJ2hvdmVyIGZvY3VzJzogZnVuY3Rpb24gfSlcbiAgaWYgKCB0eXBlb2YgZXZlbnRzID09ICdzdHJpbmcnICkge1xuICAgIHZhciBvYmpFdmVudHMgPSB7fVxuICAgIG9iakV2ZW50c1tldmVudHNdID0gYXJncy5zaGlmdCgpXG4gICAgZXZlbnRzID0gb2JqRXZlbnRzXG4gIH1cblxuICAvLyBXYWxrIHRocm91Z2ggZWFjaCBrZXkgaW4gdGhlIGV2ZW50cyBvYmplY3QgYW5kIGFkZCB2ZW5kb3IgcHJlZml4ZXMgdG8gJ2FuaW1hdGlvbicgZXZlbnRzXG4gIC8vIGFuZCB3cmFwIGNhbGxiYWNrIGluIHRoZSB0YXAgZnVuY3Rpb24gZm9yIGFsbCAndGFwJyBldmVudHMuXG4gIC8vXG5cbiAgT2JqZWN0LmtleXMoIGV2ZW50cyApLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBldmVudHNbZXZlbnRdXG5cbiAgICAvLyBFdmVudHMgY2FuIGJlIHJlZ2lzdGVyZWQgYXMgc3BhY2Ugc2VwYXJhdGVkIGdyb3VwcyBsaWtlIFwiaG92ZXIgZm9jdXNcIlxuICAgIC8vIFRoaXMgaGFuZGxlcyBlYWNoIGV2ZW50IGluZGVwZW5kYW50bHlcbiAgICAvL1xuICAgIGV2ZW50LnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGUgKXtcblxuICAgICAgLy8gSWYgaXQgaXMgYW4gYW5pbWF0aW9uIGV2ZW50LCB2ZW5kb3IgcHJlZml4IGl0LCBvciBmaXJlIHRoZSBjYWxsYmFjayBhY2NvcmRpbmcgdG8gYnJvd3NlciBzdXBwb3J0XG4gICAgICBlID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBlIClcblxuICAgICAgaWYgKCBpc0VtcHR5KCBlICkgKSB7XG4gICAgICAgIC8vIElmIGl0J3MgZW1wdHksIGl0IGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgYW5pbWF0aW9uIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0cmlnZ2VyIHRoZSBldmVudCBpbW1lZGlhdGVseVxuICAgICAgICBjYWxsYmFjaygpXG5cbiAgICAgIH0gZWxzZSBpZiAoIGUubWF0Y2goIC90YXAvICkgKSB7XG5cbiAgICAgICAgLy8gSWYgaXQncyBhIHRhcCBldmVudCwgd3JhcCB0aGUgY2FsbGJhY2sgYW5kIHNldCB0aGUgZXZlbnQgdG8gJ3RvdWNoc3RhcnQnXG4gICAgICAgIC8vIFRhcCBpc24ndCBhIHJlYWwgbmF0aXZlIGV2ZW50LCBidXQgdGhpcyB3cmFwcGVyIGxldHMgdXMgc2ltdWxhdGUgd2hhdCBhXG4gICAgICAgIC8vIG5hdGl2ZSB0YXAgZXZlbnQgd291bGQgYmUuXG4gICAgICAgIC8vXG4gICAgICAgIG5ld0V2ZW50cy50b3VjaHN0YXJ0ID0gdGFwKCBjYWxsYmFjayApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdFdmVudHNbIGUgXSA9IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBPYmplY3Qua2V5cyggbmV3RXZlbnRzICkuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIHZhciBhID0gW11cbiAgICBhLnB1c2goIGVsZW1lbnQsIGV2ZW50IClcblxuICAgIGlmICggZGVsZWdhdGUgKSBhLnB1c2goIGRlbGVnYXRlIClcblxuICAgIGEucHVzaCggbmV3RXZlbnRzWyBldmVudCBdIClcbiAgICB0cmFuc2Zvcm1lZEFyZ3MucHVzaCggYS5jb25jYXQoIGFyZ3MgKSApXG4gIH0pXG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQXJnc1xufVxuXG5cbmZ1bmN0aW9uIGlzRW1wdHkoIG9iaiApIHtcblxuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbiAgaWYgKCBvYmogPT0gbnVsbCB8fCBvYmoubGVuZ3RoID09PSAwICkgcmV0dXJuIHRydWVcblxuICBpZiAoIDAgPCBvYmoubGVuZ3RoICkgcmV0dXJuIGZhbHNlXG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmICggaGFzT3duUHJvcGVydHkuY2FsbCggb2JqLCBrZXkgKSApIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgRXZlbnQgICAgID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAgZGVsYXkgICAgID0gcmVxdWlyZSggJy4vZGVsYXknICksXG4gICAgc3VwcG9ydGVkID0gcmVxdWlyZSggJy4vYW5pbWF0aW9uLWV2ZW50cycgKS5zdXBwb3J0ZWRcblxuZnVuY3Rpb24gYW5pbWF0aW9uRHVyYXRpb24oIGVsICkge1xuICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsICkuZ2V0UHJvcGVydHlWYWx1ZSggJ2FuaW1hdGlvbi1kdXJhdGlvbicgKVxufVxuXG4vLyBXYXRjaGVzIGFsbCBkb2N1bWVudCBhbmltYXRpb24gYWRkIGFkZCBkYXRhIGF0dHJpYnV0ZXMgdG8gZWxlbWVudHMgd2hlbiB0aGV5IGJlZ2luXG4vLyBUaGlzIGVuYWJsZXMgYW5pbWF0aW9uRW5kIHRvIHdhdGNoIGFuaW1hdGlvbnMgd2hpY2ggaGF2ZW4ndCBiZWd1blxuZnVuY3Rpb24gd2F0Y2hBbmltYXRpb24oKSB7XG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2FuaW1hdGlvbnN0YXJ0JywgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGV2ZW50LnRhcmdldC5kYXRhc2V0LmlzQW5pbWF0aW5nID0gdHJ1ZVxuICB9KVxuICBFdmVudC5vbiggZG9jdW1lbnQsICdhbmltYXRpb25lbmQnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZXZlbnQudGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1pcy1hbmltYXRpbmcnKVxuICB9KVxufVxuXG4vLyBUaGlzIHJlcXVpcmVzIHRyYWNrRWxlbWVudEFuaW1hdGlvbiB0byBiZSBlbmFibGVkXG5mdW5jdGlvbiBhZnRlckFuaW1hdGlvbiggZWwsIGNhbGxiYWNrLCBzdGFydFRpbWVvdXQgKSB7XG4gIC8vIEFuaW1hdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBqdXN0IHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gIGlmICggIXN1cHBvcnRlZCApIHJldHVybiBjYWxsYmFjaygpXG5cbiAgLy8gQW5pbWF0aW9uIGhhcyBhbHJlYWR5IGJlZ3VuXG4gIGlmICggZWwuZGF0YXNldC5pc0FuaW1hdGluZyB8fCBlbC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaXMtYW5pbWF0aW5nXScgKSApIHtcblxuICAgIC8vIFdhdGNoIGZvciBlbmRcbiAgICBFdmVudC5vbmUoIGVsLCAnYW5pbWF0aW9uZW5kJywgY2FsbGJhY2sgKVxuXG4gIC8vIEFuaW1hdGlvbiBoYXMgbm90IHlldCBiZWd1biBzb+KAplxuICB9IGVsc2Uge1xuXG4gICAgLy8gc3RhcnRUaW1lb3V0IGlzIG1lYW50IHRvIGVuc3VyZSB0aGF0IGEgY2FsbGJhY2sgaXMgZmlyZWQgZXZlbiBpZiBcbiAgICAvLyBhbiBhbmltYXRpb24gZXZlbnQsIG9yIGluIHRoZSBjYXNlIHRoYXQgYW4gYW5pbWF0aW9uIGV2ZW50IGlzIG5ldmVyIHRyaWdnZXJlZFxuICAgIC8vIHRoaXMgbWlnaHQgaGFwcGVuIGlmIGEgdXNlciB3YW50cyB0byBmaXJlIGEgY2FsbGFjayBhZnRlciBhbiBlbGVtZW50IGFuaW1hdGVzXG4gICAgLy8gb3IgZmlyZSB0aGUgY2FsbGJhY2sgYW55d2F5IGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBhbmltYXRpb24uXG4gICAgaWYgKCBzdGFydFRpbWVvdXQgKSB7XG5cbiAgICAgIC8vIFNldCBhIGRlZmF1bHQgdGltZW91dCAoYWxsb3dpbmcgc3RhcnRUaW1lb3V0ID09IHRydWUgb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGlzZWNvbnMpXG4gICAgICB2YXIgdGltZSA9ICgodHlwZW9mIHN0YXJ0VGltZW91dCA9PSBcIm51bWJlclwiKSA/IHN0YXJ0VGltZW91dCA6IDMyKSAvLyAzMm1zOiB+IHR3byBmcmFtZXMgb2YgYW5pbWF0aW9uIGdyYWNlIHBlcmlvZFxuXG4gICAgICB2YXIgZGVsYXllZEV2ZW50ID0gZGVsYXkoIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBTdG9wIHdhdGNoaW5nIGZvciBhbmltYXRpb24gdG8gc3RhcnRcbiAgICAgICAgLy8gV2h5PyAtIElmIHRoZSBhbmltYXRpb24gc3RhcnRzIGxhdGVyLCB0aGUgY2FsbGJhY2sgd2lsbCBmaXJlIHR3aWNlXG4gICAgICAgIEV2ZW50Lm9mZiggZWwsICdhbmltYXRpb25zdGFydCcsIHdhdGNoRW5kRXZlbnQgKSBcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSwgdGltZSApXG4gICAgfVxuXG4gICAgLy8gTmV4dDpcbiAgICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGF0dGFjaCBjYWxsYmFjayB0byBhbmltYXRpb25FbmQgZXZlbnRcbiAgICBmdW5jdGlvbiB3YXRjaEVuZEV2ZW50ICgpIHtcbiAgICAgIGlmICggc3RhcnRUaW1lb3V0ICkgZGVsYXllZEV2ZW50LnN0b3AoKSAgICAvLyBjYW5jZWwgZGVsYXllZCBmaXJlXG4gICAgICBFdmVudC5vbmUoIGVsLCAnYW5pbWF0aW9uZW5kJywgY2FsbGJhY2sgKSAvLyB3YXRjaCBmb3IgYW5pbWF0aW9uIHRvIGZpbmlzaFxuICAgIH1cbiAgICBcbiAgICAvLyBGaW5hbGx5LCB3aGVuIHRoZSBhbmltYXRpb24gZG9lcyBzdGFydCwgd2F0Y2ggZm9yIGl0cyBlbmRcbiAgICBFdmVudC5vbmUoIGVsLCAnYW5pbWF0aW9uc3RhcnQnLCB3YXRjaEVuZEV2ZW50IClcbiAgfVxufVxuXG5hZnRlckFuaW1hdGlvbi53YXRjaCA9IHdhdGNoQW5pbWF0aW9uXG5cbm1vZHVsZS5leHBvcnRzID0gYWZ0ZXJBbmltYXRpb25cbiIsInZhciBjc3NBbmltRXZlbnRUeXBlcyA9IGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKVxudmFyIHN1cHBvcnRlZCAgICAgICAgID0gY3NzQW5pbUV2ZW50VHlwZXMuYW5pbWF0aW9uc3RhcnQgIT09IHVuZGVmaW5lZFxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHMsXG4gIHN1cHBvcnRlZDogc3VwcG9ydGVkXG59XG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnQW5pbWF0aW9uU3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ0FuaW1hdGlvbkVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnQW5pbWF0aW9uSXRlcmF0aW9uJ1xuICB9O1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFdmVudFR5cGVzKHByZWZpeCkge1xuICBwcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBhbmltYXRpb25zdGFydDogcHJlZml4ICsgJ2FuaW1hdGlvbnN0YXJ0JyxcbiAgICBhbmltYXRpb25lbmQ6IHByZWZpeCArICdhbmltYXRpb25lbmQnLFxuICAgIGFuaW1hdGlvbml0ZXJhdGlvbjogcHJlZml4ICsgJ2FuaW1hdGlvbml0ZXJhdGlvbidcbiAgfTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuaW1hdGlvbiBldmVudCB0eXBlcyB7YW5pbWF0aW9uc3RhcnQsIGFuaW1hdGlvbmVuZCwgYW5pbWF0aW9uaXRlcmF0aW9ufVxuICovXG5cbmZ1bmN0aW9uIGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKSB7XG4gIGlmICggIWRvY3VtZW50ICkgcmV0dXJuIHt9XG5cbiAgdmFyIHByZWZpeGVzID0gWyd3ZWJraXQnLCAnTW96JywgJ08nLCAnJ107XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxuICAvLyBicm93c2VyIGNvbXBsaWFudFxuICBpZiAodW5kZWZpbmVkICE9PSBzdHlsZS5hbmltYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMoKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcmVmaXhlcy5sZW5ndGgsIHByZWZpeDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcHJlZml4ID0gcHJlZml4ZXNbaV07XG5cbiAgICBpZiAodW5kZWZpbmVkICE9PSBzdHlsZVtwcmVmaXggKyAnQW5pbWF0aW9uTmFtZSddKSB7XG4gICAgICAvLyBXZWJraXRcbiAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2VFdmVudFR5cGVzKHByZWZpeC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGVsc2UgaWYgKDEgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIE9wZXJhXG4gICAgICBlbHNlIGlmICgyID09PSBpKSB7XG4gICAgICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKHByZWZpeC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cblxuLy8gQWRkcyBuZWNlc3NhcnkgYWRkIHZlbmRvciBwcmVmaXhlcyBvciBjYW1lbENhc2VkIGV2ZW50IG5hbWVzXG4vL1xuZnVuY3Rpb24gdHJhbnNmb3JtQW5pbWF0aW9uRXZlbnRzIChldmVudCkge1xuICBpZiAoIWV2ZW50Lm1hdGNoKC9hbmltYXRpb24vaSkpIHtcbiAgICByZXR1cm4gZXZlbnRcbiAgfSBlbHNlIHtcbiAgICBpZiAoY3NzQW5pbUV2ZW50VHlwZXNbZXZlbnRdKSB7XG4gICAgICByZXR1cm4gY3NzQW5pbUV2ZW50VHlwZXNbZXZlbnRdXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHdpbmRvdy5lbnYgIT0gJ3Rlc3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1wiJyArIGV2ZW50ICsgJ1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBhbmltYXRpb24gZXZlbnQnKVxuICAgICAgfVxuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG59XG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCAnYmVhbicgKSxcbiAgICBwYWdlICA9IHJlcXVpcmUoICcuL3BhZ2UnICksXG4gICAgZm9ybUVscztcblxudmFyIGZvcm1CdWJibGluZyA9IGZhbHNlXG5cbnZhciBmaXJlQnViYmxlID0gZnVuY3Rpb24gKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5kZXRhaWwgJiYgZXZlbnQuZGV0YWlsLnRyaWdnZXJlZCApIHsgcmV0dXJuIGZhbHNlIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoIGV2ZW50LnR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IHRyaWdnZXJlZDogdHJ1ZSB9IH0gKVxuXG4gIC8vIFN0b3Agb25seSAnc3VibWl0JyBldmVudHMuIFN0b3BwaW5nIGJsdXIgb3IgZm91Y3MgZXZlbnRzIHNlZW1zIHRvIGJyZWFrIEZpcmVGb3ggaW5wdXQgaW50ZXJhY3Rpb25zLlxuICBpZiAoIGV2ZW50LnR5cGUgPT0gJ3N1Ym1pdCcgKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IG9uIG9yaWdpbmFsIGV2ZW50IGlmIGN1c3RvbSBldmVudCBpcyBwcmV2ZW50ZWRcbiAgaWYgKCBldi5kZWZhdWx0UHJldmVudGVkICkgZXZlbnQucHJldmVudERlZmF1bHQoKSBcbn1cblxuLy8gU2ltcGxpZnkgc2V0dGluZyB0aGUgZXZlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZWxlbWVudFxudmFyIGV2ZW50VHlwZSA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIHJldHVybiAoIGVsLnRhZ05hbWUgPT0gJ0ZPUk0nICkgPyAnc3VibWl0JyA6ICdmb2N1cyBibHVyJ1xufVxuXG4vLyBBZGQgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlT24gPSBmdW5jdGlvbiAoIGVsICkge1xuICBFdmVudC5vbiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPZmYgPSBmdW5jdGlvbiAoIGVsICkge1xuICBFdmVudC5vZmYoIGVsLCBldmVudFR5cGUoIGVsICksIGZpcmVCdWJibGUgKVxufVxuXG4vLyBBZGQvUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZUZvcm1FdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICggZm9ybUJ1YmJsaW5nICkgeyByZXR1cm4gfSBcbiAgcGFnZS5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gUmVtb3ZlIGxpc3RlbmVycyBmcm9tIHByZXZpb3VzIHBhZ2VcbiAgICBpZiAoIGZvcm1FbHMgKSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPZmYgKVxuXG4gICAgLy8gQWRkIG5ldyBsaXN0ZW5lcnMgdG8gdGhpcyBwYWdlXG4gICAgZm9ybUVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdmb3JtLCBpbnB1dCcgKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggZm9ybUVscywgYnViYmxlT24gKVxuICB9KVxuXG4gIHZhciBmb3JtQnViYmxpbmcgPSB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnViYmxlRm9ybUV2ZW50c1xuIiwidmFyIE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hbmFnZXIgPSB7XG5cbiAgICAgIGNhbGxiYWNrczogW10sXG5cbiAgICAgIGFkZDogZnVuY3Rpb24oIGZuICkge1xuXG4gICAgICAgIHZhciBjYiA9IE1hbmFnZXIuY2FsbGJhY2submV3KCBmbiApXG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLnB1c2goIGNiIClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjYlxuXG4gICAgICB9LFxuXG4gICAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdG9wKCkgfSApXG4gICAgICB9LFxuXG4gICAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2Iuc3RhcnQoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHRvZ2dsZTogZnVuY3Rpb24oIGJvb2wgKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2IudG9nZ2xlKCBib29sICkgfSApXG4gICAgICB9LFxuXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcyA9IFtdXG4gICAgICB9LFxuXG4gICAgICBmaXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGZuICkgeyBmbi5hcHBseSggdGhpcywgYXJncyApIH0gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYW5hZ2VyXG4gIH0sXG5cbiAgY2FsbGJhY2s6IHtcbiAgICBuZXc6IGZ1bmN0aW9uKCBmbiApIHtcbiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIGNiLmVuYWJsZWQgKSB7IGZuLmFwcGx5KCBmbiwgYXJndW1lbnRzICkgfVxuICAgICAgfVxuXG4gICAgICBjYi5zdG9wICAgPSBmdW5jdGlvbigpIHsgY2IuZW5hYmxlZCA9IGZhbHNlIH1cbiAgICAgIGNiLnN0YXJ0ICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gdHJ1ZSB9XG4gICAgICBjYi50b2dnbGUgPSBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgY2IuZW5hYmxlZCA9ICggMCBpbiBhcmd1bWVudHMgKSA/IGJvb2wgOiAhY2IuZW5hYmxlZFxuICAgICAgfVxuICAgICAgY2IuZW5hYmxlZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGNiXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWFuYWdlclxuIiwidmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKVxufVxuXG52YXIgcGlja0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmb3VuZFxuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBjYW5kaWRhdGUgKSB7XG4gICAgaWYgKCB0eXBlb2YoIGNhbmRpZGF0ZSApID09ICdmdW5jdGlvbicgJiYgIWZvdW5kICkgeyBmb3VuZCA9IGNhbmRpZGF0ZSB9XG4gIH0pXG5cbiAgcmV0dXJuIGZvdW5kXG59XG5cbnZhciBkZWJvdW5jZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICAvLyBBbGxvdyBvcHRpb25zIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnRcbiAgaWYgKCB0eXBlb2YoIGZuICkgPT0gJ29iamVjdCcgKSB7IG9wdGlvbnMgPSBmbiB9IFxuXG4gIC8vIE9wdGlvbnMgd29uJ3QgYmUgbnVsbFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIHdhaXQgPSBvcHRpb25zLndhaXQgfHwgd2FpdCB8fCAwXG5cbiAgdmFyIG1heCAgICAgICAgICAgID0gb3B0aW9ucy5tYXggfHwgZmFsc2UsXG4gICAgICBsZWFkaW5nICAgICAgICA9ICggKCAnbGVhZGluZycgIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMubGVhZGluZyAgOiBmYWxzZSApLFxuICAgICAgdHJhaWxpbmcgICAgICAgPSAoICggJ3RyYWlsaW5nJyBpbiBvcHRpb25zICkgPyBvcHRpb25zLnRyYWlsaW5nIDogdHJ1ZSApLFxuICAgICAgXG4gICAgICAvLyBHcmFiIGZ1bmN0aW9ucyBmcm9tIG9wdGlvbnMgb3IgZGVmYXVsdCB0byBmaXJzdCBhcmd1bWVudFxuICAgICAgbGVhZGluZ0ZuICAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy50cmFpbGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcbiAgICAgIHRyYWlsaW5nRm4gICAgID0gcGlja0Z1bmN0aW9uKCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmxlYWRpbmcsIG9wdGlvbnMuY2FsbGJhY2ssIGZuICksXG5cbiAgICAgIC8vIFN0YXRlIHRyYWNraW5nIHZhcnNcbiAgICAgIGFyZ3MsICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBhcmd1bWVudHMgcGFzc2VkIHRvIGRlYm91bmNlZCBjYWxsYmFja1xuICAgICAgcXVldWVkICAgICAgICAgPSBmYWxzZSwgIC8vIEhhcyBhIGNhbGxiYWNrIGJlZW4gYWRkZWQgdG8gdGhlIGFuaW1hdGlvbiBsb29wP1xuICAgICAgaGFuZGxlICAgICAgICAgPSB7fSwgICAgIC8vIE9iamVjdCBmb3IgdHJhY2tpbmcgZnVuY3Rpb25zIGFuZCBjYWxsYmFja3NcbiAgICAgIGxhc3RDYWxsZWQgICAgID0gMCwgICAgICAvLyBLZWVwIGEgdGltZXIgZm9yIGRlYm91bmNpbmdcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMCwgICAgICAvLyBLZWVwIGEgdGltZXIgZm9yIG1heFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZTsgIC8vIFRyYWNrIGxlYWRpbmcsIHRocm90dGxpbmcgc3Vic2VxdWVudCBsZWFkaW5nIGNhbGxzXG5cbiAgLy8gUXVldWUgdGhlIGZ1bmN0aW9uIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gIHZhciBpbnZva2UgPSBmdW5jdGlvbiggY2FsbFR5cGUgKSB7XG5cbiAgICBsYXN0Q2FsbGVkID0gbm93KClcbiAgICBsYXN0SW52b2tlZCA9IG5vdygpXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBsZWFkaW5nQmxvY2tlZCA9IHRydWVcblxuICAgIGlmICggY2FsbFR5cGUgPT09ICdsZWFkaW5nJyApIHtcbiAgICAgIGxlYWRpbmdGbi5hcHBseSggbGVhZGluZ0ZuLCBhcmdzICkgfVxuICAgIGVsc2Uge1xuICAgICAgdHJhaWxpbmdGbi5hcHBseSggdHJhaWxpbmdGbiwgYXJncyApIH1cblxuICB9XG5cbiAgLy8gTG9hZCB0aGUgbG9vcCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWVcbiAgdmFyIGFkZFRvUXVldWUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoICFxdWV1ZWQgKSB7XG4gICAgICBxdWV1ZWQgPSB0cnVlXG4gICAgICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGxvb3AgKSAgLy8gQWRkIHRvIGJyb3dzZXIncyBhbmltYXRpb24gcXVldWVcbiAgICB9XG5cbiAgfVxuXG4gIC8vIFJlbW92ZSBmcm9tIGFuaW1hdGlvbiBxdWV1ZSBhbmQgcmVzZXQgZGVib3VuY2UgXG4gIHZhciByZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbigpIHtcblxuICAgIGlmICggXCJ2YWx1ZVwiIGluIGhhbmRsZSApIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUudmFsdWUgKVxuICAgICAgcXVldWVkICAgICAgICAgPSBmYWxzZVxuICAgICAgbGFzdENhbGxlZCAgICAgPSAwXG4gICAgICBsYXN0SW52b2tlZCAgICA9IDBcbiAgICAgIGxlYWRpbmdCbG9ja2VkID0gZmFsc2VcbiAgICB9XG4gICAgXG4gIH1cblxuICAvLyBwcmV2ZW50IGluZmluaXRlIGRlYm91bmNpbmcgKCBpZiBvcHRpb25zLm1heCBpcyBzZXQgKVxuICB2YXIgbWF4UGFzc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbWF4ICYmIG5vdygpIC0gbGFzdEludm9rZWQgPj0gbWF4IClcbiAgfVxuXG4gIHZhciB3YWl0UmVhY2hlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoIG5vdygpIC0gbGFzdENhbGxlZCApID49IHdhaXRcbiAgfVxuXG4gIC8vIFRoaXMgZ2V0cyBsb2FkZWQgaW50byB0aGUgYW5pbWF0aW9uIHF1ZXVlIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gaXZva2UgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHtcbiAgXG4gICAgLy8gTG9vcCB3YXMgZXhlY3V0ZWQgc28gaXQncyBubyBsb25nZXIgaW4gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgXG4gICAgaWYgKCBsZWFkaW5nICYmICFsZWFkaW5nQmxvY2tlZCApIHtcbiAgICAgIGludm9rZSggJ2xlYWRpbmcnIClcbiAgICB9XG5cbiAgICAvLyBJZiBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgdG8gZnJlcXVlbnRseSB0byBleGVjdXRlXG4gICAgZWxzZSBpZiAoIG1heFBhc3NlZCgpICkge1xuXG4gICAgICBpZiAoIGxlYWRpbmcgKSB7IGludm9rZSggJ2xlYWRpbmcnICkgIH1cbiAgICAgIGVsc2UgICAgICAgICAgIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgfSBcbiAgICBcbiAgICAvLyBJZiBmdW5jdGlvbiBoYXNuJ3QgYmVlbiBjYWxsZWQgc2luY2UgbGFzdCB3YWl0XG4gICAgZWxzZSBpZiAoIHdhaXRSZWFjaGVkKCkgKSB7XG5cbiAgICAgIC8vIElmIHRyYWlsaW5nIGl0J3Mgc2FmZSB0byBpbnZva2VcbiAgICAgIGlmICggdHJhaWxpbmcgKSB7IGludm9rZSggJ3RyYWlsaW5nJyApIH1cblxuICAgICAgLy8gSWYgbGVhZGluZywgaXQncyBzYWZlIHRvIHJlbW92ZSBibG9ja1xuICAgICAgaWYgKCBsZWFkaW5nICkgIHsgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZSB9XG4gICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRUb1F1ZXVlKClcbiAgICB9XG5cbiAgfVxuXG4gIC8vIEEgd3JhcHBlciBmdW5jdGlvbiBmb3IgcXVldWVpbmcgdXAgZnVuY3Rpb24gY2FsbHNcbiAgLy9cbiAgdmFyIGRlYm91bmNlZCA9IGZ1bmN0aW9uKCkge1xuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGFyZ3MgPSBhcmd1bWVudHNcbiAgICBhZGRUb1F1ZXVlKClcbiAgfVxuXG4gIGRlYm91bmNlZC5zdG9wID0gcmVtb3ZlRnJvbVF1ZXVlXG5cbiAgcmV0dXJuIGRlYm91bmNlZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBkZWxheSA9IGZ1bmN0aW9uICggZm4sIHdhaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9ICggd2FpdCAhPSBudWxsICkgPyAyIDogMTtcbiAgdmFyIGhhbmRsZSA9IHt9XG5cbiAgaGFuZGxlLmFyZ3MgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgYXJnc1N0YXJ0IClcbiAgaGFuZGxlLndhaXQgID0gd2FpdCB8fCAwXG4gIGhhbmRsZS5zdGFydCA9IG5vdygpXG5cbiAgaGFuZGxlLnN0b3AgID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICggXCJ2YWx1ZVwiIGluIGhhbmRsZSApIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUudmFsdWUgKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGUubG9vcCAgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAvLyBJZiB3YWl0IGxpbWl0IGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIG5vdygpIC0gaGFuZGxlLnN0YXJ0ID49IGhhbmRsZS53YWl0ICkge1xuICAgICAgZm4uYXBwbHkoIGZuLCBoYW5kbGUuYXJncyApXG5cbiAgICAgIC8vIElmIHJlcGVhdCBpcyBzZXQgYW5kIGlzIG5vdCAwXG4gICAgICBpZiAoICEhaGFuZGxlLnJlcGVhdCApIHtcbiAgICAgICAgaGFuZGxlLnJlcGVhdCA9IGhhbmRsZS5yZXBlYXQgLSAxXG4gICAgICAgIGhhbmRsZS5zdGFydCA9IG5vdygpXG4gICAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgICB9IGVsc2UgaWYgKCBoYW5kbGUucmVwZWF0ID09PSAwICYmIGhhbmRsZS5jb21wbGV0ZSApIHtcbiAgICAgICAgaGFuZGxlLmNvbXBsZXRlKClcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZURlbGF5KCBoYW5kbGUgKVxuICAgIH1cblxuICB9XG5cblxuICByZXR1cm4gcXVldWVEZWxheSggaGFuZGxlIClcbn1cblxudmFyIHF1ZXVlRGVsYXkgPSBmdW5jdGlvbiAoIGhhbmRsZSApIHtcbiAgaGFuZGxlLnZhbHVlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBoYW5kbGUubG9vcCApXG4gIHJldHVybiBoYW5kbGVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxheVxuIiwiLy8gVGhpcyBzaW1wbGlmaWVzIGNvbW1vbiB1c2VzIGZvciB3aW5kb3cubWF0Y2hNZWRpYSBcbi8vIG5hbWVseSwgYWRkaW5nIGxpc3RlbmVycyBmb3Igd2lkdGggYW5kIGhlaWdodCBxdWVyaWVzXG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkoIHF1ZXJ5LCBkaW1lbnNpb24gKSB7XG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIGlmICggdHlwZW9mKCBxdWVyeSApID09PSAnc3RyaW5nJyApIHsgcmV0dXJuIHF1ZXJ5IH1cblxuICByZXN1bHQubWluID0gc2l6ZSggcXVlcnkubWluLCAnbWluLScgKyBkaW1lbnNpb24gKVxuICByZXN1bHQubWF4ID0gc2l6ZSggcXVlcnkubWF4LCAnbWF4LScgKyBkaW1lbnNpb24gKVxuXG4gIGlmICggcmVzdWx0Lm1pbiAmJiByZXN1bHQubWF4IClcbiAgICByZXN1bHQucXVlcnkgPSByZXN1bHQubWluICsgJyBhbmQgJyArIHJlc3VsdC5tYXhcblxuICByZXR1cm4gcmVzdWx0LnF1ZXJ5IHx8IHJlc3VsdC5taW4gfHwgcmVzdWx0Lm1heFxufVxuXG5mdW5jdGlvbiBzaXplKCBudW0sIGxpbWl0ICkge1xuICByZXR1cm4gKCBudW0gKSA/ICcoJytsaW1pdCsnOiAnICsgdG9QeCggbnVtICkgKyAnKScgOiBudWxsXG59XG5cbmZ1bmN0aW9uIHRvUHgoIHdpZHRoICkge1xuICBpZiAoIHR5cGVvZiggd2lkdGggKSA9PT0gJ251bWJlcicgKSB7IHJldHVybiB3aWR0aCArICdweCd9XG4gIHJldHVybiB3aWR0aFxufVxuXG52YXIgbWVkaWEgPSB7XG5cbiAgd2lkdGg6IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgcmV0dXJuIG1lZGlhLmxpc3RlbiggcGFyc2VRdWVyeSggcXVlcnksICd3aWR0aCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbldpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtaW46IHNpemUgfSwgZm4gKSB9LFxuICBtYXhXaWR0aDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEud2lkdGgoIHsgbWF4OiBzaXplIH0sIGZuICkgfSxcblxuICBoZWlnaHQ6IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgcmV0dXJuIG1lZGlhLmxpc3RlbiggcGFyc2VRdWVyeSggcXVlcnksICdoZWlnaHQnICksIGZuIClcbiAgfSxcblxuICBtaW5IZWlnaHQ6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLmhlaWdodCggeyBtaW46IHNpemUgfSwgZm4gKSB9LFxuICBtYXhIZWlnaHQ6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLmhlaWdodCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICB2YXIgbWF0Y2ggPSB3aW5kb3cubWF0Y2hNZWRpYSggcXVlcnkgKVxuXG4gICAgaWYgKCBmbiApIHtcbiAgICAgIGZuKCBtYXRjaCApXG4gICAgICBtYXRjaC5hZGRMaXN0ZW5lciggZm4gKVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaFxuICB9XG5cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lZGlhXG4iLCJ2YXIgRXZlbnQgICAgICAgICAgID0gcmVxdWlyZSggJ2JlYW4nIClcbnZhciBjYWxsYmFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9jYWxsYmFjay1tYW5hZ2VyJyApXG52YXIgdGhyb3R0bGUgICAgICAgID0gcmVxdWlyZSggJy4vdGhyb3R0bGUnIClcbnZhciBkZWJvdW5jZSAgICAgICAgPSByZXF1aXJlKCAnLi9kZWJvdW5jZScgKVxuXG52YXIgb3B0aW1pemVkRXZlbnRNYW5hZ2VyID0ge1xuICBuZXc6IGZ1bmN0aW9uKCBuYW1lICkge1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNhbGxiYWNrIG1hbmFnZXJcbiAgICB2YXIgbWFuYWdlciA9IHtcbiAgICAgIHJ1bjogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RhcnQ6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgICAgIHN0b3A6IGNhbGxiYWNrTWFuYWdlci5uZXcoKVxuICAgIH1cblxuICAgIC8vIHJ1biBjYWxsYmFja3Mgd2hlbiBldmVudCBoYXBwZW5zIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHJ1bm5pbmcgPSB0aHJvdHRsZSggbWFuYWdlci5ydW4uZmlyZSApXG5cbiAgICAvLyBmaXJlIGNhbGxiYWNrcyB3aGVuIGV2ZW50IHN0YXJ0cyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBzdGFydGVkID0gZGVib3VuY2Uoe1xuICAgICAgbGVhZGluZzogbWFuYWdlci5zdGFydC5maXJlLFxuICAgICAgdHJhaWxpbmc6IGZhbHNlLFxuICAgICAgd2FpdDogMTUwXG4gICAgfSlcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0b3BwZWQgPSBkZWJvdW5jZSggbWFuYWdlci5zdG9wLmZpcmUsIDE1MCApXG5cbiAgICBFdmVudC5vbiggd2luZG93LCBuYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHJ1bm5pbmcoKVxuICAgICAgc3RhcnRlZCgpXG4gICAgICBzdG9wcGVkKClcbiAgICB9KVxuXG4gICAgLy8gUHVibGljIEFQSVxuICAgIHZhciBydW4gICA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnJ1bi5hZGQoIGZuICkgfVxuICAgIHJ1bi5zdGFydCA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnN0YXJ0LmFkZCggZm4gKSB9XG4gICAgcnVuLnN0b3AgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RvcC5hZGQoIGZuICkgfVxuXG4gICAgLy8gQWRkIGN1c3RvbSBldmVudHMgZm9yIHRvIHJ1biBvcHRpbWl6ZWQgbGlzdGVuZXJzLiAoIG5hbWUgLT4gTmFtZSApXG4gICAgcnVuKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCAnb3B0aW1pemVkJyArICBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKSApIH0gKVxuICAgIHJ1bi5zdGFydCggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgbmFtZSArICdTdGFydCcgKSB9IClcbiAgICBydW4uc3RvcCggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgbmFtZSArICdTdG9wJyApIH0gKVxuXG4gICAgcmV0dXJuIHJ1blxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3B0aW1pemVkRXZlbnRNYW5hZ2VyXG4iLCJ2YXIgRXZlbnQgICAgICAgICAgID0gcmVxdWlyZSggJ2JlYW4nIClcbnZhciBjYWxsYmFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9jYWxsYmFjay1tYW5hZ2VyJyApXG5cbi8vIENyZWF0ZSBhIG5ldyBwYWdlIGV2ZW50IG1hbmFnZXJcbnZhciBtYW5hZ2VyID0ge1xuICByZWFkeTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICBjaGFuZ2U6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgcmVhZHlBbHJlYWR5OiBmYWxzZSxcbiAgY2hhbmdlZDogZmFsc2UsXG59XG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpe1xuICBtYW5hZ2VyLnJlYWR5QWxyZWFkeSA9IHRydWUgXG59KVxuXG5tYW5hZ2VyLnJlYWR5LmFkZCggZnVuY3Rpb24oKXsgXG4gIGlmICggIXdpbmRvdy5UdXJib2xpbmtzICYmICFtYW5hZ2VyLmNoYW5nZWQgKSB7IFxuICAgIG1hbmFnZXIuY2hhbmdlZCA9IHRydWUgXG4gICAgbWFuYWdlci5jaGFuZ2UuZmlyZSgpXG4gIH1cbn0pXG5cbnZhciByZWFkeSA9IGZ1bmN0aW9uICggZm4gKSB7XG4gIGlmICggbWFuYWdlci5yZWFkeUFscmVhZHkgKSB7IGZuKCkgfVxuICByZXR1cm4gbWFuYWdlci5yZWFkeS5hZGQoIGZuICkgfVxuXG52YXIgY2hhbmdlID0gZnVuY3Rpb24oIGZuICkge1xuICBpZiAoIG1hbmFnZXIuY2hhbmdlZCApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLmNoYW5nZS5hZGQoIGZuICkgfVxuXG4vLyBNYWtlIGl0IGVhc3kgdG8gdHJpZ2dlciByZWFkeSBjYWxsYmFja3NcbnJlYWR5LmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIucmVhZHkuZmlyZSgpXG4gIC8vIEJlIHN1cmUgcmVhZHkgY2FuIG9ubHkgYmUgZmlyZWQgb25jZVxuICBtYW5hZ2VyLnJlYWR5LnN0b3AoKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIGNoYW5nZSBjYWxsYmFja3NcbmNoYW5nZS5maXJlID0gZnVuY3Rpb24gKCkge1xuICBtYW5hZ2VyLmNoYW5nZS5maXJlKCkgfVxuXG5FdmVudC5vbiggZG9jdW1lbnQsICdET01Db250ZW50TG9hZGVkJywgcmVhZHkuZmlyZSApXG5FdmVudC5vbiggZG9jdW1lbnQsICdwYWdlOmNoYW5nZSB0dXJib2xpbmtzOmxvYWQnLCBjaGFuZ2UuZmlyZSApIC8vIFN1cHBvcnQgY3VzdG9tIGFuZCByYWlscyB0dXJib2xpbmtzIHBhZ2UgbG9hZCBldmVudHNcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlYWR5OiByZWFkeSxcbiAgY2hhbmdlOiBjaGFuZ2Vcbn1cbiIsInZhciBkZWxheSA9IHJlcXVpcmUoICcuL2RlbGF5JyApXG5cbnZhciByZXBlYXQgPSBmdW5jdGlvbiggZm4sIHdhaXQsIGxpbWl0ICkge1xuXG4gIHZhciBhcmdzU3RhcnQgPSAxLFxuICAgICAgaGFuZGxlID0gZGVsYXkgKCBmbiwgd2FpdCApO1xuXG4gIGlmICAgICAgKCBsaW1pdCAhPSBudWxsICkgeyBhcmdzU3RhcnQgPSAzIH1cbiAgZWxzZSBpZiAoIHdhaXQgICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDIgfVxuXG4gIC8vIEVuYWJsZSByZXBlYXQgKCAtMSB3aWxsIHJlcGVhdCBmb3JldmVyIClcbiAgaGFuZGxlLnJlcGVhdCA9IGxpbWl0IHx8IC0xXG4gIGhhbmRsZS5hcmdzICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUuc3RvcCAgID0gaGFuZGxlLmNhbmNlbFxuXG4gIHJldHVybiBoYW5kbGVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXRcbiIsInZhciBtYW5hZ2VyID0gcmVxdWlyZSggJy4vb3B0aW1pemVkLWV2ZW50LW1hbmFnZXInIClcbnZhciByZXNpemUgID0gbWFuYWdlci5uZXcoICdyZXNpemUnIClcblxuLy8gUGF1c2UgYW5pbWF0aW9ucyBkdXJpbmcgcmVzaXppbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxucmVzaXplLmRpc2FibGVBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlID0gJzxzdHlsZSBpZD1cImZ1bGxzdG9wXCI+Lm5vLWFuaW1hdGlvbiAqLCAubm8tYW5pbWF0aW9uICo6YWZ0ZXIsIC5uby1hbmltYXRpb24gKjpiZWZvcmUge1xcXG4gICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OyBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudFxcXG4gIH08L3N0eWxlPidcblxuICAvLyBJbmplY3Qgc3R5bGUgZm9yIGVhc3kgY2xhc3NuYW1lIG1hbmlwdWxhdGlvblxuICBpZiAoICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdHlsZSNmdWxsc3RvcCcpICkgeyBcbiAgICBkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgc3R5bGUpXG4gIH1cblxuICByZXNpemUuc3RhcnQoIGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICduby1hbmltYXRpb24nICkgfSApXG4gIHJlc2l6ZS5zdG9wKCBmdW5jdGlvbigpIHsgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSggJ25vLWFuaW1hdGlvbicgKSB9IClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXNpemVcbiIsInZhciBtYW5hZ2VyID0gcmVxdWlyZSggJy4vb3B0aW1pemVkLWV2ZW50LW1hbmFnZXInIClcbnZhciBzY3JvbGwgID0gbWFuYWdlci5uZXcoICdzY3JvbGwnIClcblxuc2Nyb2xsLmRpc2FibGVQb2ludGVyID0gZnVuY3Rpb24oKSB7XG5cbiAgLy8gRGlzYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdGFydCggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgfSlcblxuICAvLyBFbmFibGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICBzY3JvbGwuc3RvcCggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJ1xuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjcm9sbFxuIiwiLy8gQ3VzdG9tIEV2ZW50IFBvbHlmaWxsXG4oZnVuY3Rpb24gKCkge1xuXG4gIGlmICggdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiICkgcmV0dXJuIGZhbHNlO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICggZXZlbnQsIHBhcmFtcyApIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkIH07XG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCAnQ3VzdG9tRXZlbnQnICk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudCggZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCApO1xuICAgIHJldHVybiBldnQ7XG4gICB9XG5cbiAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblxuICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn0pKClcbiIsIi8vIE1hbnVhbGx5IHRyaWdnZXIgYSBjYW5jZWxhYmxlIGZvcm0gc3VibWl0IGV2ZW50LlxuZnVuY3Rpb24gc3VibWl0KCBmb3JtICkge1xuICBpZiAoICFmb3JtLnRhZ05hbWUgfHwgZm9ybS50YWdOYW1lICE9ICdGT1JNJyApIHtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvciggJ1RyaWdnZXIgdGhpcyBldmVudCBvbiBhIGZvcm0gZWxlbWVudCcgKVxuICB9XG5cbiAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCAnc3VibWl0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG4gIGZvcm0uZGlzcGF0Y2hFdmVudCggZXYgKVxuXG4gIC8vIFN1Ym1pdCBmb3JtIHVubGVzcyBldmVudCBkZWZhdWx0IGlzIHByZXZlbnRlZFxuICBpZiAoICFldi5kZWZhdWx0UHJldmVudGVkICkgZm9ybS5zdWJtaXQoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1Ym1pdFxuIiwidmFyIGVuZEV2ZW50cyA9IFtcbiAgJ3RvdWNoZW5kJ1xuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRhcFxuXG4vLyBkZWZhdWx0IHRhcCB0aW1lb3V0IGluIG1zXG5UYXAudGltZW91dCA9IDIwMFxuXG5mdW5jdGlvbiBUYXAoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgLy8gaWYgdGhlIHVzZXIgaG9sZHMgaGlzL2hlciBmaW5nZXIgZG93biBmb3IgbW9yZSB0aGFuIDIwMG1zLFxuICAvLyB0aGVuIGl0J3Mgbm90IHJlYWxseSBjb25zaWRlcmVkIGEgdGFwLlxuICAvLyBob3dldmVyLCB5b3UgY2FuIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIHZhciB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IFRhcC50aW1lb3V0XG5cbiAgLy8gdG8ga2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwgbGlzdGVuZXJcbiAgbGlzdGVuZXIuaGFuZGxlciA9IGNhbGxiYWNrXG5cbiAgcmV0dXJuIGxpc3RlbmVyXG5cbiAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGxpc3RlbmVyKVxuICBmdW5jdGlvbiBsaXN0ZW5lcihlMSkge1xuICAgIC8vIHRhcCBzaG91bGQgb25seSBoYXBwZW4gd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICBpZiAoIWUxLnRvdWNoZXMgfHwgZTEudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm5cblxuICAgIHZhciBlbCA9IGUxLnRhcmdldFxuICAgIHZhciBjb250ZXh0ID0gdGhpc1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgdmFyIHRpbWVvdXRfaWQgPSBzZXRUaW1lb3V0KGNsZWFudXAsIHRpbWVvdXQpXG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBjbGVhbnVwKVxuXG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBkb25lKGUyKSB7XG4gICAgICAvLyBzaW5jZSB0b3VjaHN0YXJ0IGlzIGFkZGVkIG9uIHRoZSBzYW1lIHRpY2tcbiAgICAgIC8vIGFuZCBiZWNhdXNlIG9mIGJ1YmJsaW5nLFxuICAgICAgLy8gaXQnbGwgZXhlY3V0ZSB0aGlzIG9uIHRoZSBzYW1lIHRvdWNoc3RhcnQuXG4gICAgICAvLyB0aGlzIGZpbHRlcnMgb3V0IHRoZSBzYW1lIHRvdWNoc3RhcnQgZXZlbnQuXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIC8vIGFscmVhZHkgaGFuZGxlZFxuICAgICAgaWYgKGUyLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVyblxuXG4gICAgICAvLyBvdmVyd3JpdGUgdGhlc2UgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSBhbGwgdG8gYm90aCBzdGFydCBhbmQgZXZlbnRzLlxuICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZTEucHJldmVudERlZmF1bHRcbiAgICAgIHZhciBzdG9wUHJvcGFnYXRpb24gPSBlMS5zdG9wUHJvcGFnYXRpb25cblxuICAgICAgZTEuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMSlcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uLmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIGUxLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdC5jYWxsKGUxKVxuICAgICAgICBwcmV2ZW50RGVmYXVsdC5jYWxsKGUyKVxuICAgICAgfVxuXG4gICAgICAvLyBjYWxscyB0aGUgaGFuZGxlciB3aXRoIHRoZSBgZW5kYCBldmVudCxcbiAgICAgIC8vIGJ1dCBpIGRvbid0IHRoaW5rIGl0IG1hdHRlcnMuXG4gICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKVxuICAgIH1cblxuICAgIC8vIGNsZWFudXAgZW5kIGV2ZW50c1xuICAgIC8vIHRvIGNhbmNlbCB0aGUgdGFwLCBqdXN0IHJ1biB0aGlzIGVhcmx5XG4gICAgZnVuY3Rpb24gY2xlYW51cChlMikge1xuICAgICAgLy8gaWYgaXQncyB0aGUgc2FtZSBldmVudCBhcyB0aGUgb3JpZ2luLFxuICAgICAgLy8gdGhlbiBkb24ndCBhY3R1YWxseSBjbGVhbnVwLlxuICAgICAgLy8gaGl0IGlzc3VlcyB3aXRoIHRoaXMgLSBkb24ndCByZW1lbWJlclxuICAgICAgaWYgKGUxID09PSBlMikgcmV0dXJuXG5cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0X2lkKVxuXG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBjbGVhbnVwKVxuXG4gICAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZG9uZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCJ2YXIgZGVib3VuY2UgPSByZXF1aXJlKCAnLi9kZWJvdW5jZScgKVxuXG52YXIgdGhyb3R0bGUgPSBmdW5jdGlvbiggZm4sIHdhaXQsIG9wdGlvbnMgKSB7XG5cbiAgaWYgKCB0eXBlb2YoIGZuICkgPT0gJ29iamVjdCcgKSB7IG9wdGlvbnMgPSBmbjsgZm4gPSB1bmRlZmluZWQgfSBcbiAgZWxzZSB7IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9IH1cblxuICBvcHRpb25zLndhaXQgPSBvcHRpb25zLndhaXQgfHwgd2FpdCB8fCAwXG4gIG9wdGlvbnMubWF4ICA9IG9wdGlvbnMubWF4IHx8IG9wdGlvbnMud2FpdFxuICBvcHRpb25zLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmblxuICBvcHRpb25zLmxlYWRpbmcgID0gdHJ1ZVxuICBvcHRpb25zLnRyYWlsaW5nID0gdHJ1ZVxuXG4gIHJldHVybiBkZWJvdW5jZShvcHRpb25zKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGVcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG52YXIgVG9nZ2xlciA9IHtcbiAgY2hlY2tib3hTZWxlY3RvcjogXCJbdHlwZT1jaGVja2JveF1bZGF0YS10b2dnbGVdLCBbdHlwZT1jaGVja2JveF1bZGF0YS1zaG93XSwgW3R5cGU9Y2hlY2tib3hdW2RhdGEtaGlkZV1cIixcbiAgcmFkaW9TZWxlY3RvcjogXCJpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXNob3ddLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWhpZGVdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWFkZC1jbGFzc10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtcmVtb3ZlLWNsYXNzXVwiLFxuICBzZWxlY3RTZWxlY3RvcjogXCJvcHRpb25bZGF0YS1oaWRlXSwgb3B0aW9uW2RhdGEtc2hvd11cIixcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCl7XG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlXCIsIFwiW2RhdGEtdG9nZ2xlXSwgW2RhdGEtc2hvd10sIFtkYXRhLWhpZGVdLCBbZGF0YS10b2dnbGUtY2xhc3NdLCBbZGF0YS1hZGQtY2xhc3NdLCBbZGF0YS1yZW1vdmUtY2xhc3NdXCIsIFRvZ2dsZXIudHJpZ2dlcilcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjaGFuZ2VcIiwgXCIuc2VsZWN0LXRvZ2dsZXJcIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKHdpbmRvdywgJ2hhc2hjaGFuZ2UnLCBUb2dnbGVyLmhhc2hDaGFuZ2UpXG4gIH0sXG5cbiAgaGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCApIHtcblxuICAgICAgdmFyIGFuY2hvciA9ICdbZGF0YS1hbmNob3I9XCInK3dpbmRvdy5sb2NhdGlvbi5oYXNoKydcIl0nXG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2lucHV0JythbmNob3IrICcsIG9wdGlvbicrYW5jaG9yIClcblxuICAgICAgaWYgKCB0YXJnZXQgKSB7XG4gICAgICAgIGlmICggdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJyApIHtcbiAgICAgICAgICB0YXJnZXQuY2hlY2tlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHRhcmdldClcbiAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IHRhcmdldC5pbmRleFxuICAgICAgICAgIHRhcmdldCA9IHNlbGVjdFxuICAgICAgICB9XG4gICAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKCB0YXJnZXQgKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZWZyZXNoOiBmdW5jdGlvbigpe1xuICAgIFRvZ2dsZXIudG9nZ2xlQ2hlY2tib3hlcygpXG4gICAgVG9nZ2xlci5zZXR1cFNlbGVjdHMoKVxuICAgIFRvZ2dsZXIuc2V0dXBSYWRpb3MoKVxuICB9LFxuXG4gIHRyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gU3RvcCBldmVudCBhbmQgYnViYmxpbmcgaWYgbGluayBpcyBvbmx5IGJlaW5nIHVzZWQgYXMgYSB0b2dnbGVyXG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT0gXCIjXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3AoKVxuICAgIH0gXG5cbiAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudClcbiAgfSxcblxuICB0cmlnZ2VyVG9nZ2xpbmc6IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICB2YXIgYWN0aW9ucyA9IFsnaGlkZScsICd0b2dnbGUnLCAnc2hvdycsICdyZW1vdmVDbGFzcycsICd0b2dnbGVDbGFzcycsICdhZGRDbGFzcyddXG4gICAgdmFyIHNlbGVjdFxuXG4gICAgLy8gU3RvcmUgdGhlIHNlbGVjdCwgYW5kIHNldCB0aGUgdGFyZ2V0IHRvIHRoZSBjdXJyZW50IG9wdGlvblxuICAgIC8vIEV2ZW50cyBmaXJlIG9uIHRoZSBzZWxlY3QsIGJ1dCB0aGUgb3B0aW9ucyBoYXZlIHRvZ2dsaW5nIGF0dHJpYnV0ZXNcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUubWF0Y2goL3NlbGVjdC9pKSkge1xuICAgICAgc2VsZWN0ID0gdGFyZ2V0XG4gICAgICB0YXJnZXQgPSBzZWxlY3Quc2VsZWN0ZWRPcHRpb25zWzBdXG4gICAgfVxuXG4gICAgLy8gUmFkaW8gaW5wdXRzIGFuZCBzZWxlY3RzIGRvIG5vdCBzdXBwb3J0IHRvZ2dsaW5nLCBzbyByZW1vdmUgdGhlbVxuICAgIGFjdGlvbnMgPSBhY3Rpb25zLmZpbHRlcihmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3QgfHwgdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gIWFjdGlvbi5tYXRjaCgvdG9nZ2xlLylcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQuZGF0YXNldFthY3Rpb25dICE9IG51bGxcbiAgICB9KVxuICAgIFxuICAgIC8vIERpc3BhdGNoIGFsbCBhY3Rpb25zXG4gICAgYWN0aW9ucy5mb3JFYWNoKCBmdW5jdGlvbiggYWN0aW9uICkge1xuICAgICAgVG9nZ2xlci5kaXNwYXRjaCggdGFyZ2V0LCBhY3Rpb24gKVxuICAgIH0pXG4gIH0sXG5cbiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGVsLCB0eXBlKSB7XG4gICAgdmFyIGFjdGlvbiA9IHR5cGVcbiAgICB2YXIgZGF0YSA9IGVsLmRhdGFzZXRbdHlwZV1cblxuICAgIC8vIEFib3J0IGlmIGVsZW1lbnQgZG9lc24ndCBoYXZlIGRhdGEgZm9yIHRoZSBhY3Rpb25cbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcgfHwgZGF0YSA9PSAnJykgcmV0dXJuXG5cbiAgICAvLyBUb2dnbGUgYW5kIHNob3cgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIGNoZWNrYm94ZXNcbiAgICBpZiAoZWwudHlwZSA9PSAnY2hlY2tib3gnKVxuICAgICAgYWN0aW9uID0gKHR5cGUubWF0Y2goL2hpZGV8cmVtb3ZlL2kpID8gIWVsLmNoZWNrZWQgOiBlbC5jaGVja2VkKVxuXG4gICAgaWYgKGRhdGEpe1xuICAgICAgaWYgKHR5cGUubWF0Y2goL2NsYXNzL2kpKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhkYXRhLCBhY3Rpb24sIGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZShkYXRhLCBhY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEFkZCwgcmVtb3ZlLCBvciB0b2dnbGUgY2xhc3NuYW1lcywgdHJpZ2dlcmVkIGJ5IGVsZW1lbnRzIHdpdGg6XG4gIC8vICBkYXRhLWhpZGUtY2xhc3MsIGRhdGEtc2hvdy1jbGFzcywgYW5kIGRhdGEtdG9nZ2xlLWNsYXNzIHZhbHVlc1xuICAvL1xuICAvLyAgRGF0YSB2YWx1ZSBleGFtcGxlczpcbiAgLy8gICAtIFwiY2xhc3NuYW1lXCIgLSBhZGQvcmVtb3ZlL3RvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50XG4gIC8vICAgLSBcImZvbyBiYXJcIiAgIC0gbXVsdGlwbGUgY2xhc3NuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcyAobGlrZSBodG1sIGNsYXNzIHByb3BlcnR5KVxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3RvclwiIC0gY2hhbmdlIGNsYXNzbmFtZXMgb24gZWxlbWVudHMgbWF0Y2hlZCBieSBzZWxlY3RvclxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3Rvciwgc2VsZWN0b3JcIiAtIG1hdGNoIG11bHRpcGxlIHNlbGVjdG9yc1xuICAvL1xuICAvLyAgWW91IGNhbiBwZXJmb3JtIG11bHRpcGxlIGFkZC9yZW1vdmUgY2xhc3NlcyBieSBqb2luaW5nIHZhbHVlcyB3aXRoIGFuIGAmYFxuICAvLyAgRm9yIGV4YW1wbGU6IFwiY2xhc3NuYW1lICYgZm9vIGJhcjsgc2VsZWN0b3JcIlxuICAvLyAgVGhpcyB3b3VsZCB0b2dnbGUgY2xhc3NuYW1lIG9uIGN1cnJlbnQgZWxlbWVudCBhbmQgdG9nZ2xlIGBmb28gYmFyYCBjbGFzc25hbWVzXG4gIC8vICBvbiBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAvL1xuXG4gIHNldENsYXNzOiBmdW5jdGlvbiAoc2VsZWN0b3JzLCBhY3Rpb24sIGVsKXtcbiAgICBpZih0eXBlb2Ygc2VsZWN0b3JzID09ICd1bmRlZmluZWQnIHx8IHNlbGVjdG9ycyA9PSAnJykgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mKGFjdGlvbikgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhY3Rpb24gPSAoYWN0aW9uID8gJ2FkZCcgOiAncmVtb3ZlJylcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0b3JzLm1hdGNoKC8mLykpIHtcbiAgICAgIHNlbGVjdG9ycy5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24oc2VsKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhzZWwudHJpbSgpLCBhY3Rpb24sIGVsKSBcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0b3IgYW5kIGNsYXNzbmFtZXMsIGZvcm1hdDogXCJjbGFzc25hbWUgY2xhc3NuYW1lOyBzZWxlY3RvcixzZWxlY3RvclwiXG4gICAgdmFyIHNldHRpbmdzID0gc2VsZWN0b3JzLnNwbGl0KCc7JylcbiAgICB2YXIgY2xhc3NuYW1lcyA9IHNldHRpbmdzWzBdLnRyaW0oKVxuICAgIHZhciBtYXRjaGVzID0gW11cbiAgICBzZWxlY3RvcnMgPSBzZXR0aW5nc1sxXVxuXG4gICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIGFuZCBlbCBpcyBhbiBPUFRJT04sIHVzZSBpdHMgU0VMRUNUIGFzIHRoZSBtYXRjaGVkIGVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKGVsICYmIGVsLnRhZ05hbWUubWF0Y2goL29wdGlvbi9pKSkge1xuICAgICAgbWF0Y2hlcyA9IFtUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24oZWwpXVxuICAgICAgXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIHVzZSB0aGUgY3VycmVudCBlbCBmb3IgY2xhc3NuYW1lc1xuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIG1hdGNoZXMgPSBbZWxdXG4gICAgfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGNsYXNzbmFtZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NuYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBhY3Rpb24ucmVwbGFjZSgvQ2xhc3MvLCcnKVxuICAgICAgICBtYXRjaC5jbGFzc0xpc3RbbWV0aG9kXShjbGFzc25hbWUpXG4gICAgICB9KVxuXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgJ2NsYXNzJylcbiAgICB9KVxuICB9LFxuXG4gIHNldFN0YXRlOiBmdW5jdGlvbihzZWxlY3RvcnMsIHN0YXRlKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobWF0Y2hlcywgZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgdmFyIGFjdGlvbiA9IFRvZ2dsZXIudG9nZ2xlQWN0aW9uKG1hdGNoLCBzdGF0ZSlcblxuICAgICAgVG9nZ2xlclthY3Rpb25dKG1hdGNoKVxuICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xlckV2ZW50c09uQ2hpbGRyZW4obWF0Y2gsIGFjdGlvbilcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUFjdGlvbjogZnVuY3Rpb24oIGVsLCBhY3Rpb24gKSB7XG5cbiAgICBpZiAoIHR5cGVvZiBhY3Rpb24gPT0gJ2Jvb2xlYW4nICkge1xuICAgICAgYWN0aW9uID0gKCBhY3Rpb24gPyAnc2hvdycgOiAnaGlkZScgKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT0gJ3RvZ2dsZScpIHtcbiAgICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGluZycpICkge1xuICAgICAgICBhY3Rpb24gPSAnc2hvdydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbiA9ICdoaWRlJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSB8fCBcbiAgICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3Nob3dpbmcnICkgfHxcbiAgICAgICAgIGVsLm9mZnNldFBhcmVudCAhPSBudWxsICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nLCAnaGlkaW5nJyApXG5cbiAgICB2YXIgZnVsbHlTaG93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBSZW1vdmUgaGlkZGVuIGJlY2F1c2UgaXQgbWlnaHQgYmUgYWRkZWQgYmVmb3JlIHRoaXMgZmlyZXNcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdzaG93aW5nJywgJ2hpZGRlbicgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnIClcblxuICAgICAgLy8gRW5hYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gc2hvd25cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRm9jdXMgb24ga2V5IGVsZW1lbnQgaWYgYW4gZWxlbWVudCBleHBlY3RzIGZvY3VzXG4gICAgICB2YXIgZm9jdXNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzXScpXG4gICAgICBpZiAoZm9jdXNFbCkgeyBmb2N1c0VsLmZvY3VzKCkgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGlucHV0IGV2ZW50IG9uIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW5cbiAgICAgIHZhciByYW5nZXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYW5nZV0nKVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseVNob3csIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnc2hvd2luZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseVNob3coKVxuICAgIH1cbiAgfSxcblxuICBoaWRlOiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkZGVuJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkaW5nJyApICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHNob3dpbmcgYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICd2aXNpYmxlJywgJ3Nob3dpbmcnIClcblxuICAgIHZhciBmdWxseUhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRpbmcnLCAndmlzaWJsZScgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuXG4gICAgICAvLyBEaXNhYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gaGlkZGVuXG4gICAgICBpZiAoIHR5cGVvZiBlbC5kaXNhYmxlZCAhPSAndW5kZWZpbmVkJyApe1xuICAgICAgICBlbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGVsLmRhdGFzZXQuYW5pbWF0ZSApIHtcbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgZnVsbHlIaWRlLCB0cnVlKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGluZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseUhpZGUoKVxuICAgIH1cbiAgfSxcblxuICBnZXRMZWFmTm9kZXM6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAvLyBpcyB0aGUgcGFyZW50IGl0c2VsZiBhIGxlYWYgbm9kZT9cbiAgICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHJldHVybiBbcGFyZW50XVxuXG4gICAgdmFyIG5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSwgMClcblxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuIGVsZW0uY2hpbGRyZW4gJiYgZWxlbS5jaGlsZHJlbi5sZW5ndGggPT09IDBcbiAgICB9KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbjogZnVuY3Rpb24oZWwsIGV2ZW50TmFtZSl7XG4gICAgLy8gd2UgY2FyZSBhYm91dCBsZWFmIG5vZGVzIHNpbmNlIHRoZSBldmVudCB3aWxsIGJ1YmJsZSB0b1xuICAgIC8vIG5vbi1sZWFmIG5vZGVzIGZyb20gdGhlIGxlYWYgbm9kZXNcbiAgICB2YXIgbGVhZkNoaWxkTm9kZXMgPSBUb2dnbGVyLmdldExlYWZOb2RlcyhlbClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGVhZkNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIC8vICd0b2dnbGVyOnNob3cnLCAndG9nZ2xlcjpoaWRlJywgZXRjXG4gICAgICBFdmVudC5maXJlKG5vZGUsIFwidG9nZ2xlcjpcIiArIGV2ZW50TmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUNoZWNrYm94ZXM6IGZ1bmN0aW9uKGNoZWNrYm94ZXMpIHtcbiAgICBjaGVja2JveGVzID0gY2hlY2tib3hlcyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIuY2hlY2tib3hTZWxlY3RvcilcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2hlY2tib3hlcywgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcpXG4gIH0sXG5cbiAgc2V0dXBSYWRpb3M6IGZ1bmN0aW9uKCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnJhZGlvU2VsZWN0b3IpLCBmdW5jdGlvbihyYWRpbywgaW5kZXgpe1xuICAgICAgaWYgKCFyYWRpby5kYXRhc2V0LnRvZ2dsZXJBY3RpdmUpIHtcblxuICAgICAgICB2YXIgcmFkaW9OYW1lICAgICAgICAgPSByYWRpby5nZXRBdHRyaWJ1dGUoJ25hbWUnKSxcbiAgICAgICAgICAgIHNpYmxpbmdzICAgICAgICAgID0gVG9nZ2xlci5wYXJlbnRGb3JtKHJhZGlvKS5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYWRpb11bbmFtZT1cIicrcmFkaW9OYW1lKydcIl0nKSxcbiAgICAgICAgICAgIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ3Nob3cnKSxcbiAgICAgICAgICAgIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ2FkZENsYXNzJyksXG4gICAgICAgICAgICBjaGVja2VkXG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzaWJsaW5ncywgZnVuY3Rpb24ocil7XG5cbiAgICAgICAgICBpZiAoci5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK3IuZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgci5jaGVja2VkID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgaGF2ZSBhIGRlZmF1bHQgZGF0YS1zaG93IHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtc2hvdyB2YWx1ZXMgd2lsbCB0b2dnbGUgb2ZmIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5zaG93ID0gci5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICByLmRhdGFzZXQuYWRkQ2xhc3MgPSByLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIHIuZGF0YXNldC5oaWRlICYmIHIuZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCByLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgci5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gci5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLWFkZC1jbGFzcyB2YWx1ZSBvZiAnJ1xuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB1bnNldCBkYXRhLWFkZC1jbGFzcyB2YWx1ZXMgYXJlIHRvZ2dsZSBvZmYgYWxsIGNsYXNzZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyByZW1vdmUgY2xhc3NlcyBhY2NvcmRpbmdcbiAgICAgICAgICAvLyB0byB0aGUgZGVzZWxlY3RlZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgci5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyYnKVxuXG5cbiAgICAgICAgICByLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcblxuXG4gICAgICAgICAgaWYoIHIuY2hlY2tlZCApIGNoZWNrZWQgPSByXG5cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIGNoZWNrZWQgKSB7XG4gICAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIGNoZWNrZWQgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFRvZ2dsZXIuc2V0U3RhdGUoIHNob3dTZWxlY3RvcnMuam9pbignLCcpLCAnaGlkZScgKVxuICAgICAgICAgIFRvZ2dsZXIuc2V0Q2xhc3MoIGFkZENsYXNzU2VsZWN0b3JzLmpvaW4oJyAmICcpLCAncmVtb3ZlQ2xhc3MnIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgfSxcblxuICAvLyBBZGQgZGF0YS1oaWRlIHRvIGVhY2ggPG9wdGlvbj4gY29udGFpbmluZyB0aGUgc2VsZWN0b3JzIGZyb20gb3RoZXJcbiAgLy8gb3B0aW9uJ3MgZGF0YS1zaG93LiBUaGlzIG1ha2VzIHRoZSB0b2dnbGluZyBvZiBlbGVtZW50cyBleGNsdXNpdmUuXG4gIC8vXG4gIHNldHVwU2VsZWN0czogZnVuY3Rpb24oKXtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5zZWxlY3RTZWxlY3RvciksIGZ1bmN0aW9uKG9wdGlvbil7XG4gICAgICAvLyBQcmV2ZW50IGFuIG9wdGlvbiBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgdHdpY2VcbiAgICAgIGlmICghb3B0aW9uLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnNob3cgPSBvcHRpb24uZGF0YXNldC5zaG93IHx8ICcnXG5cbiAgICAgICAgdmFyIHNlbGVjdCA9IFRvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihvcHRpb24pXG4gICAgICAgIHNlbGVjdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3QtdG9nZ2xlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpXG5cbiAgICAgICAgdmFyIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnc2hvdycpXG4gICAgICAgIHZhciBhZGRDbGFzc1NlbGVjdG9ycyA9IFRvZ2dsZXIuZGF0YUF0dHJpYnV0ZXMob3B0aW9ucywgJ2FkZENsYXNzJylcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIGZ1bmN0aW9uKG8sIGluZGV4KSB7XG5cbiAgICAgICAgICBpZiAoby5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK28uZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBpbmRleFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG8uZGF0YXNldC5zaG93ID0gby5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICBvLmRhdGFzZXQuYWRkQ2xhc3MgPSBvLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIG8uZGF0YXNldC5oaWRlICYmIG8uZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCBvLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgLy8gSWYgc2hvdyBzZWxlY3RvcnMgYXJlIG5vdCBwcmVzZW50IGluIGVsZW1lbnQncyBkYXRhLXNob3dcbiAgICAgICAgICAvLyBBZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMgdG8gYmUgaGlkZGVuXG4gICAgICAgICAgby5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gby5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgby5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyAmICcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlzIHRvZ2dsZWQgcHJvcGVybHlcbiAgICAgICAgLy9cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoc2VsZWN0KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gRmluZCBwYXJlbnQgPHNlbGVjdD4gZm9yIGFuIG9wdGlvbiAoYWNjb3VudHMgZm9yIG9wdGlvbiBncm91cHMpXG4gIC8vXG4gIGdldFNlbGVjdEZyb21PcHRpb246IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHAgPSBlbC5wYXJlbnRFbGVtZW50XG5cbiAgICBpZiAocC50YWdOYW1lID09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm4gcFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHApXG4gICAgfVxuICB9LFxuXG5cbiAgLy8gRmluZCBwYXJlbnQgPGZvcm0+IG9yIGRvY3VtZW50IGlmIHRoZXJlIGlzIG5vIGZvcm1cbiAgLy9cbiAgcGFyZW50Rm9ybTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBlbCA9IGVsZW1lbnRcblxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudE5vZGVcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbiAgfSxcblxuICAvLyBSZXR1cm4gYSB1bmlxdWUgYXJyYXkgb2YgYWxsIGRhdGEgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGVsZW1lbnRzXG4gIC8vXG4gIGRhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbihlbGVtZW50cywgYXR0cikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7IFxuICAgICAgcmV0dXJuIGVsLmRhdGFzZXRbYXR0cl1cbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3JzLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGVjdG9ycyAhPSBcIlwiICYmIHR5cGVvZiBzZWxlY3RvcnMgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5pbmRleE9mKHNlbGVjdG9ycykgPT09IGluZGV4XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudC5yZWFkeShUb2dnbGVyLmxpc3RlbilcbkV2ZW50LmNoYW5nZShUb2dnbGVyLnJlZnJlc2gpXG5cbm1vZHVsZS5leHBvcnRzID0gVG9nZ2xlclxuIiwiLy8gU2hpbXNcbnJlcXVpcmUoICcuL2xpYi9zaGltcy9fY2xhc3NsaXN0JyApXG52YXIgbWVyZ2UgICAgPSByZXF1aXJlKCAnLi9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24nICksXG4gICAgZXZlbnQgICAgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICBsdXhvbiAgICA9IHJlcXVpcmUoICdsdXhvbicgKSxcbiAgICB0aW1lICAgICA9IG1lcmdlKHJlcXVpcmUoICcuL2xpYi90aW1lJyApLCBsdXhvbiksXG4gICAgc2Nyb2xsVG8gPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsdG8nICksXG4gICAgZnJvbVRvcCAgPSByZXF1aXJlKCAnLi9saWIvZnJvbXRvcCcgKSxcbiAgICBlYXNlICAgICA9IHJlcXVpcmUoICcuL2xpYi9lYXNlJyApXG5cbnZhciB0b29sYm94ID0ge1xuXG4gIGV2ZW50OiBldmVudCxcbiAgc2Nyb2xsVG86IHNjcm9sbFRvLFxuICBmcm9tVG9wOiBmcm9tVG9wLFxuICBtZXJnZTogbWVyZ2UsXG4gIGVhc2U6IGVhc2UsXG4gIHRpbWU6IHRpbWUsXG5cbiAgLy8gR2V0IGNsb3Nlc3QgRE9NIGVsZW1lbnQgdXAgdGhlIHRyZWUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0Q2xvc2VzdDogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBlbCwgc2VsZWN0b3IgKSApIHJldHVybiBlbFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSxcblxuICBjaGlsZE9mOiBmdW5jdGlvbiAoIGVsLCBwYXJlbnQgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwgPT0gcGFyZW50ICkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIC8vIEdldCBuZXh0IERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yXG4gIGdldE5leHQ6IGZ1bmN0aW9uKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKSApIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gTWF0Y2hlcyBzZWxlY3RvciBmdW5jdGlvblxuICAvLyBAcmVmZXJlbmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAgbWF0Y2hlczogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgcmV0dXJuICggZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbC5vTWF0Y2hlc1NlbGVjdG9yICkuY2FsbCggZWwsIHNlbGVjdG9yICk7XG4gIH0sXG5cbiAgd29yZENvdW50OiBmdW5jdGlvbiggc3RyICkge1xuICAgIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKCAvXFxTKy9nICk7XG4gICAgcmV0dXJuIG1hdGNoZXMgPyBtYXRjaGVzLmxlbmd0aCA6IDA7XG4gIH0sXG5cbiAgLy8gRWFzeSBhY2Nlc3MgdG8gc2xpY2UgZm9yIGNvbnZlcnRpbmcgb2JqZWN0cyBpbnRvIGFycmF5cyBvZiB2YWx1ZXMuXG4gIHNsaWNlOiBmdW5jdGlvbiggb2JqLCBjb3VudCApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIG9iaiwgY291bnQgKVxuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sbGVjdGlvbiwgY2FsbGJhY2sgKVxuICB9LFxuXG4gIGlzRWxlbWVudDogZnVuY3Rpb24gKCBpdGVtICkge1xuICAgIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxuICB9LFxuXG4gIGZvcm1EYXRhOiBmdW5jdGlvbiggcm9vdEVsICkge1xuICAgIHZhciBmb3JtRGF0YSAgPSBuZXcgRm9ybURhdGEoKSxcbiAgICAgICAgZmllbGRzID0gdG9vbGJveC5zbGljZShyb290RWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgc2VsZWN0W25hbWVdOm5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWFbbmFtZV06bm90KFtkaXNhYmxlZF0pJyApKVxuICAgIHZhciBmaWVsZERhdGEgPSB7fVxuXG4gICAgLy8gUmVtb3ZlIGFueSBmaWVsZCB3aGljaCBoYXMgYSBwYXJlbnQgd2hpY2ggaXMgZGlzYWJsZWRcbiAgICBmaWVsZHMgPSBmaWVsZHMuZmlsdGVyKCBmdW5jdGlvbiggZiApIHsgcmV0dXJuICF0b29sYm94LmdldENsb3Nlc3QoZiwgJ1tkaXNhYmxlZF0nKSB9KVxuXG4gICAgLy8gTG9vcCBvdmVyIGZpZWxkc1xuICAgIC8vIHJldmVyc2UgdGhlbSBiZWNhdXNlIGlmIHRoZXJlIGFyZSB0d28gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZVxuICAgIC8vIHRoZSBsYXN0IGlucHV0IG92ZXJyaWRlcyB0aGUgZmlyc3QuXG4gICAgZmllbGRzLnJldmVyc2UoKS5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKSB7XG4gICAgICBpZiAoIHRvb2xib3gubWF0Y2hlcyggZmllbGQsICdbdHlwZT1yYWRpb10sIFt0eXBlPWNoZWNrYm94XScpICkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2hlY2tib3ggb3IgcmFkaW8gaW5wdXQsIG92ZXJ3cml0ZSB3aXRoIGNoZWNrZWQgdmFsdWVzXG4gICAgICAgIGlmICggZmllbGQuY2hlY2tlZCApIGZpZWxkRGF0YVtmaWVsZC5uYW1lXSA9IGZpZWxkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbmx5IGFkZCBvbmUgdmFsdWUgcGVyIGZpZWxkIG5hbWVcbiAgICAgICAgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGREYXRhW2ZpZWxkLm5hbWVdIHx8IGZpZWxkXG4gICAgICB9XG4gICAgfSlcblxuICAgIGZvciAoIHZhciBuYW1lIGluIGZpZWxkRGF0YSApIHtcbiAgICAgIC8vIEFwcGVuZCBjdXJyZW50IGZpZWxk4oCZcyBuYW1lL3ZhbHVlIHRvIG5ldyBmb3JtRGF0YSBvYmplY3RcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCggbmFtZSwgZmllbGREYXRhW25hbWVdLnZhbHVlICk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiByZXR1cm4gc2FpZCBmb3JtRGF0YSBvYmplY3RcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbGJveFxuIiwiLy8gZWFzaW5nIGZ1bmN0aW9ucyBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbnZhciBlYXNlID0ge1xuXG4gIGluT3V0UXVhZDogZnVuY3Rpb24gKHQsIGIsIGMsIGQpIHtcbiAgICB0IC89IGQvMlxuICAgIGlmICh0IDwgMSkgeyByZXR1cm4gYy8yKnQqdCArIGIgfVxuICAgIHQtLVxuICAgIHJldHVybiAtYy8yICogKHQqKHQtMikgLSAxKSArIGJcbiAgfSxcblxuICBpbk91dEN1YmljOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuXHR0IC89IGQvMjtcblx0aWYgKHQgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjtcblx0dCAtPSAyO1xuXHRyZXR1cm4gYy8yKih0KnQqdCArIDIpICsgYjtcbiAgfSxcblxuICBpbk91dFF1aW50OiBmdW5jdGlvbih0LCBiLCBjLCBkKSB7XG4gICAgdmFyIHRzID0gKHQvPWQpKnQsXG4gICAgdGMgPSB0cyp0O1xuICAgIHJldHVybiBiK2MqKDYqdGMqdHMgKyAtMTUqdHMqdHMgKyAxMCp0Yyk7XG4gIH0sXG5cbiAgaW5PdXRDaXJjOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yO1xuICAgIGlmICh0IDwgMSkgcmV0dXJuIC1jLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpIC0gMSkgKyBiO1xuICAgIHQgLT0gMjtcbiAgICByZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSArIDEpICsgYjtcbiAgfVxuXG59XG5cbmVhc2UuZGVmYXVsdCA9IGVhc2UuaW5PdXRRdWFkXG5cbm1vZHVsZS5leHBvcnRzID0gZWFzZVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggZWwgKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKCBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQgKTtcbn1cbiIsInZhciBlYXNlICAgID0gcmVxdWlyZSggJy4vZWFzZScgKVxudmFyIGZyb21Ub3AgPSByZXF1aXJlKCAnLi9mcm9tdG9wJyApXG5cbmZ1bmN0aW9uIG1vdmUoYW1vdW50KSB7XG5cbiAgLy8gU2Nyb2xsIGFsbCBiZWNhdXNlIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgaXMgc3RpbGwgZXhwaXJlbWVudGFsXG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gYW1vdW50O1xuXG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxUbyh0bywgY2FsbGJhY2ssIGR1cmF0aW9uKSB7XG5cbiAgLy8gTWFraW5nIGFyZ3MgZmxleGlibGVcbiAgLy9cbiAgLy8gQWxsb3cgZm9yIGVsZW1lbnQgb3IgeS1jb29yZGluYXRlc1xuICBpZiggdHlwZW9mKCB0byApID09PSAnb2JqZWN0JyApIHsgdG8gPSBmcm9tVG9wKCB0byApIH1cblxuICAvLyBBY2NlcHQgZHVyYXRpb24gYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICBpZiggdHlwZW9mKCBjYWxsYmFjayApID09PSAnbnVtYmVyJyApIHsgZHVyYXRpb24gPSBjYWxsYmFjazsgY2FsbGJhY2sgPSBudWxsIH1cblxuICAvLyBEZWZhdWx0IGR1cmF0aW9uID0gNTAwXG4gIGR1cmF0aW9uID0gKCB0eXBlb2YoIGR1cmF0aW9uICkgPT09ICd1bmRlZmluZWQnICkgPyA1MDAgOiBkdXJhdGlvblxuXG4gIHZhciBzdGFydCA9IHBvc2l0aW9uKCksXG4gICAgY2hhbmdlID0gdG8gLSBzdGFydCxcbiAgICBjdXJyZW50VGltZSA9IDAsXG4gICAgaW5jcmVtZW50ID0gMjA7XG5cblxuICB2YXIgYW5pbWF0ZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gaW5jcmVtZW50IHRoZSB0aW1lXG4gICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50XG5cbiAgICAvLyBmaW5kIHRoZSB2YWx1ZSB3aXRoIHRoZSBxdWFkcmF0aWMgaW4tb3V0IGVhc2luZyBmdW5jdGlvblxuICAgIHZhciB2YWwgPSBlYXNlLmRlZmF1bHQoY3VycmVudFRpbWUsIHN0YXJ0LCBjaGFuZ2UsIGR1cmF0aW9uKVxuXG4gICAgLy8gbW92ZSB0aGUgZG9jdW1lbnQuYm9keVxuICAgIG1vdmUodmFsKTtcblxuICAgIC8vIGRvIHRoZSBhbmltYXRpb24gdW5sZXNzIGl0cyBvdmVyXG4gICAgaWYgKCBjdXJyZW50VGltZSA8IGR1cmF0aW9uICkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRlU2Nyb2xsIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBjYWxsYmFjayAmJiB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVTY3JvbGwoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjcm9sbFRvXG4iLCIvKipcbiAqIENsYXNzTGlzdCBwb2x5ZmlsbFxuICogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzXG4gKiBAYXV0aG9yIEVsaSBHcmV5IC0gaHR0cDovL2VsaWdyZXkuY29tXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCAnZG9jdW1lbnQnIGluIHNlbGYgKSB7XG5cbiAgLy8gRnVsbCBwb2x5ZmlsbCBmb3IgYnJvd3NlcnMgd2l0aCBubyBjbGFzc0xpc3Qgc3VwcG9ydFxuICBpZiAoICEoICdjbGFzc0xpc3QnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApICkgKSB7XG5cbiAgICAoIGZ1bmN0aW9uKCB2aWV3ICkge1xuXG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgaWYgKCAhKCAnRWxlbWVudCcgaW4gdmlldyApICkgcmV0dXJuO1xuXG4gICAgdmFyXG4gICAgICBjbGFzc0xpc3RQcm9wID0gJ2NsYXNzTGlzdCcsXG4gICAgICBwcm90b1Byb3AgICAgID0gJ3Byb3RvdHlwZScsXG4gICAgICBlbGVtQ3RyUHJvdG8gID0gdmlldy5FbGVtZW50WyBwcm90b1Byb3AgXSxcbiAgICAgIG9iakN0ciAgICAgICAgPSBPYmplY3QsXG5cbiAgICAgIHN0clRyaW0gPSBTdHJpbmdbIHByb3RvUHJvcCBdLnRyaW0gfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoIC9eXFxzK3xcXHMrJC9nLCAnJyApO1xuICAgICAgfSxcblxuICAgICAgYXJySW5kZXhPZiA9IEFycmF5WyBwcm90b1Byb3AgXS5pbmRleE9mIHx8IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgIGlmICggaSBpbiB0aGlzICYmIHRoaXNbIGkgXSA9PT0gaXRlbSApIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9LFxuXG4gICAgICBET01FeCA9IGZ1bmN0aW9uKCB0eXBlLCBtZXNzYWdlICkge1xuICAgICAgICB0aGlzLm5hbWUgICAgPSB0eXBlO1xuICAgICAgICB0aGlzLmNvZGUgICAgPSBET01FeGNlcHRpb25bIHR5cGUgXTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0sXG5cbiAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uKCBjbGFzc0xpc3QsIHRva2VuICkge1xuICAgICAgICBpZiAoIHRva2VuID09PSAnJyApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXG4gICAgICAgICAgICAnU1lOVEFYX0VSUicsXG4gICAgICAgICAgICAnQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAvXFxzLy50ZXN0KCB0b2tlbiApICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdJTlZBTElEX0NIQVJBQ1RFUl9FUlInLFxuICAgICAgICAgICAgJ1N0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoIGNsYXNzTGlzdCwgdG9rZW4gKTtcbiAgICAgIH0sXG5cbiAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgICB2YXIgdHJpbW1lZENsYXNzZXMgPSBzdHJUcmltLmNhbGwoIGVsZW0uZ2V0QXR0cmlidXRlKCAnY2xhc3MnICkgfHwgJycgKSxcbiAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KCAvXFxzKy8gKSA6IFtdO1xuXG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCAnY2xhc3MnLCB0aGlzLnRvU3RyaW5nKCkgKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGNsYXNzTGlzdFByb3RvID0gQ2xhc3NMaXN0WyBwcm90b1Byb3AgXSA9IFtdLFxuXG4gICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QoIHRoaXMgKTtcbiAgICAgIH07XG5cbiAgICBET01FeFsgcHJvdG9Qcm9wIF0gPSBFcnJvclsgcHJvdG9Qcm9wIF07XG5cbiAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24oIGkgKSB7XG4gICAgICByZXR1cm4gdGhpc1sgaSBdIHx8IG51bGw7XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLmNvbnRhaW5zID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG4gICAgICByZXR1cm4gY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApICE9PSAtMTtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXJcbiAgICAgICAgdG9rZW5zICA9IGFyZ3VtZW50cyxcbiAgICAgICAgaXRlciAgICA9IDAsXG4gICAgICAgIGxlbiAgICAgPSB0b2tlbnMubGVuZ3RoLFxuICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG4gICAgICAgIHRva2VuO1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaWYgKCBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgPT09IC0xICkge1xuICAgICAgICAgIHRoaXMucHVzaCggdG9rZW4gKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGluZGV4O1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG5cbiAgICAgICAgd2hpbGUgKCBpbmRleCAhPT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5zcGxpY2UoIGluZGV4LCAxICk7XG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCArK2l0ZXIgPCBsZW4gKTtcblxuICAgICAgaWYgKCB1cGRhdGVkICkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8udG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgIHRva2VuICs9ICcnO1xuXG4gICAgICB2YXJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jb250YWlucyggdG9rZW4gKSxcbiAgICAgICAgbWV0aG9kID0gcmVzdWx0ID8gZm9yY2UgIT09IHRydWUgJiYgJ3JlbW92ZScgOiBmb3JjZSAhPT0gZmFsc2UgJiYgJ2FkZCc7XG5cbiAgICAgIGlmICggbWV0aG9kICkge1xuICAgICAgICB0aGlzWyBtZXRob2QgXSggdG9rZW4gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuam9pbiggJyAnICk7XG4gICAgfTtcblxuICAgIGlmICggb2JqQ3RyLmRlZmluZVByb3BlcnR5ICkge1xuICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuICAgICAgICAgIGdldCAgICAgICAgICA6IGNsYXNzTGlzdEdldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlICAgOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZSA6IHRydWVcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgfVxuXG4gICAgICBjYXRjaCAoIGV4ICkge1xuICAgICAgICBpZiAoIGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQgKSB7XG4gICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCBvYmpDdHJbIHByb3RvUHJvcCBdLl9fZGVmaW5lR2V0dGVyX18gKSB7XG4gICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyggY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyICk7XG4gICAgfVxuXG4gICAgfSggc2VsZiApKTtcblxuICB9IGVsc2Uge1xuXG4gICAgKCBmdW5jdGlvbigpIHtcblxuICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnXycgKTtcblxuICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ2MxJywgJ2MyJyApO1xuXG4gICAgICBpZiAoICF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoICdjMicgKSApIHtcbiAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uKCBtZXRob2QgKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZVsgbWV0aG9kIF07XG5cbiAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB0b2tlbiApIHtcbiAgICAgICAgICAgIHZhciBpLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3VtZW50c1sgaSBdO1xuICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKCB0aGlzLCB0b2tlbiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNyZWF0ZU1ldGhvZCggJ2FkZCcgKTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAncmVtb3ZlJyApO1xuICAgICAgfVxuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCAnYzMnLCBmYWxzZSApO1xuXG4gICAgICBpZiAoIHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MzJyApICkge1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO1xuXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgICAgICBpZiAoIDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKCB0b2tlbiApID09PSAhZm9yY2UgKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblxuICAgIH0oKSk7XG5cbiAgfVxufVxuIiwiLyoqXG4gKiBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgT2JqZWN0LmFzc2lnbiBpbXBsZW1lbnRhdGlvblxuICogQHNvdXJjZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduI1BvbHlmaWxsXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCB0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPSAnZnVuY3Rpb24nICkge1xuICAoIGZ1bmN0aW9uKCkge1xuICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiggdGFyZ2V0ICkge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuICAgICAgZm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrICkge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuICAgICAgICBpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7XG4gICAgICAgICAgICBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG4gICAgICAgICAgICAgIG91dHB1dFsgbmV4dEtleSBdID0gc291cmNlWyBuZXh0S2V5IF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG4gIH0pKCk7XG59XG5cbi8vIE1ha2UgaXQgZWFzeSB0byBtZXJnZSBvYmplY3RzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlIG9yaWdpbmFsIG9iamVjdHNcbnZhciBtZXJnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IFt7fV0uY29uY2F0KCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseSggdGhpcywgYXJncyApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2VcbiIsInZhciBEYXRlVGltZSA9IHJlcXVpcmUoICdsdXhvbicgKS5EYXRlVGltZVxuXG5mdW5jdGlvbiBpc0JlZm9yZSggZGF0ZSwgZW5kICkge1xuICBlbmQgPSBwYXJzZSggZW5kIClcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgcmV0dXJuIGRhdGUgPT0gRGF0ZVRpbWUubWluKCBlbmQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0FmdGVyKCBkYXRlLCBzdGFydCApIHtcbiAgc3RhcnQgPSBwYXJzZSggc3RhcnQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlIClcbn1cblxuZnVuY3Rpb24gaXNCZXR3ZWVuKCBkYXRlLCBkYXRlMSwgZGF0ZTIgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIGRhdGUxID0gcGFyc2UoIGRhdGUxIClcbiAgZGF0ZTIgPSBwYXJzZSggZGF0ZTIgKVxuXG4gIGlmICggZGF0ZS5pc1ZhbGlkICYmIGRhdGUxLmlzVmFsaWQgJiYgZGF0ZTIuaXNWYWxpZCApIHtcbiAgICAvLyBEZXRlcm1pbmUgc3RhcnQgYW5kIGVuZCBkYXRlcyAodG8gYWxsb3cgYW55IG9yZGVyIGluIGFyZ3MpXG4gICAgdmFyIHN0YXJ0ID0gRGF0ZVRpbWUubWluKCBkYXRlMSwgZGF0ZTIgKVxuICAgIHZhciBlbmQgPSBEYXRlVGltZS5tYXgoIGRhdGUxLCBkYXRlMiApXG5cbiAgICByZXR1cm4gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApID09IERhdGVUaW1lLm1pbiggZGF0ZSwgZW5kIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZSggZGF0ZSwgb3B0aW9ucyApIHtcbiAgdmFyIGZvcm1hdHMgPSBbIFwiSVNPXCIsIFwiU1FMXCIsIFwiSFRUUFwiLCBcIlJGQzI4MjJcIiBdLFxuICAgICAgcGFyc2VkRGF0ZVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKCBvcHRpb25zLm1pbGxpcyAmJiAhaXNOYU4oIGRhdGUgKSApIHtcbiAgICBkYXRlID0gTnVtYmVyKCBkYXRlIClcbiAgICBmb3JtYXRzLnVuc2hpZnQoJ01pbGxpcycpXG4gIH1cblxuICBpZiAoIHR5cGVvZiBkYXRlID09ICdvYmplY3QnICkge1xuICAgIFxuICAgIC8vIElzIGFscmVhZHkgYSBEYXRlVGltZSBvYmplY3RcbiAgICBpZiAoIGRhdGUudG9JU08gKSByZXR1cm4gZGF0ZVxuICAgIGVsc2UgZm9ybWF0cy51bnNoaWZ0KCAnT2JqZWN0JyApXG5cbiAgLy8gUGFyc2Ugc3RyaW5nIGZvcm1hdHNcbiAgfVxuXG4gIGZvcm1hdHMuZm9yRWFjaCggZnVuY3Rpb24oIGZvcm1hdCApIHtcbiAgICBpZiAoKCAhcGFyc2VkRGF0ZSB8fCAhcGFyc2VkRGF0ZS5pc1ZhbGlkICkgJiYgRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0gKSB7XG4gICAgICBwYXJzZWREYXRlID0gRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0oIGRhdGUsIG9wdGlvbnMgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcGFyc2VkRGF0ZS5pc1ZhbGlkID8gcGFyc2VkRGF0ZSA6IGZhbHNlXG59XG5cbi8vIFJlbW92ZSBpbnNpZ25pZmljYW50IGRpZ2l0c1xuZnVuY3Rpb24gcHJldHR5UHJpbnQoIGRhdGUsIG9wdGlvbnMgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSwgb3B0aW9ucyApXG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy56b25lKSBkYXRlID0gZGF0ZS5zZXRab25lKG9wdGlvbnMuem9uZSlcblxuICBpZiAoIGRhdGUgKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU08oKS5yZXBsYWNlKCdUJywgJyAnKS5yZXBsYWNlKCcuMDAwJywnICcpLnJlcGxhY2UoJzowMCAnLCcgJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJVbnBhcnNlYWJsZSBkYXRlIHN0cmluZ1wiIFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0JlZm9yZTogaXNCZWZvcmUsXG4gIGlzQWZ0ZXI6IGlzQWZ0ZXIsXG4gIGlzQmV0d2VlbjogaXNCZXR3ZWVuLFxuICBwYXJzZTogcGFyc2UsXG4gIHByZXR0eVByaW50OiBwcmV0dHlQcmludFxufVxuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDE1IEZsb3JpYW4gSGFydG1hbm4sIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9yaWFuIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9yaWFuL2Nvb2tpZS5qc1xuXG4hZnVuY3Rpb24gKGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHR2YXIgY29va2llID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjb29raWUuZ2V0LmFwcGx5KGNvb2tpZSwgYXJndW1lbnRzKTtcblx0fTtcblxuXHR2YXIgdXRpbHMgPSBjb29raWUudXRpbHMgPSAge1xuXG5cdFx0Ly8gSXMgdGhlIGdpdmVuIHZhbHVlIGFuIGFycmF5PyBVc2UgRVM1IEFycmF5LmlzQXJyYXkgaWYgaXQncyBhdmFpbGFibGUuXG5cdFx0aXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nO1xuXHRcdH0sXG5cblx0XHQvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBwbGFpbiBvYmplY3QgLyBhbiBvYmplY3Qgd2hvc2UgY29uc3RydWN0b3IgaXMgYE9iamVjdGA/XG5cdFx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gISF2YWx1ZSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcblx0XHR9LFxuXG5cdFx0Ly8gQ29udmVydCBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhbiBhcnJheSDigJMgZm9yIGV4YW1wbGUgYGFyZ3VtZW50c2AuXG5cdFx0dG9BcnJheTogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmFsdWUpO1xuXHRcdH0sXG5cblx0XHQvLyBHZXQgdGhlIGtleXMgb2YgYW4gb2JqZWN0LiBVc2UgRVM1IE9iamVjdC5rZXlzIGlmIGl0J3MgYXZhaWxhYmxlLlxuXHRcdGdldEtleXM6IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdHZhciBrZXlzID0gW10sXG5cdFx0XHRcdCBrZXkgPSAnJztcblx0XHRcdGZvciAoa2V5IGluIG9iaikge1xuXHRcdFx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIGtleXMucHVzaChrZXkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGtleXM7XG5cdFx0fSxcblxuXHRcdC8vIFVubGlrZSBKYXZhU2NyaXB0J3MgYnVpbHQtaW4gZXNjYXBlIGZ1bmN0aW9ucywgdGhpcyBtZXRob2Rcblx0XHQvLyBvbmx5IGVzY2FwZXMgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiBjb29raWVzLlxuXHRcdGVuY29kZTogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9bLDtcIlxcXFw9XFxzJV0vZywgZnVuY3Rpb24gKGNoYXJhY3Rlcikge1xuXHRcdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGNoYXJhY3Rlcik7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0ZGVjb2RlOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuXHRcdH0sXG5cblx0XHQvLyBSZXR1cm4gZmFsbGJhY2sgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLCBvdGhlcndpc2UgcmV0dXJuIHZhbHVlLlxuXHRcdHJldHJpZXZlOiBmdW5jdGlvbiAodmFsdWUsIGZhbGxiYWNrKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGZhbGxiYWNrIDogdmFsdWU7XG5cdFx0fVxuXG5cdH07XG5cblx0Y29va2llLmRlZmF1bHRzID0ge307XG5cblx0Y29va2llLmV4cGlyZXNNdWx0aXBsaWVyID0gNjAgKiA2MCAqIDI0O1xuXG5cdGNvb2tpZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuXHRcdGlmICh1dGlscy5pc1BsYWluT2JqZWN0KGtleSkpIHtcblx0XHRcdC8vIGBrZXlgIGNvbnRhaW5zIGFuIG9iamVjdCB3aXRoIGtleXMgYW5kIHZhbHVlcyBmb3IgY29va2llcywgYHZhbHVlYCBjb250YWlucyB0aGUgb3B0aW9ucyBvYmplY3QuXG5cblx0XHRcdGZvciAodmFyIGsgaW4ga2V5KSB7XG5cdFx0XHRcdGlmIChrZXkuaGFzT3duUHJvcGVydHkoaykpIHRoaXMuc2V0KGssIGtleVtrXSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zID0gdXRpbHMuaXNQbGFpbk9iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7IGV4cGlyZXM6IG9wdGlvbnMgfTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5nIGZvciBzZXNzaW9uIGNvb2tpZXMuXG5cdFx0XHR2YXIgZXhwaXJlcyA9IG9wdGlvbnMuZXhwaXJlcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVzIDogKHRoaXMuZGVmYXVsdHMuZXhwaXJlcyB8fCAnJyksXG5cdFx0XHQgICAgZXhwaXJlc1R5cGUgPSB0eXBlb2YoZXhwaXJlcyk7XG5cblx0XHRcdGlmIChleHBpcmVzVHlwZSA9PT0gJ3N0cmluZycgJiYgZXhwaXJlcyAhPT0gJycpIGV4cGlyZXMgPSBuZXcgRGF0ZShleHBpcmVzKTtcblx0XHRcdGVsc2UgaWYgKGV4cGlyZXNUeXBlID09PSAnbnVtYmVyJykgZXhwaXJlcyA9IG5ldyBEYXRlKCtuZXcgRGF0ZSArIDEwMDAgKiB0aGlzLmV4cGlyZXNNdWx0aXBsaWVyICogZXhwaXJlcyk7IC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgSUUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYG1heC1hZ2VgIGNvb2tpZSBhdHRyaWJ1dGUuXG5cblx0XHRcdGlmIChleHBpcmVzICE9PSAnJyAmJiAndG9HTVRTdHJpbmcnIGluIGV4cGlyZXMpIGV4cGlyZXMgPSAnO2V4cGlyZXM9JyArIGV4cGlyZXMudG9HTVRTdHJpbmcoKTtcblxuXHRcdFx0dmFyIHBhdGggPSBvcHRpb25zLnBhdGggfHwgdGhpcy5kZWZhdWx0cy5wYXRoO1xuXHRcdFx0cGF0aCA9IHBhdGggPyAnO3BhdGg9JyArIHBhdGggOiAnJztcblxuXHRcdFx0dmFyIGRvbWFpbiA9IG9wdGlvbnMuZG9tYWluIHx8IHRoaXMuZGVmYXVsdHMuZG9tYWluO1xuXHRcdFx0ZG9tYWluID0gZG9tYWluID8gJztkb21haW49JyArIGRvbWFpbiA6ICcnO1xuXG5cdFx0XHR2YXIgc2VjdXJlID0gb3B0aW9ucy5zZWN1cmUgfHwgdGhpcy5kZWZhdWx0cy5zZWN1cmUgPyAnO3NlY3VyZScgOiAnJztcblx0XHRcdGlmIChvcHRpb25zLnNlY3VyZSA9PT0gZmFsc2UpIHNlY3VyZSA9ICcnO1xuXG5cdFx0XHRkb2N1bWVudC5jb29raWUgPSB1dGlscy5lbmNvZGUoa2V5KSArICc9JyArIHV0aWxzLmVuY29kZSh2YWx1ZSkgKyBleHBpcmVzICsgcGF0aCArIGRvbWFpbiArIHNlY3VyZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBgY29va2llYCBvYmplY3QgdG8gbWFrZSBjaGFpbmluZyBwb3NzaWJsZS5cblx0fTtcblxuXHRjb29raWUuc2V0RGVmYXVsdCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoa2V5KSkge1xuXHRcdFx0Zm9yICh2YXIgayBpbiBrZXkpIHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0KGspID09PSB1bmRlZmluZWQpIHRoaXMuc2V0KGssIGtleVtrXSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNvb2tpZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuZ2V0KGtleSkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fVxuXHR9LFxuXG5cdGNvb2tpZS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5cykge1xuXHRcdGtleXMgPSB1dGlscy5pc0FycmF5KGtleXMpID8ga2V5cyA6IHV0aWxzLnRvQXJyYXkoYXJndW1lbnRzKTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRoaXMuc2V0KGtleXNbaV0sICcnLCAtMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7IC8vIFJldHVybiB0aGUgYGNvb2tpZWAgb2JqZWN0IHRvIG1ha2UgY2hhaW5pbmcgcG9zc2libGUuXG5cdH07XG5cblx0Y29va2llLnJlbW92ZVNwZWNpZmljID0gZnVuY3Rpb24gKGtleXMsIG9wdGlvbnMpIHtcblx0XHRpZiAoIW9wdGlvbnMpIHJldHVybiB0aGlzLnJlbW92ZShrZXlzKTtcblxuXHRcdGtleXMgPSB1dGlscy5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXTtcblx0XHRvcHRpb25zLmV4cGlyZXMgPSAtMTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRoaXMuc2V0KGtleXNbaV0sICcnLCBvcHRpb25zKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBgY29va2llYCBvYmplY3QgdG8gbWFrZSBjaGFpbmluZyBwb3NzaWJsZS5cblx0fTtcblxuXHRjb29raWUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlKHV0aWxzLmdldEtleXModGhpcy5hbGwoKSkpO1xuXHR9O1xuXG5cdGNvb2tpZS5nZXQgPSBmdW5jdGlvbiAoa2V5cywgZmFsbGJhY2spIHtcblx0XHR2YXIgY29va2llcyA9IHRoaXMuYWxsKCk7XG5cblx0XHRpZiAodXRpbHMuaXNBcnJheShrZXlzKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IHt9O1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSA9IGtleXNbaV07XG5cdFx0XHRcdHJlc3VsdFt2YWx1ZV0gPSB1dGlscy5yZXRyaWV2ZShjb29raWVzW3ZhbHVlXSwgZmFsbGJhY2spO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fSBlbHNlIHJldHVybiB1dGlscy5yZXRyaWV2ZShjb29raWVzW2tleXNdLCBmYWxsYmFjayk7XG5cdH07XG5cblx0Y29va2llLmFsbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoZG9jdW1lbnQuY29va2llID09PSAnJykgcmV0dXJuIHt9O1xuXG5cdFx0dmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJyksXG5cdFx0ICAgIHJlc3VsdCA9IHt9O1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBjb29raWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHR2YXIga2V5ID0gdXRpbHMuZGVjb2RlKGl0ZW0uc2hpZnQoKSk7XG5cdFx0XHR2YXIgdmFsdWUgPSB1dGlscy5kZWNvZGUoaXRlbS5qb2luKCc9JykpO1xuXHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvb2tpZS5lbmFibGVkID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChuYXZpZ2F0b3IuY29va2llRW5hYmxlZCkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcmV0ID0gY29va2llLnNldCgnXycsICdfJykuZ2V0KCdfJykgPT09ICdfJztcblx0XHRjb29raWUucmVtb3ZlKCdfJyk7XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblxuXHQvLyBJZiBhbiBBTUQgbG9hZGVyIGlzIHByZXNlbnQgdXNlIEFNRC5cblx0Ly8gSWYgYSBDb21tb25KUyBsb2FkZXIgaXMgcHJlc2VudCB1c2UgQ29tbW9uSlMuXG5cdC8vIE90aGVyd2lzZSBhc3NpZ24gdGhlIGBjb29raWVgIG9iamVjdCB0byB0aGUgZ2xvYmFsIHNjb3BlLlxuXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHtjb29raWU6IGNvb2tpZX07XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0ZXhwb3J0cy5jb29raWUgPSBjb29raWU7XG5cdH0gZWxzZSB3aW5kb3cuY29va2llID0gY29va2llO1xuXG4vLyBJZiB1c2VkIGUuZy4gd2l0aCBCcm93c2VyaWZ5IGFuZCBDb21tb25KUywgZG9jdW1lbnQgaXMgbm90IGRlY2xhcmVkLlxufSh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGRvY3VtZW50KTtcbiIsIi8vICAgICBrZXltYXN0ZXIuanNcbi8vICAgICAoYykgMjAxMS0yMDEzIFRob21hcyBGdWNoc1xuLy8gICAgIGtleW1hc3Rlci5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuOyhmdW5jdGlvbihnbG9iYWwpe1xuICB2YXIgayxcbiAgICBfaGFuZGxlcnMgPSB7fSxcbiAgICBfbW9kcyA9IHsgMTY6IGZhbHNlLCAxODogZmFsc2UsIDE3OiBmYWxzZSwgOTE6IGZhbHNlIH0sXG4gICAgX3Njb3BlID0gJ2FsbCcsXG4gICAgLy8gbW9kaWZpZXIga2V5c1xuICAgIF9NT0RJRklFUlMgPSB7XG4gICAgICAn4oenJzogMTYsIHNoaWZ0OiAxNixcbiAgICAgICfijKUnOiAxOCwgYWx0OiAxOCwgb3B0aW9uOiAxOCxcbiAgICAgICfijIMnOiAxNywgY3RybDogMTcsIGNvbnRyb2w6IDE3LFxuICAgICAgJ+KMmCc6IDkxLCBjb21tYW5kOiA5MVxuICAgIH0sXG4gICAgLy8gc3BlY2lhbCBrZXlzXG4gICAgX01BUCA9IHtcbiAgICAgIGJhY2tzcGFjZTogOCwgdGFiOiA5LCBjbGVhcjogMTIsXG4gICAgICBlbnRlcjogMTMsICdyZXR1cm4nOiAxMyxcbiAgICAgIGVzYzogMjcsIGVzY2FwZTogMjcsIHNwYWNlOiAzMixcbiAgICAgIGxlZnQ6IDM3LCB1cDogMzgsXG4gICAgICByaWdodDogMzksIGRvd246IDQwLFxuICAgICAgZGVsOiA0NiwgJ2RlbGV0ZSc6IDQ2LFxuICAgICAgaG9tZTogMzYsIGVuZDogMzUsXG4gICAgICBwYWdldXA6IDMzLCBwYWdlZG93bjogMzQsXG4gICAgICAnLCc6IDE4OCwgJy4nOiAxOTAsICcvJzogMTkxLFxuICAgICAgJ2AnOiAxOTIsICctJzogMTg5LCAnPSc6IDE4NyxcbiAgICAgICc7JzogMTg2LCAnXFwnJzogMjIyLFxuICAgICAgJ1snOiAyMTksICddJzogMjIxLCAnXFxcXCc6IDIyMFxuICAgIH0sXG4gICAgY29kZSA9IGZ1bmN0aW9uKHgpe1xuICAgICAgcmV0dXJuIF9NQVBbeF0gfHwgeC50b1VwcGVyQ2FzZSgpLmNoYXJDb2RlQXQoMCk7XG4gICAgfSxcbiAgICBfZG93bktleXMgPSBbXTtcblxuICBmb3Ioaz0xO2s8MjA7aysrKSBfTUFQWydmJytrXSA9IDExMStrO1xuXG4gIC8vIElFIGRvZXNuJ3Qgc3VwcG9ydCBBcnJheSNpbmRleE9mLCBzbyBoYXZlIGEgc2ltcGxlIHJlcGxhY2VtZW50XG4gIGZ1bmN0aW9uIGluZGV4KGFycmF5LCBpdGVtKXtcbiAgICB2YXIgaSA9IGFycmF5Lmxlbmd0aDtcbiAgICB3aGlsZShpLS0pIGlmKGFycmF5W2ldPT09aXRlbSkgcmV0dXJuIGk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLy8gZm9yIGNvbXBhcmluZyBtb2RzIGJlZm9yZSB1bmFzc2lnbm1lbnRcbiAgZnVuY3Rpb24gY29tcGFyZUFycmF5KGExLCBhMikge1xuICAgIGlmIChhMS5sZW5ndGggIT0gYTIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYTFbaV0gIT09IGEyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG1vZGlmaWVyTWFwID0ge1xuICAgICAgMTY6J3NoaWZ0S2V5JyxcbiAgICAgIDE4OidhbHRLZXknLFxuICAgICAgMTc6J2N0cmxLZXknLFxuICAgICAgOTE6J21ldGFLZXknXG4gIH07XG4gIGZ1bmN0aW9uIHVwZGF0ZU1vZGlmaWVyS2V5KGV2ZW50KSB7XG4gICAgICBmb3IoayBpbiBfbW9kcykgX21vZHNba10gPSBldmVudFttb2RpZmllck1hcFtrXV07XG4gIH07XG5cbiAgLy8gaGFuZGxlIGtleWRvd24gZXZlbnRcbiAgZnVuY3Rpb24gZGlzcGF0Y2goZXZlbnQpIHtcbiAgICB2YXIga2V5LCBoYW5kbGVyLCBrLCBpLCBtb2RpZmllcnNNYXRjaCwgc2NvcGU7XG4gICAga2V5ID0gZXZlbnQua2V5Q29kZTtcblxuICAgIGlmIChpbmRleChfZG93bktleXMsIGtleSkgPT0gLTEpIHtcbiAgICAgICAgX2Rvd25LZXlzLnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICAvLyBpZiBhIG1vZGlmaWVyIGtleSwgc2V0IHRoZSBrZXkuPG1vZGlmaWVya2V5bmFtZT4gcHJvcGVydHkgdG8gdHJ1ZSBhbmQgcmV0dXJuXG4gICAgaWYoa2V5ID09IDkzIHx8IGtleSA9PSAyMjQpIGtleSA9IDkxOyAvLyByaWdodCBjb21tYW5kIG9uIHdlYmtpdCwgY29tbWFuZCBvbiBHZWNrb1xuICAgIGlmKGtleSBpbiBfbW9kcykge1xuICAgICAgX21vZHNba2V5XSA9IHRydWU7XG4gICAgICAvLyAnYXNzaWduS2V5JyBmcm9tIGluc2lkZSB0aGlzIGNsb3N1cmUgaXMgZXhwb3J0ZWQgdG8gd2luZG93LmtleVxuICAgICAgZm9yKGsgaW4gX01PRElGSUVSUykgaWYoX01PRElGSUVSU1trXSA9PSBrZXkpIGFzc2lnbktleVtrXSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0ZU1vZGlmaWVyS2V5KGV2ZW50KTtcblxuICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUga2V5cHJlc3MgKGZpbHRlcigpIGNhbiBjYW4gYmUgb3ZlcnJpZGRlbilcbiAgICAvLyBieSBkZWZhdWx0IGlnbm9yZSBrZXkgcHJlc3NlcyBpZiBhIHNlbGVjdCwgdGV4dGFyZWEsIG9yIGlucHV0IGlzIGZvY3VzZWRcbiAgICBpZighYXNzaWduS2V5LmZpbHRlci5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgLy8gYWJvcnQgaWYgbm8gcG90ZW50aWFsbHkgbWF0Y2hpbmcgc2hvcnRjdXRzIGZvdW5kXG4gICAgaWYgKCEoa2V5IGluIF9oYW5kbGVycykpIHJldHVybjtcblxuICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcblxuICAgIC8vIGZvciBlYWNoIHBvdGVudGlhbCBzaG9ydGN1dFxuICAgIGZvciAoaSA9IDA7IGkgPCBfaGFuZGxlcnNba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgaGFuZGxlciA9IF9oYW5kbGVyc1trZXldW2ldO1xuXG4gICAgICAvLyBzZWUgaWYgaXQncyBpbiB0aGUgY3VycmVudCBzY29wZVxuICAgICAgaWYoaGFuZGxlci5zY29wZSA9PSBzY29wZSB8fCBoYW5kbGVyLnNjb3BlID09ICdhbGwnKXtcbiAgICAgICAgLy8gY2hlY2sgaWYgbW9kaWZpZXJzIG1hdGNoIGlmIGFueVxuICAgICAgICBtb2RpZmllcnNNYXRjaCA9IGhhbmRsZXIubW9kcy5sZW5ndGggPiAwO1xuICAgICAgICBmb3IoayBpbiBfbW9kcylcbiAgICAgICAgICBpZigoIV9tb2RzW2tdICYmIGluZGV4KGhhbmRsZXIubW9kcywgK2spID4gLTEpIHx8XG4gICAgICAgICAgICAoX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPT0gLTEpKSBtb2RpZmllcnNNYXRjaCA9IGZhbHNlO1xuICAgICAgICAvLyBjYWxsIHRoZSBoYW5kbGVyIGFuZCBzdG9wIHRoZSBldmVudCBpZiBuZWNjZXNzYXJ5XG4gICAgICAgIGlmKChoYW5kbGVyLm1vZHMubGVuZ3RoID09IDAgJiYgIV9tb2RzWzE2XSAmJiAhX21vZHNbMThdICYmICFfbW9kc1sxN10gJiYgIV9tb2RzWzkxXSkgfHwgbW9kaWZpZXJzTWF0Y2gpe1xuICAgICAgICAgIGlmKGhhbmRsZXIubWV0aG9kKGV2ZW50LCBoYW5kbGVyKT09PWZhbHNlKXtcbiAgICAgICAgICAgIGlmKGV2ZW50LnByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlbHNlIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBpZihldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYoZXZlbnQuY2FuY2VsQnViYmxlKSBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB1bnNldCBtb2RpZmllciBrZXlzIG9uIGtleXVwXG4gIGZ1bmN0aW9uIGNsZWFyTW9kaWZpZXIoZXZlbnQpe1xuICAgIHZhciBrZXkgPSBldmVudC5rZXlDb2RlLCBrLFxuICAgICAgICBpID0gaW5kZXgoX2Rvd25LZXlzLCBrZXkpO1xuXG4gICAgLy8gcmVtb3ZlIGtleSBmcm9tIF9kb3duS2V5c1xuICAgIGlmIChpID49IDApIHtcbiAgICAgICAgX2Rvd25LZXlzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7XG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gZmFsc2U7XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlc2V0TW9kaWZpZXJzKCkge1xuICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGZhbHNlO1xuICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuICB9O1xuXG4gIC8vIHBhcnNlIGFuZCBhc3NpZ24gc2hvcnRjdXRcbiAgZnVuY3Rpb24gYXNzaWduS2V5KGtleSwgc2NvcGUsIG1ldGhvZCl7XG4gICAgdmFyIGtleXMsIG1vZHM7XG4gICAga2V5cyA9IGdldEtleXMoa2V5KTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGhvZCA9IHNjb3BlO1xuICAgICAgc2NvcGUgPSAnYWxsJztcbiAgICB9XG5cbiAgICAvLyBmb3IgZWFjaCBzaG9ydGN1dFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gc2V0IG1vZGlmaWVyIGtleXMgaWYgYW55XG4gICAgICBtb2RzID0gW107XG4gICAgICBrZXkgPSBrZXlzW2ldLnNwbGl0KCcrJyk7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IDEpe1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXkpO1xuICAgICAgICBrZXkgPSBba2V5W2tleS5sZW5ndGgtMV1dO1xuICAgICAgfVxuICAgICAgLy8gY29udmVydCB0byBrZXljb2RlIGFuZC4uLlxuICAgICAga2V5ID0ga2V5WzBdXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG4gICAgICAvLyAuLi5zdG9yZSBoYW5kbGVyXG4gICAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgX2hhbmRsZXJzW2tleV0gPSBbXTtcbiAgICAgIF9oYW5kbGVyc1trZXldLnB1c2goeyBzaG9ydGN1dDoga2V5c1tpXSwgc2NvcGU6IHNjb3BlLCBtZXRob2Q6IG1ldGhvZCwga2V5OiBrZXlzW2ldLCBtb2RzOiBtb2RzIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyB1bmJpbmQgYWxsIGhhbmRsZXJzIGZvciBnaXZlbiBrZXkgaW4gY3VycmVudCBzY29wZVxuICBmdW5jdGlvbiB1bmJpbmRLZXkoa2V5LCBzY29wZSkge1xuICAgIHZhciBtdWx0aXBsZUtleXMsIGtleXMsXG4gICAgICBtb2RzID0gW10sXG4gICAgICBpLCBqLCBvYmo7XG5cbiAgICBtdWx0aXBsZUtleXMgPSBnZXRLZXlzKGtleSk7XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgbXVsdGlwbGVLZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICBrZXlzID0gbXVsdGlwbGVLZXlzW2pdLnNwbGl0KCcrJyk7XG5cbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbW9kcyA9IGdldE1vZHMoa2V5cyk7XG4gICAgICAgIGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gY29kZShrZXkpO1xuXG4gICAgICBpZiAoc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzY29wZSA9IGdldFNjb3BlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIV9oYW5kbGVyc1trZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBfaGFuZGxlcnNba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICBvYmogPSBfaGFuZGxlcnNba2V5XVtpXTtcbiAgICAgICAgLy8gb25seSBjbGVhciBoYW5kbGVycyBpZiBjb3JyZWN0IHNjb3BlIGFuZCBtb2RzIG1hdGNoXG4gICAgICAgIGlmIChvYmouc2NvcGUgPT09IHNjb3BlICYmIGNvbXBhcmVBcnJheShvYmoubW9kcywgbW9kcykpIHtcbiAgICAgICAgICBfaGFuZGxlcnNba2V5XVtpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdpdGggY29kZSAna2V5Q29kZScgaXMgY3VycmVudGx5IGRvd25cbiAgLy8gQ29udmVydHMgc3RyaW5ncyBpbnRvIGtleSBjb2Rlcy5cbiAgZnVuY3Rpb24gaXNQcmVzc2VkKGtleUNvZGUpIHtcbiAgICAgIGlmICh0eXBlb2Yoa2V5Q29kZSk9PSdzdHJpbmcnKSB7XG4gICAgICAgIGtleUNvZGUgPSBjb2RlKGtleUNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4KF9kb3duS2V5cywga2V5Q29kZSkgIT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcmVzc2VkS2V5Q29kZXMoKSB7XG4gICAgICByZXR1cm4gX2Rvd25LZXlzLnNsaWNlKDApO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyKGV2ZW50KXtcbiAgICB2YXIgdGFnTmFtZSA9IChldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudCkudGFnTmFtZTtcbiAgICAvLyBpZ25vcmUga2V5cHJlc3NlZCBpbiBhbnkgZWxlbWVudHMgdGhhdCBzdXBwb3J0IGtleWJvYXJkIGRhdGEgaW5wdXRcbiAgICByZXR1cm4gISh0YWdOYW1lID09ICdJTlBVVCcgfHwgdGFnTmFtZSA9PSAnU0VMRUNUJyB8fCB0YWdOYW1lID09ICdURVhUQVJFQScpO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSBrZXkuPG1vZGlmaWVyPiB0byBmYWxzZVxuICBmb3IoayBpbiBfTU9ESUZJRVJTKSBhc3NpZ25LZXlba10gPSBmYWxzZTtcblxuICAvLyBzZXQgY3VycmVudCBzY29wZSAoZGVmYXVsdCAnYWxsJylcbiAgZnVuY3Rpb24gc2V0U2NvcGUoc2NvcGUpeyBfc2NvcGUgPSBzY29wZSB8fCAnYWxsJyB9O1xuICBmdW5jdGlvbiBnZXRTY29wZSgpeyByZXR1cm4gX3Njb3BlIHx8ICdhbGwnIH07XG5cbiAgLy8gZGVsZXRlIGFsbCBoYW5kbGVycyBmb3IgYSBnaXZlbiBzY29wZVxuICBmdW5jdGlvbiBkZWxldGVTY29wZShzY29wZSl7XG4gICAgdmFyIGtleSwgaGFuZGxlcnMsIGk7XG5cbiAgICBmb3IgKGtleSBpbiBfaGFuZGxlcnMpIHtcbiAgICAgIGhhbmRsZXJzID0gX2hhbmRsZXJzW2tleV07XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyApIHtcbiAgICAgICAgaWYgKGhhbmRsZXJzW2ldLnNjb3BlID09PSBzY29wZSkgaGFuZGxlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBlbHNlIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gYWJzdHJhY3Qga2V5IGxvZ2ljIGZvciBhc3NpZ24gYW5kIHVuYXNzaWduXG4gIGZ1bmN0aW9uIGdldEtleXMoa2V5KSB7XG4gICAgdmFyIGtleXM7XG4gICAga2V5ID0ga2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAga2V5cyA9IGtleS5zcGxpdCgnLCcpO1xuICAgIGlmICgoa2V5c1trZXlzLmxlbmd0aCAtIDFdKSA9PSAnJykge1xuICAgICAga2V5c1trZXlzLmxlbmd0aCAtIDJdICs9ICcsJztcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICAvLyBhYnN0cmFjdCBtb2RzIGxvZ2ljIGZvciBhc3NpZ24gYW5kIHVuYXNzaWduXG4gIGZ1bmN0aW9uIGdldE1vZHMoa2V5KSB7XG4gICAgdmFyIG1vZHMgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIDEpO1xuICAgIGZvciAodmFyIG1pID0gMDsgbWkgPCBtb2RzLmxlbmd0aDsgbWkrKylcbiAgICBtb2RzW21pXSA9IF9NT0RJRklFUlNbbW9kc1ttaV1dO1xuICAgIHJldHVybiBtb2RzO1xuICB9XG5cbiAgLy8gY3Jvc3MtYnJvd3NlciBldmVudHNcbiAgZnVuY3Rpb24gYWRkRXZlbnQob2JqZWN0LCBldmVudCwgbWV0aG9kKSB7XG4gICAgaWYgKG9iamVjdC5hZGRFdmVudExpc3RlbmVyKVxuICAgICAgb2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIG1ldGhvZCwgZmFsc2UpO1xuICAgIGVsc2UgaWYob2JqZWN0LmF0dGFjaEV2ZW50KVxuICAgICAgb2JqZWN0LmF0dGFjaEV2ZW50KCdvbicrZXZlbnQsIGZ1bmN0aW9uKCl7IG1ldGhvZCh3aW5kb3cuZXZlbnQpIH0pO1xuICB9O1xuXG4gIC8vIHNldCB0aGUgaGFuZGxlcnMgZ2xvYmFsbHkgb24gZG9jdW1lbnRcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpIHsgZGlzcGF0Y2goZXZlbnQpIH0pOyAvLyBQYXNzaW5nIF9zY29wZSB0byBhIGNhbGxiYWNrIHRvIGVuc3VyZSBpdCByZW1haW5zIHRoZSBzYW1lIGJ5IGV4ZWN1dGlvbi4gRml4ZXMgIzQ4XG4gIGFkZEV2ZW50KGRvY3VtZW50LCAna2V5dXAnLCBjbGVhck1vZGlmaWVyKTtcblxuICAvLyByZXNldCBtb2RpZmllcnMgdG8gZmFsc2Ugd2hlbmV2ZXIgdGhlIHdpbmRvdyBpcyAocmUpZm9jdXNlZC5cbiAgYWRkRXZlbnQod2luZG93LCAnZm9jdXMnLCByZXNldE1vZGlmaWVycyk7XG5cbiAgLy8gc3RvcmUgcHJldmlvdXNseSBkZWZpbmVkIGtleVxuICB2YXIgcHJldmlvdXNLZXkgPSBnbG9iYWwua2V5O1xuXG4gIC8vIHJlc3RvcmUgcHJldmlvdXNseSBkZWZpbmVkIGtleSBhbmQgcmV0dXJuIHJlZmVyZW5jZSB0byBvdXIga2V5IG9iamVjdFxuICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgIHZhciBrID0gZ2xvYmFsLmtleTtcbiAgICBnbG9iYWwua2V5ID0gcHJldmlvdXNLZXk7XG4gICAgcmV0dXJuIGs7XG4gIH1cblxuICAvLyBzZXQgd2luZG93LmtleSBhbmQgd2luZG93LmtleS5zZXQvZ2V0L2RlbGV0ZVNjb3BlLCBhbmQgdGhlIGRlZmF1bHQgZmlsdGVyXG4gIGdsb2JhbC5rZXkgPSBhc3NpZ25LZXk7XG4gIGdsb2JhbC5rZXkuc2V0U2NvcGUgPSBzZXRTY29wZTtcbiAgZ2xvYmFsLmtleS5nZXRTY29wZSA9IGdldFNjb3BlO1xuICBnbG9iYWwua2V5LmRlbGV0ZVNjb3BlID0gZGVsZXRlU2NvcGU7XG4gIGdsb2JhbC5rZXkuZmlsdGVyID0gZmlsdGVyO1xuICBnbG9iYWwua2V5LmlzUHJlc3NlZCA9IGlzUHJlc3NlZDtcbiAgZ2xvYmFsLmtleS5nZXRQcmVzc2VkS2V5Q29kZXMgPSBnZXRQcmVzc2VkS2V5Q29kZXM7XG4gIGdsb2JhbC5rZXkubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7XG4gIGdsb2JhbC5rZXkudW5iaW5kID0gdW5iaW5kS2V5O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IGFzc2lnbktleTtcblxufSkodGhpcyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDtcbiAgfSBlbHNlIHtcbiAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBfc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZUZ1bmN0aW9uKGZuKSB7XG4gIHJldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKGZuKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBNYXAoKSA6IHVuZGVmaW5lZDtcblxuICBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmIChDbGFzcyA9PT0gbnVsbCB8fCAhX2lzTmF0aXZlRnVuY3Rpb24oQ2xhc3MpKSByZXR1cm4gQ2xhc3M7XG5cbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7XG5cbiAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBXcmFwcGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgQ2xhc3MpO1xuICB9O1xuXG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKTtcbn1cblxuLypcclxuICBUaGlzIGlzIGp1c3QgYSBqdW5rIGRyYXdlciwgY29udGFpbmluZyBhbnl0aGluZyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBjbGFzc2VzLlxyXG4gIEJlY2F1c2UgTHV4b24gaXMgc21hbGwoaXNoKSwgdGhpcyBzaG91bGQgc3RheSBzbWFsbCBhbmQgd2Ugd29uJ3Qgd29ycnkgYWJvdXQgc3BsaXR0aW5nXHJcbiAgaXQgdXAgaW50bywgc2F5LCBwYXJzaW5nVXRpbC5qcyBhbmQgYmFzaWNVdGlsLmpzIGFuZCBzbyBvbi4gQnV0IHRoZXkgYXJlIGRpdmlkZWQgdXAgYnkgZmVhdHVyZSBhcmVhLlxyXG4qL1xuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG4vLyBUWVBFU1xuZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwidW5kZWZpbmVkXCI7XG59XG5mdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59IC8vIENBUEFCSUxJVElFU1xuXG5mdW5jdGlvbiBoYXNJbnRsKCkge1xuICByZXR1cm4gdHlwZW9mIEludGwgIT09IFwidW5kZWZpbmVkXCIgJiYgSW50bC5EYXRlVGltZUZvcm1hdDtcbn1cbmZ1bmN0aW9uIGhhc0Zvcm1hdFRvUGFydHMoKSB7XG4gIHJldHVybiAhaXNVbmRlZmluZWQoSW50bC5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyk7XG59IC8vIE9CSkVDVFMgQU5EIEFSUkFZU1xuXG5mdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cbmZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChiZXN0LCBuZXh0KSB7XG4gICAgdmFyIHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuXG4gICAgaWYgKCFiZXN0KSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoYmVzdFswXSwgcGFpclswXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChhLCBrKSB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufSAvLyBOVU1CRVJTIEFORCBTVFJJTkdTXG5cbmZ1bmN0aW9uIG51bWJlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc051bWJlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn0gLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5cbmZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCwgbikge1xuICBpZiAobiA9PT0gdm9pZCAwKSB7XG4gICAgbiA9IDI7XG4gIH1cblxuICBpZiAoaW5wdXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmV0dXJuIChcIjBcIi5yZXBlYXQobikgKyBpbnB1dCkuc2xpY2UoLW4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZU1pbGxpcyhmcmFjdGlvbikge1xuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoXCIwLlwiICsgZnJhY3Rpb24pICogMTAwMDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihmKTtcbiAgfVxufVxuZnVuY3Rpb24gcm91bmRUbyhudW1iZXIsIGRpZ2l0cykge1xuICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRpZ2l0cyk7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59IC8vIERBVEUgQkFTSUNTXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5mdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG59XG5mdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICB2YXIgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgICBtb2RZZWFyID0geWVhciArIChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuXG4gIGlmIChtb2RNb250aCA9PT0gMikge1xuICAgIHJldHVybiBpc0xlYXBZZWFyKG1vZFllYXIpID8gMjkgOiAyODtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gWzMxLCBudWxsLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV1bbW9kTW9udGggLSAxXTtcbiAgfVxufVxuZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIHZhciBwMSA9ICh3ZWVrWWVhciArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICUgNyxcbiAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn0gLy8gUEFSU0lOR1xuXG5mdW5jdGlvbiBwYXJzZVpvbmVJbmZvKHRzLCBvZmZzZXRGb3JtYXQsIGxvY2FsZSwgdGltZVpvbmUpIHtcbiAgaWYgKHRpbWVab25lID09PSB2b2lkIDApIHtcbiAgICB0aW1lWm9uZSA9IG51bGw7XG4gIH1cblxuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgIGludGxPcHRzID0ge1xuICAgIGhvdXIxMjogZmFsc2UsXG4gICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgIGRheTogXCIyLWRpZ2l0XCIsXG4gICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgbWludXRlOiBcIjItZGlnaXRcIlxuICB9O1xuXG4gIGlmICh0aW1lWm9uZSkge1xuICAgIGludGxPcHRzLnRpbWVab25lID0gdGltZVpvbmU7XG4gIH1cblxuICB2YXIgbW9kaWZpZWQgPSBPYmplY3QuYXNzaWduKHtcbiAgICB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdFxuICB9LCBpbnRsT3B0cyksXG4gICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIHZhciBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXRUb1BhcnRzKGRhdGUpLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0aW1lem9uZW5hbWVcIjtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkID8gcGFyc2VkLnZhbHVlIDogbnVsbDtcbiAgfSBlbHNlIGlmIChpbnRsKSB7XG4gICAgLy8gdGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgZm9yIGFsbCBsb2NhbGVzXG4gICAgdmFyIHdpdGhvdXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIGludGxPcHRzKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGluY2x1ZGVkID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBtb2RpZmllZCkuZm9ybWF0KGRhdGUpLFxuICAgICAgICBkaWZmZWQgPSBpbmNsdWRlZC5zdWJzdHJpbmcod2l0aG91dC5sZW5ndGgpLFxuICAgICAgICB0cmltbWVkID0gZGlmZmVkLnJlcGxhY2UoL15bLCBcXHUyMDBlXSsvLCBcIlwiKTtcbiAgICByZXR1cm4gdHJpbW1lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSAvLyBzaWduZWRPZmZzZXQoJy01JywgJzMwJykgLT4gLTMzMFxuXG5mdW5jdGlvbiBzaWduZWRPZmZzZXQob2ZmSG91clN0ciwgb2ZmTWludXRlU3RyKSB7XG4gIHZhciBvZmZIb3VyID0gcGFyc2VJbnQob2ZmSG91clN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgICAgb2ZmTWluU2lnbmVkID0gb2ZmSG91ciA8IDAgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufSAvLyBDT0VSQ0lPTlxuXG5mdW5jdGlvbiBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVyLCBpZ25vcmVVbmtub3duKSB7XG4gIGlmIChpZ25vcmVVbmtub3duID09PSB2b2lkIDApIHtcbiAgICBpZ25vcmVVbmtub3duID0gZmFsc2U7XG4gIH1cblxuICB2YXIgbm9ybWFsaXplZCA9IHt9O1xuXG4gIGZvciAodmFyIHUgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSh1KSkge1xuICAgICAgdmFyIHYgPSBvYmpbdV07XG5cbiAgICAgIGlmICh2ICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2KSAmJiAhTnVtYmVyLmlzTmFOKHYpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBub3JtYWxpemVyKHUsIGlnbm9yZVVua25vd24pO1xuXG4gICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICBub3JtYWxpemVkW21hcHBlZF0gPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiB0aW1lT2JqZWN0KG9iaikge1xuICByZXR1cm4gcGljayhvYmosIFtcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIG4gPSBcIm51bWVyaWNcIixcbiAgICBzID0gXCJzaG9ydFwiLFxuICAgIGwgPSBcImxvbmdcIixcbiAgICBkMiA9IFwiMi1kaWdpdFwiO1xudmFyIERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuXG59O1xudmFyIERBVEVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbFxufTtcbnZhciBUSU1FX1NJTVBMRSA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMlxufTtcbnZhciBUSU1FX1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgVElNRV9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgVElNRV8yNF9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIGhvdXIxMjogZmFsc2Vcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAqL1xuXG52YXIgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cblxudmFyIERBVEVUSU1FX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICovXG5cbnZhciBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG52YXIgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xudmFyIERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG52YXIgREFURVRJTUVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xudmFyIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xudmFyIERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgT2JqZWN0LmtleXMob2JqKS5zb3J0KCkpO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxudmFyIG1vbnRoc0xvbmcgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcbnZhciBtb250aHNTaG9ydCA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcbnZhciBtb250aHNOYXJyb3cgPSBbXCJKXCIsIFwiRlwiLCBcIk1cIiwgXCJBXCIsIFwiTVwiLCBcIkpcIiwgXCJKXCIsIFwiQVwiLCBcIlNcIiwgXCJPXCIsIFwiTlwiLCBcIkRcIl07XG5mdW5jdGlvbiBtb250aHMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIG1vbnRoc05hcnJvdztcblxuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBtb250aHNMb25nO1xuXG4gICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgIHJldHVybiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIiwgXCIxMFwiLCBcIjExXCIsIFwiMTJcIl07XG5cbiAgICBjYXNlIFwiMi1kaWdpdFwiOlxuICAgICAgcmV0dXJuIFtcIjAxXCIsIFwiMDJcIiwgXCIwM1wiLCBcIjA0XCIsIFwiMDVcIiwgXCIwNlwiLCBcIjA3XCIsIFwiMDhcIiwgXCIwOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxudmFyIHdlZWtkYXlzTG9uZyA9IFtcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCIsIFwiU3VuZGF5XCJdO1xudmFyIHdlZWtkYXlzU2hvcnQgPSBbXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIiwgXCJTdW5cIl07XG52YXIgd2Vla2RheXNOYXJyb3cgPSBbXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIiwgXCJTXCJdO1xuZnVuY3Rpb24gd2Vla2RheXMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIHdlZWtkYXlzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNTaG9ydDtcblxuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNMb25nO1xuXG4gICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgIHJldHVybiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG52YXIgbWVyaWRpZW1zID0gW1wiQU1cIiwgXCJQTVwiXTtcbnZhciBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcbnZhciBlcmFzU2hvcnQgPSBbXCJCQ1wiLCBcIkFEXCJdO1xudmFyIGVyYXNOYXJyb3cgPSBbXCJCXCIsIFwiQVwiXTtcbmZ1bmN0aW9uIGVyYXMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGVyYXNOYXJyb3c7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBlcmFzU2hvcnQ7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIGVyYXNMb25nO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSB7XG4gIHJldHVybiBtZXJpZGllbXNbZHQuaG91ciA8IDEyID8gMCA6IDFdO1xufVxuZnVuY3Rpb24gd2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIHdlZWtkYXlzKGxlbmd0aClbZHQud2Vla2RheSAtIDFdO1xufVxuZnVuY3Rpb24gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBtb250aHMobGVuZ3RoKVtkdC5tb250aCAtIDFdO1xufVxuZnVuY3Rpb24gZXJhRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gZXJhcyhsZW5ndGgpW2R0LnllYXIgPCAwID8gMCA6IDFdO1xufVxuZnVuY3Rpb24gZm9ybWF0U3RyaW5nKGtub3duRm9ybWF0KSB7XG4gIC8vIHRoZXNlIGFsbCBoYXZlIHRoZSBvZmZzZXRzIHJlbW92ZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGVtXG4gIC8vIHdpdGhvdXQgYWxsIHRoZSBpbnRsIHN0dWZmIHRoaXMgaXMgYmFja2ZpbGxpbmdcbiAgdmFyIGZpbHRlcmVkID0gcGljayhrbm93bkZvcm1hdCwgW1wid2Vla2RheVwiLCBcImVyYVwiLCBcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJ0aW1lWm9uZU5hbWVcIiwgXCJob3VyMTJcIl0pLFxuICAgICAga2V5ID0gc3RyaW5naWZ5KGZpbHRlcmVkKSxcbiAgICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcblxuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0hVR0UpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5XCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcImg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NIT1JUX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfU0lNUExFKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJISDptbTpzc1wiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRSk6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgfVxufVxuXG4vLyB0aGVzZSBhcmVuJ3QgcmVhbGx5IHByaXZhdGUsIGJ1dCBub3IgYXJlIHRoZXkgcmVhbGx5IHVzZWZ1bCB0byBkb2N1bWVudFxuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG52YXIgTHV4b25FcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEx1eG9uRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gTHV4b25FcnJvcigpIHtcbiAgICByZXR1cm4gX0Vycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBMdXhvbkVycm9yO1xufShfd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cblxudmFyIEludmFsaWREYXRlVGltZUVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcikge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkRGF0ZVRpbWVFcnJvciwgX0x1eG9uRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREYXRlVGltZUVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvci5jYWxsKHRoaXMsIFwiSW52YWxpZCBEYXRlVGltZTogXCIgKyByZWFzb24udG9NZXNzYWdlKCkpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZERhdGVUaW1lRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSW52YWxpZEludGVydmFsRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yMikge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkSW50ZXJ2YWxFcnJvciwgX0x1eG9uRXJyb3IyKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkSW50ZXJ2YWxFcnJvcihyZWFzb24pIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3IyLmNhbGwodGhpcywgXCJJbnZhbGlkIEludGVydmFsOiBcIiArIHJlYXNvbi50b01lc3NhZ2UoKSkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkSW50ZXJ2YWxFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkRHVyYXRpb25FcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3IzKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREdXJhdGlvbkVycm9yLCBfTHV4b25FcnJvcjMpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREdXJhdGlvbkVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjMuY2FsbCh0aGlzLCBcIkludmFsaWQgRHVyYXRpb246IFwiICsgcmVhc29uLnRvTWVzc2FnZSgpKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWREdXJhdGlvbkVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjQpIHtcbiAgX2luaGVyaXRzTG9vc2UoQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IsIF9MdXhvbkVycm9yNCk7XG5cbiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSW52YWxpZFVuaXRFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3I1KSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWRVbml0RXJyb3IsIF9MdXhvbkVycm9yNSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFVuaXRFcnJvcih1bml0KSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yNS5jYWxsKHRoaXMsIFwiSW52YWxpZCB1bml0IFwiICsgdW5pdCkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkVW5pdEVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIEludmFsaWRBcmd1bWVudEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjYpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZEFyZ3VtZW50RXJyb3IsIF9MdXhvbkVycm9yNik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEFyZ3VtZW50RXJyb3IoKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgWm9uZUlzQWJzdHJhY3RFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3I3KSB7XG4gIF9pbmhlcml0c0xvb3NlKFpvbmVJc0Fic3RyYWN0RXJyb3IsIF9MdXhvbkVycm9yNyk7XG5cbiAgZnVuY3Rpb24gWm9uZUlzQWJzdHJhY3RFcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I3LmNhbGwodGhpcywgXCJab25lIGlzIGFuIGFic3RyYWN0IGNsYXNzXCIpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gWm9uZUlzQWJzdHJhY3RFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxyXG4gKiBAaW50ZXJmYWNlXHJcbiAqL1xuXG52YXIgWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFpvbmUoKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBab25lLnByb3RvdHlwZTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXHJcbiAgICogQGFic3RyYWN0XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5mb3JtYXQgLSBXaGF0IHN0eWxlIG9mIG9mZnNldCB0byByZXR1cm4uIEFjY2VwdHMgJ2xvbmcnIG9yICdzaG9ydCcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgb3B0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cclxuICAgKiBAYWJzdHJhY3RcclxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgZXF1YWwgdG8gYW5vdGhlciB6b25lclxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyB2YWxpZC5cclxuICAgKiBAYWJzdHJhY3RcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhab25lLCBbe1xuICAgIGtleTogXCJ0eXBlXCIsXG5cbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHpvbmVcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIHpvbmUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBab25lO1xufSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcblxudmFyIExvY2FsWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoTG9jYWxab25lLCBfWm9uZSk7XG5cbiAgZnVuY3Rpb24gTG9jYWxab25lKCkge1xuICAgIHJldHVybiBfWm9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTG9jYWxab25lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIF9yZWYpIHtcbiAgICB2YXIgZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH07XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH07XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwibG9jYWxcIjtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoTG9jYWxab25lLCBbe1xuICAgIGtleTogXCJ0eXBlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsb2NhbFwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoaGFzSW50bCgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICAgICAgfSBlbHNlIHJldHVybiBcImxvY2FsXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuaXZlcnNhbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJpbnN0YW5jZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiA9PT0gbnVsbCkge1xuICAgICAgICBzaW5nbGV0b24gPSBuZXcgTG9jYWxab25lKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaW5nbGV0b247XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExvY2FsWm9uZTtcbn0oWm9uZSk7XG5cbnZhciBkdGZDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBtYWtlRFRGKHpvbmUpIHtcbiAgaWYgKCFkdGZDYWNoZVt6b25lXSkge1xuICAgIGR0ZkNhY2hlW3pvbmVdID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7XG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgdGltZVpvbmU6IHpvbmUsXG4gICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgIG1vbnRoOiBcIjItZGlnaXRcIixcbiAgICAgIGRheTogXCIyLWRpZ2l0XCIsXG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICBzZWNvbmQ6IFwiMi1kaWdpdFwiXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbnZhciB0eXBlVG9Qb3MgPSB7XG4gIHllYXI6IDAsXG4gIG1vbnRoOiAxLFxuICBkYXk6IDIsXG4gIGhvdXI6IDMsXG4gIG1pbnV0ZTogNCxcbiAgc2Vjb25kOiA1XG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgdmFyIGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXQoZGF0ZSkucmVwbGFjZSgvXFx1MjAwRS9nLCBcIlwiKSxcbiAgICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgICAgZk1vbnRoID0gcGFyc2VkWzFdLFxuICAgICAgZkRheSA9IHBhcnNlZFsyXSxcbiAgICAgIGZZZWFyID0gcGFyc2VkWzNdLFxuICAgICAgZkhvdXIgPSBwYXJzZWRbNF0sXG4gICAgICBmTWludXRlID0gcGFyc2VkWzVdLFxuICAgICAgZlNlY29uZCA9IHBhcnNlZFs2XTtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdFRvUGFydHMoZGF0ZSksXG4gICAgICBmaWxsZWQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHRlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZm9ybWF0dGVkJGkgPSBmb3JtYXR0ZWRbaV0sXG4gICAgICAgIHR5cGUgPSBfZm9ybWF0dGVkJGkudHlwZSxcbiAgICAgICAgdmFsdWUgPSBfZm9ybWF0dGVkJGkudmFsdWUsXG4gICAgICAgIHBvcyA9IHR5cGVUb1Bvc1t0eXBlXTtcblxuICAgIGlmICghaXNVbmRlZmluZWQocG9zKSkge1xuICAgICAgZmlsbGVkW3Bvc10gPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxsZWQ7XG59XG5cbnZhciBJQU5BWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSUFOQVpvbmUsIF9ab25lKTtcblxuICBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyID0gZnVuY3Rpb24gaXNWYWxpZFNwZWNpZmllcihzKSB7XG4gICAgcmV0dXJuIHMgJiYgcy5tYXRjaCgvXlthLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8pPyQvaSk7XG4gIH07XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkWm9uZSh6b25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgICB0aW1lWm9uZTogem9uZVxuICAgICAgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9OyAvLyBFdGMvR01UKzggLT4gLTQ4MFxuXG5cbiAgSUFOQVpvbmUucGFyc2VHTVRPZmZzZXQgPSBmdW5jdGlvbiBwYXJzZUdNVE9mZnNldChzcGVjaWZpZXIpIHtcbiAgICBpZiAoc3BlY2lmaWVyKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBzcGVjaWZpZXIubWF0Y2goL15FdGNcXC9HTVQoWystXVxcZHsxLDJ9KSQvaSk7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gLTYwICogcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIElBTkFab25lKG5hbWUpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9ab25lLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy56b25lTmFtZSA9IG5hbWU7XG4gICAgX3RoaXMudmFsaWQgPSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShuYW1lKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gSUFOQVpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLnpvbmVOYW1lKTtcbiAgfTtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0cyksXG4gICAgICAgIGR0ZiA9IG1ha2VEVEYodGhpcy56b25lTmFtZSksXG4gICAgICAgIF9yZWYyID0gZHRmLmZvcm1hdFRvUGFydHMgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKSxcbiAgICAgICAgZlllYXIgPSBfcmVmMlswXSxcbiAgICAgICAgZk1vbnRoID0gX3JlZjJbMV0sXG4gICAgICAgIGZEYXkgPSBfcmVmMlsyXSxcbiAgICAgICAgZkhvdXIgPSBfcmVmMlszXSxcbiAgICAgICAgZk1pbnV0ZSA9IF9yZWYyWzRdLFxuICAgICAgICBmU2Vjb25kID0gX3JlZjJbNV0sXG4gICAgICAgIGFzVVRDID0gRGF0ZS5VVEMoZlllYXIsIGZNb250aCAtIDEsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kKTtcblxuICAgIHZhciBhc1RTID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgYXNUUyAtPSBhc1RTICUgMTAwMDtcbiAgICByZXR1cm4gKGFzVVRDIC0gYXNUUykgLyAoNjAgKiAxMDAwKTtcbiAgfTtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJpYW5hXCIgJiYgb3RoZXJab25lLnpvbmVOYW1lID09PSB0aGlzLnpvbmVOYW1lO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhJQU5BWm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaWFuYVwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJQU5BWm9uZTtcbn0oWm9uZSk7XG5cbnZhciBzaW5nbGV0b24kMSA9IG51bGw7XG5cbmZ1bmN0aW9uIGhvdXJzTWludXRlc09mZnNldCh6KSB7XG4gIHZhciBob3VycyA9IE1hdGgudHJ1bmMoei5maXhlZCAvIDYwKSxcbiAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyh6LmZpeGVkICUgNjApLFxuICAgICAgc2lnbiA9IGhvdXJzID4gMCA/IFwiK1wiIDogXCItXCIsXG4gICAgICBiYXNlID0gc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcbiAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArIFwiOlwiICsgcGFkU3RhcnQobWludXRlcywgMikgOiBiYXNlO1xufVxuXG52YXIgRml4ZWRPZmZzZXRab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShGaXhlZE9mZnNldFpvbmUsIF9ab25lKTtcblxuICBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UgPSBmdW5jdGlvbiBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllciA9IGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKHMpIHtcbiAgICBpZiAocykge1xuICAgICAgdmFyIHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcblxuICAgICAgaWYgKHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaXhlZE9mZnNldFpvbmUoc2lnbmVkT2Zmc2V0KHJbMV0sIHJbMl0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoRml4ZWRPZmZzZXRab25lLCBudWxsLCBbe1xuICAgIGtleTogXCJ1dGNJbnN0YW5jZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiQxID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiQxID0gbmV3IEZpeGVkT2Zmc2V0Wm9uZSgwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbiQxO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9ab25lLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5maXhlZCA9IG9mZnNldDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRml4ZWRPZmZzZXRab25lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfTtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImZpeGVkXCIgJiYgb3RoZXJab25lLmZpeGVkID09PSB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImZpeGVkXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpeGVkID09PSAwID8gXCJVVENcIiA6IFwiVVRDXCIgKyBob3Vyc01pbnV0ZXNPZmZzZXQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuaXZlcnNhbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGaXhlZE9mZnNldFpvbmU7XG59KFpvbmUpO1xuXG52YXIgSW52YWxpZFpvbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9ab25lKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWRab25lLCBfWm9uZSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFpvbmUoem9uZU5hbWUpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9ab25lLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy56b25lTmFtZSA9IHpvbmVOYW1lO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJbnZhbGlkWm9uZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfTtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoSW52YWxpZFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuaXZlcnNhbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEludmFsaWRab25lO1xufShab25lKTtcblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplWm9uZShpbnB1dCwgZGVmYXVsdFpvbmUpIHtcbiAgdmFyIG9mZnNldDtcblxuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICB2YXIgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09IFwibG9jYWxcIikgcmV0dXJuIExvY2FsWm9uZS5pbnN0YW5jZTtlbHNlIGlmIChsb3dlcmVkID09PSBcInV0Y1wiIHx8IGxvd2VyZWQgPT09IFwiZ210XCIpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gbmV3IElBTkFab25lKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgbmV3IEludmFsaWRab25lKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQub2Zmc2V0ICYmIHR5cGVvZiBpbnB1dC5vZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9XG59XG5cbnZhciBub3cgPSBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufSxcbiAgICBkZWZhdWx0Wm9uZSA9IG51bGwsXG4gICAgLy8gbm90IHNldHRpbmcgdGhpcyBkaXJlY3RseSB0byBMb2NhbFpvbmUuaW5zdGFuY2UgYmMgbG9hZGluZyBvcmRlciBpc3N1ZXNcbmRlZmF1bHRMb2NhbGUgPSBudWxsLFxuICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG51bGwsXG4gICAgdGhyb3dPbkludmFsaWQgPSBmYWxzZTtcbi8qKlxyXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxyXG4gKi9cblxuXG52YXIgU2V0dGluZ3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTZXR0aW5ncygpIHt9XG5cbiAgLyoqXHJcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXHJcbiAgICogQHJldHVybiB7dm9pZH1cclxuICAgKi9cbiAgU2V0dGluZ3MucmVzZXRDYWNoZXMgPSBmdW5jdGlvbiByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTZXR0aW5ncywgbnVsbCwgW3tcbiAgICBrZXk6IFwibm93XCIsXG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBub3c7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbnVtYmVyLCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIEVwb2NoIG1pbGxpc2Vjb25kIGNvdW50XHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiBEYXRlLm5vdygpICsgMzAwMCAvLyBwcmV0ZW5kIGl0IGlzIDMgc2Vjb25kcyBpbiB0aGUgZnV0dXJlXHJcbiAgICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiAwIC8vIGFsd2F5cyBwcmV0ZW5kIGl0J3MgSmFuIDEsIDE5NzAgYXQgbWlkbmlnaHQgaW4gVVRDIHRpbWVcclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChuKSB7XG4gICAgICBub3cgPSBuO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRab25lTmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIChkZWZhdWx0Wm9uZSB8fCBMb2NhbFpvbmUuaW5zdGFuY2UpLm5hbWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh6KSB7XG4gICAgICBpZiAoIXopIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBub3JtYWxpemVab25lKHopO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgb2JqZWN0IHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7Wm9uZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFpvbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Wm9uZSB8fCBMb2NhbFpvbmUuaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0TG9jYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobG9jYWxlKSB7XG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHROdW1iZXJpbmdTeXN0ZW1cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdE91dHB1dENhbGVuZGFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgTHV4b24gd2lsbCB0aHJvdyB3aGVuIGl0IGVuY291bnRlcnMgaW52YWxpZCBEYXRlVGltZXMsIER1cmF0aW9ucywgb3IgSW50ZXJ2YWxzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidGhyb3dPbkludmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aHJvd09uSW52YWxpZDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2V0dGluZ3M7XG59KCk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVRva2VucyhzcGxpdHMsIHRva2VuVG9TdHJpbmcpIHtcbiAgdmFyIHMgPSBcIlwiO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IHNwbGl0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbiA9IF9yZWY7XG5cbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzO1xufVxuXG52YXIgdG9rZW5Ub09iamVjdCA9IHtcbiAgRDogREFURV9TSE9SVCxcbiAgREQ6IERBVEVfTUVELFxuICBEREQ6IERBVEVfRlVMTCxcbiAgRERERDogREFURV9IVUdFLFxuICB0OiBUSU1FX1NJTVBMRSxcbiAgdHQ6IFRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIHR0dHQ6IFRJTUVfV0lUSF9MT05HX09GRlNFVCxcbiAgVDogVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBUSU1FXzI0X1dJVEhfU0VDT05EUyxcbiAgVFRUOiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VULFxuICBUVFRUOiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IERBVEVUSU1FX1NIT1JULFxuICBmZjogREFURVRJTUVfTUVELFxuICBmZmY6IERBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IERBVEVUSU1FX0hVR0UsXG4gIEY6IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyxcbiAgRkY6IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMsXG4gIEZGRkY6IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTXG59O1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgRm9ybWF0dGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgRm9ybWF0dGVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucGFyc2VGb3JtYXQgPSBmdW5jdGlvbiBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICB2YXIgY3VycmVudCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRGdWxsID0gXCJcIixcbiAgICAgICAgYnJhY2tldGVkID0gZmFsc2U7XG4gICAgdmFyIHNwbGl0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gZm10LmNoYXJBdChpKTtcblxuICAgICAgaWYgKGMgPT09IFwiJ1wiKSB7XG4gICAgICAgIGlmIChjdXJyZW50RnVsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3BsaXRzLnB1c2goe1xuICAgICAgICAgICAgbGl0ZXJhbDogYnJhY2tldGVkLFxuICAgICAgICAgICAgdmFsOiBjdXJyZW50RnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIGN1cnJlbnRGdWxsID0gXCJcIjtcbiAgICAgICAgYnJhY2tldGVkID0gIWJyYWNrZXRlZDtcbiAgICAgIH0gZWxzZSBpZiAoYnJhY2tldGVkKSB7XG4gICAgICAgIGN1cnJlbnRGdWxsICs9IGM7XG4gICAgICB9IGVsc2UgaWYgKGMgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXJyZW50RnVsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3BsaXRzLnB1c2goe1xuICAgICAgICAgICAgbGl0ZXJhbDogZmFsc2UsXG4gICAgICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RnVsbCA9IGM7XG4gICAgICAgIGN1cnJlbnQgPSBjO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50RnVsbC5sZW5ndGggPiAwKSB7XG4gICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgIGxpdGVyYWw6IGJyYWNrZXRlZCxcbiAgICAgICAgdmFsOiBjdXJyZW50RnVsbFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwbGl0cztcbiAgfTtcblxuICBmdW5jdGlvbiBGb3JtYXR0ZXIobG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gZm9ybWF0T3B0cztcbiAgICB0aGlzLmxvYyA9IGxvY2FsZTtcbiAgICB0aGlzLnN5c3RlbUxvYyA9IG51bGw7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQgPSBmdW5jdGlvbiBmb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgb3B0cykge1xuICAgIGlmICh0aGlzLnN5c3RlbUxvYyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zeXN0ZW1Mb2MgPSB0aGlzLmxvYy5yZWRlZmF1bHRUb1N5c3RlbSgpO1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdERhdGVUaW1lID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RGF0ZVRpbWVQYXJ0cyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uIHJlc29sdmVkT3B0aW9ucyhkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLnJlc29sdmVkT3B0aW9ucygpO1xuICB9O1xuXG4gIF9wcm90by5udW0gPSBmdW5jdGlvbiBudW0obiwgcCkge1xuICAgIGlmIChwID09PSB2b2lkIDApIHtcbiAgICAgIHAgPSAwO1xuICAgIH1cblxuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICB2YXIgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICBpZiAocCA+IDApIHtcbiAgICAgIG9wdHMucGFkVG8gPSBwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYy5udW1iZXJGb3JtYXR0ZXIob3B0cykuZm9ybWF0KG4pO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIga25vd25FbmdsaXNoID0gdGhpcy5sb2MubGlzdGluZ01vZGUoKSA9PT0gXCJlblwiO1xuXG4gICAgdmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvcHRzLCBleHRyYWN0KSB7XG4gICAgICByZXR1cm4gX3RoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpO1xuICAgIH0sXG4gICAgICAgIGZvcm1hdE9mZnNldCA9IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvcHRzKSB7XG4gICAgICBpZiAoZHQuaXNPZmZzZXRGaXhlZCAmJiBkdC5vZmZzZXQgPT09IDAgJiYgb3B0cy5hbGxvd1opIHtcbiAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaG91cnMgPSBNYXRoLnRydW5jKGR0Lm9mZnNldCAvIDYwKSxcbiAgICAgICAgICBtaW51dGVzID0gTWF0aC5hYnMoZHQub2Zmc2V0ICUgNjApLFxuICAgICAgICAgIHNpZ24gPSBob3VycyA+PSAwID8gXCIrXCIgOiBcIi1cIixcbiAgICAgICAgICBiYXNlID0gXCJcIiArIHNpZ24gKyBNYXRoLmFicyhob3Vycyk7XG5cbiAgICAgIHN3aXRjaCAob3B0cy5mb3JtYXQpIHtcbiAgICAgICAgY2FzZSBcInNob3J0XCI6XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBcIjpcIiArIF90aGlzLm51bShtaW51dGVzLCAyKTtcblxuICAgICAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArIFwiOlwiICsgbWludXRlcyA6IGJhc2U7XG5cbiAgICAgICAgY2FzZSBcInRlY2hpZVwiOlxuICAgICAgICAgIHJldHVybiBcIlwiICsgc2lnbiArIF90aGlzLm51bShNYXRoLmFicyhob3VycyksIDIpICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJWYWx1ZSBmb3JtYXQgXCIgKyBvcHRzLmZvcm1hdCArIFwiIGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0XCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIG1lcmlkaWVtID0gZnVuY3Rpb24gbWVyaWRpZW0oKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkgOiBzdHJpbmcoe1xuICAgICAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICAgICAgaG91cjEyOiB0cnVlXG4gICAgICB9LCBcImRheXBlcmlvZFwiKTtcbiAgICB9LFxuICAgICAgICBtb250aCA9IGZ1bmN0aW9uIG1vbnRoKGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHtcbiAgICAgICAgbW9udGg6IGxlbmd0aFxuICAgICAgfSA6IHtcbiAgICAgICAgbW9udGg6IGxlbmd0aCxcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSwgXCJtb250aFwiKTtcbiAgICB9LFxuICAgICAgICB3ZWVrZGF5ID0gZnVuY3Rpb24gd2Vla2RheShsZW5ndGgsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgICB9IDoge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGgsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSwgXCJ3ZWVrZGF5XCIpO1xuICAgIH0sXG4gICAgICAgIG1heWJlTWFjcm8gPSBmdW5jdGlvbiBtYXliZU1hY3JvKHRva2VuKSB7XG4gICAgICB2YXIgbWFjcm8gPSB0b2tlblRvT2JqZWN0W3Rva2VuXTtcblxuICAgICAgaWYgKG1hY3JvKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgbWFjcm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIGVyYSA9IGZ1bmN0aW9uIGVyYShsZW5ndGgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7XG4gICAgICAgIGVyYTogbGVuZ3RoXG4gICAgICB9LCBcImVyYVwiKTtcbiAgICB9LFxuICAgICAgICB0b2tlblRvU3RyaW5nID0gZnVuY3Rpb24gdG9rZW5Ub1N0cmluZyh0b2tlbikge1xuICAgICAgdmFyIG91dHB1dENhbCA9IF90aGlzLmxvYy5vdXRwdXRDYWxlbmRhcjsgLy8gV2hlcmUgcG9zc2libGU6IGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL3RyYW5zbGF0aW9uL2RhdGUtdGltZSNUT0MtU3RhbmQtQWxvbmUtdnMuLUZvcm1hdC1TdHlsZXNcblxuICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAvLyBtc1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJ1XCI6IC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgIC8vIHNlY29uZHNcblxuICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kKTtcblxuICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCwgMik7XG4gICAgICAgIC8vIG1pbnV0ZXNcblxuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWludXRlKTtcblxuICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbnV0ZSwgMik7XG4gICAgICAgIC8vIGhvdXJzXG5cbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyKTtcblxuICAgICAgICBjYXNlIFwiaGhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyLCAyKTtcblxuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91cik7XG5cbiAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyLCAyKTtcbiAgICAgICAgLy8gb2Zmc2V0XG5cbiAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgICAvLyBsaWtlICs2XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7XG4gICAgICAgICAgICBmb3JtYXQ6IFwibmFycm93XCIsXG4gICAgICAgICAgICBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgLy8gbGlrZSArMDY6MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7XG4gICAgICAgICAgICBmb3JtYXQ6IFwidGVjaGllXCIsXG4gICAgICAgICAgICBhbGxvd1o6IGZhbHNlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlIEVTVFxuICAgICAgICAgIHJldHVybiBkdC5vZmZzZXROYW1lU2hvcnQ7XG5cbiAgICAgICAgY2FzZSBcIlpaWlpaXCI6XG4gICAgICAgICAgLy8gbGlrZSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcbiAgICAgICAgICByZXR1cm4gZHQub2Zmc2V0TmFtZUxvbmc7XG4gICAgICAgIC8vIHpvbmVcblxuICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgIHJldHVybiBkdC56b25lTmFtZTtcbiAgICAgICAgLy8gbWVyaWRpZW1zXG5cbiAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICByZXR1cm4gbWVyaWRpZW0oKTtcbiAgICAgICAgLy8gZGF0ZXNcblxuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwiZGF5XCIpIDogX3RoaXMubnVtKGR0LmRheSk7XG5cbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBkYXk6IFwiMi1kaWdpdFwiXG4gICAgICAgICAgfSwgXCJkYXlcIikgOiBfdGhpcy5udW0oZHQuZGF5LCAyKTtcbiAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrZGF5KTtcblxuICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlcydcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiRUVFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gc3RhbmRhbG9uZVxuXG4gICAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCJudW1lcmljXCIsXG4gICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IF90aGlzLm51bShkdC5tb250aCk7XG5cbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMSwgZG9lc24ndCBzZWVtIHRvIHdvcmtcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIjItZGlnaXRcIixcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcblxuICAgICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgIHJldHVybiBtb250aChcImxvbmdcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAvLyBtb250aHMgLSBmb3JtYXRcblxuICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IF90aGlzLm51bShkdC5tb250aCk7XG5cbiAgICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwiMi1kaWdpdFwiXG4gICAgICAgICAgfSwgXCJtb250aFwiKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG5cbiAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgLy8geWVhcnNcblxuICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgIC8vIGxpa2UgMjAxNFxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhcik7XG5cbiAgICAgICAgY2FzZSBcInl5XCI6XG4gICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG5cbiAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDAwMTJcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIHllYXI6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJ5ZWFyXCIpIDogX3RoaXMubnVtKGR0LnllYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDAwMDAxMlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhciwgNik7XG4gICAgICAgIC8vIGVyYXNcblxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICByZXR1cm4gZXJhKFwic2hvcnRcIik7XG5cbiAgICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgIHJldHVybiBlcmEoXCJsb25nXCIpO1xuXG4gICAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICAgIHJldHVybiBlcmEoXCJuYXJyb3dcIik7XG5cbiAgICAgICAgY2FzZSBcImtrXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG5cbiAgICAgICAgY2FzZSBcImtra2tcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtZZWFyLCA0KTtcblxuICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla051bWJlcik7XG5cbiAgICAgICAgY2FzZSBcIldXXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcblxuICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQub3JkaW5hbCk7XG5cbiAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQub3JkaW5hbCwgMyk7XG5cbiAgICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnF1YXJ0ZXIpO1xuXG4gICAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnF1YXJ0ZXIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShNYXRoLmZsb29yKGR0LnRzIC8gMTAwMCkpO1xuXG4gICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC50cyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbWF5YmVNYWNybyh0b2tlbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcgPSBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbkZyb21TdHJpbmcoZHVyLCBmbXQpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciB0b2tlblRvRmllbGQgPSBmdW5jdGlvbiB0b2tlblRvRmllbGQodG9rZW4pIHtcbiAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgICByZXR1cm4gXCJtaWxsaXNlY29uZFwiO1xuXG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG5cbiAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBcImRheVwiO1xuXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcblxuICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKGxpbGR1cikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICB2YXIgbWFwcGVkID0gdG9rZW5Ub0ZpZWxkKHRva2VuKTtcblxuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5udW0obGlsZHVyLmdldChtYXBwZWQpLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgICAgcmVhbFRva2VucyA9IHRva2Vucy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBfcmVmMikge1xuICAgICAgdmFyIGxpdGVyYWwgPSBfcmVmMi5saXRlcmFsLFxuICAgICAgICAgIHZhbCA9IF9yZWYyLnZhbDtcbiAgICAgIHJldHVybiBsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKTtcbiAgICB9LCBbXSksXG4gICAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvLmFwcGx5KGR1ciwgcmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pKTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnModG9rZW5zLCB0b2tlblRvU3RyaW5nKGNvbGxhcHNlZCkpO1xuICB9O1xuXG4gIHJldHVybiBGb3JtYXR0ZXI7XG59KCk7XG5cbnZhciBpbnRsRFRDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzKSB7XG4gIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICB2YXIgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcblxuICBpZiAoIWR0Zikge1xuICAgIGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bERUQ2FjaGVba2V5XSA9IGR0ZjtcbiAgfVxuXG4gIHJldHVybiBkdGY7XG59XG5cbnZhciBpbnRsTnVtQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q2FjaGVuZElORihsb2NTdHJpbmcsIG9wdHMpIHtcbiAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBvcHRzXSk7XG4gIHZhciBpbmYgPSBpbnRsTnVtQ2FjaGVba2V5XTtcblxuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG5cbiAgcmV0dXJuIGluZjtcbn1cblxudmFyIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gc3lzdGVtTG9jYWxlKCkge1xuICBpZiAoc3lzTG9jYWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSBpZiAoaGFzSW50bCgpKSB7XG4gICAgdmFyIGNvbXB1dGVkU3lzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7IC8vIG5vZGUgc29tZXRpbWVzIGRlZmF1bHRzIHRvIFwidW5kXCIuIE92ZXJyaWRlIHRoYXQgYmVjYXVzZSB0aGF0IGlzIGR1bWJcblxuICAgIHN5c0xvY2FsZUNhY2hlID0gY29tcHV0ZWRTeXMgPT09IFwidW5kXCIgPyBcImVuLVVTXCIgOiBjb21wdXRlZFN5cztcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBcImVuLVVTXCI7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTG9jYWxlU3RyaW5nKGxvY2FsZVN0cikge1xuICAvLyBJIHJlYWxseSB3YW50IHRvIGF2b2lkIHdyaXRpbmcgYSBCQ1AgNDcgcGFyc2VyXG4gIC8vIHNlZSwgZS5nLiBodHRwczovL2dpdGh1Yi5jb20vd29vb3JtL2JjcC00N1xuICAvLyBJbnRlYWQsIHdlJ2xsIGRvIHRoaXM6XG4gIC8vIGEpIGlmIHRoZSBzdHJpbmcgaGFzIG5vIC11IGV4dGVuc2lvbnMsIGp1c3QgbGVhdmUgaXQgYWxvbmVcbiAgLy8gYikgaWYgaXQgZG9lcywgdXNlIEludGwgdG8gcmVzb2x2ZSBldmVyeXRoaW5nXG4gIC8vIGMpIGlmIEludGwgZmFpbHMsIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSAtdVxuICB2YXIgdUluZGV4ID0gbG9jYWxlU3RyLmluZGV4T2YoXCItdS1cIik7XG5cbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgdmFyIG9wdGlvbnM7XG4gICAgdmFyIHNtYWxsZXIgPSBsb2NhbGVTdHIuc3Vic3RyaW5nKDAsIHVJbmRleCk7XG5cbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9vcHRpb25zLmNhbGVuZGFyOyAvLyByZXR1cm4gdGhlIHNtYWxsZXIgb25lIHNvIHRoYXQgd2UgY2FuIGFwcGVuZCB0aGUgY2FsZW5kYXIgYW5kIG51bWJlcmluZyBvdmVycmlkZXMgdG8gaXRcblxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKGhhc0ludGwoKSkge1xuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICBsb2NhbGVTdHIgKz0gXCItY2EtXCIgKyBvdXRwdXRDYWxlbmRhcjtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgICBsb2NhbGVTdHIgKz0gXCItbnUtXCIgKyBudW1iZXJpbmdTeXN0ZW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhbGVTdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2NhbGVTdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBNb250aHMoZikge1xuICB2YXIgbXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgdmFyIGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDc7IGkrKykge1xuICAgIHZhciBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuXG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbGlzdFN0dWZmKGxvYywgbGVuZ3RoLCBkZWZhdWx0T0ssIGVuZ2xpc2hGbiwgaW50bEZuKSB7XG4gIHZhciBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aChcImVuXCIpIHx8IGhhc0ludGwoKSAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiO1xuICB9XG59XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cblxudmFyIFNpbXBsZU51bWJlckZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNpbXBsZU51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoaSkge1xuICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiByb3VuZFRvKGksIDMpO1xuICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gIH07XG5cbiAgcmV0dXJuIFNpbXBsZU51bWJlckZvcm1hdHRlcjtcbn0oKTtcblxudmFyIEludGxOdW1iZXJGb3JtYXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnRsTnVtYmVyRm9ybWF0dGVyKGludGwsIG9wdHMpIHtcbiAgICB2YXIgaW50bE9wdHMgPSB7XG4gICAgICB1c2VHcm91cGluZzogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKG9wdHMucGFkVG8gPiAwKSB7XG4gICAgICBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgfVxuXG4gICAgdGhpcy5mbG9vciA9IG9wdHMuZmxvb3I7XG4gICAgdGhpcy5pbmYgPSBnZXRDYWNoZW5kSU5GKGludGwsIGludGxPcHRzKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gSW50bE51bWJlckZvcm1hdHRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoaSkge1xuICAgIHZhciBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogaTtcbiAgICByZXR1cm4gdGhpcy5pbmYuZm9ybWF0KGZpeGVkKTtcbiAgfTtcblxuICByZXR1cm4gSW50bE51bWJlckZvcm1hdHRlcjtcbn0oKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgUG9seURhdGVGb3JtYXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgaW50bCwgb3B0cykge1xuICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgdGhpcy5oYXNJbnRsID0gaGFzSW50bCgpO1xuICAgIHZhciB6O1xuXG4gICAgaWYgKGR0LnpvbmUudW5pdmVyc2FsICYmIHRoaXMuaGFzSW50bCkge1xuICAgICAgLy8gQ2hyb21pdW0gZG9lc24ndCBzdXBwb3J0IGZpeGVkLW9mZnNldCB6b25lcyBsaWtlIEV0Yy9HTVQrOCBpbiBpdHMgZm9ybWF0dGVyLFxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM2NDM3NC5cbiAgICAgIC8vIFNvIHdlIGhhdmUgdG8gbWFrZSBkby4gVHdvIGNhc2VzOlxuICAgICAgLy8gMS4gVGhlIGZvcm1hdCBvcHRpb25zIHRlbGwgdXMgdG8gc2hvdyB0aGUgem9uZS4gV2UgY2FuJ3QgZG8gdGhhdCwgc28gdGhlIGJlc3RcbiAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgLy8gMi4gVGhlIGZvcm1hdCBvcHRpb25zIGRvbid0IHRlbGwgdXMgdG8gc2hvdyB0aGUgem9uZS4gVGhlbiB3ZSBjYW4gYWRqdXN0IHRoZW1cbiAgICAgIC8vIHRoZSB0aW1lIGFuZCB0ZWxsIHRoZSBmb3JtYXR0ZXIgdG8gc2hvdyBpdCB0byB1cyBpbiBVVEMsIHNvIHRoYXQgdGhlIHRpbWUgaXMgcmlnaHRcbiAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgLy8gV2UgY2FuIGNsZWFuIGFsbCB0aGlzIHVwIHdoZW4gQ2hyb21lIGZpeGVzIHRoaXMuXG4gICAgICB6ID0gXCJVVENcIjtcblxuICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZHQuem9uZS50eXBlID09PSBcImxvY2FsXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNJbnRsKSB7XG4gICAgICB2YXIgaW50bE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAoeikge1xuICAgICAgICBpbnRsT3B0cy50aW1lWm9uZSA9IHo7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHRmID0gZ2V0Q2FjaGVkRFRGKGludGwsIGludGxPcHRzKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvMyA9IFBvbHlEYXRlRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICBpZiAodGhpcy5oYXNJbnRsKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0KHRoaXMuZHQudG9KU0RhdGUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0b2tlbkZvcm1hdCA9IGZvcm1hdFN0cmluZyh0aGlzLm9wdHMpLFxuICAgICAgICAgIGxvYyA9IExvY2FsZS5jcmVhdGUoXCJlbi1VU1wiKTtcbiAgICAgIHJldHVybiBGb3JtYXR0ZXIuY3JlYXRlKGxvYykuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMuZHQsIHRva2VuRm9ybWF0KTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5mb3JtYXRUb1BhcnRzID0gZnVuY3Rpb24gZm9ybWF0VG9QYXJ0cygpIHtcbiAgICBpZiAodGhpcy5oYXNJbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGEgY29wIG91dC4gV2UgYWN0dWFsbHkgY291bGQgZG8gdGhpcyBmb3IgRW5nbGlzaC4gSG93ZXZlciwgd2UgY291bGRuJ3QgZG8gaXQgZm9yIGludGwgc3RyaW5nc1xuICAgICAgLy8gYW5kIElNTyBpdCdzIHRvbyB3ZWlyZCB0byBoYXZlIGFuIHVuY2FubnkgdmFsbGV5IGxpa2UgdGhhdFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5oYXNJbnRsKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogXCJlbi1VU1wiLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW06IFwibGF0blwiLFxuICAgICAgICBvdXRwdXRDYWxlbmRhcjogXCJncmVnb3J5XCJcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBQb2x5RGF0ZUZvcm1hdHRlcjtcbn0oKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgTG9jYWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgTG9jYWxlLmZyb21PcHRzID0gZnVuY3Rpb24gZnJvbU9wdHMob3B0cykge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKG9wdHMubG9jYWxlLCBvcHRzLm51bWJlcmluZ1N5c3RlbSwgb3B0cy5vdXRwdXRDYWxlbmRhciwgb3B0cy5kZWZhdWx0VG9FTik7XG4gIH07XG5cbiAgTG9jYWxlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIsIGRlZmF1bHRUb0VOKSB7XG4gICAgaWYgKGRlZmF1bHRUb0VOID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRUb0VOID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHNwZWNpZmllZExvY2FsZSA9IGxvY2FsZSB8fCBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlLFxuICAgICAgICAvLyB0aGUgc3lzdGVtIGxvY2FsZSBpcyB1c2VmdWwgZm9yIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MgYnV0IGFubm95aW5nIGZvciBwYXJzaW5nL2Zvcm1hdHRpbmcga25vd24gZm9ybWF0c1xuICAgIGxvY2FsZVIgPSBzcGVjaWZpZWRMb2NhbGUgfHwgKGRlZmF1bHRUb0VOID8gXCJlbi1VU1wiIDogc3lzdGVtTG9jYWxlKCkpLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyUiA9IG91dHB1dENhbGVuZGFyIHx8IFNldHRpbmdzLmRlZmF1bHRPdXRwdXRDYWxlbmRhcjtcbiAgICByZXR1cm4gbmV3IExvY2FsZShsb2NhbGVSLCBudW1iZXJpbmdTeXN0ZW1SLCBvdXRwdXRDYWxlbmRhclIsIHNwZWNpZmllZExvY2FsZSk7XG4gIH07XG5cbiAgTG9jYWxlLnJlc2V0Q2FjaGUgPSBmdW5jdGlvbiByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICB9O1xuXG4gIExvY2FsZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBMb2NhbGUobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICB2YXIgX3BhcnNlTG9jYWxlU3RyaW5nID0gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICAgICAgcGFyc2VkTG9jYWxlID0gX3BhcnNlTG9jYWxlU3RyaW5nWzBdLFxuICAgICAgICBwYXJzZWROdW1iZXJpbmdTeXN0ZW0gPSBfcGFyc2VMb2NhbGVTdHJpbmdbMV0sXG4gICAgICAgIHBhcnNlZE91dHB1dENhbGVuZGFyID0gX3BhcnNlTG9jYWxlU3RyaW5nWzJdO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tb250aHNDYWNoZSA9IHtcbiAgICAgIGZvcm1hdDoge30sXG4gICAgICBzdGFuZGFsb25lOiB7fVxuICAgIH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICB2YXIgX3Byb3RvNCA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNC5saXN0aW5nTW9kZSA9IGZ1bmN0aW9uIGxpc3RpbmdNb2RlKGRlZmF1bHRPSykge1xuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaW50bCA9IGhhc0ludGwoKSxcbiAgICAgICAgaGFzRlRQID0gaW50bCAmJiBoYXNGb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIGlzQWN0dWFsbHlFbiA9IHRoaXMubG9jYWxlID09PSBcImVuXCIgfHwgdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJlbi11c1wiIHx8IGludGwgJiYgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmludGwpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZS5zdGFydHNXaXRoKFwiZW4tdXNcIiksXG4gICAgICAgIGhhc05vV2VpcmRuZXNzID0gKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gXCJncmVnb3J5XCIpO1xuXG4gICAgaWYgKCFoYXNGVFAgJiYgIShpc0FjdHVhbGx5RW4gJiYgaGFzTm9XZWlyZG5lc3MpICYmICFkZWZhdWx0T0spIHtcbiAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgfSBlbHNlIGlmICghaGFzRlRQIHx8IGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykge1xuICAgICAgcmV0dXJuIFwiZW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiaW50bFwiO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG80LmNsb25lID0gZnVuY3Rpb24gY2xvbmUoYWx0cykge1xuICAgIGlmICghYWx0cyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbHRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSwgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciwgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQucmVkZWZhdWx0VG9FTiA9IGZ1bmN0aW9uIHJlZGVmYXVsdFRvRU4oYWx0cykge1xuICAgIGlmIChhbHRzID09PSB2b2lkIDApIHtcbiAgICAgIGFsdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7XG4gICAgICBkZWZhdWx0VG9FTjogdHJ1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG80LnJlZGVmYXVsdFRvU3lzdGVtID0gZnVuY3Rpb24gcmVkZWZhdWx0VG9TeXN0ZW0oYWx0cykge1xuICAgIGlmIChhbHRzID09PSB2b2lkIDApIHtcbiAgICAgIGFsdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7XG4gICAgICBkZWZhdWx0VG9FTjogZmFsc2VcbiAgICB9KSk7XG4gIH07XG5cbiAgX3Byb3RvNC5tb250aHMgPSBmdW5jdGlvbiBtb250aHMkJDEobGVuZ3RoLCBmb3JtYXQsIGRlZmF1bHRPSykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoZm9ybWF0ID09PSB2b2lkIDApIHtcbiAgICAgIGZvcm1hdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBtb250aHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8ge1xuICAgICAgICBtb250aDogbGVuZ3RoLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9IDoge1xuICAgICAgICBtb250aDogbGVuZ3RoXG4gICAgICB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/IFwiZm9ybWF0XCIgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgICAgaWYgKCFfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwTW9udGhzKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIm1vbnRoXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMkJDEobGVuZ3RoLCBmb3JtYXQsIGRlZmF1bHRPSykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7XG4gICAgICBmb3JtYXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdE9LID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRPSyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgd2Vla2RheXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8ge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGgsXG4gICAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgICBtb250aDogXCJsb25nXCIsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0gOiB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aFxuICAgICAgfSxcbiAgICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG5cbiAgICAgIGlmICghX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIF90aGlzMi53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuZXh0cmFjdChkdCwgaW50bCwgXCJ3ZWVrZGF5XCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMi53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80Lm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyQkMShkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIHVuZGVmaW5lZCwgZGVmYXVsdE9LLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVyaWRpZW1zO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAvLyBmb3IgQU0gYW5kIFBNLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBtYWtlcyBwYXJzaW5nIHdheSBlYXNpZXIuXG4gICAgICBpZiAoIV90aGlzMy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgIHZhciBpbnRsID0ge1xuICAgICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICAgIGhvdXIxMjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBfdGhpczMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczMubWVyaWRpZW1DYWNoZTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmVyYXMgPSBmdW5jdGlvbiBlcmFzJCQxKGxlbmd0aCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAoZGVmYXVsdE9LID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRPSyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgZXJhcywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSB7XG4gICAgICAgIGVyYTogbGVuZ3RoXG4gICAgICB9OyAvLyBUaGlzIGlzIHV0dGVyIGJ1bGxzaGl0LiBEaWZmZXJlbnQgY2FsZW5kYXJzIGFyZSBnb2luZyB0byBkZWZpbmUgZXJhcyB0b3RhbGx5IGRpZmZlcmVudGx5LiBXaGF0IEkgbmVlZCBpcyB0aGUgbWluaW11bSBzZXQgb2YgZGF0ZXNcbiAgICAgIC8vIHRvIGRlZmluaXRlbHkgZW51bWVyYXRlIHRoZW0uXG5cbiAgICAgIGlmICghX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0gPSBbRGF0ZVRpbWUudXRjKC00MCwgMSwgMSksIERhdGVUaW1lLnV0YygyMDE3LCAxLCAxKV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczQuZXh0cmFjdChkdCwgaW50bCwgXCJlcmFcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvNC5leHRyYWN0ID0gZnVuY3Rpb24gZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgdmFyIGRmID0gdGhpcy5kdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpLFxuICAgICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgICBtYXRjaGluZyA9IHJlc3VsdHMuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZDtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2hpbmcgPyBtYXRjaGluZy52YWx1ZSA6IG51bGw7XG4gIH07XG5cbiAgX3Byb3RvNC5udW1iZXJGb3JtYXR0ZXIgPSBmdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXIob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZvcmNlc2ltcGxlIG9wdGlvbiBpcyBuZXZlciB1c2VkICh0aGUgb25seSBjYWxsZXIgc2hvcnQtY2lyY3VpdHMgb24gaXQsIGJ1dCBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSlcbiAgICAvLyAoaW4gY29udHJhc3QsIHRoZSByZXN0IG9mIHRoZSBjb25kaXRpb24gaXMgdXNlZCBoZWF2aWx5KVxuICAgIGlmIChvcHRzLmZvcmNlU2ltcGxlIHx8IHRoaXMuZmFzdE51bWJlcnMgfHwgIWhhc0ludGwoKSkge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIob3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50bE51bWJlckZvcm1hdHRlcih0aGlzLmludGwsIG9wdHMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG80LmR0Rm9ybWF0dGVyID0gZnVuY3Rpb24gZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSB7XG4gICAgaWYgKGludGxPcHRzID09PSB2b2lkIDApIHtcbiAgICAgIGludGxPcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH07XG5cbiAgX3Byb3RvNC5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJiB0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gb3RoZXIubnVtYmVyaW5nU3lzdGVtICYmIHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG90aGVyLm91dHB1dENhbGVuZGFyO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhMb2NhbGUsIFt7XG4gICAga2V5OiBcImZhc3ROdW1iZXJzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPSBzdXBwb3J0c0Zhc3ROdW1iZXJzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9jYWxlO1xufSgpO1xuXG4vKlxyXG4gKiBUaGlzIGZpbGUgaGFuZGxlcyBwYXJzaW5nIGZvciB3ZWxsLXNwZWNpZmllZCBmb3JtYXRzLiBIZXJlJ3MgaG93IGl0IHdvcmtzOlxyXG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cclxuICogQW4gZXh0cmFjdG9yIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcmVnZXggbWF0Y2ggYXJyYXkgYW5kIHJldHVybnMgYSB7IHllYXI6IC4uLiwgbW9udGg6IC4uLiB9IG9iamVjdFxyXG4gKiBwYXJzZSgpIGRvZXMgdGhlIHdvcmsgb2YgZXhlY3V0aW5nIHRoZSByZWdleCBhbmQgYXBwbHlpbmcgdGhlIGV4dHJhY3Rvci4gSXQgdGFrZXMgbXVsdGlwbGUgcmVnZXgvZXh0cmFjdG9yIHBhaXJzIHRvIHRyeSBpbiBzZXF1ZW5jZS5cclxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXHJcbiAqIGNvbWJpbmVFeHRyYWN0b3JzKCkgZG9lcyB0aGUgd29yayBvZiBjb21iaW5pbmcgdGhlbSwga2VlcGluZyB0cmFjayBvZiB0aGUgY3Vyc29yIHRocm91Z2ggbXVsdGlwbGUgZXh0cmFjdGlvbnMuXHJcbiAqIFNvbWUgZXh0cmFjdGlvbnMgYXJlIHN1cGVyIGR1bWIgYW5kIHNpbXBsZVBhcnNlIGFuZCBmcm9tU3RyaW5ncyBoZWxwIERSWSB0aGVtLlxyXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZWdleGVzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZ2V4ZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgZnVsbCA9IHJlZ2V4ZXMucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyByLnNvdXJjZTtcbiAgfSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoXCJeXCIgKyBmdWxsICsgXCIkXCIpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycygpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBleHRyYWN0b3JzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgZXh0cmFjdG9yc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChtKSB7XG4gICAgcmV0dXJuIGV4dHJhY3RvcnMucmVkdWNlKGZ1bmN0aW9uIChfcmVmLCBleCkge1xuICAgICAgdmFyIG1lcmdlZFZhbHMgPSBfcmVmWzBdLFxuICAgICAgICAgIG1lcmdlZFpvbmUgPSBfcmVmWzFdLFxuICAgICAgICAgIGN1cnNvciA9IF9yZWZbMl07XG5cbiAgICAgIHZhciBfZXggPSBleChtLCBjdXJzb3IpLFxuICAgICAgICAgIHZhbCA9IF9leFswXSxcbiAgICAgICAgICB6b25lID0gX2V4WzFdLFxuICAgICAgICAgIG5leHQgPSBfZXhbMl07XG5cbiAgICAgIHJldHVybiBbT2JqZWN0LmFzc2lnbihtZXJnZWRWYWxzLCB2YWwpLCBtZXJnZWRab25lIHx8IHpvbmUsIG5leHRdO1xuICAgIH0sIFt7fSwgbnVsbCwgMV0pLnNsaWNlKDAsIDIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZShzKSB7XG4gIGlmIChzID09IG51bGwpIHtcbiAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICB9XG5cbiAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBwYXR0ZXJucyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgcGF0dGVybnNbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gIH1cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcGF0dGVybnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9wYXR0ZXJucyRfaSA9IHBhdHRlcm5zW19pXSxcbiAgICAgICAgcmVnZXggPSBfcGF0dGVybnMkX2lbMF0sXG4gICAgICAgIGV4dHJhY3RvciA9IF9wYXR0ZXJucyRfaVsxXTtcbiAgICB2YXIgbSA9IHJlZ2V4LmV4ZWMocyk7XG5cbiAgICBpZiAobSkge1xuICAgICAgcmV0dXJuIGV4dHJhY3RvcihtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW251bGwsIG51bGxdO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVQYXJzZSgpIHtcbiAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAga2V5c1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChtYXRjaCwgY3Vyc29yKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldFtrZXlzW2ldXSA9IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3JldCwgbnVsbCwgY3Vyc29yICsgaV07XG4gIH07XG59IC8vIElTTyBhbmQgU1FMIHBhcnNpbmdcblxuXG52YXIgb2Zmc2V0UmVnZXggPSAvKD86KFopfChbKy1dXFxkXFxkKSg/Ojo/KFxcZFxcZCkpPykvLFxuICAgIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsOX0pKT8pPyk/LyxcbiAgICBpc29UaW1lUmVnZXggPSBSZWdFeHAoXCJcIiArIGlzb1RpbWVCYXNlUmVnZXguc291cmNlICsgb2Zmc2V0UmVnZXguc291cmNlICsgXCI/XCIpLFxuICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OlRcIiArIGlzb1RpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpLFxuICAgIGlzb1ltZFJlZ2V4ID0gLyhbKy1dXFxkezZ9fFxcZHs0fSkoPzotPyhcXGRcXGQpKD86LT8oXFxkXFxkKSk/KT8vLFxuICAgIGlzb1dlZWtSZWdleCA9IC8oXFxkezR9KS0/VyhcXGRcXGQpKD86LT8oXFxkKSk/LyxcbiAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICBleHRyYWN0SVNPV2Vla0RhdGEgPSBzaW1wbGVQYXJzZShcIndlZWtZZWFyXCIsIFwid2Vla051bWJlclwiLCBcIndlZWtEYXlcIiksXG4gICAgZXh0cmFjdElTT09yZGluYWxEYXRhID0gc2ltcGxlUGFyc2UoXCJ5ZWFyXCIsIFwib3JkaW5hbFwiKSxcbiAgICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sXG4gICAgLy8gZHVtYmVkLWRvd24gdmVyc2lvbiBvZiB0aGUgSVNPIG9uZVxuc3FsVGltZVJlZ2V4ID0gUmVnRXhwKGlzb1RpbWVCYXNlUmVnZXguc291cmNlICsgXCIgPyg/OlwiICsgb2Zmc2V0UmVnZXguc291cmNlICsgXCJ8KFthLXpBLVpfXXsxLDI1Nn0vW2EtekEtWl9dezEsMjU2fSkpP1wiKSxcbiAgICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoXCIoPzogXCIgKyBzcWxUaW1lUmVnZXguc291cmNlICsgXCIpP1wiKTtcblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIHllYXI6IHBhcnNlSW50KG1hdGNoW2N1cnNvcl0pLFxuICAgIG1vbnRoOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAxXSkgfHwgMSxcbiAgICBkYXk6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDJdKSB8fCAxXG4gIH07XG4gIHJldHVybiBbaXRlbSwgbnVsbCwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09UaW1lKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGl0ZW0gPSB7XG4gICAgaG91cjogcGFyc2VJbnQobWF0Y2hbY3Vyc29yXSkgfHwgMCxcbiAgICBtaW51dGU6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDFdKSB8fCAwLFxuICAgIHNlY29uZDogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMl0pIHx8IDAsXG4gICAgbWlsbGlzZWNvbmQ6IHBhcnNlTWlsbGlzKG1hdGNoW2N1cnNvciArIDNdKVxuICB9O1xuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDRdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPT2Zmc2V0KG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgICAgZnVsbE9mZnNldCA9IHNpZ25lZE9mZnNldChtYXRjaFtjdXJzb3IgKyAxXSwgbWF0Y2hbY3Vyc29yICsgMl0pLFxuICAgICAgem9uZSA9IGxvY2FsID8gbnVsbCA6IEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShmdWxsT2Zmc2V0KTtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJQU5BWm9uZShtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciB6b25lID0gbWF0Y2hbY3Vyc29yXSA/IG5ldyBJQU5BWm9uZShtYXRjaFtjdXJzb3JdKSA6IG51bGw7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDFdO1xufSAvLyBJU08gZHVyYXRpb24gcGFyc2luZ1xuXG5cbnZhciBpc29EdXJhdGlvbiA9IC9eUCg/Oig/OigtP1xcZHsxLDl9KVkpPyg/OigtP1xcZHsxLDl9KU0pPyg/OigtP1xcZHsxLDl9KUQpPyg/OlQoPzooLT9cXGR7MSw5fSlIKT8oPzooLT9cXGR7MSw5fSlNKT8oPzooLT9cXGR7MSw5fSkoPzpbLixdKC0/XFxkezEsOX0pKT9TKT8pP3woLT9cXGR7MSw5fSlXKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgdmFyIHllYXJTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFszXSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzVdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbNl0sXG4gICAgICBtaWxsaXNlY29uZHNTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHdlZWtTdHIgPSBtYXRjaFs4XTtcbiAgcmV0dXJuIFt7XG4gICAgeWVhcnM6IHBhcnNlSW50KHllYXJTdHIpLFxuICAgIG1vbnRoczogcGFyc2VJbnQobW9udGhTdHIpLFxuICAgIHdlZWtzOiBwYXJzZUludCh3ZWVrU3RyKSxcbiAgICBkYXlzOiBwYXJzZUludChkYXlTdHIpLFxuICAgIGhvdXJzOiBwYXJzZUludChob3VyU3RyKSxcbiAgICBtaW51dGVzOiBwYXJzZUludChtaW51dGVTdHIpLFxuICAgIHNlY29uZHM6IHBhcnNlSW50KHNlY29uZFN0ciksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtaWxsaXNlY29uZHNTdHIpXG4gIH1dO1xufSAvLyBUaGVzZSBhcmUgYSBsaXR0bGUgYnJhaW5kZWFkLiBFRFQgKnNob3VsZCogdGVsbCB1cyB0aGF0IHdlJ3JlIGluLCBzYXksIEFtZXJpY2EvTmV3X1lvcmtcbi8vIGFuZCBub3QganVzdCB0aGF0IHdlJ3JlIGluIC0yNDAgKnJpZ2h0IG5vdyouIEJ1dCBzaW5jZSBJIGRvbid0IHRoaW5rIHRoZXNlIGFyZSB1c2VkIHRoYXQgb2Z0ZW5cbi8vIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSB0aGF0XG5cblxudmFyIG9ic09mZnNldHMgPSB7XG4gIEdNVDogMCxcbiAgRURUOiAtNCAqIDYwLFxuICBFU1Q6IC01ICogNjAsXG4gIENEVDogLTUgKiA2MCxcbiAgQ1NUOiAtNiAqIDYwLFxuICBNRFQ6IC02ICogNjAsXG4gIE1TVDogLTcgKiA2MCxcbiAgUERUOiAtNyAqIDYwLFxuICBQU1Q6IC04ICogNjBcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgeWVhcjogeWVhclN0ci5sZW5ndGggPT09IDIgPyB1bnRydW5jYXRlWWVhcihwYXJzZUludCh5ZWFyU3RyKSkgOiBwYXJzZUludCh5ZWFyU3RyKSxcbiAgICBtb250aDogbW9udGhTdHIubGVuZ3RoID09PSAyID8gcGFyc2VJbnQobW9udGhTdHIsIDEwKSA6IG1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpICsgMSxcbiAgICBkYXk6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnQoaG91clN0ciksXG4gICAgbWludXRlOiBwYXJzZUludChtaW51dGVTdHIpXG4gIH07XG4gIGlmIChzZWNvbmRTdHIpIHJlc3VsdC5zZWNvbmQgPSBwYXJzZUludChzZWNvbmRTdHIpO1xuXG4gIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgcmVzdWx0LndlZWtkYXkgPSB3ZWVrZGF5U3RyLmxlbmd0aCA+IDMgPyB3ZWVrZGF5c0xvbmcuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDEgOiB3ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0gLy8gUkZDIDI4MjIvNTMyMlxuXG5cbnZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIG9ic09mZnNldCA9IG1hdGNoWzhdLFxuICAgICAgbWlsT2Zmc2V0ID0gbWF0Y2hbOV0sXG4gICAgICBvZmZIb3VyU3RyID0gbWF0Y2hbMTBdLFxuICAgICAgb2ZmTWludXRlU3RyID0gbWF0Y2hbMTFdLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICB2YXIgb2Zmc2V0O1xuXG4gIGlmIChvYnNPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gIH0gZWxzZSBpZiAobWlsT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gMDtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXQgPSBzaWduZWRPZmZzZXQob2ZmSG91clN0ciwgb2ZmTWludXRlU3RyKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzdWx0LCBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCldO1xufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzUkZDMjgyMihzKSB7XG4gIC8vIFJlbW92ZSBjb21tZW50cyBhbmQgZm9sZGluZyB3aGl0ZXNwYWNlIGFuZCByZXBsYWNlIG11bHRpcGxlLXNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcKFteKV0qXFwpfFtcXG5cXHRdL2csIFwiIFwiKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgXCIgXCIpLnRyaW0oKTtcbn0gLy8gaHR0cCBkYXRlXG5cblxudmFyIHJmYzExMjMgPSAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLCAoXFxkXFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcXGR7NH0pIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICAgIHJmYzg1MCA9IC9eKE1vbmRheXxUdWVzZGF5fFdlZHNkYXl8VGh1cnNkYXl8RnJpZGF5fFNhdHVyZGF5fFN1bmRheSksIChcXGRcXGQpLShKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYyktKFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgYXNjaWkgPSAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKCBcXGR8XFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSAoXFxkezR9KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMTEyM09yODUwKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFsyXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbM10sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNV0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzddLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFTQ0lJKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzJdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbM10sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs1XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzZdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzddLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZUlTT0RhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW2NvbWJpbmVSZWdleGVzKGlzb1ltZFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPWW1kLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCldLCBbY29tYmluZVJlZ2V4ZXMoaXNvV2Vla1JlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPV2Vla0RhdGEsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29PcmRpbmFsUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09PcmRpbmFsRGF0YSwgZXh0cmFjdElTT1RpbWUpXSwgW2NvbWJpbmVSZWdleGVzKGlzb1RpbWVSZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0pO1xufVxuZnVuY3Rpb24gcGFyc2VSRkMyODIyRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShwcmVwcm9jZXNzUkZDMjgyMihzKSwgW3JmYzI4MjIsIGV4dHJhY3RSRkMyODIyXSk7XG59XG5mdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW3JmYzg1MCwgZXh0cmFjdFJGQzExMjNPcjg1MF0sIFthc2NpaSwgZXh0cmFjdEFTQ0lJXSk7XG59XG5mdW5jdGlvbiBwYXJzZUlTT0R1cmF0aW9uKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtpc29EdXJhdGlvbiwgZXh0cmFjdElTT0R1cmF0aW9uXSk7XG59XG5mdW5jdGlvbiBwYXJzZVNRTChzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpXSwgW2NvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpXSk7XG59XG5cbnZhciBJbnZhbGlkID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEludmFsaWQucHJvdG90eXBlO1xuXG4gIF9wcm90by50b01lc3NhZ2UgPSBmdW5jdGlvbiB0b01lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuZXhwbGFuYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYXNvbiArIFwiOiBcIiArIHRoaXMuZXhwbGFuYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEludmFsaWQ7XG59KCk7XG5cbnZhciBJTlZBTElEID0gXCJJbnZhbGlkIER1cmF0aW9uXCI7IC8vIHVuaXQgY29udmVyc2lvbiBjb25zdGFudHNcblxudmFyIGxvd09yZGVyTWF0cml4ID0ge1xuICB3ZWVrczoge1xuICAgIGRheXM6IDcsXG4gICAgaG91cnM6IDcgKiAyNCxcbiAgICBtaW51dGVzOiA3ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgZGF5czoge1xuICAgIGhvdXJzOiAyNCxcbiAgICBtaW51dGVzOiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgaG91cnM6IHtcbiAgICBtaW51dGVzOiA2MCxcbiAgICBzZWNvbmRzOiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbWludXRlczoge1xuICAgIHNlY29uZHM6IDYwLFxuICAgIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwXG4gIH0sXG4gIHNlY29uZHM6IHtcbiAgICBtaWxsaXNlY29uZHM6IDEwMDBcbiAgfVxufSxcbiAgICBjYXN1YWxNYXRyaXggPSBPYmplY3QuYXNzaWduKHtcbiAgeWVhcnM6IHtcbiAgICBtb250aHM6IDEyLFxuICAgIHdlZWtzOiA1MixcbiAgICBkYXlzOiAzNjUsXG4gICAgaG91cnM6IDM2NSAqIDI0LFxuICAgIG1pbnV0ZXM6IDM2NSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogMTMsXG4gICAgZGF5czogOTEsXG4gICAgaG91cnM6IDkxICogMjQsXG4gICAgbWludXRlczogOTEgKiAyNCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIG1vbnRoczoge1xuICAgIHdlZWtzOiA0LFxuICAgIGRheXM6IDMwLFxuICAgIGhvdXJzOiAzMCAqIDI0LFxuICAgIG1pbnV0ZXM6IDMwICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCksXG4gICAgZGF5c0luWWVhckFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0MDAsXG4gICAgZGF5c0luTW9udGhBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDgwMCxcbiAgICBhY2N1cmF0ZU1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlLFxuICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCxcbiAgICBtaW51dGVzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgcXVhcnRlcnM6IHtcbiAgICBtb250aHM6IDMsXG4gICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDI4LFxuICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSAvIDQsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0IC8gNCxcbiAgICBtaW51dGVzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwIC8gNCxcbiAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgLyA0LFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCAvIDRcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IGRheXNJbk1vbnRoQWNjdXJhdGUgLyA3LFxuICAgIGRheXM6IGRheXNJbk1vbnRoQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCxcbiAgICBtaW51dGVzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxufSwgbG93T3JkZXJNYXRyaXgpOyAvLyB1bml0cyBvcmRlcmVkIGJ5IHNpemVcblxudmFyIG9yZGVyZWRVbml0cyA9IFtcInllYXJzXCIsIFwicXVhcnRlcnNcIiwgXCJtb250aHNcIiwgXCJ3ZWVrc1wiLCBcImRheXNcIiwgXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdO1xudmFyIHJldmVyc2VVbml0cyA9IG9yZGVyZWRVbml0cy5zbGljZSgwKS5yZXZlcnNlKCk7IC8vIGNsb25lIHJlYWxseSBtZWFucyBcImNyZWF0ZSBhbm90aGVyIGluc3RhbmNlIGp1c3QgbGlrZSB0aGlzIG9uZSwgYnV0IHdpdGggdGhlc2UgY2hhbmdlc1wiXG5cbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIpIHtcbiAgaWYgKGNsZWFyID09PSB2b2lkIDApIHtcbiAgICBjbGVhciA9IGZhbHNlO1xuICB9XG5cbiAgLy8gZGVlcCBtZXJnZSBmb3IgdmFsc1xuICB2YXIgY29uZiA9IHtcbiAgICB2YWx1ZXM6IGNsZWFyID8gYWx0cy52YWx1ZXMgOiBPYmplY3QuYXNzaWduKHt9LCBkdXIudmFsdWVzLCBhbHRzLnZhbHVlcyB8fCB7fSksXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3lcbiAgfTtcbiAgcmV0dXJuIG5ldyBEdXJhdGlvbihjb25mKTtcbn1cblxuZnVuY3Rpb24gYW50aVRydW5jKG4pIHtcbiAgcmV0dXJuIG4gPCAwID8gTWF0aC5mbG9vcihuKSA6IE1hdGguY2VpbChuKTtcbn0gLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuXG5cbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICB2YXIgY29udiA9IG1hdHJpeFt0b1VuaXRdW2Zyb21Vbml0XSxcbiAgICAgIHJhdyA9IGZyb21NYXBbZnJvbVVuaXRdIC8gY29udixcbiAgICAgIHNhbWVTaWduID0gTWF0aC5zaWduKHJhdykgPT09IE1hdGguc2lnbih0b01hcFt0b1VuaXRdKSxcbiAgICAgIC8vIG9rLCBzbyB0aGlzIGlzIHdpbGQsIGJ1dCBzZWUgdGhlIG1hdHJpeCBpbiB0aGUgdGVzdHNcbiAgYWRkZWQgPSAhc2FtZVNpZ24gJiYgdG9NYXBbdG9Vbml0XSAhPT0gMCAmJiBNYXRoLmFicyhyYXcpIDw9IDEgPyBhbnRpVHJ1bmMocmF3KSA6IE1hdGgudHJ1bmMocmF3KTtcbiAgdG9NYXBbdG9Vbml0XSArPSBhZGRlZDtcbiAgZnJvbU1hcFtmcm9tVW5pdF0gLT0gYWRkZWQgKiBjb252O1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWVzKG1hdHJpeCwgdmFscykge1xuICByZXZlcnNlVW5pdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2aW91cywgY3VycmVudCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodmFsc1tjdXJyZW50XSkpIHtcbiAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICBjb252ZXJ0KG1hdHJpeCwgdmFscywgcHJldmlvdXMsIHZhbHMsIGN1cnJlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cbiAgfSwgbnVsbCk7XG59XG4vKipcclxuICogQSBEdXJhdGlvbiBvYmplY3QgcmVwcmVzZW50cyBhIHBlcmlvZCBvZiB0aW1lLCBsaWtlIFwiMiBtb250aHNcIiBvciBcIjEgZGF5LCAxIGhvdXJcIi4gQ29uY2VwdHVhbGx5LCBpdCdzIGp1c3QgYSBtYXAgb2YgdW5pdHMgdG8gdGhlaXIgcXVhbnRpdGllcywgYWNjb21wYW5pZWQgYnkgc29tZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gYW5kIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uIFRoZXkgY2FuIGJlIHVzZWQgb24gdGhlaXIgb3duIG9yIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgTHV4b24gdHlwZXM7IGZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB7QGxpbmsgRGF0ZVRpbWUucGx1c30gdG8gYWRkIGEgRHVyYXRpb24gb2JqZWN0IHRvIGEgRGF0ZVRpbWUsIHByb2R1Y2luZyBhbm90aGVyIERhdGVUaW1lLlxyXG4gKlxyXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIER1cmF0aW9uOlxyXG4gKlxyXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbi5mcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uLmZyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT30uXHJcbiAqICogKipVbml0IHZhbHVlcyoqIFNlZSB0aGUge0BsaW5rIER1cmF0aW9uLnllYXJzfSwge0BsaW5rIER1cmF0aW9uLm1vbnRoc30sIHtAbGluayBEdXJhdGlvbi53ZWVrc30sIHtAbGluayBEdXJhdGlvbi5kYXlzfSwge0BsaW5rIER1cmF0aW9uLmhvdXJzfSwge0BsaW5rIER1cmF0aW9uLm1pbnV0ZXN9LCB7QGxpbmsgRHVyYXRpb24uc2Vjb25kc30sIHtAbGluayBEdXJhdGlvbi5taWxsaXNlY29uZHN9IGFjY2Vzc29ycy5cclxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgIHtAbGluayBEdXJhdGlvbi5sb2NhbGV9IGFuZCB7QGxpbmsgRHVyYXRpb24ubnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIER1cmF0aW9uLnBsdXN9LCB7QGxpbmsgRHVyYXRpb24ubWludXN9LCB7QGxpbmsgRHVyYXRpb24ubm9ybWFsaXplfSwge0BsaW5rIER1cmF0aW9uLnNldH0sIHtAbGluayBEdXJhdGlvbi5yZWNvbmZpZ3VyZX0sIHtAbGluayBEdXJhdGlvbi5zaGlmdFRvfSwgYW5kIHtAbGluayBEdXJhdGlvbi5uZWdhdGV9LlxyXG4gKiAqICoqT3V0cHV0KiogVG8gY29udmVydCB0aGUgRHVyYXRpb24gaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgRHVyYXRpb24uYXN9LCB7QGxpbmsgRHVyYXRpb24udG9JU099LCB7QGxpbmsgRHVyYXRpb24udG9Gb3JtYXR9LCBhbmQge0BsaW5rIER1cmF0aW9uLnRvSlNPTn1cclxuICpcclxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxyXG4gKi9cblxuXG52YXIgRHVyYXRpb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBEdXJhdGlvbihjb25maWcpIHtcbiAgICB2YXIgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgb2YgbWlsbGlzZWNvbmRzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWlsbGlzZWNvbmRzOiBjb3VudFxuICAgIH0sIG9wdHMpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFycycgYW5kICdob3Vycy5cclxuICAgKiBJZiB0aGlzIG9iamVjdCBpcyBlbXB0eSB0aGVuIHplcm8gIG1pbGxpc2Vjb25kcyBkdXJhdGlvbiBpcyByZXR1cm5lZC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5xdWFydGVyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5c1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZXNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZHNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIkR1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290IFwiICsgdHlwZW9mIG9iaik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICB2YWx1ZXM6IG5vcm1hbGl6ZU9iamVjdChvYmosIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvYmopLFxuICAgICAgY29udmVyc2lvbkFjY3VyYWN5OiBvYmouY29udmVyc2lvbkFjY3VyYWN5XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDNZNk00RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIGRheTogNCwgaG91cnM6IDEyLCBtaW51dGVzOiAzMCwgc2Vjb25kczogNSB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1A1WTNNJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDUsIG1vbnRoczogMyB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0LCBvcHRzKSB7XG4gICAgdmFyIF9wYXJzZUlTT0R1cmF0aW9uID0gcGFyc2VJU09EdXJhdGlvbih0ZXh0KSxcbiAgICAgICAgcGFyc2VkID0gX3BhcnNlSVNPRHVyYXRpb25bMF07XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICB2YXIgb2JqID0gT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMpO1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3Qob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIFwidGhlIGlucHV0IFxcXCJcIiArIHRleHQgKyBcIlxcXCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxXCIpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgZGF0ZXRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICBpZiAoZXhwbGFuYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgZXhwbGFuYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIER1cmF0aW9uIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRHVyYXRpb25FcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICAgIGludmFsaWQ6IGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cblxuXG4gIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQgPSBmdW5jdGlvbiBub3JtYWxpemVVbml0KHVuaXQsIGlnbm9yZVVua25vd24pIHtcbiAgICBpZiAoaWdub3JlVW5rbm93biA9PT0gdm9pZCAwKSB7XG4gICAgICBpZ25vcmVVbmtub3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIlxuICAgIH1bdW5pdCA/IHVuaXQudG9Mb3dlckNhc2UoKSA6IHVuaXRdO1xuICAgIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIER1cmF0aW9uLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uaXNEdXJhdGlvbiA9IGZ1bmN0aW9uIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiBvLmlzTHV4b25EdXJhdGlvbjtcbiAgfTtcbiAgLyoqXHJcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy4gWW91IG1heSB1c2UgdGhlc2UgdG9rZW5zOlxyXG4gICAqICogYFNgIGZvciBtaWxsaXNlY29uZHNcclxuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xyXG4gICAqICogYG1gIGZvciBtaW51dGVzXHJcbiAgICogKiBgaGAgZm9yIGhvdXJzXHJcbiAgICogKiBgZGAgZm9yIGRheXNcclxuICAgKiAqIGBNYCBmb3IgbW9udGhzXHJcbiAgICogKiBgeWAgZm9yIHllYXJzXHJcbiAgICogTm90ZXM6XHJcbiAgICogKiBBZGQgcGFkZGluZyBieSByZXBlYXRpbmcgdGhlIHRva2VuLCBlLmcuIFwieXlcIiBwYWRzIHRoZSB5ZWFycyB0byB0d28gZGlnaXRzLCBcImhoaGhcIiBwYWRzIHRoZSBob3VycyBvdXQgdG8gZm91ciBkaWdpdHNcclxuICAgKiAqIFRoZSBkdXJhdGlvbiB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgc2V0IG9mIHVuaXRzIGluIHRoZSBmb3JtYXQgc3RyaW5nIHVzaW5nIHtAbGluayBEdXJhdGlvbi5zaGlmdFRvfSBhbmQgdGhlIER1cmF0aW9ucydzIGNvbnZlcnNpb24gYWNjdXJhY3kgc2V0dGluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsb29yPXRydWVdIC0gZmxvb3IgbnVtZXJpY2FsIHZhbHVlc1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieXkgZGQgc3NzXCIpIC8vPT4gXCIwMSAwNiAwMDJcIlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcIk0gU1wiKSAvLz0+IFwiMTIgNTE4NDAyMDAwXCJcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyByZXZlcnNlLWNvbXBhdCBzaW5jZSAxLjI7IHdlIGFsd2F5cyByb3VuZCBkb3duIG5vdywgbmV2ZXIgdXAsIGFuZCB3ZSBkbyBpdCBieSBkZWZhdWx0XG4gICAgdmFyIGZtdE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7XG4gICAgICBmbG9vcjogb3B0cy5yb3VuZCAhPT0gZmFsc2UgJiYgb3B0cy5mbG9vciAhPT0gZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdCkgOiBJTlZBTElEO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIER1cmF0aW9uJ3MgdmFsdWVzLlxyXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIF9wcm90by50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmFsdWVzKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2UuY29udmVyc2lvbkFjY3VyYWN5ID0gdGhpcy5jb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMywgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQM1lUNDVTJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDQsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDRNVDQ1UydcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaW51dGVzOiA1IH0pLnRvSVNPKCkgLy89PiAnUFQ1TSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiA2IH0pLnRvSVNPKCkgLy89PiAnUFQwLjAwNlMnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPID0gZnVuY3Rpb24gdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcyA9IFwiUFwiO1xuICAgIGlmICh0aGlzLnllYXJzICE9PSAwKSBzICs9IHRoaXMueWVhcnMgKyBcIllcIjtcbiAgICBpZiAodGhpcy5tb250aHMgIT09IDAgfHwgdGhpcy5xdWFydGVycyAhPT0gMCkgcyArPSB0aGlzLm1vbnRocyArIHRoaXMucXVhcnRlcnMgKiAzICsgXCJNXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCB8fCB0aGlzLndlZWtzICE9PSAwKSBzICs9IHRoaXMuZGF5cyArIHRoaXMud2Vla3MgKiA3ICsgXCJEXCI7XG4gICAgaWYgKHRoaXMuaG91cnMgIT09IDAgfHwgdGhpcy5taW51dGVzICE9PSAwIHx8IHRoaXMuc2Vjb25kcyAhPT0gMCB8fCB0aGlzLm1pbGxpc2Vjb25kcyAhPT0gMCkgcyArPSBcIlRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCkgcyArPSB0aGlzLmhvdXJzICsgXCJIXCI7XG4gICAgaWYgKHRoaXMubWludXRlcyAhPT0gMCkgcyArPSB0aGlzLm1pbnV0ZXMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IHRoaXMuc2Vjb25kcyArIHRoaXMubWlsbGlzZWNvbmRzIC8gMTAwMCArIFwiU1wiO1xuICAgIHJldHVybiBzO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLmFzKFwibWlsbGlzZWNvbmRzXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLFxuICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcmRlcmVkVW5pdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgayA9IG9yZGVyZWRVbml0c1tfaV07XG5cbiAgICAgIGlmIChkdXIudmFsdWVzLmhhc093blByb3BlcnR5KGspIHx8IHRoaXMudmFsdWVzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IGR1ci5nZXQoaykgKyB0aGlzLmdldChrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiByZXN1bHRcbiAgICB9LCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIHNob3J0ZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm1pbnVzID0gZnVuY3Rpb24gbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLnllYXJzIC8vPT4gMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkubW9udGhzIC8vPT4gMFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZGF5cyAvLz0+IDNcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IHllYXJzOiAyMDE3IH0pXHJcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IGhvdXJzOiA4LCBtaW51dGVzOiAzMCB9KVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldCh2YWx1ZXMpIHtcbiAgICB2YXIgbWl4ZWQgPSBPYmplY3QuYXNzaWduKHRoaXMudmFsdWVzLCBub3JtYWxpemVPYmplY3QodmFsdWVzLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbWl4ZWRcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlIGFuZC9vciBudW1iZXJpbmdTeXN0ZW0uICBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgY29udmVyc2lvbkFjY3VyYWN5ID0gX3JlZi5jb252ZXJzaW9uQWNjdXJhY3k7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbVxuICAgIH0pLFxuICAgICAgICBvcHRzID0ge1xuICAgICAgbG9jOiBsb2NcbiAgICB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ2RheXMnKSAvLz0+IDM2NVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmFzID0gZnVuY3Rpb24gYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9O1xuICAvKipcclxuICAgKiBSZWR1Y2UgdGhpcyBEdXJhdGlvbiB0byBpdHMgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGluIGl0cyBjdXJyZW50IHVuaXRzLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMiwgZGF5czogNTAwMCB9KS5ub3JtYWxpemUoKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogMTUsIGRheXM6IDI1NSB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMiwgbWludXRlczogLTQ1IH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMTUgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbm9ybWFsaXplVmFsdWVzKHRoaXMubWF0cml4LCB2YWxzKTtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdCh2YWxzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIER1cmF0aW9uIGludG8gaXRzIHJlcHJlc2VudGF0aW9uIGluIGEgZGlmZmVyZW50IHNldCBvZiB1bml0cy5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNoaWZ0VG8gPSBmdW5jdGlvbiBzaGlmdFRvKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB1bml0cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHVuaXRzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh1bml0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVuaXRzID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KTtcbiAgICB9KTtcbiAgICB2YXIgYnVpbHQgPSB7fSxcbiAgICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgICAgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICB2YXIgbGFzdFVuaXQ7XG4gICAgbm9ybWFsaXplVmFsdWVzKHRoaXMubWF0cml4LCB2YWxzKTtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgayA9IG9yZGVyZWRVbml0c1tfaTJdO1xuXG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcbiAgICAgICAgdmFyIG93biA9IDA7IC8vIGFueXRoaW5nIHdlIGhhdmVuJ3QgYm9pbGVkIGRvd24geWV0IHNob3VsZCBnZXQgYm9pbGVkIHRvIHRoaXMgdW5pdFxuXG4gICAgICAgIGZvciAodmFyIGFrIGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICAgICAgaWYgKGFjY3VtdWxhdGVkLmhhc093blByb3BlcnR5KGFrKSkge1xuICAgICAgICAgICAgb3duICs9IHRoaXMubWF0cml4W2FrXVtrXSAqIGFjY3VtdWxhdGVkW2FrXTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkW2FrXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHBsdXMgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgaW4gdGhpcyB1bml0XG5cblxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gTWF0aC50cnVuYyhvd24pO1xuICAgICAgICBidWlsdFtrXSA9IGk7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gb3duIC0gaTsgLy8gd2UnZCBsaWtlIHRvIGFic29yYiB0aGVzZSBmcmFjdGlvbnMgaW4gYW5vdGhlciB1bml0XG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgZnVydGhlciBkb3duIHRoZSBjaGFpbiB0aGF0IHNob3VsZCBiZSByb2xsZWQgdXAgaW4gdG8gdGhpc1xuXG4gICAgICAgIGZvciAodmFyIGRvd24gaW4gdmFscykge1xuICAgICAgICAgIGlmIChvcmRlcmVkVW5pdHMuaW5kZXhPZihkb3duKSA+IG9yZGVyZWRVbml0cy5pbmRleE9mKGspKSB7XG4gICAgICAgICAgICBjb252ZXJ0KHRoaXMubWF0cml4LCB2YWxzLCBkb3duLCBidWlsdCwgayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIG90aGVyd2lzZSwga2VlcCBpdCBpbiB0aGUgd2luZ3MgdG8gYm9pbCBpdCBsYXRlclxuXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9IC8vIGFueXRoaW5nIGxlZnRvdmVyIGJlY29tZXMgdGhlIGRlY2ltYWwgZm9yIHRoZSBsYXN0IHVuaXRcblxuXG4gICAgaWYgKGxhc3RVbml0KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgaWYgKGFjY3VtdWxhdGVkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSAhPT0gMCkge1xuICAgICAgICAgICAgYnVpbHRbbGFzdFVuaXRdICs9IGtleSA9PT0gbGFzdFVuaXQgPyBhY2N1bXVsYXRlZFtrZXldIDogYWNjdW11bGF0ZWRba2V5XSAvIHRoaXMubWF0cml4W2xhc3RVbml0XVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IGJ1aWx0XG4gICAgfSwgdHJ1ZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLm5lZ2F0ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAtMSwgc2Vjb25kczogLTMwIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBuZWdhdGVkID0ge307XG5cbiAgICB2YXIgX2FyciA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcblxuICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IF9hcnIubGVuZ3RoOyBfaTMrKykge1xuICAgICAgdmFyIGsgPSBfYXJyW19pM107XG4gICAgICBuZWdhdGVkW2tdID0gLXRoaXMudmFsdWVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IG5lZ2F0ZWRcbiAgICB9LCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB5ZWFycy5cclxuICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogRXF1YWxpdHkgY2hlY2tcclxuICAgKiBUd28gRHVyYXRpb25zIGFyZSBlcXVhbCBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHVuaXRzIGFuZCB0aGUgc2FtZSB2YWx1ZXMgZm9yIGVhY2ggdW5pdC5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBvcmRlcmVkVW5pdHMubGVuZ3RoOyBfaTQrKykge1xuICAgICAgdmFyIHUgPSBvcmRlcmVkVW5pdHNbX2k0XTtcblxuICAgICAgaWYgKHRoaXMudmFsdWVzW3VdICE9PSBvdGhlci52YWx1ZXNbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhEdXJhdGlvbiwgW3tcbiAgICBrZXk6IFwibG9jYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInllYXJzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMueWVhcnMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHF1YXJ0ZXJzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicXVhcnRlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5xdWFydGVycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbW9udGhzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibW9udGhzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMubW9udGhzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrc1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy53ZWVrcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5cy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRheXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5kYXlzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBob3Vycy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhvdXJzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuaG91cnMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbnV0ZXMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaW51dGVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMubWludXRlcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2Vjb25kc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibWlsbGlzZWNvbmRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMubWlsbGlzZWNvbmRzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEdXJhdGlvbiBpcyBpbnZhbGlkLiBJbnZhbGlkIGR1cmF0aW9ucyBhcmUgcmV0dXJuZWQgYnkgZGlmZiBvcGVyYXRpb25zXHJcbiAgICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkUmVhc29uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRFeHBsYW5hdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIER1cmF0aW9uO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbmlzaCkge1xuICBpZiAoaXNOdW1iZXIoZHVyYXRpb25pc2gpKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb25pc2gpO1xuICB9IGVsc2UgaWYgKER1cmF0aW9uLmlzRHVyYXRpb24oZHVyYXRpb25pc2gpKSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uaXNoO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbmlzaCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uaXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJVbmtub3duIGR1cmF0aW9uIGFyZ3VtZW50IFwiICsgZHVyYXRpb25pc2ggKyBcIiBvZiB0eXBlIFwiICsgdHlwZW9mIGR1cmF0aW9uaXNoKTtcbiAgfVxufVxuXG52YXIgSU5WQUxJRCQxID0gXCJJbnZhbGlkIEludGVydmFsXCI7IC8vIGNoZWNrcyBpZiB0aGUgc3RhcnQgaXMgZXF1YWwgdG8gb3IgYmVmb3JlIHRoZSBlbmRcblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFydEVuZChzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQgfHwgIXN0YXJ0LmlzVmFsaWQpIHtcbiAgICByZXR1cm4gbmV3IEludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgc3RhcnRcIik7XG4gIH0gZWxzZSBpZiAoIWVuZCB8fCAhZW5kLmlzVmFsaWQpIHtcbiAgICByZXR1cm4gbmV3IEludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkKFwiZW5kIGJlZm9yZSBzdGFydFwiLCBcIlRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PVwiICsgc3RhcnQudG9JU08oKSArIFwiIGFuZCBlbmQ9XCIgKyBlbmQudG9JU08oKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxyXG4gKiBBbiBJbnRlcnZhbCBvYmplY3QgcmVwcmVzZW50cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBvZiB0aW1lLCB3aGVyZSBlYWNoIGVuZHBvaW50IGlzIGEge0BsaW5rIERhdGVUaW1lfS4gQ29uY2VwdHVhbGx5LCBpdCdzIGEgY29udGFpbmVyIGZvciB0aG9zZSB0d28gZW5kcG9pbnRzLCBhY2NvbXBhbmllZCBieSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgY29tcGFyaW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gSW50ZXJ2YWw6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIGFmdGVyfSwge0BsaW5rIGJlZm9yZX0sIG9yIHtAbGluayBmcm9tSVNPfS5cclxuICogKiAqKkFjY2Vzc29ycyoqIFVzZSB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgZW5kfSB0byBnZXQgdGhlIHN0YXJ0IGFuZCBlbmQuXHJcbiAqICogKipJbnRlcnJvZ2F0aW9uKiogVG8gYW5hbHl6ZSB0aGUgSW50ZXJ2YWwsIHVzZSB7QGxpbmsgY291bnR9LCB7QGxpbmsgbGVuZ3RofSwge0BsaW5rIGhhc1NhbWV9LCB7QGxpbmsgY29udGFpbnN9LCB7QGxpbmsgaXNBZnRlcn0sIG9yIHtAbGluayBpc0JlZm9yZX0uXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayBzcGxpdEF0fSwge0BsaW5rIHNwbGl0Qnl9LCB7QGxpbmsgZGl2aWRlRXF1YWxseX0sIHtAbGluayBtZXJnZX0sIHtAbGluayB4b3J9LCB7QGxpbmsgdW5pb259LCB7QGxpbmsgaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIGRpZmZlcmVuY2V9LlxyXG4gKiAqICoqQ29tcGFyaXNvbioqIFRvIGNvbXBhcmUgdGhpcyBJbnRlcnZhbCB0byBhbm90aGVyIG9uZSwgdXNlIHtAbGluayBlcXVhbHN9LCB7QGxpbmsgb3ZlcmxhcHN9LCB7QGxpbmsgYWJ1dHNTdGFydH0sIHtAbGluayBhYnV0c0VuZH0sIHtAbGluayBlbmd1bGZzfVxyXG4gKiAqICoqT3V0cHV0KioqIFRvIGNvbnZlcnQgdGhlIEludGVydmFsIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS5cclxuICovXG5cblxudmFyIEludGVydmFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gSW50ZXJ2YWwoY29uZmlnKSB7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIEludGVydmFsIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4cGxhbmF0aW9uPW51bGxdIC0gbG9uZ2VyIGV4cGxhbmF0aW9uLCBtYXkgaW5jbHVkZSBwYXJhbWV0ZXJzIGFuZCBvdGhlciB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5pbnZhbGlkID0gZnVuY3Rpb24gaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgaWYgKGV4cGxhbmF0aW9uID09PSB2b2lkIDApIHtcbiAgICAgIGV4cGxhbmF0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBJbnRlcnZhbCBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEludGVydmFsRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgICBpbnZhbGlkOiBpbnZhbGlkXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGFuIGVuZCBEYXRlVGltZS4gSW5jbHVzaXZlIG9mIHRoZSBzdGFydCBidXQgbm90IHRoZSBlbmQuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmZyb21EYXRlVGltZXMgPSBmdW5jdGlvbiBmcm9tRGF0ZVRpbWVzKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYnVpbHRTdGFydCA9IGZyaWVuZGx5RGF0ZVRpbWUoc3RhcnQpLFxuICAgICAgICBidWlsdEVuZCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gbmV3IEludGVydmFsKHtcbiAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgZW5kOiBidWlsdEVuZCxcbiAgICAgIGludmFsaWQ6IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIHRvLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYWZ0ZXIgPSBmdW5jdGlvbiBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGFuIGVuZCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgYmFja3dhcmRzIHRvLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbC5cclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmJlZm9yZSA9IGZ1bmN0aW9uIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLFxuICAgICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGFuIElTTyA4NjAxIHN0cmluZy5cclxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIG9wdGlvbnMgdG8gcGFzcyB7QGxpbmsgRGF0ZVRpbWUuZnJvbUlTT30gYW5kIG9wdGlvbmFsbHkge0BsaW5rIER1cmF0aW9uLmZyb21JU099XHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08odGV4dCwgb3B0cykge1xuICAgIHZhciBfc3BsaXQgPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMiksXG4gICAgICAgIHMgPSBfc3BsaXRbMF0sXG4gICAgICAgIGUgPSBfc3BsaXRbMV07XG5cbiAgICBpZiAocyAmJiBlKSB7XG4gICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5mcm9tSVNPKHMsIG9wdHMpLFxuICAgICAgICAgIGVuZCA9IERhdGVUaW1lLmZyb21JU08oZSwgb3B0cyk7XG5cbiAgICAgIGlmIChzdGFydC5pc1ZhbGlkICYmIGVuZC5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQuaXNWYWxpZCkge1xuICAgICAgICB2YXIgZHVyID0gRHVyYXRpb24uZnJvbUlTTyhlLCBvcHRzKTtcblxuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kLmlzVmFsaWQpIHtcbiAgICAgICAgdmFyIF9kdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuXG4gICAgICAgIGlmIChfZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgX2R1cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXNJU08gODYwMVwiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGFuIEludGVydmFsLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuaXNJbnRlcnZhbCA9IGZ1bmN0aW9uIGlzSW50ZXJ2YWwobykge1xuICAgIHJldHVybiBvIGluc3RhbmNlb2YgSW50ZXJ2YWwgfHwgby5pc0x1eG9uSW50ZXJ2YWw7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxyXG4gICAqIEB0eXBlIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBJbnRlcnZhbC5wcm90b3R5cGU7XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuICBfcHJvdG8ubGVuZ3RoID0gZnVuY3Rpb24gbGVuZ3RoKHVuaXQpIHtcbiAgICBpZiAodW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgICB1bml0ID0gXCJtaWxsaXNlY29uZHNcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uLmFwcGx5KHRoaXMsIFt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBtaW51dGVzLCBob3VycywgZGF5cywgbW9udGhzLCBvciB5ZWFycyBpbmNsdWRlZCBpbiB0aGUgSW50ZXJ2YWwsIGV2ZW4gaW4gcGFydC5cclxuICAgKiBVbmxpa2Uge0BsaW5rIGxlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcclxuICAgKiBhc2tzICd3aGF0IGRhdGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIGludGVydmFsPycsIG5vdCAnaG93IG1hbnkgZGF5cyBsb25nIGlzIHRoaXMgaW50ZXJ2YWw/J1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdD0nbWlsbGlzZWNvbmRzJ10gLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by5jb3VudCA9IGZ1bmN0aW9uIGNvdW50KHVuaXQpIHtcbiAgICBpZiAodW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgICB1bml0ID0gXCJtaWxsaXNlY29uZHNcIjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIE5hTjtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICAgIGVuZCA9IHRoaXMuZW5kLnN0YXJ0T2YodW5pdCk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZW5kLmRpZmYoc3RhcnQsIHVuaXQpLmdldCh1bml0KSkgKyAxO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5oYXNTYW1lID0gZnVuY3Rpb24gaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBEYXRlVGltZXMuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLnZhbHVlT2YoKSA9PT0gdGhpcy5lLnZhbHVlT2YoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmlzQWZ0ZXIgPSBmdW5jdGlvbiBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmlzQmVmb3JlID0gZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmUgPD0gZGF0ZVRpbWU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucyA8PSBkYXRlVGltZSAmJiB0aGlzLmUgPiBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyB0byBzZXRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIHN0YXJ0ID0gX3JlZi5zdGFydCxcbiAgICAgICAgZW5kID0gX3JlZi5lbmQ7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQgfHwgdGhpcy5zLCBlbmQgfHwgdGhpcy5lKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBhdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWVzXHJcbiAgICogQHBhcmFtIHsuLi5bRGF0ZVRpbWVdfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBfcHJvdG8uc3BsaXRBdCA9IGZ1bmN0aW9uIHNwbGl0QXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIHNvcnRlZCA9IGRhdGVUaW1lcy5tYXAoZnJpZW5kbHlEYXRlVGltZSkuc29ydCgpLFxuICAgICAgICByZXN1bHRzID0gW107XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIHZhciBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXHJcbiAgICogTGVmdCBvdmVyIHRpbWUgaXMgZ3JvdXBlZCBpbnRvIGEgc21hbGxlciBpbnRlcnZhbFxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgbGVuZ3RoIG9mIGVhY2ggcmVzdWx0aW5nIGludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBfcHJvdG8uc3BsaXRCeSA9IGZ1bmN0aW9uIHNwbGl0QnkoZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhZHVyLmlzVmFsaWQgfHwgZHVyLmFzKFwibWlsbGlzZWNvbmRzXCIpID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGFkZGVkLFxuICAgICAgICBuZXh0O1xuICAgIHZhciByZXN1bHRzID0gW107XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgYWRkZWQgPSBzLnBsdXMoZHVyKTtcbiAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcbiAgLyoqXHJcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBpbnRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNtYWxsZXIgaW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGl2aWRlRXF1YWxseSA9IGZ1bmN0aW9uIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgb3ZlcmxhcHMgd2l0aCB0aGUgc3BlY2lmaWVkIEludGVydmFsXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm92ZXJsYXBzID0gZnVuY3Rpb24gb3ZlcmxhcHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lID4gb3RoZXIucyAmJiB0aGlzLnMgPCBvdGhlci5lO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uYWJ1dHNTdGFydCA9IGZ1bmN0aW9uIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBlbmQuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmFidXRzRW5kID0gZnVuY3Rpb24gYWJ1dHNFbmQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArb3RoZXIuZSA9PT0gK3RoaXMucztcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVuZ3VsZnMgPSBmdW5jdGlvbiBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgYXMgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIFJldHVybnMgbnVsbCBpZiB0aGUgaW50ZXJzZWN0aW9uIGlzIGVtcHR5LCBpLmUuLCB0aGUgaW50ZXJ2YWxzIGRvbid0IGludGVyc2VjdC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA+IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lIDwgb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG5cbiAgICBpZiAocyA+IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIHVuaW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnVuaW9uID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPCBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9O1xuICAvKipcclxuICAgKiBNZXJnZSBhbiBhcnJheSBvZiBJbnRlcnZhbHMgaW50byBhIGVxdWl2YWxlbnQgbWluaW1hbCBzZXQgb2YgSW50ZXJ2YWxzLlxyXG4gICAqIENvbWJpbmVzIG92ZXJsYXBwaW5nIGFuZCBhZGphY2VudCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHtbSW50ZXJ2YWxdfSBpbnRlcnZhbHNcclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwubWVyZ2UgPSBmdW5jdGlvbiBtZXJnZShpbnRlcnZhbHMpIHtcbiAgICB2YXIgX2ludGVydmFscyRzb3J0JHJlZHVjID0gaW50ZXJ2YWxzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnMgLSBiLnM7XG4gICAgfSkucmVkdWNlKGZ1bmN0aW9uIChfcmVmMiwgaXRlbSkge1xuICAgICAgdmFyIHNvZmFyID0gX3JlZjJbMF0sXG4gICAgICAgICAgY3VycmVudCA9IF9yZWYyWzFdO1xuXG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgaXRlbV07XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQub3ZlcmxhcHMoaXRlbSkgfHwgY3VycmVudC5hYnV0c1N0YXJ0KGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtzb2Zhci5jb25jYXQoW2N1cnJlbnRdKSwgaXRlbV07XG4gICAgICB9XG4gICAgfSwgW1tdLCBudWxsXSksXG4gICAgICAgIGZvdW5kID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzBdLFxuICAgICAgICBmaW5hbCA9IF9pbnRlcnZhbHMkc29ydCRyZWR1Y1sxXTtcblxuICAgIGlmIChmaW5hbCkge1xuICAgICAgZm91bmQucHVzaChmaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIHJlcHJlc2VudGluZyB0aGUgc3BhbnMgb2YgdGltZSB0aGF0IG9ubHkgYXBwZWFyIGluIG9uZSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC54b3IgPSBmdW5jdGlvbiB4b3IoaW50ZXJ2YWxzKSB7XG4gICAgdmFyIF9BcnJheSRwcm90b3R5cGU7XG5cbiAgICB2YXIgc3RhcnQgPSBudWxsLFxuICAgICAgICBjdXJyZW50Q291bnQgPSAwO1xuXG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgZW5kcyA9IGludGVydmFscy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBbe1xuICAgICAgICB0aW1lOiBpLnMsXG4gICAgICAgIHR5cGU6IFwic1wiXG4gICAgICB9LCB7XG4gICAgICAgIHRpbWU6IGkuZSxcbiAgICAgICAgdHlwZTogXCJlXCJcbiAgICAgIH1dO1xuICAgIH0pLFxuICAgICAgICBmbGF0dGVuZWQgPSAoX0FycmF5JHByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSkuY29uY2F0LmFwcGx5KF9BcnJheSRwcm90b3R5cGUsIGVuZHMpLFxuICAgICAgICBhcnIgPSBmbGF0dGVuZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGFyciwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMztcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBfcmVmMztcbiAgICAgIGN1cnJlbnRDb3VudCArPSBpLnR5cGUgPT09IFwic1wiID8gMSA6IC0xO1xuXG4gICAgICBpZiAoY3VycmVudENvdW50ID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gaS50aW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0ICYmICtzdGFydCAhPT0gK2kudGltZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHN0YXJ0LCBpLnRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwubWVyZ2UocmVzdWx0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgdGltZSBpbiB0aGlzIEludGVydmFsIHRoYXQgZG9lc24ndCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7Li4uSW50ZXJ2YWx9IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIGRpZmZlcmVuY2UoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgaW50ZXJ2YWxzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBpbnRlcnZhbHNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSkubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW50ZXJzZWN0aW9uKGkpO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgJiYgIWkuaXNFbXB0eSgpO1xuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJbXCIgKyB0aGlzLnMudG9JU08oKSArIFwiIFxcdTIwMTMgXCIgKyB0aGlzLmUudG9JU08oKSArIFwiKVwiO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbC5cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZS50b0lTT31cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTyhvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIHRoaXMucy50b0lTTyhvcHRzKSArIFwiL1wiICsgdGhpcy5lLnRvSVNPKG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lLnRvRm9ybWF0fSBmb3IgZGV0YWlscy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gICcg4oCTICddIC0gYSBzZXBhcmF0b3IgdG8gcGxhY2UgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByZXByZXNlbnRhdGlvbnNcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChkYXRlRm9ybWF0LCBfdGVtcDIpIHtcbiAgICB2YXIgX3JlZjQgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmNCRzZXBhcmF0b3IgPSBfcmVmNC5zZXBhcmF0b3IsXG4gICAgICAgIHNlcGFyYXRvciA9IF9yZWY0JHNlcGFyYXRvciA9PT0gdm9pZCAwID8gXCIg4oCTIFwiIDogX3JlZjQkc2VwYXJhdG9yO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuIFwiXCIgKyB0aGlzLnMudG9Gb3JtYXQoZGF0ZUZvcm1hdCkgKyBzZXBhcmF0b3IgKyB0aGlzLmUudG9Gb3JtYXQoZGF0ZUZvcm1hdCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbigpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogODg0ODkyNTcgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ2RheXMnKS50b09iamVjdCgpIC8vPT4geyBkYXlzOiAxLjAyNDE4MTIxNTI3Nzc3NzggfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNCwgc2Vjb25kczogNDkuMjU3IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgc2Vjb25kczogODg0ODkuMjU3IH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by50b0R1cmF0aW9uID0gZnVuY3Rpb24gdG9EdXJhdGlvbih1bml0LCBvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKHRoaXMuaW52YWxpZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZS5kaWZmKHRoaXMucywgdW5pdCwgb3B0cyk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKEludGVydmFsLCBbe1xuICAgIGtleTogXCJzdGFydFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxyXG4gICAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgaS5lLiB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1ZhbGlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkUmVhc29uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRFeHBsYW5hdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEludGVydmFsO1xufSgpO1xuXG4vKipcclxuICogVGhlIEluZm8gY2xhc3MgY29udGFpbnMgc3RhdGljIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgZ2VuZXJhbCB0aW1lIGFuZCBkYXRlIHJlbGF0ZWQgZGF0YS4gRm9yIGV4YW1wbGUsIGl0IGhhcyBtZXRob2RzIGZvciBmaW5kaW5nIG91dCBpZiBhIHRpbWUgem9uZSBoYXMgYSBEU1QsIGZvciBsaXN0aW5nIHRoZSBtb250aHMgaW4gYW55IHN1cHBvcnRlZCBsb2NhbGUsIGFuZCBmb3IgZGlzY292ZXJpbmcgd2hpY2ggb2YgTHV4b24gZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICovXG5cbnZhciBJbmZvID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5mbygpIHt9XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGNvbnRhaW5zIGEgRFNULlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gWm9uZSB0byBjaGVjay4gRGVmYXVsdHMgdG8gdGhlIGVudmlyb25tZW50J3MgbG9jYWwgem9uZS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuICBJbmZvLmhhc0RTVCA9IGZ1bmN0aW9uIGhhc0RTVCh6b25lKSB7XG4gICAgaWYgKHpvbmUgPT09IHZvaWQgMCkge1xuICAgICAgem9uZSA9IFNldHRpbmdzLmRlZmF1bHRab25lO1xuICAgIH1cblxuICAgIHZhciBwcm90byA9IERhdGVUaW1lLmxvY2FsKCkuc2V0Wm9uZSh6b25lKS5zZXQoe1xuICAgICAgbW9udGg6IDEyXG4gICAgfSk7XG4gICAgcmV0dXJuICF6b25lLnVuaXZlcnNhbCAmJiBwcm90by5vZmZzZXQgIT09IHByb3RvLnNldCh7XG4gICAgICBtb250aDogNlxuICAgIH0pLm9mZnNldDtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGlzIGEgdmFsaWQgSUFOQSBzcGVjaWZpZXIuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBab25lIHRvIGNoZWNrXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEluZm8uaXNWYWxpZElBTkFab25lID0gZnVuY3Rpb24gaXNWYWxpZElBTkFab25lKHpvbmUpIHtcbiAgICByZXR1cm4gISFJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSBtb250aCBuYW1lcy5cclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygpWzBdIC8vPT4gJ0phbnVhcnknXHJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JylbMF0gLy89PiAnSmFuJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9IClbMF0gLy89PiAnamFudi4nXHJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfZoSdcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbG9uZycsIHsgb3V0cHV0Q2FsZW5kYXI6ICdpc2xhbWljJyB9KVswXSAvLz0+ICdSYWJpyrsgSSdcclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzID0gZnVuY3Rpb24gbW9udGhzKGxlbmd0aCwgX3RlbXApIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIF9yZWYkbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRsb2NhbGUsXG4gICAgICAgIF9yZWYkbnVtYmVyaW5nU3lzdGVtID0gX3JlZi5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYkbnVtYmVyaW5nU3lzdGVtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYkb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYkb3V0cHV0Q2FsZW5kYXIgPT09IHZvaWQgMCA/IFwiZ3JlZ29yeVwiIDogX3JlZiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXHJcbiAgICogRm9ybWF0IG1vbnRocyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIG1vbnRocyBpbiB0aGF0IHRoZXkncmUgbWVhbnQgdG8gYXBwZWFyIG5leHQgdG8gdGhlIGRheSBvZiB0aGUgbW9udGguIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XHJcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxyXG4gICAqIFNlZSB7QGxpbmsgbW9udGhzfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcj0nZ3JlZ29yeSddIC0gdGhlIGNhbGVuZGFyXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLm1vbnRoc0Zvcm1hdCA9IGZ1bmN0aW9uIG1vbnRoc0Zvcm1hdChsZW5ndGgsIF90ZW1wMikge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYyID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMixcbiAgICAgICAgX3JlZjIkbG9jYWxlID0gX3JlZjIubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRsb2NhbGUsXG4gICAgICAgIF9yZWYyJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYyLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIkbnVtYmVyaW5nU3lzdGVtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjIkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmMiRvdXRwdXRDYWxlbmRhciA9IF9yZWYyLm91dHB1dENhbGVuZGFyLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYyJG91dHB1dENhbGVuZGFyID09PSB2b2lkIDAgPyBcImdyZWdvcnlcIiA6IF9yZWYyJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgd2VlayBuYW1lcy5cclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKClbMF0gLy89PiAnTW9uZGF5J1xyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSlbMF0gLy89PiAnbHVuLidcclxuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9in2YTYp9ir2YbZitmGJ1xyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCwgX3RlbXAzKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjMgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmMyRsb2NhbGUgPSBfcmVmMy5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYzJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJGxvY2FsZSxcbiAgICAgICAgX3JlZjMkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMyRudW1iZXJpbmdTeXN0ZW07XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkud2Vla2RheXMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCB3ZWVrIG5hbWVzLlxyXG4gICAqIEZvcm1hdCB3ZWVrZGF5cyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIHdlZWtkYXlzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byBtb3JlIGRhdGUgaW5mb3JtYXRpb24uIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XHJcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxyXG4gICAqIFNlZSB7QGxpbmsgd2Vla2RheXN9XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby53ZWVrZGF5c0Zvcm1hdCA9IGZ1bmN0aW9uIHdlZWtkYXlzRm9ybWF0KGxlbmd0aCwgX3RlbXA0KSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjQgPSBfdGVtcDQgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA0LFxuICAgICAgICBfcmVmNCRsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY0JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JGxvY2FsZSxcbiAgICAgICAgX3JlZjQkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNCRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNCRudW1iZXJpbmdTeXN0ZW07XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkud2Vla2RheXMobGVuZ3RoLCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxyXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKHsgbG9jYWxlOiAnbXknIH0pIC8vPT4gWyAn4YCU4YC24YCU4YCA4YC6JywgJ+GAiuGAlOGAsScgXVxyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMoX3RlbXA1KSB7XG4gICAgdmFyIF9yZWY1ID0gX3RlbXA1ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNSxcbiAgICAgICAgX3JlZjUkbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNSRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNSRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZXJhcywgc3VjaCBhcyBbJ0JDJywgJ0FEJ10uIFRoZSBsb2NhbGUgY2FuIGJlIHNwZWNpZmllZCwgYnV0IHRoZSBjYWxlbmRhciBzeXN0ZW0gaXMgYWx3YXlzIEdyZWdvcmlhbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXHJcbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJykgLy89PiBbICdCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJyBdXHJcbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJywgeyBsb2NhbGU6ICdmcicgfSkgLy89PiBbICdhdmFudCBKw6lzdXMtQ2hyaXN0JywgJ2FwcsOocyBKw6lzdXMtQ2hyaXN0JyBdXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLmVyYXMgPSBmdW5jdGlvbiBlcmFzKGxlbmd0aCwgX3RlbXA2KSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcInNob3J0XCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWY2ID0gX3RlbXA2ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNixcbiAgICAgICAgX3JlZjYkbG9jYWxlID0gX3JlZjYubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNiRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmZWF0dXJlcyBpbiB0aGlzIGVudmlyb25tZW50LlxyXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxyXG4gICAqIEtleXM6XHJcbiAgICogKiBgem9uZXNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgSUFOQSB0aW1lem9uZXNcclxuICAgKiAqIGBpbnRsVG9rZW5zYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemVkIHRva2VuLWJhc2VkIGZvcm1hdHRpbmcvcGFyc2luZ1xyXG4gICAqICogYGludGxgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgZ2VuZXJhbCBpbnRlcm5hdGlvbmFsaXphdGlvblxyXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgaW50bDogdHJ1ZSwgaW50bFRva2VuczogZmFsc2UsIHpvbmVzOiB0cnVlIH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBJbmZvLmZlYXR1cmVzID0gZnVuY3Rpb24gZmVhdHVyZXMoKSB7XG4gICAgdmFyIGludGwgPSBmYWxzZSxcbiAgICAgICAgaW50bFRva2VucyA9IGZhbHNlLFxuICAgICAgICB6b25lcyA9IGZhbHNlO1xuXG4gICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgaW50bCA9IHRydWU7XG4gICAgICBpbnRsVG9rZW5zID0gaGFzRm9ybWF0VG9QYXJ0cygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB6b25lcyA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICAgIHRpbWVab25lOiBcIkFtZXJpY2EvTmV3X1lvcmtcIlxuICAgICAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSA9PT0gXCJBbWVyaWNhL05ld19Zb3JrXCI7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHpvbmVzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGludGw6IGludGwsXG4gICAgICBpbnRsVG9rZW5zOiBpbnRsVG9rZW5zLFxuICAgICAgem9uZXM6IHpvbmVzXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICB2YXIgdXRjRGF5U3RhcnQgPSBmdW5jdGlvbiB1dGNEYXlTdGFydChkdCkge1xuICAgIHJldHVybiBkdC50b1VUQygwLCB7XG4gICAgICBrZWVwTG9jYWxUaW1lOiB0cnVlXG4gICAgfSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCk7XG4gIH0sXG4gICAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuXG4gIHJldHVybiBNYXRoLmZsb29yKER1cmF0aW9uLmZyb21NaWxsaXMobXMpLmFzKFwiZGF5c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIHZhciBkaWZmZXJzID0gW1tcInllYXJzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIueWVhciAtIGEueWVhcjtcbiAgfV0sIFtcIm1vbnRoc1wiLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLm1vbnRoIC0gYS5tb250aCArIChiLnllYXIgLSBhLnllYXIpICogMTI7XG4gIH1dLCBbXCJ3ZWVrc1wiLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICByZXR1cm4gKGRheXMgLSBkYXlzICUgNykgLyA3O1xuICB9XSwgW1wiZGF5c1wiLCBkYXlEaWZmXV07XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBsb3dlc3RPcmRlciwgaGlnaFdhdGVyO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaWZmZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZGlmZmVycyRfaSA9IGRpZmZlcnNbX2ldLFxuICAgICAgICB1bml0ID0gX2RpZmZlcnMkX2lbMF0sXG4gICAgICAgIGRpZmZlciA9IF9kaWZmZXJzJF9pWzFdO1xuXG4gICAgaWYgKHVuaXRzLmluZGV4T2YodW5pdCkgPj0gMCkge1xuICAgICAgdmFyIF9jdXJzb3IkcGx1cztcblxuICAgICAgbG93ZXN0T3JkZXIgPSB1bml0O1xuICAgICAgdmFyIGRlbHRhID0gZGlmZmVyKGN1cnNvciwgbGF0ZXIpO1xuICAgICAgaGlnaFdhdGVyID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1cyA9IHt9LCBfY3Vyc29yJHBsdXNbdW5pdF0gPSBkZWx0YSwgX2N1cnNvciRwbHVzKSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICB2YXIgX2hpZ2hXYXRlciRtaW51cztcblxuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXIubWludXMoKF9oaWdoV2F0ZXIkbWludXMgPSB7fSwgX2hpZ2hXYXRlciRtaW51c1t1bml0XSA9IDEsIF9oaWdoV2F0ZXIkbWludXMpKTtcbiAgICAgICAgZGVsdGEgLT0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlcjtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0c1t1bml0XSA9IGRlbHRhO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbY3Vyc29yLCByZXN1bHRzLCBoaWdoV2F0ZXIsIGxvd2VzdE9yZGVyXTtcbn1cblxuZnVuY3Rpb24gX2RpZmYgKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cykge1xuICB2YXIgX2hpZ2hPcmRlckRpZmZzID0gaGlnaE9yZGVyRGlmZnMoZWFybGllciwgbGF0ZXIsIHVuaXRzKSxcbiAgICAgIGN1cnNvciA9IF9oaWdoT3JkZXJEaWZmc1swXSxcbiAgICAgIHJlc3VsdHMgPSBfaGlnaE9yZGVyRGlmZnNbMV0sXG4gICAgICBoaWdoV2F0ZXIgPSBfaGlnaE9yZGVyRGlmZnNbMl0sXG4gICAgICBsb3dlc3RPcmRlciA9IF9oaWdoT3JkZXJEaWZmc1szXTtcblxuICB2YXIgcmVtYWluaW5nTWlsbGlzID0gbGF0ZXIgLSBjdXJzb3I7XG4gIHZhciBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICByZXR1cm4gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiLCBcIm1pbGxpc2Vjb25kc1wiXS5pbmRleE9mKHUpID49IDA7XG4gIH0pO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGhpZ2hXYXRlciA8IGxhdGVyKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzMjtcblxuICAgICAgaGlnaFdhdGVyID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1czIgPSB7fSwgX2N1cnNvciRwbHVzMltsb3dlc3RPcmRlcl0gPSAxLCBfY3Vyc29yJHBsdXMyKSk7XG4gICAgfVxuXG4gICAgaWYgKGhpZ2hXYXRlciAhPT0gY3Vyc29yKSB7XG4gICAgICByZXN1bHRzW2xvd2VzdE9yZGVyXSA9IChyZXN1bHRzW2xvd2VzdE9yZGVyXSB8fCAwKSArIHJlbWFpbmluZ01pbGxpcyAvIChoaWdoV2F0ZXIgLSBjdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBkdXJhdGlvbiA9IER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihyZXN1bHRzLCBvcHRzKSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIF9EdXJhdGlvbiRmcm9tTWlsbGlzO1xuXG4gICAgcmV0dXJuIChfRHVyYXRpb24kZnJvbU1pbGxpcyA9IER1cmF0aW9uLmZyb21NaWxsaXMocmVtYWluaW5nTWlsbGlzLCBvcHRzKSkuc2hpZnRUby5hcHBseShfRHVyYXRpb24kZnJvbU1pbGxpcywgbG93ZXJPcmRlclVuaXRzKS5wbHVzKGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cbn1cblxudmFyIE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QpIHtcbiAgaWYgKHBvc3QgPT09IHZvaWQgMCkge1xuICAgIHBvc3QgPSBmdW5jdGlvbiBwb3N0KGkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlZ2V4OiByZWdleCxcbiAgICBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZikge1xuICAgICAgdmFyIHMgPSBfcmVmWzBdO1xuICAgICAgcmV0dXJuIHBvc3QocGFyc2VJbnQocykpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sIFwiXFxcXC4/XCIpO1xufVxuXG5mdW5jdGlvbiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9uZU9mKHN0cmluZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgaWYgKHN0cmluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChzdHJpbmdzLm1hcChmaXhMaXN0UmVnZXgpLmpvaW4oXCJ8XCIpKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMikge1xuICAgICAgICB2YXIgcyA9IF9yZWYyWzBdO1xuICAgICAgICByZXR1cm4gc3RyaW5ncy5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpO1xuICAgICAgICB9KSArIHN0YXJ0SW5kZXg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4ge1xuICAgIHJlZ2V4OiByZWdleCxcbiAgICBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjMpIHtcbiAgICAgIHZhciBoID0gX3JlZjNbMV0sXG4gICAgICAgICAgbSA9IF9yZWYzWzJdO1xuICAgICAgcmV0dXJuIHNpZ25lZE9mZnNldChoLCBtKTtcbiAgICB9LFxuICAgIGdyb3VwczogZ3JvdXBzXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4ge1xuICAgIHJlZ2V4OiByZWdleCxcbiAgICBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjQpIHtcbiAgICAgIHZhciBzID0gX3JlZjRbMF07XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuaXRGb3JUb2tlbih0b2tlbiwgbG9jKSB7XG4gIHZhciBvbmUgPSAvXFxkLyxcbiAgICAgIHR3byA9IC9cXGR7Mn0vLFxuICAgICAgdGhyZWUgPSAvXFxkezN9LyxcbiAgICAgIGZvdXIgPSAvXFxkezR9LyxcbiAgICAgIG9uZU9yVHdvID0gL1xcZHsxLDJ9LyxcbiAgICAgIG9uZVRvVGhyZWUgPSAvXFxkezEsM30vLFxuICAgICAgdHdvVG9Gb3VyID0gL1xcZHsyLDR9LyxcbiAgICAgIGxpdGVyYWwgPSBmdW5jdGlvbiBsaXRlcmFsKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cCh0LnZhbCksXG4gICAgICBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjUpIHtcbiAgICAgICAgdmFyIHMgPSBfcmVmNVswXTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9LFxuICAgICAgbGl0ZXJhbDogdHJ1ZVxuICAgIH07XG4gIH0sXG4gICAgICB1bml0YXRlID0gZnVuY3Rpb24gdW5pdGF0ZSh0KSB7XG4gICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodC52YWwpIHtcbiAgICAgIC8vIGVyYVxuICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKFwic2hvcnRcIiwgZmFsc2UpLCAwKTtcblxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgIC8vIHllYXJzXG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KC9cXGR7MSw2fS8pO1xuXG4gICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG5cbiAgICAgIGNhc2UgXCJ5eXl5XCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuXG4gICAgICBjYXNlIFwieXl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHs0LDZ9Lyk7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHs2fS8pO1xuICAgICAgLy8gbW9udGhzXG5cbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBkYXRlc1xuXG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgLy8gb3JkaW5hbHNcblxuICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG5cbiAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgLy8gdGltZVxuXG4gICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiaGhcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwic1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcblxuICAgICAgY2FzZSBcIlNTU1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG5cbiAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1xcZHsxLDl9Lyk7XG4gICAgICAvLyBtZXJpZGllbVxuXG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1lcmlkaWVtcygpLCAwKTtcbiAgICAgIC8vIHdlZWtZZWFyIChrKVxuXG4gICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcblxuICAgICAgY2FzZSBcImtrXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgLy8gd2Vla051bWJlciAoVylcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIHdlZWtkYXlzXG5cbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmUpO1xuXG4gICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIHRydWUsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBvZmZzZXQvem9uZVxuXG4gICAgICBjYXNlIFwiWlwiOlxuICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8vLCAyKTtcblxuICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KShcXGR7Mn0pPy8sIDIpO1xuICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBaWlpaIChQU1QpIG9yIFpaWlpaIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpIGluIHBhcnNpbmdcbiAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuXG4gICAgICBjYXNlIFwielwiOlxuICAgICAgICByZXR1cm4gc2ltcGxlKC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KFxcL1thLXpfKy1dezEsMjU2fSk/KT8vaSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdW5pdCA9IHVuaXRhdGUodG9rZW4pIHx8IHtcbiAgICBpbnZhbGlkUmVhc29uOiBNSVNTSU5HX0ZUUFxuICB9O1xuICB1bml0LnRva2VuID0gdG9rZW47XG4gIHJldHVybiB1bml0O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2V4KHVuaXRzKSB7XG4gIHZhciByZSA9IHVuaXRzLm1hcChmdW5jdGlvbiAodSkge1xuICAgIHJldHVybiB1LnJlZ2V4O1xuICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGYsIHIpIHtcbiAgICByZXR1cm4gZiArIFwiKFwiICsgci5zb3VyY2UgKyBcIilcIjtcbiAgfSwgXCJcIik7XG4gIHJldHVybiBbXCJeXCIgKyByZSArIFwiJFwiLCB1bml0c107XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpIHtcbiAgdmFyIG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICB2YXIgYWxsID0ge307XG4gICAgdmFyIG1hdGNoSW5kZXggPSAxO1xuXG4gICAgZm9yICh2YXIgaSBpbiBoYW5kbGVycykge1xuICAgICAgaWYgKGhhbmRsZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHZhciBoID0gaGFuZGxlcnNbaV0sXG4gICAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG5cbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2hJbmRleCArPSBncm91cHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICB2YXIgdG9GaWVsZCA9IGZ1bmN0aW9uIHRvRmllbGQodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICByZXR1cm4gXCJtaWxsaXNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwic1wiOlxuICAgICAgICByZXR1cm4gXCJzZWNvbmRcIjtcblxuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG5cbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gXCJob3VyXCI7XG5cbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBcImRheVwiO1xuXG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gXCJvcmRpbmFsXCI7XG5cbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuXG4gICAgICBjYXNlIFwieVwiOlxuICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG5cbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtOdW1iZXJcIjtcblxuICAgICAgY2FzZSBcImtcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla1llYXJcIjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHZhciB6b25lO1xuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gbmV3IElBTkFab25lKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyhtYXRjaGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGspIHtcbiAgICB2YXIgZiA9IHRvRmllbGQoayk7XG5cbiAgICBpZiAoZikge1xuICAgICAgcltmXSA9IG1hdGNoZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG5mdW5jdGlvbiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpIHtcbiAgdmFyIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmb3JtYXQpLFxuICAgICAgdW5pdHMgPSB0b2tlbnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpO1xuICB9KSxcbiAgICAgIGRpc3F1YWxpZnlpbmdVbml0ID0gdW5pdHMuZmluZChmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmludmFsaWRSZWFzb247XG4gIH0pO1xuXG4gIGlmIChkaXNxdWFsaWZ5aW5nVW5pdCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dDogaW5wdXQsXG4gICAgICB0b2tlbnM6IHRva2VucyxcbiAgICAgIGludmFsaWRSZWFzb246IGRpc3F1YWxpZnlpbmdVbml0LmludmFsaWRSZWFzb25cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBfYnVpbGRSZWdleCA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgICByZWdleFN0cmluZyA9IF9idWlsZFJlZ2V4WzBdLFxuICAgICAgICBoYW5kbGVycyA9IF9idWlsZFJlZ2V4WzFdLFxuICAgICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgXCJpXCIpLFxuICAgICAgICBfbWF0Y2ggPSBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSxcbiAgICAgICAgcmF3TWF0Y2hlcyA9IF9tYXRjaFswXSxcbiAgICAgICAgbWF0Y2hlcyA9IF9tYXRjaFsxXSxcbiAgICAgICAgX3JlZjYgPSBtYXRjaGVzID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSA6IFtudWxsLCBudWxsXSxcbiAgICAgICAgcmVzdWx0ID0gX3JlZjZbMF0sXG4gICAgICAgIHpvbmUgPSBfcmVmNlsxXTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dDogaW5wdXQsXG4gICAgICB0b2tlbnM6IHRva2VucyxcbiAgICAgIHJlZ2V4OiByZWdleCxcbiAgICAgIHJhd01hdGNoZXM6IHJhd01hdGNoZXMsXG4gICAgICBtYXRjaGVzOiBtYXRjaGVzLFxuICAgICAgcmVzdWx0OiByZXN1bHQsXG4gICAgICB6b25lOiB6b25lXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgX2V4cGxhaW5Gcm9tVG9rZW5zID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSxcbiAgICAgIHJlc3VsdCA9IF9leHBsYWluRnJvbVRva2Vucy5yZXN1bHQsXG4gICAgICB6b25lID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnpvbmUsXG4gICAgICBpbnZhbGlkUmVhc29uID0gX2V4cGxhaW5Gcm9tVG9rZW5zLmludmFsaWRSZWFzb247XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuXG52YXIgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuaXQgb3V0IG9mIHJhbmdlXCIsIFwieW91IHNwZWNpZmllZCBcIiArIHZhbHVlICsgXCIgKG9mIHR5cGUgXCIgKyB0eXBlb2YgdmFsdWUgKyBcIikgYXMgYSBcIiArIHVuaXQgKyBcIiwgd2hpY2ggaXMgaW52YWxpZFwiKTtcbn1cblxuZnVuY3Rpb24gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgdmFyIGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgdmFyIHRhYmxlID0gaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyLFxuICAgICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGkgPCBvcmRpbmFsO1xuICB9KSxcbiAgICAgIGRheSA9IG9yZGluYWwgLSB0YWJsZVttb250aDBdO1xuICByZXR1cm4ge1xuICAgIG1vbnRoOiBtb250aDAgKyAxLFxuICAgIGRheTogZGF5XG4gIH07XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICB2YXIgeWVhciA9IGdyZWdPYmoueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ09iai5tb250aCxcbiAgICAgIGRheSA9IGdyZWdPYmouZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgd2Vla2RheSA9IGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KTtcbiAgdmFyIHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgICAgd2Vla1llYXI7XG5cbiAgaWYgKHdlZWtOdW1iZXIgPCAxKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyIC0gMTtcbiAgICB3ZWVrTnVtYmVyID0gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICh3ZWVrTnVtYmVyID4gd2Vla3NJbldlZWtZZWFyKHllYXIpKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyICsgMTtcbiAgICB3ZWVrTnVtYmVyID0gMTtcbiAgfSBlbHNlIHtcbiAgICB3ZWVrWWVhciA9IHllYXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgd2Vla1llYXI6IHdlZWtZZWFyLFxuICAgIHdlZWtOdW1iZXI6IHdlZWtOdW1iZXIsXG4gICAgd2Vla2RheTogd2Vla2RheVxuICB9LCB0aW1lT2JqZWN0KGdyZWdPYmopKTtcbn1cbmZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICB2YXIgd2Vla1llYXIgPSB3ZWVrRGF0YS53ZWVrWWVhcixcbiAgICAgIHdlZWtOdW1iZXIgPSB3ZWVrRGF0YS53ZWVrTnVtYmVyLFxuICAgICAgd2Vla2RheSA9IHdlZWtEYXRhLndlZWtkYXksXG4gICAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICAgIHllYXJJbkRheXMgPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgdmFyIG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICAgIHllYXI7XG5cbiAgaWYgKG9yZGluYWwgPCAxKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyIC0gMTtcbiAgICBvcmRpbmFsICs9IGRheXNJblllYXIoeWVhcik7XG4gIH0gZWxzZSBpZiAob3JkaW5hbCA+IHllYXJJbkRheXMpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgKyAxO1xuICAgIG9yZGluYWwgLT0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSB7XG4gICAgeWVhciA9IHdlZWtZZWFyO1xuICB9XG5cbiAgdmFyIF91bmNvbXB1dGVPcmRpbmFsID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwubW9udGgsXG4gICAgICBkYXkgPSBfdW5jb21wdXRlT3JkaW5hbC5kYXk7XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogZGF5XG4gIH0sIHRpbWVPYmplY3Qod2Vla0RhdGEpKTtcbn1cbmZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICB2YXIgeWVhciA9IGdyZWdEYXRhLnllYXIsXG4gICAgICBtb250aCA9IGdyZWdEYXRhLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ0RhdGEuZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBvcmRpbmFsOiBvcmRpbmFsXG4gIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cbmZ1bmN0aW9uIG9yZGluYWxUb0dyZWdvcmlhbihvcmRpbmFsRGF0YSkge1xuICB2YXIgeWVhciA9IG9yZGluYWxEYXRhLnllYXIsXG4gICAgICBvcmRpbmFsID0gb3JkaW5hbERhdGEub3JkaW5hbCxcbiAgICAgIF91bmNvbXB1dGVPcmRpbmFsMiA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCksXG4gICAgICBtb250aCA9IF91bmNvbXB1dGVPcmRpbmFsMi5tb250aCxcbiAgICAgIGRheSA9IF91bmNvbXB1dGVPcmRpbmFsMi5kYXk7XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogZGF5XG4gIH0sIHRpbWVPYmplY3Qob3JkaW5hbERhdGEpKTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai53ZWVrWWVhciksXG4gICAgICB2YWxpZFdlZWsgPSBudW1iZXJCZXR3ZWVuKG9iai53ZWVrTnVtYmVyLCAxLCB3ZWVrc0luV2Vla1llYXIob2JqLndlZWtZZWFyKSksXG4gICAgICB2YWxpZFdlZWtkYXkgPSBudW1iZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai55ZWFyKSxcbiAgICAgIHZhbGlkT3JkaW5hbCA9IG51bWJlckJldHdlZW4ob2JqLm9yZGluYWwsIDEsIGRheXNJblllYXIob2JqLnllYXIpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE9yZGluYWwpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJvcmRpbmFsXCIsIG9iai5vcmRpbmFsKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRNb250aCA9IG51bWJlckJldHdlZW4ob2JqLm1vbnRoLCAxLCAxMiksXG4gICAgICB2YWxpZERheSA9IG51bWJlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkSG91ciA9IG51bWJlckJldHdlZW4ob2JqLmhvdXIsIDAsIDIzKSxcbiAgICAgIHZhbGlkTWludXRlID0gbnVtYmVyQmV0d2VlbihvYmoubWludXRlLCAwLCA1OSksXG4gICAgICB2YWxpZFNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLnNlY29uZCwgMCwgNTkpLFxuICAgICAgdmFsaWRNaWxsaXNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLm1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiaG91clwiLCBvYmouaG91cik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWludXRlKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWludXRlXCIsIG9iai5taW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBvYmouc2Vjb24pO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgb2JqLm1pbGxpc2Vjb25kKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxudmFyIElOVkFMSUQkMiA9IFwiSW52YWxpZCBEYXRlVGltZVwiO1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIFwidGhlIHpvbmUgXFxcIlwiICsgem9uZS5uYW1lICsgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG59IC8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5cblxuZnVuY3Rpb24gcG9zc2libHlDYWNoZWRXZWVrRGF0YShkdCkge1xuICBpZiAoZHQud2Vla0RhdGEgPT09IG51bGwpIHtcbiAgICBkdC53ZWVrRGF0YSA9IGdyZWdvcmlhblRvV2VlayhkdC5jKTtcbiAgfVxuXG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn0gLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuXG5cbmZ1bmN0aW9uIGNsb25lJDEoaW5zdCwgYWx0cykge1xuICB2YXIgY3VycmVudCA9IHtcbiAgICB0czogaW5zdC50cyxcbiAgICB6b25lOiBpbnN0LnpvbmUsXG4gICAgYzogaW5zdC5jLFxuICAgIG86IGluc3QubyxcbiAgICBsb2M6IGluc3QubG9jLFxuICAgIGludmFsaWQ6IGluc3QuaW52YWxpZFxuICB9O1xuICByZXR1cm4gbmV3IERhdGVUaW1lKE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnQsIGFsdHMsIHtcbiAgICBvbGQ6IGN1cnJlbnRcbiAgfSkpO1xufSAvLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5cblxuZnVuY3Rpb24gZml4T2Zmc2V0KGxvY2FsVFMsIG8sIHR6KSB7XG4gIC8vIE91ciBVVEMgdGltZSBpcyBqdXN0IGEgZ3Vlc3MgYmVjYXVzZSBvdXIgb2Zmc2V0IGlzIGp1c3QgYSBndWVzc1xuICB2YXIgdXRjR3Vlc3MgPSBsb2NhbFRTIC0gbyAqIDYwICogMTAwMDsgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuXG4gIHZhciBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7IC8vIElmIHNvLCBvZmZzZXQgZGlkbid0IGNoYW5nZSBhbmQgd2UncmUgZG9uZVxuXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9IC8vIElmIG5vdCwgY2hhbmdlIHRoZSB0cyBieSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgb2Zmc2V0XG5cblxuICB1dGNHdWVzcyAtPSAobzIgLSBvKSAqIDYwICogMTAwMDsgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG5cbiAgdmFyIG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcblxuICBpZiAobzIgPT09IG8zKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgbzJdO1xuICB9IC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcblxuXG4gIHJldHVybiBbbG9jYWxUUyAtIE1hdGgubWluKG8yLCBvMykgKiA2MCAqIDEwMDAsIE1hdGgubWF4KG8yLCBvMyldO1xufSAvLyBjb252ZXJ0IGFuIGVwb2NoIHRpbWVzdGFtcCBpbnRvIGEgY2FsZW5kYXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG9mZnNldFxuXG5cbmZ1bmN0aW9uIHRzVG9PYmoodHMsIG9mZnNldCkge1xuICB0cyArPSBvZmZzZXQgKiA2MCAqIDEwMDA7XG4gIHZhciBkID0gbmV3IERhdGUodHMpO1xuICByZXR1cm4ge1xuICAgIHllYXI6IGQuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICBtb250aDogZC5nZXRVVENNb250aCgpICsgMSxcbiAgICBkYXk6IGQuZ2V0VVRDRGF0ZSgpLFxuICAgIGhvdXI6IGQuZ2V0VVRDSG91cnMoKSxcbiAgICBtaW51dGU6IGQuZ2V0VVRDTWludXRlcygpLFxuICAgIHNlY29uZDogZC5nZXRVVENTZWNvbmRzKCksXG4gICAgbWlsbGlzZWNvbmQ6IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcbiAgfTtcbn0gLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcblxuXG5mdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIHZhciBkID0gRGF0ZS5VVEMob2JqLnllYXIsIG9iai5tb250aCAtIDEsIG9iai5kYXksIG9iai5ob3VyLCBvYmoubWludXRlLCBvYmouc2Vjb25kLCBvYmoubWlsbGlzZWNvbmQpOyAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG5cbiAgaWYgKG9iai55ZWFyIDwgMTAwICYmIG9iai55ZWFyID49IDApIHtcbiAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgZC5zZXRVVENGdWxsWWVhcihvYmoueWVhcik7XG4gIH1cblxuICByZXR1cm4gK2Q7XG59IC8vIGNvbnZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBlcG9jaCB0aW1lc3RhbXBcblxuXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59IC8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5cblxuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgdmFyIG9QcmUgPSBpbnN0Lm8sXG4gICAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBkdXIueWVhcnMsXG4gICAgICBtb250aCA9IGluc3QuYy5tb250aCArIGR1ci5tb250aHMgKyBkdXIucXVhcnRlcnMgKiAzLFxuICAgICAgYyA9IE9iamVjdC5hc3NpZ24oe30sIGluc3QuYywge1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogTWF0aC5taW4oaW5zdC5jLmRheSwgZGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArIGR1ci5kYXlzICsgZHVyLndlZWtzICogN1xuICB9KSxcbiAgICAgIG1pbGxpc1RvQWRkID0gRHVyYXRpb24uZnJvbU9iamVjdCh7XG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoXCJtaWxsaXNlY29uZHNcIiksXG4gICAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIHZhciBfZml4T2Zmc2V0ID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSksXG4gICAgICB0cyA9IF9maXhPZmZzZXRbMF0sXG4gICAgICBvID0gX2ZpeE9mZnNldFsxXTtcblxuICBpZiAobWlsbGlzVG9BZGQgIT09IDApIHtcbiAgICB0cyArPSBtaWxsaXNUb0FkZDsgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuXG4gICAgbyA9IGluc3Quem9uZS5vZmZzZXQodHMpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0czogdHMsXG4gICAgbzogb1xuICB9O1xufSAvLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcblxuXG5mdW5jdGlvbiBwYXJzZURhdGFUb0RhdGVUaW1lKHBhcnNlZCwgcGFyc2VkWm9uZSwgb3B0cywgZm9ybWF0LCB0ZXh0KSB7XG4gIHZhciBzZXRab25lID0gb3B0cy5zZXRab25lLFxuICAgICAgem9uZSA9IG9wdHMuem9uZTtcblxuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMsIHtcbiAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQobmV3IEludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIFwidGhlIGlucHV0IFxcXCJcIiArIHRleHQgKyBcIlxcXCIgY2FuJ3QgYmUgcGFyc2VkIGFzIFwiICsgZm9ybWF0KSk7XG4gIH1cbn0gLy8gaWYgeW91IHdhbnQgdG8gb3V0cHV0IGEgdGVjaG5pY2FsIGZvcm1hdCAoZS5nLiBSRkMgMjgyMiksIHRoaXMgaGVscGVyXG4vLyBoZWxwcyBoYW5kbGUgdGhlIGRldGFpbHNcblxuXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCkge1xuICByZXR1cm4gZHQuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUoTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpLCB7XG4gICAgYWxsb3daOiB0cnVlLFxuICAgIGZvcmNlU2ltcGxlOiB0cnVlXG4gIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KSA6IG51bGw7XG59IC8vIHRlY2huaWNhbCB0aW1lIGZvcm1hdHMgKGUuZy4gdGhlIHRpbWUgcGFydCBvZiBJU08gODYwMSksIHRha2Ugc29tZSBvcHRpb25zXG4vLyBhbmQgdGhpcyBjb21tb25pemVzIHRoZWlyIGhhbmRsaW5nXG5cblxuZnVuY3Rpb24gdG9UZWNoVGltZUZvcm1hdChkdCwgX3JlZikge1xuICB2YXIgX3JlZiRzdXBwcmVzc1NlY29uZHMgPSBfcmVmLnN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NTZWNvbmRzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgX3JlZiRzdXBwcmVzc01pbGxpc2VjID0gX3JlZi5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gX3JlZiRzdXBwcmVzc01pbGxpc2VjID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyxcbiAgICAgIF9yZWYkaW5jbHVkZU9mZnNldCA9IF9yZWYuaW5jbHVkZU9mZnNldCxcbiAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmJGluY2x1ZGVPZmZzZXQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJGluY2x1ZGVPZmZzZXQsXG4gICAgICBfcmVmJGluY2x1ZGVab25lID0gX3JlZi5pbmNsdWRlWm9uZSxcbiAgICAgIGluY2x1ZGVab25lID0gX3JlZiRpbmNsdWRlWm9uZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGluY2x1ZGVab25lLFxuICAgICAgX3JlZiRzcGFjZVpvbmUgPSBfcmVmLnNwYWNlWm9uZSxcbiAgICAgIHNwYWNlWm9uZSA9IF9yZWYkc3BhY2Vab25lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc3BhY2Vab25lO1xuICB2YXIgZm10ID0gXCJISDptbVwiO1xuXG4gIGlmICghc3VwcHJlc3NTZWNvbmRzIHx8IGR0LnNlY29uZCAhPT0gMCB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgIGZtdCArPSBcIjpzc1wiO1xuXG4gICAgaWYgKCFzdXBwcmVzc01pbGxpc2Vjb25kcyB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgICAgZm10ICs9IFwiLlNTU1wiO1xuICAgIH1cbiAgfVxuXG4gIGlmICgoaW5jbHVkZVpvbmUgfHwgaW5jbHVkZU9mZnNldCkgJiYgc3BhY2Vab25lKSB7XG4gICAgZm10ICs9IFwiIFwiO1xuICB9XG5cbiAgaWYgKGluY2x1ZGVab25lKSB7XG4gICAgZm10ICs9IFwielwiO1xuICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICBmbXQgKz0gXCJaWlwiO1xuICB9XG5cbiAgcmV0dXJuIHRvVGVjaEZvcm1hdChkdCwgZm10KTtcbn0gLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5cblxudmFyIGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdFdlZWtVbml0VmFsdWVzID0ge1xuICB3ZWVrTnVtYmVyOiAxLFxuICB3ZWVrZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICBvcmRpbmFsOiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn07IC8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xuXG52YXIgb3JkZXJlZFVuaXRzJDEgPSBbXCJ5ZWFyXCIsIFwibW9udGhcIiwgXCJkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0sXG4gICAgb3JkZXJlZFdlZWtVbml0cyA9IFtcIndlZWtZZWFyXCIsIFwid2Vla051bWJlclwiLCBcIndlZWtkYXlcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl0sXG4gICAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdOyAvLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcblxuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0LCBpZ25vcmVVbmtub3duKSB7XG4gIGlmIChpZ25vcmVVbmtub3duID09PSB2b2lkIDApIHtcbiAgICBpZ25vcmVVbmtub3duID0gZmFsc2U7XG4gIH1cblxuICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICB5ZWFyOiBcInllYXJcIixcbiAgICB5ZWFyczogXCJ5ZWFyXCIsXG4gICAgbW9udGg6IFwibW9udGhcIixcbiAgICBtb250aHM6IFwibW9udGhcIixcbiAgICBkYXk6IFwiZGF5XCIsXG4gICAgZGF5czogXCJkYXlcIixcbiAgICBob3VyOiBcImhvdXJcIixcbiAgICBob3VyczogXCJob3VyXCIsXG4gICAgbWludXRlOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZXM6IFwibWludXRlXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiXG4gIH1bdW5pdCA/IHVuaXQudG9Mb3dlckNhc2UoKSA6IHVuaXRdO1xuICBpZiAoIWlnbm9yZVVua25vd24gJiYgIW5vcm1hbGl6ZWQpIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn0gLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuXG5cbmZ1bmN0aW9uIHF1aWNrRFQob2JqLCB6b25lKSB7XG4gIC8vIGFzc3VtZSB3ZSBoYXZlIHRoZSBoaWdoZXItb3JkZXIgdW5pdHNcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9yZGVyZWRVbml0cyQxLmxlbmd0aDsgX2krKykge1xuICAgIHZhciB1ID0gb3JkZXJlZFVuaXRzJDFbX2ldO1xuXG4gICAgaWYgKGlzVW5kZWZpbmVkKG9ialt1XSkpIHtcbiAgICAgIG9ialt1XSA9IGRlZmF1bHRVbml0VmFsdWVzW3VdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbnZhbGlkID0gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB8fCBoYXNJbnZhbGlkVGltZURhdGEob2JqKTtcblxuICBpZiAoaW52YWxpZCkge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICB9XG5cbiAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICBvZmZzZXRQcm92aXMgPSB6b25lLm9mZnNldCh0c05vdyksXG4gICAgICBfb2JqVG9UUyA9IG9ialRvVFMob2JqLCBvZmZzZXRQcm92aXMsIHpvbmUpLFxuICAgICAgdHMgPSBfb2JqVG9UU1swXSxcbiAgICAgIG8gPSBfb2JqVG9UU1sxXTtcblxuICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICB0czogdHMsXG4gICAgem9uZTogem9uZSxcbiAgICBvOiBvXG4gIH0pO1xufVxuLyoqXHJcbiAqIEEgRGF0ZVRpbWUgaXMgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGRhdGUgYW5kIHRpbWUgYW5kIGFjY29tcGFueWluZyBtZXRob2RzLiBJdCBjb250YWlucyBjbGFzcyBhbmQgaW5zdGFuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XHJcbiAqICogQSB0aW1lc3RhbXAuIEVhY2ggRGF0ZVRpbWUgaW5zdGFuY2UgcmVmZXJzIHRvIGEgc3BlY2lmaWMgbWlsbGlzZWNvbmQgb2YgdGhlIFVuaXggZXBvY2guXHJcbiAqICogQSB0aW1lIHpvbmUuIEVhY2ggaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBpbiB0aGUgY29udGV4dCBvZiBhIHNwZWNpZmljIHpvbmUgKGJ5IGRlZmF1bHQgdGhlIGxvY2FsIHN5c3RlbSdzIHpvbmUpLlxyXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxyXG4gKlxyXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdW5jdGlvbmFsaXR5IGl0IHByb3ZpZGVzOlxyXG4gKlxyXG4gKiAqICoqQ3JlYXRpb24qKjogVG8gY3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBpdHMgY29tcG9uZW50cywgdXNlIG9uZSBvZiBpdHMgZmFjdG9yeSBjbGFzcyBtZXRob2RzOiB7QGxpbmsgbG9jYWx9LCB7QGxpbmsgdXRjfSwgYW5kIChtb3N0IGZsZXhpYmx5KSB7QGxpbmsgZnJvbU9iamVjdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIHN0YW5kYXJkIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUlTT30sIHtAbGluayBmcm9tSFRUUH0sIGFuZCB7QGxpbmsgZnJvbVJGQzI4MjJ9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBjdXN0b20gc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tRm9ybWF0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgbmF0aXZlIEpTIGRhdGUsIHVzZSB7QGxpbmsgZnJvbUpTRGF0ZX0uXHJcbiAqICogKipHcmVnb3JpYW4gY2FsZW5kYXIgYW5kIHRpbWUqKjogVG8gZXhhbWluZSB0aGUgR3JlZ29yaWFuIHByb3BlcnRpZXMgb2YgYSBEYXRlVGltZSBpbmRpdmlkdWFsbHkgKGkuZSBhcyBvcHBvc2VkIHRvIGNvbGxlY3RpdmVseSB0aHJvdWdoIHtAbGluayB0b09iamVjdH0pLCB1c2UgdGhlIHtAbGluayB5ZWFyfSwge0BsaW5rIG1vbnRofSxcclxuICoge0BsaW5rIGRheX0sIHtAbGluayBob3VyfSwge0BsaW5rIG1pbnV0ZX0sIHtAbGluayBzZWNvbmR9LCB7QGxpbmsgbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cclxuICogKiAqKldlZWsgY2FsZW5kYXIqKjogRm9yIElTTyB3ZWVrIGNhbGVuZGFyIGF0dHJpYnV0ZXMsIHNlZSB0aGUge0BsaW5rIHdlZWtZZWFyfSwge0BsaW5rIHdlZWtOdW1iZXJ9LCBhbmQge0BsaW5rIHdlZWtkYXl9IGFjY2Vzc29ycy5cclxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgdGhlIHtAbGluayBsb2NhbGV9IGFuZCB7QGxpbmsgbnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayByZWNvbmZpZ3VyZX0sIHtAbGluayBzZXRab25lfSwge0BsaW5rIHNldExvY2FsZX0sIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIGVuZE9mfSwge0BsaW5rIHN0YXJ0T2Z9LCB7QGxpbmsgdG9VVEN9LCBhbmQge0BsaW5rIHRvTG9jYWx9LlxyXG4gKiAqICoqT3V0cHV0Kio6IFRvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgdXNlIHRoZSB7QGxpbmsgdG9KU09OfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvSFRUUH0sIHtAbGluayB0b09iamVjdH0sIHtAbGluayB0b1JGQzI4MjJ9LCB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9LCB7QGxpbmsgdG9Gb3JtYXR9LCB7QGxpbmsgdG9NaWxsaXN9IGFuZCB7QGxpbmsgdG9KU0RhdGV9LlxyXG4gKlxyXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxyXG4gKi9cblxuXG52YXIgRGF0ZVRpbWUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gRGF0ZVRpbWUoY29uZmlnKSB7XG4gICAgdmFyIHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSxcbiAgICAgICAgaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IChOdW1iZXIuaXNOYU4oY29uZmlnLnRzKSA/IG5ldyBJbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKSA6IG51bGwpIHx8ICghem9uZS5pc1ZhbGlkID8gdW5zdXBwb3J0ZWRab25lKHpvbmUpIDogbnVsbCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy50cyA9IGlzVW5kZWZpbmVkKGNvbmZpZy50cykgPyBTZXR0aW5ncy5ub3coKSA6IGNvbmZpZy50cztcbiAgICB2YXIgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuXG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICB2YXIgdW5jaGFuZ2VkID0gY29uZmlnLm9sZCAmJiBjb25maWcub2xkLnRzID09PSB0aGlzLnRzICYmIGNvbmZpZy5vbGQuem9uZS5lcXVhbHMoem9uZSk7XG4gICAgICBjID0gdW5jaGFuZ2VkID8gY29uZmlnLm9sZC5jIDogdHNUb09iaih0aGlzLnRzLCB6b25lLm9mZnNldCh0aGlzLnRzKSk7XG4gICAgICBvID0gdW5jaGFuZ2VkID8gY29uZmlnLm9sZC5vIDogem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy56b25lID0gem9uZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy53ZWVrRGF0YSA9IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuaXNMdXhvbkRhdGVUaW1lID0gdHJ1ZTtcbiAgfSAvLyBDT05TVFJVQ1RcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBsb2NhbCBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5ZWFyIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGBsb2NhbCgpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmxvY2FsID0gZnVuY3Rpb24gbG9jYWwoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHllYXIpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IFNldHRpbmdzLm5vdygpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVpcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnV0YyA9IGZ1bmN0aW9uIHV0Yyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KCksXG4gICAgICAgIHpvbmU6IEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YXNjcmlwdCBEYXRlIG9iamVjdC4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIGEgSmF2YXNjcmlwdCBEYXRlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21KU0RhdGUgPSBmdW5jdGlvbiBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICB0czogaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU4sXG4gICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgLSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCBVVENcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhtaWxsaXNlY29uZHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFpc051bWJlcihtaWxsaXNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IG1pbGxpc2Vjb25kcyxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChpLmUuIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vjb25kcyAtIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMTk3MCBVVENcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU2Vjb25kcyA9IGZ1bmN0aW9uIGZyb21TZWNvbmRzKHNlY29uZHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFpc051bWJlcihzZWNvbmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbVNlY29uZHMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogc2Vjb25kcyAqIDEwMDAsXG4gICAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucylcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFyJyBhbmQgJ2hvdXInIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXIgLSBhIHllYXIsIHN1Y2ggYXMgMTk4N1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGggLSBhIG1vbnRoLCAxLTEyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm9yZGluYWwgLSBkYXkgb2YgdGhlIHllYXIsIDEtMzY1IG9yIDM2NlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla1llYXIgLSBhbiBJU08gd2VlayB5ZWFyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtkYXkgLSBhbiBJU08gd2Vla2RheSwgMS03LCB3aGVyZSAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXIgLSBob3VyIG9mIHRoZSBkYXksIDAtMjNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kIC0gc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAtNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kIC0gbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgMC05OTlcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb2JqLnpvbmU9J2xvY2FsJ10gLSBpbnRlcnByZXQgdGhlIG51bWJlcnMgaW4gdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIHpvbmUuIENhbiB0YWtlIGFueSB2YWx1ZSB0YWtlbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0Wm9uZSgpXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiwgbW9udGg6IDUsIGRheTogMjV9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTA1LTI1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDEtMDFUMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAndXRjJyB9KSxcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ2xvY2FsJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgd2Vla1llYXI6IDIwMTYsIHdlZWtOdW1iZXI6IDIsIHdlZWtkYXk6IDMgfSkudG9JU09EYXRlKCkgLy89PiAnMjAxNi0wMS0xMydcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIHZhciB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9iai56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoIXpvbmVUb1VzZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZVRvVXNlKSk7XG4gICAgfVxuXG4gICAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmVUb1VzZS5vZmZzZXQodHNOb3cpLFxuICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgICBjb250YWluc0dyZWdvclllYXIgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC55ZWFyKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgICBkZWZpbml0ZVdlZWtEZWYgPSBub3JtYWxpemVkLndlZWtZZWFyIHx8IG5vcm1hbGl6ZWQud2Vla051bWJlcixcbiAgICAgICAgbG9jID0gTG9jYWxlLmZyb21PYmplY3Qob2JqKTsgLy8gY2FzZXM6XG4gICAgLy8ganVzdCBhIHdlZWtkYXkgLT4gdGhpcyB3ZWVrJ3MgaW5zdGFuY2Ugb2YgdGhhdCB3ZWVrZGF5LCBubyB3b3JyaWVzXG4gICAgLy8gKGdyZWdvcmlhbiBkYXRhIG9yIG9yZGluYWwpICsgKHdlZWtZZWFyIG9yIHdlZWtOdW1iZXIpIC0+IGVycm9yXG4gICAgLy8gKGdyZWdvcmlhbiBtb250aCBvciBkYXkpICsgb3JkaW5hbCAtPiBlcnJvclxuICAgIC8vIG90aGVyd2lzZSBqdXN0IHVzZSB3ZWVrcyBvciBvcmRpbmFscyBvciBncmVnb3JpYW4sIGRlcGVuZGluZyBvbiB3aGF0J3Mgc3BlY2lmaWVkXG5cbiAgICBpZiAoKGNvbnRhaW5zR3JlZ29yIHx8IGNvbnRhaW5zT3JkaW5hbCkgJiYgZGVmaW5pdGVXZWVrRGVmKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzXCIpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluc0dyZWdvck1EICYmIGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXlcIik7XG4gICAgfVxuXG4gICAgdmFyIHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IG5vcm1hbGl6ZWQud2Vla2RheSAmJiAhY29udGFpbnNHcmVnb3I7IC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG5cbiAgICB2YXIgdW5pdHMsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG5cbiAgICBpZiAodXNlV2Vla0RhdGEpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFdlZWtVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0V2Vla1VuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub1dlZWsob2JqTm93KTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkT3JkaW5hbFVuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRPcmRpbmFsVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvT3JkaW5hbChvYmpOb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRVbml0cyQxO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRVbml0VmFsdWVzO1xuICAgIH0gLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG5cblxuICAgIHZhciBmb3VuZEZpcnN0ID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSB1bml0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pMiA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjI7XG5cbiAgICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgICBpZiAoX2kyID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMiA9IF9pdGVyYXRvcltfaTIrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTIgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoX2kyLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMiA9IF9pMi52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSBfcmVmMjtcbiAgICAgIHZhciB2ID0gbm9ybWFsaXplZFt1XTtcblxuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfSAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyB3ZSBoYXZlIGFyZSBpbiByYW5nZVxuXG5cbiAgICB2YXIgaGlnaGVyT3JkZXJJbnZhbGlkID0gdXNlV2Vla0RhdGEgPyBoYXNJbnZhbGlkV2Vla0RhdGEobm9ybWFsaXplZCkgOiBjb250YWluc09yZGluYWwgPyBoYXNJbnZhbGlkT3JkaW5hbERhdGEobm9ybWFsaXplZCkgOiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShub3JtYWxpemVkKSxcbiAgICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuXG5cbiAgICB2YXIgZ3JlZ29yaWFuID0gdXNlV2Vla0RhdGEgPyB3ZWVrVG9HcmVnb3JpYW4obm9ybWFsaXplZCkgOiBjb250YWluc09yZGluYWwgPyBvcmRpbmFsVG9HcmVnb3JpYW4obm9ybWFsaXplZCkgOiBub3JtYWxpemVkLFxuICAgICAgICBfb2JqVG9UUzIgPSBvYmpUb1RTKGdyZWdvcmlhbiwgb2Zmc2V0UHJvdmlzLCB6b25lVG9Vc2UpLFxuICAgICAgICB0c0ZpbmFsID0gX29ialRvVFMyWzBdLFxuICAgICAgICBvZmZzZXRGaW5hbCA9IF9vYmpUb1RTMlsxXSxcbiAgICAgICAgaW5zdCA9IG5ldyBEYXRlVGltZSh7XG4gICAgICB0czogdHNGaW5hbCxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIG86IG9mZnNldEZpbmFsLFxuICAgICAgbG9jOiBsb2NcbiAgICB9KTsgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG5cblxuICAgIGlmIChub3JtYWxpemVkLndlZWtkYXkgJiYgY29udGFpbnNHcmVnb3IgJiYgb2JqLndlZWtkYXkgIT09IGluc3Qud2Vla2RheSkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJtaXNtYXRjaGVkIHdlZWtkYXlcIiwgXCJ5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiBcIiArIG5vcm1hbGl6ZWQud2Vla2RheSArIFwiIGFuZCBhIGRhdGUgb2YgXCIgKyBpbnN0LnRvSVNPKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0O1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJywge3pvbmU6ICd1dGMnfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LVcwNS00JylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9wYXJzZUlTT0RhdGUgPSBwYXJzZUlTT0RhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VJU09EYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSVNPRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSVNPIDg2MDFcIiwgdGV4dCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJ1R1ZSwgMjUgTm92IDIwMTYgMTM6MjM6MTIgKzA2MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21SRkMyODIyID0gZnVuY3Rpb24gZnJvbVJGQzI4MjIodGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlUkZDMjgyMkRhdGUgPSBwYXJzZVJGQzI4MjJEYXRlKHRleHQpLFxuICAgICAgICB2YWxzID0gX3BhcnNlUkZDMjgyMkRhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VSRkMyODIyRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiUkZDIDI4MjJcIiwgdGV4dCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSFRUUCBoZWFkZXIgZGF0ZVxyXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSFRUUCBoZWFkZXIgZGF0ZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIHRoZSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4gRm9yIEhUVFAgZGF0ZXMsIHRoaXMgaXMgYWx3YXlzIFVUQywgc28gdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBgem9uZWAgb3B0aW9uIHRvICd1dGMnLCBidXQgdGhpcyBvcHRpb24gaXMgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggc2ltaWxhciBtZXRob2RzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuZGF5LCAwNi1Ob3YtOTQgMDg6NDk6MzcgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuIE5vdiAgNiAwODo0OTozNyAxOTk0JylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21IVFRQID0gZnVuY3Rpb24gZnJvbUhUVFAodGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlSFRUUERhdGUgPSBwYXJzZUhUVFBEYXRlKHRleHQpLFxuICAgICAgICB2YWxzID0gX3BhcnNlSFRUUERhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VIVFRQRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBpbnB1dCBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgZGVzY3JpcHRpb24pXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tRm9ybWF0ID0gZnVuY3Rpb24gZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICB2YXIgX29wdHMgPSBvcHRzLFxuICAgICAgICBfb3B0cyRsb2NhbGUgPSBfb3B0cy5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9vcHRzJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRzJGxvY2FsZSxcbiAgICAgICAgX29wdHMkbnVtYmVyaW5nU3lzdGVtID0gX29wdHMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0cyRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0cyRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sXG4gICAgICBkZWZhdWx0VG9FTjogdHJ1ZVxuICAgIH0pLFxuICAgICAgICBfcGFyc2VGcm9tVG9rZW5zID0gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpLFxuICAgICAgICB2YWxzID0gX3BhcnNlRnJvbVRva2Vuc1swXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZUZyb21Ub2tlbnNbMV0sXG4gICAgICAgIGludmFsaWQgPSBfcGFyc2VGcm9tVG9rZW5zWzJdO1xuXG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcImZvcm1hdCBcIiArIGZtdCwgdGV4dCk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodGV4dCwgZm10LCBvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycsIHsgc2V0Wm9uZTogdHJ1ZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcwOToxMjozNC4zNDInKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVNRTCA9IGZ1bmN0aW9uIGZyb21TUUwodGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlU1FMID0gcGFyc2VTUUwodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VTUUxbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VTUUxbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICBpZiAoZXhwbGFuYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgZXhwbGFuYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIERhdGVUaW1lIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIGludmFsaWQ6IGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRGF0ZVRpbWUuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5pc0RhdGVUaW1lID0gZnVuY3Rpb24gaXNEYXRlVGltZShvKSB7XG4gICAgcmV0dXJuIG8uaXNMdXhvbkRhdGVUaW1lO1xuICB9OyAvLyBJTkZPXG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ21vbnRoJyk7IC8vPT4gN1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBEYXRlVGltZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbdW5pdF07XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgYnkgYW4gb3BlcmF0aW9uIG9uIGFub3RoZXIgaW52YWxpZCBkYXRlXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSB0aGUgc2FtZSBvcHRpb25zIGFzIHRvTG9jYWxlU3RyaW5nXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuICBfcHJvdG8ucmVzb2x2ZWRMb2NhbGVPcHRzID0gZnVuY3Rpb24gcmVzb2x2ZWRMb2NhbGVPcHRzKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcyA9IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLnJlc29sdmVkT3B0aW9ucyh0aGlzKSxcbiAgICAgICAgbG9jYWxlID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLmxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgY2FsZW5kYXIgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMuY2FsZW5kYXI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhclxuICAgIH07XG4gIH07IC8vIFRSQU5TRk9STVxuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIHNldFpvbmV9KCd1dGMnKVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9VVEMgPSBmdW5jdGlvbiB0b1VUQyhvZmZzZXQsIG9wdHMpIHtcbiAgICBpZiAob2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gdGhlIGhvc3QncyBsb2NhbCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUobmV3IExvY2FsWm9uZSgpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIHNwZWNpZmllZCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSBVVEMgdGltZXN0YW1wKSwgYnV0IHRoZSBuZXcgaW5zdGFuY2Ugd2lsbCByZXBvcnQgZGlmZmVyZW50IGxvY2FsIHRpbWVzIGFuZCBjb25zaWRlciBEU1RzIHdoZW4gbWFraW5nIGNvbXB1dGF0aW9ucywgYXMgd2l0aCB7QGxpbmsgcGx1c30uIFlvdSBtYXkgd2lzaCB0byB1c2Uge0BsaW5rIHRvTG9jYWx9IGFuZCB7QGxpbmsgdG9VVEN9IHdoaWNoIHByb3ZpZGUgc2ltcGxlIGNvbnZlbmllbmNlIHdyYXBwZXJzIGZvciBjb21tb25seSB1c2VkIHpvbmVzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAndXRjKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIFpvbmV9IGNsYXNzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMua2VlcExvY2FsVGltZT1mYWxzZV0gLSBJZiB0cnVlLCBhZGp1c3QgdGhlIHVuZGVybHlpbmcgdGltZSBzbyB0aGF0IHRoZSBsb2NhbCB0aW1lIHN0YXlzIHRoZSBzYW1lLCBidXQgaW4gdGhlIHRhcmdldCB6b25lLiBZb3Ugc2hvdWxkIHJhcmVseSBuZWVkIHRoaXMuXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0Wm9uZSA9IGZ1bmN0aW9uIHNldFpvbmUoem9uZSwgX3RlbXApIHtcbiAgICB2YXIgX3JlZjMgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgX3JlZjMka2VlcExvY2FsVGltZSA9IF9yZWYzLmtlZXBMb2NhbFRpbWUsXG4gICAgICAgIGtlZXBMb2NhbFRpbWUgPSBfcmVmMyRrZWVwTG9jYWxUaW1lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGtlZXBMb2NhbFRpbWUsXG4gICAgICAgIF9yZWYzJGtlZXBDYWxlbmRhclRpbSA9IF9yZWYzLmtlZXBDYWxlbmRhclRpbWUsXG4gICAgICAgIGtlZXBDYWxlbmRhclRpbWUgPSBfcmVmMyRrZWVwQ2FsZW5kYXJUaW0gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMka2VlcENhbGVuZGFyVGltO1xuXG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuXG4gICAgaWYgKHpvbmUuZXF1YWxzKHRoaXMuem9uZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoIXpvbmUuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5ld1RTID0ga2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lIC8vIGtlZXBDYWxlbmRhclRpbWUgaXMgdGhlIGRlcHJlY2F0ZWQgbmFtZSBmb3Iga2VlcExvY2FsVGltZVxuICAgICAgPyB0aGlzLnRzICsgKHRoaXMubyAtIHpvbmUub2Zmc2V0KHRoaXMudHMpKSAqIDYwICogMTAwMCA6IHRoaXMudHM7XG4gICAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICAgIHRzOiBuZXdUUyxcbiAgICAgICAgem9uZTogem9uZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoX3RlbXAyKSB7XG4gICAgdmFyIF9yZWY0ID0gX3RlbXAyID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMixcbiAgICAgICAgbG9jYWxlID0gX3JlZjQubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNC5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjQub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIG91dHB1dENhbGVuZGFyOiBvdXRwdXRDYWxlbmRhclxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHtcbiAgICAgIGxvYzogbG9jXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5zZXRMb2NhbGUoJ2VuLUdCJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zZXRMb2NhbGUgPSBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoe1xuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIFlvdSBjYW4gb25seSBzZXQgdW5pdHMgd2l0aCB0aGlzIG1ldGhvZDsgZm9yIFwic2V0dGluZ1wiIG1ldGFkYXRhLCBzZWUge0BsaW5rIHJlY29uZmlndXJlfSBhbmQge0BsaW5rIHNldFpvbmV9LlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHllYXI6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyBob3VyOiA4LCBtaW51dGU6IDMwIH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgd2Vla2RheTogNSB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHllYXI6IDIwMDUsIG9yZGluYWw6IDIzNCB9KVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgICAgc2V0dGluZ1dlZWtTdHVmZiA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtZZWFyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrTnVtYmVyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrZGF5KTtcbiAgICB2YXIgbWl4ZWQ7XG5cbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCkpIHtcbiAgICAgIG1peGVkID0gb3JkaW5hbFRvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWl4ZWQgPSBPYmplY3QuYXNzaWduKHRoaXMudG9PYmplY3QoKSwgbm9ybWFsaXplZCk7IC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG5cbiAgICAgIGlmIChpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSkpIHtcbiAgICAgICAgbWl4ZWQuZGF5ID0gTWF0aC5taW4oZGF5c0luTW9udGgobWl4ZWQueWVhciwgbWl4ZWQubW9udGgpLCBtaXhlZC5kYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfb2JqVG9UUzMgPSBvYmpUb1RTKG1peGVkLCB0aGlzLm8sIHRoaXMuem9uZSksXG4gICAgICAgIHRzID0gX29ialRvVFMzWzBdLFxuICAgICAgICBvID0gX29ialRvVFMzWzFdO1xuXG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgdHM6IHRzLFxuICAgICAgbzogb1xuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBBZGQgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqXHJcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAxIH0pIC8vfj4gdGhpcyB0aW1lIHRvbW9ycm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMywgbWludXRlczogMTMgfSkpIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8ucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFN1YnRyYWN0IGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcclxuICAgKiBTZWUge0BsaW5rIHBsdXN9XHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICovXG5cblxuICBfcHJvdG8ubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbikubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgYmVnaW5uaW5nIG9mLiBDYW4gYmUgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd5ZWFyJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDEtMDEnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2RheScpLnRvSVNPVGltZSgpOyAvLz0+ICcwMDowMC4wMDAtMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnN0YXJ0T2YgPSBmdW5jdGlvbiBzdGFydE9mKHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG8gPSB7fSxcbiAgICAgICAgbm9ybWFsaXplZFVuaXQgPSBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpO1xuXG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwicXVhcnRlcnNcIjpcbiAgICAgIGNhc2UgXCJtb250aHNcIjpcbiAgICAgICAgby5kYXkgPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwid2Vla3NcIjpcbiAgICAgIGNhc2UgXCJkYXlzXCI6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJtaW51dGVzXCI6XG4gICAgICAgIG8uc2Vjb25kID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcInNlY29uZHNcIjpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgdmFyIHEgPSBNYXRoLmNlaWwodGhpcy5tb250aCAvIDMpO1xuICAgICAgby5tb250aCA9IChxIC0gMSkgKiAzICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQobyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgZW5kIChpLmUuIHRoZSBsYXN0IG1pbGxpc2Vjb25kKSBvZiBhIHVuaXQgb2YgdGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGVuZCBvZi4gQ2FuIGJlICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCdtb250aCcpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMzFUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd5ZWFyJykudG9JU08oKTsgLy89PiAnMjAxNC0xMi0zMVQyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLmVuZE9mKCdkYXknKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2hvdXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDA1OjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5lbmRPZiA9IGZ1bmN0aW9uIGVuZE9mKHVuaXQpIHtcbiAgICB2YXIgX3RoaXMkc3RhcnRPZiRwbHVzO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc3RhcnRPZih1bml0KS5wbHVzKChfdGhpcyRzdGFydE9mJHBsdXMgPSB7fSwgX3RoaXMkc3RhcnRPZiRwbHVzW3VuaXRdID0gMSwgX3RoaXMkc3RhcnRPZiRwbHVzKSkubWludXMoMSkgOiB0aGlzO1xuICB9OyAvLyBPVVRQVVRcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXHJcbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIEZvciBhIHRhYmxlIG9mIHRva2VucyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zLCBzZWUgW2hlcmVdKGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zKS5cclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXHJcbiAgICogQHNlZSBodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vZG9jcy9tYW51YWwvZm9ybWF0dGluZy5odG1sI3RhYmxlLW9mLXRva2Vuc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0cyB0byBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnNldExvY2FsZSgnZnInKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IGF2ci4gMjInXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnLCB7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gJzIwMTcgYXZyLiAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKG9wdHMpKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQkMjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXHJcbiAgICogVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIGJyb3dzZXItc3BlY2lmaWMsIGJ1dCBpbiBnZW5lcmFsIGl0IHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gICAqIG9mIHRoZSBEYXRlVGltZSBpbiB0aGUgYXNzaWduZWQgbG9jYWxlLlxyXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IDQvMjAvMjAxN1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuc2V0TG9jYWxlKCdlbi1nYicpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gJzIwLzA0LzIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogXCJlbi1nYlwiIH0pOyAvLz0+ICcyMC8wNC8yMDE3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5USU1FX1NJTVBMRSk7IC8vPT4gJzExOjMyIEFNJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURVRJTUVfU0hPUlQpOyAvLz0+ICc0LzIwLzIwMTcsIDExOjMyIEFNJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe3dlZWtkYXk6ICdsb25nJywgbW9udGg6ICdsb25nJywgZGF5OiAnMi1kaWdpdCd9KTsgLy89PiAnVGh1LCBBcHIgMjAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7d2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0J30pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7aG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0J30pOyAvLz0+ICcxMTozMidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZyhvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IERBVEVfU0hPUlQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLmZvcm1hdERhdGVUaW1lKHRoaXMpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIGkuZS4gaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cclxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0L2Zvcm1hdFRvUGFydHNcclxuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiBbXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnZGF5JywgdmFsdWU6ICcyNScgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ21vbnRoJywgdmFsdWU6ICcwNScgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ3llYXInLCB2YWx1ZTogJzE5ODInIH1cclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gXVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvTG9jYWxlUGFydHMgPSBmdW5jdGlvbiB0b0xvY2FsZVBhcnRzKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLmZvcm1hdERhdGVUaW1lUGFydHModGhpcykgOiBbXTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPKCkgLy89PiAnMTk4Mi0wNS0yNVQwMDowMDowMC4wMDBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPID0gZnVuY3Rpb24gdG9JU08ob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudG9JU09EYXRlKCkgKyBcIlRcIiArIHRoaXMudG9JU09UaW1lKG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIGRhdGUgY29tcG9uZW50XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODIsIDUsIDI1KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTA1LTI1J1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTT0RhdGUgPSBmdW5jdGlvbiB0b0lTT0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcInl5eXktTU0tZGRcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3Mgd2VlayBkYXRlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODIsIDUsIDI1KS50b0lTT1dlZWtEYXRlKCkgLy89PiAnMTk4Mi1XMjEtMidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU09XZWVrRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPV2Vla0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcImtra2stJ1cnV1ctY1wiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB0aW1lIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLmhvdXIoNykubWludXRlKDM0KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLmhvdXIoNykubWludXRlKDM0KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMDc6MzRaJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTT1RpbWUgPSBmdW5jdGlvbiB0b0lTT1RpbWUoX3RlbXAzKSB7XG4gICAgdmFyIF9yZWY1ID0gX3RlbXAzID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wMyxcbiAgICAgICAgX3JlZjUkc3VwcHJlc3NNaWxsaXNlID0gX3JlZjUuc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gX3JlZjUkc3VwcHJlc3NNaWxsaXNlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY1JHN1cHByZXNzTWlsbGlzZSxcbiAgICAgICAgX3JlZjUkc3VwcHJlc3NTZWNvbmRzID0gX3JlZjUuc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgICBzdXBwcmVzc1NlY29uZHMgPSBfcmVmNSRzdXBwcmVzc1NlY29uZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgICBfcmVmNSRpbmNsdWRlT2Zmc2V0ID0gX3JlZjUuaW5jbHVkZU9mZnNldCxcbiAgICAgICAgaW5jbHVkZU9mZnNldCA9IF9yZWY1JGluY2x1ZGVPZmZzZXQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmNSRpbmNsdWRlT2Zmc2V0O1xuXG4gICAgcmV0dXJuIHRvVGVjaFRpbWVGb3JtYXQodGhpcywge1xuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBzdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kczogc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICBpbmNsdWRlT2Zmc2V0OiBpbmNsdWRlT2Zmc2V0XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gUkZDIDI4MjItY29tcGF0aWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSwgYWx3YXlzIGluIFVUQ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCAtMDQwMCdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9SRkMyODIyID0gZnVuY3Rpb24gdG9SRkMyODIyKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzIFpaWlwiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSFRUUCBoZWFkZXJzLlxyXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHN0cmluZyBjb25mb3JtcyB0byBSRkMgMTEyMy5cclxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCBHTVQnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzLCAxOSkudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAxOTowMDowMCBHTVQnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSFRUUCA9IGZ1bmN0aW9uIHRvSFRUUCgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMudG9VVEMoKSwgXCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TUUxEYXRlID0gZnVuY3Rpb24gdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJ5eXl5LU1NLWRkXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnRvU1FMKCkgLy89PiAnMDU6MTU6MTYuMzQ1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVab25lOiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TUUxUaW1lID0gZnVuY3Rpb24gdG9TUUxUaW1lKF90ZW1wNCkge1xuICAgIHZhciBfcmVmNiA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQsXG4gICAgICAgIF9yZWY2JGluY2x1ZGVPZmZzZXQgPSBfcmVmNi5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjYkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY2JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY2JGluY2x1ZGVab25lID0gX3JlZjYuaW5jbHVkZVpvbmUsXG4gICAgICAgIGluY2x1ZGVab25lID0gX3JlZjYkaW5jbHVkZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjYkaW5jbHVkZVpvbmU7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBpbmNsdWRlT2Zmc2V0OiBpbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZVpvbmU6IGluY2x1ZGVab25lLFxuICAgICAgc3BhY2Vab25lOiB0cnVlXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TUUwgPSBmdW5jdGlvbiB0b1NRTChvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b1NRTERhdGUoKSArIFwiIFwiICsgdGhpcy50b1NRTFRpbWUob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQkMjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIHNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TZWNvbmRzID0gZnVuY3Rpb24gdG9TZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIC8gMTAwMCA6IE5hTjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBCU09OIHNlcmlhbGl6YWJsZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7RGF0ZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b0JTT04gPSBmdW5jdGlvbiB0b0JTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9KU0RhdGUoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEYXRlVGltZSdzIHllYXIsIG1vbnRoLCBkYXksIGFuZCBzbyBvbi5cclxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b09iamVjdCgpIC8vPT4geyB5ZWFyOiAyMDE3LCBtb250aDogNCwgZGF5OiAyMiwgaG91cjogMjAsIG1pbnV0ZTogNDksIHNlY29uZDogNDIsIG1pbGxpc2Vjb25kOiAyNjggfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIF9wcm90by50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLm91dHB1dENhbGVuZGFyID0gdGhpcy5vdXRwdXRDYWxlbmRhcjtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IERhdGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge0RhdGV9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9KU0RhdGUgPSBmdW5jdGlvbiB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH07IC8vIENPTVBBUkVcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gRGF0ZVRpbWVzIGFzIGEgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiB2YXIgaTEgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgyLTA1LTI1VDA5OjQ1JyksXHJcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xyXG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxyXG4gICAqIGkyLmRpZmYoaTEsICdob3VycycpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMjE2OC43NSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmRpZmYgPSBmdW5jdGlvbiBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQsIG9wdHMpIHtcbiAgICBpZiAodW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgICB1bml0ID0gXCJtaWxsaXNlY29uZHNcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyRGF0ZVRpbWUuaXNWYWxpZCkgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkIHx8IG90aGVyRGF0ZVRpbWUuaW52YWxpZCk7XG5cbiAgICB2YXIgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgICAgb3RoZXJJc0xhdGVyID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCkgPiB0aGlzLnZhbHVlT2YoKSxcbiAgICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgICBkaWZmZWQgPSBfZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgcmlnaHQgbm93LlxyXG4gICAqIFNlZSB7QGxpbmsgZGlmZn1cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciB1bml0cyB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb25cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmRpZmZOb3cgPSBmdW5jdGlvbiBkaWZmTm93KHVuaXQsIG9wdHMpIHtcbiAgICBpZiAodW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgICB1bml0ID0gXCJtaWxsaXNlY29uZHNcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGlmZihEYXRlVGltZS5sb2NhbCgpLCB1bml0LCBvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnVudGlsID0gZnVuY3Rpb24gdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgYm90aCB0aGUgc2FtZSBjYWxlbmRhciBkYXlcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKG90aGVyRGF0ZVRpbWUsIHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHVuaXQgPT09IFwibWlsbGlzZWNvbmRcIikge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodW5pdCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuZW5kT2YodW5pdCk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEYXRlVGltZXMgYXJlIGVxdWFsIGlmZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBtaWxsaXNlY29uZCwgaGF2ZSB0aGUgc2FtZSB6b25lIGFuZCBsb2NhdGlvbiwgYW5kIGFyZSBib3RoIHZhbGlkLlxyXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09IH5kdDJgLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkICYmIG90aGVyLmlzVmFsaWQgJiYgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJiB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmIHRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG1pbiBvZiBzZXZlcmFsIGRhdGUgdGltZXNcclxuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgRGF0ZVRpbWVzIGZyb20gd2hpY2ggdG8gY2hvb3NlIHRoZSBtaW5pbXVtXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubWluID0gZnVuY3Rpb24gbWluKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RCeShkYXRlVGltZXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaS52YWx1ZU9mKCk7XG4gICAgfSwgTWF0aC5taW4pO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcclxuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgRGF0ZVRpbWVzIGZyb20gd2hpY2ggdG8gY2hvb3NlIHRoZSBtYXhpbXVtXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubWF4ID0gZnVuY3Rpb24gbWF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpLnZhbHVlT2YoKTtcbiAgICB9LCBNYXRoLm1heCk7XG4gIH07IC8vIE1JU0NcblxuICAvKipcclxuICAgKiBFeHBsYWluIGhvdyBhIHN0cmluZyB3b3VsZCBiZSBwYXJzZWQgYnkgZnJvbUZvcm1hdCgpXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIGRlc2NyaXB0aW9uKVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0YWtlbiBieSBmcm9tRm9ybWF0KClcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tRm9ybWF0RXhwbGFpbiA9IGZ1bmN0aW9uIGZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBfb3B0aW9ucyRsb2NhbGUgPSBfb3B0aW9ucy5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9vcHRpb25zJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRpb25zJGxvY2FsZSxcbiAgICAgICAgX29wdGlvbnMkbnVtYmVyaW5nU3lzID0gX29wdGlvbnMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRudW1iZXJpbmdTeXMsXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sXG4gICAgICBkZWZhdWx0VG9FTjogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGZyb21Gb3JtYXRFeHBsYWluIGluc3RlYWRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TdHJpbmdFeHBsYWluID0gZnVuY3Rpb24gZnJvbVN0cmluZ0V4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpO1xuICB9OyAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxyXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xyXG4gICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRGF0ZVRpbWUsIFt7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibG9jYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvdXRwdXQgY2FsZW5kYXIgb2YgYSBEYXRlVGltZSwgc3VjaCAnaXNsYW1pYycuIFRoZSBvdXRwdXQgY2FsZW5kYXIgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3V0cHV0Q2FsZW5kYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ6b25lTmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHllYXJcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwieWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnF1YXJ0ZXIgLy89PiAyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJxdWFydGVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gTWF0aC5jZWlsKHRoaXMuYy5tb250aCAvIDMpIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbW9udGggKDEtMTIpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm1vbnRoIC8vPT4gNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibW9udGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubW9udGggOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoICgxLTMwaXNoKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmRheSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSkuaG91ciAvLz0+IDlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhvdXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuaG91ciA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbnV0ZSBvZiB0aGUgaG91ciAoMC01OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzApLm1pbnV0ZSAvLz0+IDMwXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaW51dGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWludXRlIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2Vjb25kIG9mIHRoZSBtaW51dGUgKDAtNTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNlY29uZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5zZWNvbmQgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyLCA2NTQpLm1pbGxpc2Vjb25kIC8vPT4gNjU0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaWxsaXNlY29uZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taWxsaXNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWsgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla1llYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS53ZWVrTnVtYmVyIC8vPT4gMjFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtOdW1iZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtOdW1iZXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuXHJcbiAgICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrZGF5IC8vPT4gNFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla2RheSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG9yZGluYWwgKGkuZS4gdGhlIGRheSBvZiB0aGUgeWVhcilcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfERhdGVUaW1lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvcmRpbmFsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhTaG9ydCAvLz0+IE9jdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibW9udGhTaG9ydFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwic2hvcnRcIiwge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aExvbmcgLy89PiBPY3RvYmVyXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aExvbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcImxvbmdcIiwge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtkYXlTaG9ydFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJzaG9ydFwiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5TG9uZyAvLz0+IE1vbmRheVxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheUxvbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwibG9uZ1wiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLm9mZnNldCAvLz0+IC0yNDBcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLm9mZnNldCAvLz0+IDBcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS5vZmZzZXQodGhpcy50cykgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzaG9ydCBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVTVFwiIG9yIFwiRURUXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldE5hbWVTaG9ydFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZzZXROYW1lTG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogXCJsb25nXCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzT2Zmc2V0Rml4ZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUudW5pdmVyc2FsIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkRTVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7XG4gICAgICAgICAgbW9udGg6IDFcbiAgICAgICAgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoe1xuICAgICAgICAgIG1vbnRoOiA1XG4gICAgICAgIH0pLm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBEYXRlVGltZSBpcyBpbiBhIGxlYXAgeWVhciwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5pc0luTGVhcFllYXIgLy89PiB0cnVlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzSW5MZWFwWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYsIDIpLmRheXNJbk1vbnRoIC8vPT4gMjlcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYsIDMpLmRheXNJbk1vbnRoIC8vPT4gMzFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRheXNJbk1vbnRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykuZGF5c0luWWVhciAvLz0+IDM2NVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c0luWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGRheXNJblllYXIodGhpcy55ZWFyKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2Vla3MgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLndlZWtzSW5XZWVrWWVhciAvLz0+IDUyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrc0luV2Vla1llYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiREFURV9TSE9SVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfU0hPUlQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURV9NRURcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX01FRDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURV9GVUxMXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURV9GVUxMO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX0hVR0VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX0hVR0U7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfU0lNUExFXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9TSU1QTEU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9MT05HX09GRlNFVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9TSU1QTEVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1NJTVBMRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX1NIT1JUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfTUVEXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfTUVEX1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0ZVTExcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9GVUxMO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0hVR0VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERhdGVUaW1lO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoRGF0ZVRpbWUuaXNEYXRlVGltZShkYXRlVGltZWlzaCkpIHtcbiAgICByZXR1cm4gZGF0ZVRpbWVpc2g7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgZGF0ZVRpbWVpc2gudmFsdWVPZiAmJiBpc051bWJlcihkYXRlVGltZWlzaC52YWx1ZU9mKCkpKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIHR5cGVvZiBkYXRlVGltZWlzaCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tT2JqZWN0KGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiBcIiArIGRhdGVUaW1laXNoICsgXCIsIG9mIHR5cGUgXCIgKyB0eXBlb2YgZGF0ZVRpbWVpc2gpO1xuICB9XG59XG5cbmV4cG9ydHMuRGF0ZVRpbWUgPSBEYXRlVGltZTtcbmV4cG9ydHMuRHVyYXRpb24gPSBEdXJhdGlvbjtcbmV4cG9ydHMuSW50ZXJ2YWwgPSBJbnRlcnZhbDtcbmV4cG9ydHMuSW5mbyA9IEluZm87XG5leHBvcnRzLlpvbmUgPSBab25lO1xuZXhwb3J0cy5GaXhlZE9mZnNldFpvbmUgPSBGaXhlZE9mZnNldFpvbmU7XG5leHBvcnRzLklBTkFab25lID0gSUFOQVpvbmU7XG5leHBvcnRzLkxvY2FsWm9uZSA9IExvY2FsWm9uZTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBTZXR0aW5ncztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWx1eG9uLmpzLm1hcFxuIl19
11977
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19jb29raWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19tb2RhbC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NlYXJjaC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NpZGViYXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19zdGFjay5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3RyZWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL3NoaW1zL19kYXRhc2V0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9zcGFyay5qcyIsIm5vZGVfbW9kdWxlcy9iZWFuL2JlYW4uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hZnRlci1hbmltYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYW5pbWF0aW9uLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9idWJibGUtZm9ybS1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvY2FsbGJhY2stbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWxheS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9tZWRpYS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9wYWdlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3JlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXNpemUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3NoaW1zL2N1c3RvbS1ldmVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zdWJtaXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGFwLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90aHJvdHRsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvZ2dsZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Zyb210b3AuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29va2llX2pzL2Nvb2tpZS5qcyIsIm5vZGVfbW9kdWxlcy9rZXltYXN0ZXIva2V5bWFzdGVyLmpzIiwibm9kZV9tb2R1bGVzL2x1eG9uL2J1aWxkL2Nqcy1icm93c2VyL2x1eG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGNvb2tpZSA9IHJlcXVpcmUoICdjb29raWVfanMnICkuY29va2llXG5cbmZ1bmN0aW9uIHVwZGF0ZSAoIGtleSwgZGF0YSwgb3B0aW9ucyApIHtcbiAgdmFyIG9sZF9kYXRhID0gZ2V0KCBrZXkgKVxuICBzZXQoIGtleSwgdG9vbGJveC5tZXJnZSggb2xkX2RhdGEsIGRhdGEpLCBvcHRpb25zIClcbn1cblxuZnVuY3Rpb24gZ2V0ICgga2V5ICkge1xuICB2YXIgZGF0YSA9IGNvb2tpZS5nZXQoIGtleSApXG4gIHJldHVybiBkYXRhID8gSlNPTi5wYXJzZSggZGF0YSkgOiB7fVxufVxuXG5mdW5jdGlvbiBzZXQgKCBrZXksIHZhbHVlLCBvcHRpb25zICkge1xuICBvcHRpb25zID0gdG9vbGJveC5tZXJnZSggeyBwYXRoOiAnLycgfSwgb3B0aW9ucyB8fCB7fSApXG4gIGNvb2tpZS5zZXQoIGtleSwgSlNPTi5zdHJpbmdpZnkoIHZhbHVlICksIG9wdGlvbnMgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICB1cGRhdGU6IHVwZGF0ZVxufVxuIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBuYW1lc1xuXG4gIGZ1bmN0aW9uIGF0dHIoIHNvdXJjZSwgbmFtZSApe1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09ICdvYmplY3QnKVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSsnXCIgJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZSsnXCIgJyB9XG5cbiAgZnVuY3Rpb24gZGFzaGVyaXplKCBpbnB1dCApIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW1xcXFxXLF9dL2csICctJykucmVwbGFjZSgvLXsyLH0vZywgJy0nKVxuICB9XG5cbiAgZnVuY3Rpb24gc3ZnTmFtZSggbmFtZSApIHtcbiAgICByZXR1cm4gXCJzdmctXCIrZGFzaGVyaXplKCBuYW1lIClcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZSggbmFtZSwgb3B0aW9ucyApIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIHZhciBpZCA9IGRhc2hlcml6ZSggbmFtZSApXG4gICAgdmFyIHN5bWJvbCA9IHN2Z3MoKVtpZF1cblxuICAgIGlmICggc3ltYm9sICkge1xuICAgICAgdmFyIHBhcmVudCA9IHN5bWJvbC5wYXJlbnRFbGVtZW50XG4gICAgICB2YXIgcHJlZml4ID0gcGFyZW50LmRhdGFzZXQucHJlZml4XG4gICAgICB2YXIgYmFzZSAgID0gcGFyZW50LmRhdGFzZXQuc3ltYm9sQ2xhc3NcblxuICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KCAnPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCIjJyArIHByZWZpeCArICctJyArIGlkICsgJ1wiLz48L3N2Zz4nICkuZmlyc3RDaGlsZDtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIGJhc2UgKyAnICcgKyBwcmVmaXggKyAnLScgKyBpZCArICcgJyArICggb3B0aW9ucy5jbGFzcyB8fCAnJyApLnRyaW0oKSApXG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsIHN5bWJvbC5nZXRBdHRyaWJ1dGUoICd2aWV3Qm94JyApIClcblxuICAgICAgaWYgKCAhKCBvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMuaGVpZ2h0IHx8IG9wdGlvbnMuc2NhbGUgKSApIHtcblxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsICBzeW1ib2wuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKVxuICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSlcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoIG9wdGlvbnMud2lkdGggKSAgc3ZnLnNldEF0dHJpYnV0ZSggJ3dpZHRoJywgIG9wdGlvbnMud2lkdGggKVxuICAgICAgICBpZiAoIG9wdGlvbnMuaGVpZ2h0ICkgc3ZnLnNldEF0dHJpYnV0ZSggJ2hlaWdodCcsIG9wdGlvbnMuaGVpZ2h0IClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN2Z1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBcIicrbmFtZSsnXCIgc3ZnIHN5bWJvbC4gRW5zdXJlIHRoYXQgc3ZnIHNjcmlwdHMgYXJlIGxvYWRlZCcpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3Zncygpe1xuICAgIGlmICggIW5hbWVzICkge1xuICAgICAgbmFtZXMgPSB7fVxuICAgICAgdmFyIHN5bWJvbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ3N2Z1tpZF49ZXN2Z10gc3ltYm9sJyApIClcbiAgICAgIHN5bWJvbHMuZm9yRWFjaCggZnVuY3Rpb24oIHN5bWJvbCApIHtcbiAgICAgICAgbmFtZXNbc3ltYm9sLmRhdGFzZXQubmFtZV0gPSBzeW1ib2xcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBuYW1lc1xuICB9XG5cbiAgdmFyIGVzdmcgPSB7XG4gICAgc3Znczogc3ZncyxcbiAgICB1c2U6IHVzZVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oIGV2ZW50ICkgeyBuYW1lcyA9IG51bGw7IGVzdmcuc3ZncygpIH0pXG4gIH1cblxuICBpZiggdHlwZW9mKCBtb2R1bGUgKSAhPSAndW5kZWZpbmVkJyApIHsgbW9kdWxlLmV4cG9ydHMgPSBlc3ZnIH1cbiAgZWxzZSB3aW5kb3cuZXN2ZyA9IGVzdmdcblxufSkoKVxuIiwiKGZ1bmN0aW9uKCl7XG5cbiAgZnVuY3Rpb24gZW1iZWQoKSB7XG4gICAgaWYgKCAhZG9jdW1lbnQuYm9keSApIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGVtYmVkIClcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlc3ZnLXN2Zy1pY29ucycpKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgJzxzdmcgaWQ9XCJlc3ZnLXN2Zy1pY29uc1wiIGRhdGEtc3ltYm9sLWNsYXNzPVwiaWNvblwiIGRhdGEtcHJlZml4PVwic3ZnXCIgdmVyc2lvbj1cIjEuMVwiIHN0eWxlPVwiaGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGVcIiBkYXRhLXR1cmJvbGlua3MtcGVybWFuZW50PjxkZWZzPjxjbGlwUGF0aCBpZD1cImRlZi1zdmctcXVlc3Rpb24tMFwiPjxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZpbGw9XCJ3aGl0ZVwiLz48L2NsaXBQYXRoPjwvZGVmcz48c3ltYm9sIGlkPVwic3ZnLWFkZFwiIGRhdGEtbmFtZT1cImFkZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0wIDEyQzAgMTIuMzk3OCAwLjE1ODAzNSAxMi43Nzk0IDAuNDM5MzQgMTMuMDYwN0MwLjcyMDY0NCAxMy4zNDIgMS4xMDIxOCAxMy41IDEuNSAxMy41SDEwLjI1QzEwLjMxNjMgMTMuNSAxMC4zNzk5IDEzLjUyNjMgMTAuNDI2OCAxMy41NzMyQzEwLjQ3MzcgMTMuNjIwMSAxMC41IDEzLjY4MzcgMTAuNSAxMy43NVYyMi41QzEwLjUgMjIuODk3OCAxMC42NTggMjMuMjc5NCAxMC45MzkzIDIzLjU2MDdDMTEuMjIwNiAyMy44NDIgMTEuNjAyMiAyNCAxMiAyNEMxMi4zOTc4IDI0IDEyLjc3OTQgMjMuODQyIDEzLjA2MDcgMjMuNTYwN0MxMy4zNDIgMjMuMjc5NCAxMy41IDIyLjg5NzggMTMuNSAyMi41VjEzLjc1QzEzLjUgMTMuNjgzNyAxMy41MjYzIDEzLjYyMDEgMTMuNTczMiAxMy41NzMyQzEzLjYyMDEgMTMuNTI2MyAxMy42ODM3IDEzLjUgMTMuNzUgMTMuNUgyMi41QzIyLjg5NzggMTMuNSAyMy4yNzk0IDEzLjM0MiAyMy41NjA3IDEzLjA2MDdDMjMuODQyIDEyLjc3OTQgMjQgMTIuMzk3OCAyNCAxMkMyNCAxMS42MDIyIDIzLjg0MiAxMS4yMjA2IDIzLjU2MDcgMTAuOTM5M0MyMy4yNzk0IDEwLjY1OCAyMi44OTc4IDEwLjUgMjIuNSAxMC41SDEzLjc1QzEzLjY4MzcgMTAuNSAxMy42MjAxIDEwLjQ3MzcgMTMuNTczMiAxMC40MjY4QzEzLjUyNjMgMTAuMzc5OSAxMy41IDEwLjMxNjMgMTMuNSAxMC4yNVYxLjVDMTMuNSAxLjEwMjE4IDEzLjM0MiAwLjcyMDY0NCAxMy4wNjA3IDAuNDM5MzRDMTIuNzc5NCAwLjE1ODAzNSAxMi4zOTc4IDAgMTIgMEMxMS42MDIyIDAgMTEuMjIwNiAwLjE1ODAzNSAxMC45MzkzIDAuNDM5MzRDMTAuNjU4IDAuNzIwNjQ0IDEwLjUgMS4xMDIxOCAxMC41IDEuNVYxMC4yNUMxMC41IDEwLjMxNjMgMTAuNDczNyAxMC4zNzk5IDEwLjQyNjggMTAuNDI2OEMxMC4zNzk5IDEwLjQ3MzcgMTAuMzE2MyAxMC41IDEwLjI1IDEwLjVIMS41QzEuMTAyMTggMTAuNSAwLjcyMDY0NCAxMC42NTggMC40MzkzNCAxMC45MzkzQzAuMTU4MDM1IDExLjIyMDYgMCAxMS42MDIyIDAgMTJIMFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hZG1pbi11c2VyXCIgZGF0YS1uYW1lPVwiYWRtaW4tdXNlclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMy4wMTkgMTYuNUMxMy4wMTkgMTYuMjM0OCAxMi45MTM2IDE1Ljk4MDQgMTIuNzI2MSAxNS43OTI5QzEyLjUzODYgMTUuNjA1NCAxMi4yODQyIDE1LjUgMTIuMDE5IDE1LjVIOC4xMDVDOC4wNDg5NCAxNS41MDA2IDcuOTk0MzUgMTUuNDgyMSA3Ljk1MDE5IDE1LjQ0NzZDNy45MDYwMyAxNS40MTMxIDcuODc0OTMgMTUuMzY0NSA3Ljg2MiAxNS4zMUM3LjYyMDY2IDE0LjIyMzMgNy41MDE1OSAxMy4xMTMxIDcuNTA3IDEyQzcuNTA1MjcgMTEuMDYwOCA3LjU5MDI5IDEwLjEyMzUgNy43NjEgOS4yQzcuNzczMjIgOS4xNDI5NSA3LjgwNDc4IDkuMDkxODggNy44NTAzNCA5LjA1NTQzQzcuODk1OSA5LjAxODk4IDcuOTUyNjYgOC45OTk0IDguMDExIDlDMTguODg0IDkgMjEuNTY2IDkuMDA4IDIyLjI5MSA4Ljk4MkMyMi40NTM2IDguOTkxNjYgMjIuNjE1OCA4Ljk1ODc0IDIyLjc2MTggOC44ODY0OUMyMi45MDc3IDguODE0MjUgMjMuMDMyMyA4LjcwNTE4IDIzLjEyMzIgOC41NzAwNkMyMy4yMTQgOC40MzQ5NCAyMy4yNjgxIDguMjc4NDQgMjMuMjggOC4xMTYwNEMyMy4yOTE5IDcuOTUzNjMgMjMuMjYxMiA3Ljc5MDkyIDIzLjE5MSA3LjY0NEMyMi4zMTY4IDUuMzc3NDQgMjAuNzcyMSAzLjQzMTQyIDE4Ljc2MyAyLjA2NTYyQzE2Ljc1NCAwLjY5OTgzMSAxNC4zNzYyIC0wLjAyMDc2NDcgMTEuOTQ3IDEuNjU2MjRlLTA2QzguODI3NzYgMC4wNzQyNjU0IDUuODU0NjcgMS4zMzcxNCAzLjYzNTUzIDMuNTMwNDRDMS40MTYzOCA1LjcyMzc1IDAuMTE4Nzg0IDguNjgxODQgMC4wMDc5OTg1NSAxMS44Qy0wLjA1MDY1NTcgMTQuOTI2NyAxLjExNjMyIDE3Ljk1MjIgMy4yNTk0IDIwLjIyOTZDNS40MDI0NyAyMi41MDcxIDguMzUxNTQgMjMuODU1NyAxMS40NzYgMjMuOTg3SDExLjUyQzExLjc2MTggMjMuOTg3NCAxMS45OTU1IDIzLjkwMDEgMTIuMTc3OSAyMy43NDE0QzEyLjM2MDMgMjMuNTgyNyAxMi40NzkgMjMuMzYzMyAxMi41MTIxIDIzLjEyMzhDMTIuNTQ1MiAyMi44ODQyIDEyLjQ5MDMgMjIuNjQwOSAxMi4zNTc4IDIyLjQzODdDMTIuMjI1MiAyMi4yMzY1IDEyLjAyMzggMjIuMDg5MiAxMS43OTEgMjIuMDI0QzExLjU5NCAyMS45NTcxIDExLjQyNDYgMjEuODI3IDExLjMwOSAyMS42NTRDMTAuMzgxOSAyMC40NDYgOS41MzI4NyAxOS4xODAxIDguNzY3IDE3Ljg2NEM4Ljc0NjgyIDE3LjgyNTkgOC43MzY4NCAxNy43ODMyIDguNzM4MDIgMTcuNzQwMUM4LjczOTIxIDE3LjY5NyA4Ljc1MTUyIDE3LjY1NSA4Ljc3Mzc2IDE3LjYxOEM4Ljc5NjAxIDE3LjU4MTEgOC44Mjc0MiAxNy41NTA1IDguODY0OTYgMTcuNTI5M0M4LjkwMjUgMTcuNTA4MSA4Ljk0NDg4IDE3LjQ5NyA4Ljk4OCAxNy40OTdIMTIuMDE5QzEyLjI4MzcgMTcuNDk3IDEyLjUzNzYgMTcuMzkyMSAxMi43MjUgMTcuMjA1MkMxMi45MTI1IDE3LjAxODMgMTMuMDE4MiAxNi43NjQ3IDEzLjAxOSAxNi41Wk01LjggMTUuMkM1LjgwNzYxIDE1LjIzNjMgNS44MDY5OSAxNS4yNzM5IDUuNzk4MTggMTUuMzFDNS43ODkzOCAxNS4zNDYxIDUuNzcyNjMgMTUuMzc5NyA1Ljc0OTE0IDE1LjQwODVDNS43MjU2NSAxNS40MzczIDUuNjk2MDIgMTUuNDYwNCA1LjY2MjQzIDE1LjQ3NjJDNS42Mjg4NCAxNS40OTIxIDUuNTkyMTMgMTUuNTAwMiA1LjU1NSAxNS41SDIuODE4QzIuNzY2MjQgMTUuNDk5OSAyLjcxNTc5IDE1LjQ4MzggMi42NzM1NCAxNS40NTM5QzIuNjMxMjkgMTUuNDI0IDIuNTk5MzIgMTUuMzgxOCAyLjU4MiAxNS4zMzNDMS44NzgxIDEzLjM1MTIgMS44MTg5NSAxMS4xOTc1IDIuNDEzIDkuMThDMi40MjgyOSA5LjEyODE2IDIuNDU5OTEgOS4wODI2MyAyLjUwMzE1IDkuMDUwMkMyLjU0NjM5IDkuMDE3NzcgMi41OTg5NSA5LjAwMDE2IDIuNjUzIDlINS40NkM1LjQ5NTkzIDkuMDAwMzUgNS41MzEzNyA5LjAwODM3IDUuNTYzOTUgOS4wMjM1NEM1LjU5NjUyIDkuMDM4NyA1LjYyNTQ4IDkuMDYwNjYgNS42NDg4NyA5LjA4Nzk0QzUuNjcyMjYgOS4xMTUyMSA1LjY4OTU1IDkuMTQ3MTcgNS42OTk1OCA5LjE4MTY4QzUuNzA5NiA5LjIxNjE5IDUuNzEyMTMgOS4yNTI0NCA1LjcwNyA5LjI4OEM1LjU3MTYzIDEwLjE4NTYgNS41MDQ3NyAxMS4wOTIyIDUuNTA3IDEyQzUuNTA0MTkgMTMuMDczNSA1LjYwMjI5IDE0LjE0NDkgNS44IDE1LjJWMTUuMlpNMTEuODU5IDIuMjdDMTEuOTAxNSAyLjIzOTc3IDExLjk1MjMgMi4yMjM1MyAxMi4wMDQ1IDIuMjIzNTNDMTIuMDU2NiAyLjIyMzUzIDEyLjEwNzUgMi4yMzk3NyAxMi4xNSAyLjI3QzEzLjY1MjkgMy4zOTMwNyAxNC44MTU4IDQuOTEwMDIgMTUuNTEgNi42NTNDMTUuNTI2IDYuNjkxMDUgMTUuNTMyNCA2LjczMjQ4IDE1LjUyODUgNi43NzM1OEMxNS41MjQ2IDYuODE0NjggMTUuNTEwNiA2Ljg1NDE3IDE1LjQ4NzcgNi44ODg1NEMxNS40NjQ4IDYuOTIyOSAxNS40MzM4IDYuOTUxMDcgMTUuMzk3NCA2Ljk3MDUyQzE1LjM2MDkgNi45ODk5NyAxNS4zMjAzIDcuMDAwMSAxNS4yNzkgN0g4LjcyOUM4LjY4Nzk5IDcuMDAwMTQgOC42NDc2IDYuOTkwMDYgOC42MTE0NiA2Ljk3MDY4QzguNTc1MzIgNi45NTEzIDguNTQ0NTggNi45MjMyMyA4LjUyMiA2Ljg4OUM4LjQ5OTA5IDYuODU0NTUgOC40ODUwOSA2LjgxNDk2IDguNDgxMjUgNi43NzM3N0M4LjQ3NzQxIDYuNzMyNTkgOC40ODM4NSA2LjY5MTA5IDguNSA2LjY1M0M5LjE4OTEgNC45MDczOSAxMC4zNTI2IDMuMzg5MjQgMTEuODU5IDIuMjdWMi4yN1pNMjAuNDQgNi42MTRDMjAuNDY0NSA2LjY1MTgzIDIwLjQ3ODQgNi42OTU1OSAyMC40ODAxIDYuNzQwNjRDMjAuNDgxNyA2Ljc4NTY5IDIwLjQ3MTIgNi44MzAzNiAyMC40NDk2IDYuODY5OTJDMjAuNDI4IDYuOTA5NDcgMjAuMzk2MSA2Ljk0MjQ1IDIwLjM1NzIgNi45NjUzNUMyMC4zMTg0IDYuOTg4MjUgMjAuMjc0MSA3LjAwMDIyIDIwLjIyOSA3SDE3Ljk0NkMxNy44OTM0IDcuMDAwMDIgMTcuODQyMiA2Ljk4MzUyIDE3Ljc5OTQgNi45NTI4NEMxNy43NTY3IDYuOTIyMTYgMTcuNzI0OCA2Ljg3ODg0IDE3LjcwOCA2LjgyOUMxNy4yOTY2IDUuNTcyNjIgMTYuNjk3OSA0LjM4NTU3IDE1LjkzMiAzLjMwOEMxNS44OTk5IDMuMjYzMDYgMTUuODgzNSAzLjIwODc1IDE1Ljg4NTUgMy4xNTM1NEMxNS44ODc1IDMuMDk4MzMgMTUuOTA3NyAzLjA0NTM0IDE1Ljk0MyAzLjAwMjg0QzE1Ljk3ODMgMi45NjAzNSAxNi4wMjY3IDIuOTMwNzQgMTYuMDgwNiAyLjkxODY1QzE2LjEzNDUgMi45MDY1NSAxNi4xOTA5IDIuOTEyNjYgMTYuMjQxIDIuOTM2QzE3Ljk2NDUgMy43MzM4NiAxOS40MjIxIDUuMDEwNjIgMjAuNDQgNi42MTRWNi42MTRaTTcuNzQgMi45NjhDNy43OTAwMiAyLjk0NDE1IDcuODQ2NTYgMi45Mzc2IDcuOTAwNzEgMi45NDkzOEM3Ljk1NDg2IDIuOTYxMTYgOC4wMDM1NyAyLjk5MDU5IDguMDM5MTcgMy4wMzMwN0M4LjA3NDc3IDMuMDc1NTQgOC4wOTUyNSAzLjEyODYzIDguMDk3MzkgMy4xODQwMUM4LjA5OTU0IDMuMjM5MzkgOC4wODMyMSAzLjI5MzkxIDguMDUxIDMuMzM5QzcuMjk4NDUgNC40MDgxOCA2LjcwOTk1IDUuNTgzODMgNi4zMDUgNi44MjdDNi4yODg3NyA2Ljg3NzE0IDYuMjU3MTEgNi45MjA4NiA2LjIxNDU1IDYuOTUxOTNDNi4xNzE5OSA2Ljk4MyA2LjEyMDY5IDYuOTk5ODIgNi4wNjggN0gzLjgwNUMzLjc2MDE2IDYuOTk5OTMgMy43MTYxNiA2Ljk4Nzc5IDMuNjc3NjIgNi45NjQ4N0MzLjYzOTA4IDYuOTQxOTUgMy42MDc0MSA2LjkwOTA4IDMuNTg1OTQgNi44Njk3MUMzLjU2NDQ3IDYuODMwMzUgMy41NTM5OCA2Ljc4NTkzIDMuNTU1NTcgNi43NDExMkMzLjU1NzE3IDYuNjk2MyAzLjU3MDc4IDYuNjUyNzQgMy41OTUgNi42MTVDNC42MDk0MyA1LjAzNjUgNi4wNDUyIDMuNzczMjQgNy43NCAyLjk2OFYyLjk2OFpNOC4wOTEgMjAuN0M4LjEyMzEzIDIwLjc0NDkgOC4xMzk0OCAyMC43OTkzIDguMTM3NDggMjAuODU0NUM4LjEzNTQ4IDIwLjkwOTcgOC4xMTUyNSAyMC45NjI3IDguMDc5OTUgMjEuMDA1MkM4LjA0NDY1IDIxLjA0NzcgNy45OTYyNyAyMS4wNzczIDcuOTQyMzcgMjEuMDg5NEM3Ljg4ODQ2IDIxLjEwMTUgNy44MzIwNyAyMS4wOTUzIDcuNzgyIDIxLjA3MkM2LjI0NzE2IDIwLjM1OTEgNC45MTg4NSAxOS4yNjc2IDMuOTIyIDE3LjlDMy44OTQxNCAxNy44NjI5IDMuODc3MTggMTcuODE4NyAzLjg3MzAxIDE3Ljc3MjVDMy44Njg4NCAxNy43MjYyIDMuODc3NjMgMTcuNjc5NyAzLjg5ODM5IDE3LjYzODJDMy45MTkxNSAxNy41OTY3IDMuOTUxMDcgMTcuNTYxNyAzLjk5MDU3IDE3LjUzNzNDNC4wMzAwNiAxNy41MTI5IDQuMDc1NTcgMTcuNSA0LjEyMiAxNy41SDYuMjQ2QzYuMjk2OTMgMTcuNTAwMiA2LjM0NjYgMTcuNTE1OSA2LjM4ODQgMTcuNTQ1QzYuNDMwMTkgMTcuNTc0MiA2LjQ2MjE0IDE3LjYxNTMgNi40OCAxNy42NjNDNi44ODE3IDE4Ljc0MTUgNy40MjMzMyAxOS43NjI2IDguMDkxIDIwLjdWMjAuN1pcIi8+PHBhdGggZD1cIk0xOC43NjkgMTcuN0MxOS40NDQxIDE3LjcwMDIgMjAuMTA0MSAxNy41MDAyIDIwLjY2NTUgMTcuMTI1MkMyMS4yMjcgMTYuNzUwMyAyMS42NjQ2IDE2LjIxNzIgMjEuOTIzIDE1LjU5MzZDMjIuMTgxNSAxNC45Njk5IDIyLjI0OTEgMTQuMjgzNiAyMi4xMTc1IDEzLjYyMTRDMjEuOTg1OCAxMi45NTkzIDIxLjY2MDcgMTIuMzUxIDIxLjE4MzQgMTEuODczNkMyMC43MDYgMTEuMzk2MyAyMC4wOTc4IDExLjA3MTIgMTkuNDM1NiAxMC45Mzk1QzE4Ljc3MzQgMTAuODA3OSAxOC4wODcxIDEwLjg3NTUgMTcuNDYzNCAxMS4xMzRDMTYuODM5OCAxMS4zOTI0IDE2LjMwNjcgMTEuODMgMTUuOTMxOCAxMi4zOTE1QzE1LjU1NjggMTIuOTUyOSAxNS4zNTY4IDEzLjYxMjkgMTUuMzU3IDE0LjI4OEMxNS4zNTcgMTUuMTkyOSAxNS43MTY1IDE2LjA2MDggMTYuMzU2NCAxNi43MDA3QzE2Ljk5NjIgMTcuMzQwNSAxNy44NjQxIDE3LjcgMTguNzY5IDE3LjdaXCIvPjxwYXRoIGQ9XCJNMTMuNTQ4IDIzLjQ0NUMxMy41NDA1IDIzLjUxNSAxMy41NDc5IDIzLjU4NTcgMTMuNTY5NyAyMy42NTI2QzEzLjU5MTUgMjMuNzE5NiAxMy42MjcxIDIzLjc4MTEgMTMuNjc0MyAyMy44MzMzQzEzLjcyMTUgMjMuODg1NSAxMy43NzkyIDIzLjkyNzIgMTMuODQzNiAyMy45NTU2QzEzLjkwOCAyMy45ODM5IDEzLjk3NzYgMjMuOTk4NCAxNC4wNDggMjMuOTk4SDIzLjQ5NUMyMy41NjU0IDIzLjk5ODQgMjMuNjM1IDIzLjk4MzkgMjMuNjk5NCAyMy45NTU2QzIzLjc2MzggMjMuOTI3MiAyMy44MjE1IDIzLjg4NTUgMjMuODY4NyAyMy44MzMzQzIzLjkxNTkgMjMuNzgxMSAyMy45NTE1IDIzLjcxOTYgMjMuOTczMyAyMy42NTI2QzIzLjk5NTEgMjMuNTg1NyAyNC4wMDI1IDIzLjUxNSAyMy45OTUgMjMuNDQ1QzIzLjg1ODkgMjIuMTU1MiAyMy4yNTAxIDIwLjk2MTQgMjIuMjg2MSAyMC4wOTM4QzIxLjMyMjEgMTkuMjI2MSAyMC4wNzEgMTguNzQ2IDE4Ljc3NCAxOC43NDZDMTcuNDc3IDE4Ljc0NiAxNi4yMjU5IDE5LjIyNjEgMTUuMjYxOSAyMC4wOTM4QzE0LjI5NzkgMjAuOTYxNCAxMy42ODkxIDIyLjE1NTIgMTMuNTUzIDIzLjQ0NUgxMy41NDhaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hldnJvbi1kb3duXCIgZGF0YS1uYW1lPVwiY2hldnJvbi1kb3duXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuMjQ5IDcuMjA3TDEyLjIzMyAxOS42NzhDMTIuMzMyNSAxOS43ODE4IDEyLjQ1MiAxOS44NjQ0IDEyLjU4NDIgMTkuOTIwOEMxMi43MTY0IDE5Ljk3NzIgMTIuODU4NyAyMC4wMDYzIDEzLjAwMjUgMjAuMDA2M0MxMy4xNDYzIDIwLjAwNjMgMTMuMjg4NiAxOS45NzcyIDEzLjQyMDggMTkuOTIwOEMxMy41NTMgMTkuODY0NCAxMy42NzI1IDE5Ljc4MTggMTMuNzcyIDE5LjY3OEwyNC43NTEgNy4yMDdDMjQuODM4OCA3LjEwODA3IDI0LjkwNTggNi45OTI1IDI0Ljk0ODEgNi44NjcxNUMyNC45OTA0IDYuNzQxOCAyNS4wMDcgNi42MDkyNCAyNC45OTcgNi40NzczNEMyNC45ODcgNi4zNDU0MyAyNC45NTA2IDYuMjE2ODggMjQuODkgNi4wOTkzMkMyNC44Mjk0IDUuOTgxNzYgMjQuNzQ1NyA1Ljg3NzU5IDI0LjY0NCA1Ljc5M0wyMi43OTQgNC4yMzZDMjIuNTg3NyA0LjA2MjA4IDIyLjMyMTMgMy45NzYyNCAyMi4wNTIzIDMuOTk3QzIxLjc4MzIgNC4wMTc3NyAyMS41MzMyIDQuMTQzNDggMjEuMzU2IDQuMzQ3TDEzLjE5MSAxMy44QzEzLjE2NzUgMTMuODI3MyAxMy4xMzg0IDEzLjg0OTIgMTMuMTA1NyAxMy44NjQyQzEzLjA3MyAxMy44NzkyIDEzLjAzNzUgMTMuODg2OSAxMy4wMDE1IDEzLjg4NjlDMTIuOTY1NSAxMy44ODY5IDEyLjkzIDEzLjg3OTIgMTIuODk3MyAxMy44NjQyQzEyLjg2NDYgMTMuODQ5MiAxMi44MzU1IDEzLjgyNzMgMTIuODEyIDEzLjhMNC42NDQgNC4zNDZDNC40NjY2OSA0LjE0MzQyIDQuMjE2NTQgNC4wMTkwNiAzLjk0OCA0QzMuODE0ODUgMy45ODgxMyAzLjY4MDY3IDQuMDAzMDggMy41NTM0IDQuMDQzOTZDMy40MjYxMiA0LjA4NDgzIDMuMzA4MzQgNC4xNTA4MiAzLjIwNyA0LjIzOEwxLjM1NiA1Ljc5M0MxLjI1MzcyIDUuODc3NDQgMS4xNjk0OSA1Ljk4MTYxIDEuMTA4MzMgNi4wOTkyOUMxLjA0NzE3IDYuMjE2OTggMS4wMTAzMiA2LjM0NTc3IDEgNi40NzhDMC45ODk5OSA2LjYxMDA0IDEuMDA2OSA2Ljc0Mjc0IDEuMDQ5NyA2Ljg2ODA1QzEuMDkyNSA2Ljk5MzM2IDEuMTYwMzEgNy4xMDg2OCAxLjI0OSA3LjIwN1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jaGV2cm9uLXVwXCIgZGF0YS1uYW1lPVwiY2hldnJvbi11cFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMy43NTEgMTYuNzkzTDEyLjc2NyA0LjMyMkMxMi42Njc1IDQuMjE4MjIgMTIuNTQ4IDQuMTM1NjMgMTIuNDE1OCA0LjA3OTIyQzEyLjI4MzYgNC4wMjI4IDEyLjE0MTMgMy45OTM3MiAxMS45OTc1IDMuOTkzNzJDMTEuODUzNyAzLjk5MzcyIDExLjcxMTQgNC4wMjI4IDExLjU3OTIgNC4wNzkyMkMxMS40NDcgNC4xMzU2MyAxMS4zMjc1IDQuMjE4MjIgMTEuMjI4IDQuMzIyTDAuMjQ4OTk4IDE2Ljc5M0MwLjE2MTE4OCAxNi44OTE5IDAuMDk0MTU5OSAxNy4wMDc1IDAuMDUxODk3NSAxNy4xMzI5QzAuMDA5NjM1MTUgMTcuMjU4MiAtMC4wMDY5OTk2IDE3LjM5MDggMC4wMDI5ODE3MyAxNy41MjI3QzAuMDEyOTYzMSAxNy42NTQ2IDAuMDQ5MzU2OCAxNy43ODMxIDAuMTEgMTcuOTAwN0MwLjE3MDY0NCAxOC4wMTgyIDAuMjU0MyAxOC4xMjI0IDAuMzU1OTk4IDE4LjIwN0wyLjIwNiAxOS43NjRDMi40MTIyOSAxOS45Mzc5IDIuNjc4NyAyMC4wMjM4IDIuOTQ3NzMgMjAuMDAzQzMuMjE2NzYgMTkuOTgyMiAzLjQ2Njg0IDE5Ljg1NjUgMy42NDQgMTkuNjUzTDExLjgwOSAxMC4yQzExLjgzMjUgMTAuMTcyNyAxMS44NjE1IDEwLjE1MDggMTEuODk0MyAxMC4xMzU4QzExLjkyNyAxMC4xMjA4IDExLjk2MjUgMTAuMTEzMSAxMS45OTg1IDEwLjExMzFDMTIuMDM0NSAxMC4xMTMxIDEyLjA3IDEwLjEyMDggMTIuMTAyNyAxMC4xMzU4QzEyLjEzNTQgMTAuMTUwOCAxMi4xNjQ1IDEwLjE3MjcgMTIuMTg4IDEwLjJMMjAuMzU2IDE5LjY1QzIwLjQ0NCAxOS43NTEzIDIwLjU1MTEgMTkuODM0MyAyMC42NzEzIDE5Ljg5NDJDMjAuNzkxNCAxOS45NTQxIDIwLjkyMjEgMTkuOTg5NyAyMS4wNTYgMTkuOTk5QzIxLjE4OTEgMjAuMDEwOSAyMS4zMjMzIDE5Ljk5NTkgMjEuNDUwNiAxOS45NTVDMjEuNTc3OSAxOS45MTQyIDIxLjY5NTcgMTkuODQ4MiAyMS43OTcgMTkuNzYxTDIzLjY0OCAxOC4yMDNDMjMuNzQ5NSAxOC4xMTgyIDIzLjgzMjkgMTguMDE0IDIzLjg5MzQgMTcuODk2NUMyMy45NTM5IDE3Ljc3ODkgMjMuOTkwMiAxNy42NTA0IDI0LjAwMDEgMTcuNTE4NkMyNC4wMTAxIDE3LjM4NjggMjMuOTkzNiAxNy4yNTQzIDIzLjk1MTUgMTcuMTI5QzIzLjkwOTQgMTcuMDAzNyAyMy44NDI1IDE2Ljg4ODEgMjMuNzU1IDE2Ljc4OUwyMy43NTEgMTYuNzkzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNsb3NlXCIgZGF0YS1uYW1lPVwiY2xvc2VcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMC40MzkwMDUgMjEuNDRDMC4xNTc3NDMgMjEuNzIxNCAtMC4wMDAyMTU3NzEgMjIuMTAzIC0wLjAwMDEyMTk5NyAyMi41MDA5Qy0yLjgyMjI5ZS0wNSAyMi44OTg3IDAuMTU4MTEgMjMuMjgwMiAwLjQzOTUwNSAyMy41NjE1QzAuNzIwOSAyMy44NDI4IDEuMTAyNSAyNC4wMDA3IDEuNTAwMzYgMjQuMDAwNkMxLjg5ODIyIDI0LjAwMDUgMi4yNzk3NCAyMy44NDI0IDIuNTYxMDEgMjMuNTYxTDExLjgyMyAxNC4zQzExLjg0NjIgMTQuMjc2NyAxMS44NzM4IDE0LjI1ODIgMTEuOTA0MiAxNC4yNDU2QzExLjkzNDYgMTQuMjMzIDExLjk2NzEgMTQuMjI2NiAxMiAxNC4yMjY2QzEyLjAzMjkgMTQuMjI2NiAxMi4wNjU0IDE0LjIzMyAxMi4wOTU4IDE0LjI0NTZDMTIuMTI2MiAxNC4yNTgyIDEyLjE1MzggMTQuMjc2NyAxMi4xNzcgMTQuM0wyMS40MzkgMjMuNTYzQzIxLjU3ODMgMjMuNzAyMyAyMS43NDM2IDIzLjgxMjkgMjEuOTI1NiAyMy44ODgzQzIyLjEwNzYgMjMuOTYzNyAyMi4zMDI3IDI0LjAwMjYgMjIuNDk5NyAyNC4wMDI2QzIyLjY5NjcgMjQuMDAyNyAyMi44OTE3IDIzLjk2MzkgMjMuMDczOCAyMy44ODg2QzIzLjI1NTggMjMuODEzMiAyMy40MjEyIDIzLjcwMjggMjMuNTYwNSAyMy41NjM1QzIzLjY5OTggMjMuNDI0MiAyMy44MTA0IDIzLjI1ODkgMjMuODg1OCAyMy4wNzY5QzIzLjk2MTIgMjIuODk0OSAyNC4wMDAxIDIyLjY5OTkgMjQuMDAwMSAyMi41MDI5QzI0LjAwMDIgMjIuMzA1OSAyMy45NjE0IDIyLjExMDggMjMuODg2MSAyMS45Mjg4QzIzLjgxMDcgMjEuNzQ2NyAyMy43MDAzIDIxLjU4MTMgMjMuNTYxIDIxLjQ0MkwxNC4zIDEyLjE3N0MxNC4yNzY3IDEyLjE1MzggMTQuMjU4MyAxMi4xMjYyIDE0LjI0NTYgMTIuMDk1OEMxNC4yMzMgMTIuMDY1NCAxNC4yMjY2IDEyLjAzMjkgMTQuMjI2NiAxMkMxNC4yMjY2IDExLjk2NzEgMTQuMjMzIDExLjkzNDYgMTQuMjQ1NiAxMS45MDQyQzE0LjI1ODMgMTEuODczOCAxNC4yNzY3IDExLjg0NjIgMTQuMyAxMS44MjNMMjMuNTYzIDIuNTYxQzIzLjg0NDMgMi4yNzkzNCAyNC4wMDIxIDEuODk3NDkgMjQuMDAxOCAxLjQ5OTQ0QzI0LjAwMTYgMS4xMDEzOSAyMy44NDMyIDAuNzE5NzYyIDIzLjU2MTUgMC40Mzg1QzIzLjI3OTggMC4xNTcyMzggMjIuODk4IC0wLjAwMDYxNTY2NCAyMi40OTk5IC0wLjAwMDMzNDM2NEMyMi4xMDE5IC01LjMwNjQ5ZS0wNSAyMS43MjAzIDAuMTU4MzQgMjEuNDM5IDAuNDRMMTIuMTc3IDkuN0MxMi4xNTM4IDkuNzIzMjggMTIuMTI2MiA5Ljc0MTc1IDEyLjA5NTggOS43NTQzNkMxMi4wNjU0IDkuNzY2OTYgMTIuMDMyOSA5Ljc3MzQ1IDEyIDkuNzczNDVDMTEuOTY3MSA5Ljc3MzQ1IDExLjkzNDYgOS43NjY5NiAxMS45MDQyIDkuNzU0MzZDMTEuODczOCA5Ljc0MTc1IDExLjg0NjIgOS43MjMyOCAxMS44MjMgOS43TDIuNTYxMDEgMC40NEMyLjQyMTc0IDAuMzAwNjY3IDIuMjU2MzkgMC4xOTAxMyAyLjA3NDQxIDAuMTE0Njk4QzEuODkyNDIgMC4wMzkyNjcgMS42OTczNiAwLjAwMDQxOTE0NCAxLjUwMDM2IDAuMDAwMzcyNzE1QzEuMTAyNSAwLjAwMDI3ODk0NyAwLjcyMDkgMC4xNTgyMzggMC40Mzk1MDUgMC40Mzk1QzAuMTU4MTEgMC43MjA3NjIgLTIuODI2MDRlLTA1IDEuMTAyMjkgLTAuMDAwMTIyMDI5IDEuNTAwMTVDLTAuMDAwMjE1Nzk3IDEuODk4IDAuMTU3NzQzIDIuMjc5NjEgMC40MzkwMDUgMi41NjFMOS43IDExLjgyM0M5LjcyMzI5IDExLjg0NjIgOS43NDE3NiAxMS44NzM4IDkuNzU0MzYgMTEuOTA0MkM5Ljc2Njk2IDExLjkzNDYgOS43NzM0NSAxMS45NjcxIDkuNzczNDUgMTJDOS43NzM0NSAxMi4wMzI5IDkuNzY2OTYgMTIuMDY1NCA5Ljc1NDM2IDEyLjA5NThDOS43NDE3NiAxMi4xMjYyIDkuNzIzMjkgMTIuMTUzOCA5LjcgMTIuMTc3TDAuNDM5MDA1IDIxLjQ0WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNvbnRhY3RcIiBkYXRhLW5hbWU9XCJjb250YWN0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTI0LjAwMDEgMjFDMjMuOTk3OSAxOS4wMTE1IDIzLjIwNzEgMTcuMTA1MSAyMS44MDEgMTUuNjk5QzIwLjM5NSAxNC4yOTMgMTguNDg4NSAxMy41MDIxIDE2LjUwMDEgMTMuNUMxNS42OTE2IDEzLjUwMDMgMTQuODg4NiAxMy42MzMgMTQuMTIzMSAxMy44OTNDMTQuMDQyOCAxMy45MTk4IDEzLjk3MDYgMTMuOTY2NSAxMy45MTMzIDE0LjAyODhDMTMuODU2IDE0LjA5MTEgMTMuODE1NSAxNC4xNjcgMTMuNzk1NSAxNC4yNDkyQzEzLjc3NTUgMTQuMzMxNCAxMy43NzY3IDE0LjQxNzQgMTMuNzk5MSAxNC40OTkxQzEzLjgyMTQgMTQuNTgwNyAxMy44NjQgMTQuNjU1MyAxMy45MjMxIDE0LjcxNkMxNS41NzM3IDE2LjM5MTEgMTYuNDk5MyAxOC42NDgzIDE2LjUwMDEgMjFWMjEuMDI0QzE2LjQ5OTEgMjEuMDg2MiAxNi41MTA2IDIxLjE0NzkgMTYuNTMzNyAyMS4yMDU2QzE2LjU1NjkgMjEuMjYzMyAxNi41OTEzIDIxLjMxNTkgMTYuNjM0OSAyMS4zNjAyQzE2LjY3ODYgMjEuNDA0NSAxNi43MzA2IDIxLjQzOTYgMTYuNzg3OSAyMS40NjM2QzE2Ljg0NTMgMjEuNDg3NiAxNi45MDY5IDIxLjUgMTYuOTY5MSAyMS41SDIzLjUwMDFDMjMuNjMyNyAyMS41IDIzLjc1OTggMjEuNDQ3MyAyMy44NTM2IDIxLjM1MzZDMjMuOTQ3NCAyMS4yNTk4IDI0LjAwMDEgMjEuMTMyNiAyNC4wMDAxIDIxWlwiLz48cGF0aCBkPVwiTTEzLjY3NSA1LjUzMDAxQzEzLjgwNzggNS45NDA1NCAxMy45MDEyIDYuMzYyNzggMTMuOTU0IDYuNzkxMDFDMTMuOTYzNCA2Ljg2OTQxIDEzLjk5MTIgNi45NDQ0NiAxNC4wMzUyIDcuMDEwMDNDMTQuMDc5MiA3LjA3NTYxIDE0LjEzODEgNy4xMjk4MyAxNC4yMDcxIDcuMTY4MjZDMTQuMjc2IDcuMjA2NyAxNC4zNTMxIDcuMjI4MjYgMTQuNDMyIDcuMjMxMTdDMTQuNTEwOSA3LjIzNDA4IDE0LjU4OTQgNy4yMTgyNiAxNC42NjEgNy4xODUwMUMxNS4zMjc1IDYuODc1OTcgMTUuOTMwMiA2LjQ0NDg4IDE2LjQzOCA1LjkxNDAxQzE2LjQ2MTQgNS44ODk2MyAxNi40ODk2IDUuODcwMjQgMTYuNTIwNyA1Ljg1Njk5QzE2LjU1MTggNS44NDM3NCAxNi41ODUyIDUuODM2OTEgMTYuNjE5IDUuODM2OTFDMTYuNjUyOCA1LjgzNjkxIDE2LjY4NjMgNS44NDM3NCAxNi43MTc0IDUuODU2OTlDMTYuNzQ4NSA1Ljg3MDI0IDE2Ljc3NjYgNS44ODk2MyAxNi44IDUuOTE0MDFDMTcuNDgwNSA2LjYyNjYyIDE4LjMyOTIgNy4xNTY4NSAxOS4yNjggNy40NTYwMUMxOS4zODE0IDcuNDkyMjUgMTkuNDc4MSA3LjU2Nzc1IDE5LjU0MDggNy42Njg5NEMxOS42MDM1IDcuNzcwMTIgMTkuNjI4MSA3Ljg5MDM1IDE5LjYxIDguMDA4MDFDMTkuNDk5MSA4LjcyNzA5IDE5LjEzNDggOS4zODI4MiAxOC41ODI4IDkuODU2ODVDMTguMDMwOCAxMC4zMzA5IDE3LjMyNzYgMTAuNTkyIDE2LjYgMTAuNTkzQzE2LjE4NzkgMTAuNTkzNCAxNS43OCAxMC41MDk0IDE1LjQwMTYgMTAuMzQ2QzE1LjAyMzIgMTAuMTgyNiAxNC42ODIzIDkuOTQzMzMgMTQuNCA5LjY0MzAxQzE0LjM0MTkgOS41ODE2NCAxNC4yNjkyIDkuNTM2IDE0LjE4ODYgOS41MTAzNkMxNC4xMDgxIDkuNDg0NzIgMTQuMDIyNCA5LjQ3OTkxIDEzLjkzOTUgOS40OTY0QzEzLjg1NjYgOS41MTI4OCAxMy43NzkyIDkuNTUwMSAxMy43MTQ2IDkuNjA0NkMxMy42NSA5LjY1OTA5IDEzLjYwMDIgOS43MjkwOCAxMy41NyA5LjgwODAxQzEzLjQ1MzQgMTAuMTEyNCAxMy4zMTQgMTAuNDA3NiAxMy4xNTMgMTAuNjkxQzEzLjA5NjMgMTAuNzkwMiAxMy4wNzUzIDEwLjkwNTkgMTMuMDkzNSAxMS4wMTg3QzEzLjExMTcgMTEuMTMxNSAxMy4xNjggMTEuMjM0NyAxMy4yNTMgMTEuMzExQzE0LjEzOTYgMTIuMTA5MSAxNS4yODI4IDEyLjU2MyAxNi40NzU0IDEyLjU5MDRDMTcuNjY4IDEyLjYxNzcgMTguODMwOCAxMi4yMTY3IDE5Ljc1MyAxMS40NkMxOS43ODM0IDExLjQzNSAxOS44MTkyIDExLjQxNzUgMTkuODU3NiAxMS40MDlDMTkuODk2IDExLjQwMDQgMTkuOTM1OCAxMS40MDEgMTkuOTczOSAxMS40MTA4QzIwLjAxMiAxMS40MjA1IDIwLjA0NzMgMTEuNDM5MSAyMC4wNzY4IDExLjQ2NUMyMC4xMDY0IDExLjQ5MSAyMC4xMjk0IDExLjUyMzUgMjAuMTQ0IDExLjU2QzIwLjI3MTUgMTEuODk2OSAyMC40MzMgMTIuMjE5OSAyMC42MjYgMTIuNTI0QzIwLjY5NTUgMTIuNjM3OSAyMC43ODcxIDEyLjczNjggMjAuODk1NCAxMi44MTQ4QzIxLjAwMzcgMTIuODkyNyAyMS4xMjY1IDEyLjk0ODIgMjEuMjU2NiAxMi45NzhDMjEuMzg2NyAxMy4wMDc4IDIxLjUyMTQgMTMuMDExMiAyMS42NTI4IDEyLjk4ODFDMjEuNzg0MyAxMi45NjUgMjEuOTA5NyAxMi45MTU4IDIyLjAyMTkgMTIuODQzNUMyMi4xMzQgMTIuNzcxMSAyMi4yMzA1IDEyLjY3NzEgMjIuMzA1NyAxMi41NjY4QzIyLjM4MDkgMTIuNDU2NiAyMi40MzMzIDEyLjMzMjQgMjIuNDU5OCAxMi4yMDE2QzIyLjQ4NjMgMTIuMDcwOSAyMi40ODYzIDExLjkzNjEgMjIuNDU5OSAxMS44MDUzQzIyLjQzMzUgMTEuNjc0NSAyMi4zODEyIDExLjU1MDMgMjIuMzA2IDExLjQ0QzIxLjgzNjIgMTAuNjUzNCAyMS42MDQyIDkuNzQ3NjEgMjEuNjM4IDguODMyMDFWNy41NDYwMUMyMS42NCA2LjU3NjE5IDIxLjM2MTkgNS42MjY0MiAyMC44MzcxIDQuODEwODdDMjAuMzEyMyAzLjk5NTMxIDE5LjU2MzEgMy4zNDg2OSAxOC42Nzk2IDIuOTQ4NzFDMTcuNzk2MSAyLjU0ODczIDE2LjgxNTkgMi40MTI0MiAxNS44NTY4IDIuNTU2MTdDMTQuODk3NiAyLjY5OTkxIDE0LjAwMDQgMy4xMTc2IDEzLjI3MyAzLjc1OTAxQzEzLjE4NjggMy44MzU2NiAxMy4xMjk4IDMuOTM5NzcgMTMuMTExNSA0LjA1MzY3QzEzLjA5MzMgNC4xNjc1OCAxMy4xMTUgNC4yODQyOSAxMy4xNzMgNC4zODQwMUMxMy4zODEyIDQuNzQ2NzkgMTMuNTQ5NSA1LjEzMTAzIDEzLjY3NSA1LjUzMDAxVjUuNTMwMDFaXCIvPjxwYXRoIGQ9XCJNMTIuNSA3LjVDMTIuNSA2LjUxMTEgMTIuMjA2OCA1LjU0NDQgMTEuNjU3MyA0LjcyMjE1QzExLjEwNzkgMy44OTk5MSAxMC4zMjcgMy4yNTkwNCA5LjQxMzQyIDIuODgwNkM4LjQ5OTc5IDIuNTAyMTcgNy40OTQ0NiAyLjQwMzE1IDYuNTI0NTUgMi41OTYwOEM1LjU1NDY1IDIuNzg5IDQuNjYzNzMgMy4yNjUyMSAzLjk2NDQ3IDMuOTY0NDdDMy4yNjUyMSA0LjY2MzczIDIuNzg5IDUuNTU0NjUgMi41OTYwOCA2LjUyNDU1QzIuNDAzMTUgNy40OTQ0NiAyLjUwMjE3IDguNDk5NzkgMi44ODA2IDkuNDEzNDJDMy4yNTkwNCAxMC4zMjcgMy44OTk5MSAxMS4xMDc5IDQuNzIyMTUgMTEuNjU3M0M1LjU0NDQgMTIuMjA2OCA2LjUxMTEgMTIuNSA3LjUgMTIuNUM4LjgyNTYgMTIuNDk4NCAxMC4wOTY0IDExLjk3MTEgMTEuMDMzOCAxMS4wMzM4QzExLjk3MTEgMTAuMDk2NCAxMi40OTg0IDguODI1NiAxMi41IDcuNVY3LjVaTTQuNiA2Ljc1N0M0LjYxOTkyIDYuNjgyMDYgNC42NTY5OSA2LjYxMjc4IDQuNzA4MjkgNi41NTQ2NEM0Ljc1OTYgNi40OTY0OSA0LjgyMzcyIDYuNDUxMDcgNC44OTU1OSA2LjQyMTk3QzQuOTY3NDcgNi4zOTI4NyA1LjA0NTEyIDYuMzgwODkgNS4xMjI0MyA2LjM4Njk3QzUuMTk5NzMgNi4zOTMwNSA1LjI3NDU2IDYuNDE3MDMgNS4zNDEgNi40NTdDNi40Mjg1MyA3LjEzMDcxIDcuNjgwNzMgNy40OTE1OSA4Ljk2IDcuNUM5LjI3MDk2IDcuNDk5NDEgOS41ODE0NiA3LjQ3NjAyIDkuODg5IDcuNDNDOS45NjU5NCA3LjQxODUxIDEwLjA0NDUgNy40MjUxMyAxMC4xMTg0IDcuNDQ5MzNDMTAuMTkyMyA3LjQ3MzUzIDEwLjI1OTYgNy41MTQ2NSAxMC4zMTQ4IDcuNTY5NDFDMTAuMzcwMSA3LjYyNDE3IDEwLjQxMTggNy42OTEwNiAxMC40MzY2IDcuNzY0NzdDMTAuNDYxNSA3LjgzODQ4IDEwLjQ2ODggNy45MTY5NyAxMC40NTggNy45OTRDMTAuMzMyNyA4LjczNTE1IDkuOTMzNjkgOS40MDIyNCA5LjM0MDAxIDkuODYzMjdDOC43NDYzMiAxMC4zMjQzIDguMDAxMiAxMC41NDU3IDcuMjUyMTEgMTAuNDgzNUM2LjUwMzAxIDEwLjQyMTQgNS44MDQ1MiAxMC4wODA0IDUuMjk0ODcgOS41Mjc4N0M0Ljc4NTIyIDguOTc1MzYgNC41MDE1NiA4LjI1MTY3IDQuNSA3LjVDNC41MDAzNyA3LjI0OTAxIDQuNTMzOTkgNi45OTkxNiA0LjYgNi43NTdWNi43NTdaXCIvPjxwYXRoIGQ9XCJNMTUgMjFDMTUgMTkuMDEwOSAxNC4yMDk4IDE3LjEwMzIgMTIuODAzMyAxNS42OTY3QzExLjM5NjggMTQuMjkwMiA5LjQ4OTEyIDEzLjUgNy41IDEzLjVDNS41MTA4OCAxMy41IDMuNjAzMjIgMTQuMjkwMiAyLjE5NjcgMTUuNjk2N0MwLjc5MDE3NiAxNy4xMDMyIDAgMTkuMDEwOSAwIDIxQzAgMjEuMTMyNiAwLjA1MjY3ODQgMjEuMjU5OCAwLjE0NjQ0NyAyMS4zNTM2QzAuMjQwMjE1IDIxLjQ0NzMgMC4zNjczOTIgMjEuNSAwLjUgMjEuNUgxNC41QzE0LjYzMjYgMjEuNSAxNC43NTk4IDIxLjQ0NzMgMTQuODUzNiAyMS4zNTM2QzE0Ljk0NzMgMjEuMjU5OCAxNSAyMS4xMzI2IDE1IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRhc2hib2FyZFwiIGRhdGEtbmFtZT1cImRhc2hib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMiAwQzkuNjI2NjMgMCA3LjMwNjU1IDAuNzAzNzg4IDUuMzMzMTYgMi4wMjIzNkMzLjM1OTc3IDMuMzQwOTQgMS44MjE3IDUuMjE1MDkgMC45MTM0NTEgNy40MDc4QzAuMDA1MTk5NDMgOS42MDA1MSAtMC4yMzI0NDEgMTIuMDEzMyAwLjIzMDU4MiAxNC4zNDExQzAuNjkzNjA1IDE2LjY2ODkgMS44MzY0OSAxOC44MDcxIDMuNTE0NzIgMjAuNDg1M0M1LjE5Mjk1IDIyLjE2MzUgNy4zMzExNSAyMy4zMDY0IDkuNjU4OTIgMjMuNzY5NEMxMS45ODY3IDI0LjIzMjQgMTQuMzk5NSAyMy45OTQ4IDE2LjU5MjIgMjMuMDg2NkMxOC43ODQ5IDIyLjE3ODMgMjAuNjU5MSAyMC42NDAyIDIxLjk3NzYgMTguNjY2OEMyMy4yOTYyIDE2LjY5MzUgMjQgMTQuMzczNCAyNCAxMkMyMy45OTY2IDguODE4NDYgMjIuNzMxMiA1Ljc2ODIxIDIwLjQ4MTUgMy41MTg1MkMxOC4yMzE4IDEuMjY4ODMgMTUuMTgxNSAwLjAwMzQ0MTA4IDEyIDBWMFpNNS4xNDUwMSA4LjkxTDQuMjc5MDEgOC40MUM0LjEwNjYxIDguMzEwNTQgMy45ODA3OSA4LjE0NjY4IDMuOTI5MjIgNy45NTQ0NUMzLjg3NzY1IDcuNzYyMjMgMy45MDQ1NSA3LjU1NzM5IDQuMDA0MDEgNy4zODVDNC4xMDM0NiA3LjIxMjYxIDQuMjY3MzMgNy4wODY3OSA0LjQ1OTU1IDcuMDM1MjJDNC42NTE3OCA2Ljk4MzY0IDQuODU2NjEgNy4wMTA1NCA1LjAyOTAxIDcuMTFMNS44OTUwMSA3LjYxQzYuMDM4MyA3LjY5MjQ5IDYuMTUwMzIgNy44MjAwMSA2LjIxMzY1IDcuOTcyNzRDNi4yNzY5OCA4LjEyNTQ4IDYuMjg4MDYgOC4yOTQ4NiA2LjI0NTE3IDguNDU0NTRDNi4yMDIyOSA4LjYxNDIyIDYuMTA3ODQgOC43NTUyNSA1Ljk3NjUxIDguODU1NzFDNS44NDUxOSA4Ljk1NjE2IDUuNjg0MzUgOS4wMTA0MSA1LjUxOTAxIDkuMDFDNS4zODc2NiA5LjAxMDU0IDUuMjU4NTUgOC45NzYwMiA1LjE0NTAxIDguOTFWOC45MVpNNS4yNTAwMSAxMS45OTFDNS4yNTAwMSAxMi4xODk5IDUuMTcwOTkgMTIuMzgwNyA1LjAzMDM0IDEyLjUyMTNDNC44ODk2OCAxMi42NjIgNC42OTg5MiAxMi43NDEgNC41MDAwMSAxMi43NDFIMy41MDAwMUMzLjMwMTA5IDEyLjc0MSAzLjExMDMzIDEyLjY2MiAyLjk2OTY4IDEyLjUyMTNDMi44MjkwMiAxMi4zODA3IDIuNzUwMDEgMTIuMTg5OSAyLjc1MDAxIDExLjk5MUMyLjc1MDAxIDExLjc5MjEgMi44MjkwMiAxMS42MDEzIDIuOTY5NjggMTEuNDYwN0MzLjExMDMzIDExLjMyIDMuMzAxMDkgMTEuMjQxIDMuNTAwMDEgMTEuMjQxSDQuNTAwMDFDNC42OTg5MiAxMS4yNDEgNC44ODk2OCAxMS4zMiA1LjAzMDM0IDExLjQ2MDdDNS4xNzA5OSAxMS42MDEzIDUuMjUwMDEgMTEuNzkyMSA1LjI1MDAxIDExLjk5MVpNMTQuMjQgMTJDMTQuMjQgMTIuNDQ1IDE0LjEwOCAxMi44OCAxMy44NjA4IDEzLjI1QzEzLjYxMzYgMTMuNjIgMTMuMjYyMiAxMy45MDg0IDEyLjg1MSAxNC4wNzg3QzEyLjQzOTkgMTQuMjQ5IDExLjk4NzUgMTQuMjkzNiAxMS41NTExIDE0LjIwNjhDMTEuMTE0NiAxNC4xMiAxMC43MTM3IDEzLjkwNTcgMTAuMzk5IDEzLjU5MUMxMC4wODQzIDEzLjI3NjMgOS44NzAwNiAxMi44NzU0IDkuNzgzMjQgMTIuNDM5QzkuNjk2NDIgMTIuMDAyNSA5Ljc0MDk4IDExLjU1MDEgOS45MTEyOCAxMS4xMzlDMTAuMDgxNiAxMC43Mjc4IDEwLjM3IDEwLjM3NjQgMTAuNzQgMTAuMTI5MkMxMS4xMSA5Ljg4MTk2IDExLjU0NSA5Ljc1IDExLjk5IDkuNzVDMTIuMDE1NCA5Ljc1MDE0IDEyLjA0MDggOS43NTE4MSAxMi4wNjYgOS43NTVDMTIuMTExMiA5Ljc1OTU1IDEyLjE1NjcgOS43NTE3MSAxMi4xOTc4IDkuNzMyMzNDMTIuMjM4OCA5LjcxMjk1IDEyLjI3MzggOS42ODI3NiAxMi4yOTkgOS42NDVMMTUuNjk5IDQuNTcxQzE1Ljc3MTkgNC40NjEyOCAxNS44NjU3IDQuMzY3MDQgMTUuOTc1MSA0LjI5MzY5QzE2LjA4NDUgNC4yMjAzMyAxNi4yMDczIDQuMTY5MyAxNi4zMzY0IDQuMTQzNTRDMTYuNDY1NiA0LjExNzc3IDE2LjU5ODYgNC4xMTc3OCAxNi43Mjc3IDQuMTQzNTVDMTYuODU2OSA0LjE2OTMyIDE2Ljk3OTcgNC4yMjAzNSAxNy4wODkgNC4yOTM3MUMxNy4xOTg0IDQuMzY3MDcgMTcuMjkyMiA0LjQ2MTMxIDE3LjM2NTEgNC41NzEwM0MxNy40MzggNC42ODA3NSAxNy40ODg0IDQuODAzNzggMTcuNTEzNiA0LjkzMzA2QzE3LjUzODggNS4wNjIzMyAxNy41MzgyIDUuMTk1MzEgMTcuNTExOCA1LjMyNDM1QzE3LjQ4NTUgNS40NTMzOSAxNy40MzM5IDUuNTc1OTUgMTcuMzYgNS42ODVMMTMuOTkzIDEwLjcxQzEzLjk2NzkgMTAuNzQ3NSAxMy45NTM1IDEwLjc5MTEgMTMuOTUxMiAxMC44MzYyQzEzLjk0ODkgMTAuODgxMyAxMy45NTg5IDEwLjkyNjEgMTMuOTggMTAuOTY2QzE0LjE0OTYgMTEuMjg0MyAxNC4yMzg5IDExLjYzOTMgMTQuMjQgMTJWMTJaTTEyLjc1OCA0LjU1OEMxMi43NTggNC43NTY5MSAxMi42NzkgNC45NDc2OCAxMi41MzgzIDUuMDg4MzNDMTIuMzk3NyA1LjIyODk4IDEyLjIwNjkgNS4zMDggMTIuMDA4IDUuMzA4QzExLjgwOTEgNS4zMDggMTEuNjE4MyA1LjIyODk4IDExLjQ3NzcgNS4wODgzM0MxMS4zMzcgNC45NDc2OCAxMS4yNTggNC43NTY5MSAxMS4yNTggNC41NThWMy41NThDMTEuMjU4IDMuMzU5MDkgMTEuMzM3IDMuMTY4MzIgMTEuNDc3NyAzLjAyNzY3QzExLjYxODMgMi44ODcwMiAxMS44MDkxIDIuODA4IDEyLjAwOCAyLjgwOEMxMi4yMDY5IDIuODA4IDEyLjM5NzcgMi44ODcwMiAxMi41MzgzIDMuMDI3NjdDMTIuNjc5IDMuMTY4MzIgMTIuNzU4IDMuMzU5MDkgMTIuNzU4IDMuNTU4VjQuNTU4Wk03LjM5MzAxIDQuMDI1QzcuNDc4MjQgMy45NzU1OSA3LjU3MjQgMy45NDM1IDcuNjcwMDcgMy45MzA1OUM3Ljc2Nzc0IDMuOTE3NjcgNy44NjcgMy45MjQxNyA3Ljk2MjE1IDMuOTQ5NzNDOC4wNTczIDMuOTc1MjggOC4xNDY0NiA0LjAxOTM4IDguMjI0NTIgNC4wNzk0OUM4LjMwMjU4IDQuMTM5NiA4LjM2Nzk5IDQuMjE0NTQgOC40MTcwMSA0LjNMOC45MTcwMSA1LjE2NkM4Ljk2NjQ2IDUuMjUxMTggOC45OTg2IDUuMzQ1MjggOS4wMTE1OSA1LjQ0MjkxQzkuMDI0NTggNS41NDA1NCA5LjAxODE2IDUuNjM5NzcgOC45OTI3MSA1LjczNDkxQzguOTY3MjUgNS44MzAwNiA4LjkyMzI1IDUuOTE5MjQgOC44NjMyNCA1Ljk5NzMzQzguODAzMjMgNi4wNzU0MyA4LjcyODM5IDYuMTQwOSA4LjY0MzAxIDYuMTlDOC41Mjk0NiA2LjI1NjAyIDguNDAwMzUgNi4yOTA1NCA4LjI2OTAxIDYuMjlDOC4xMzcyMyA2LjI5MDI5IDguMDA3NzIgNi4yNTU3NiA3Ljg5MzU4IDYuMTg5OTFDNy43Nzk0NCA2LjEyNDA2IDcuNjg0NzIgNi4wMjkyMiA3LjYxOTAxIDUuOTE1TDcuMTE5MDEgNS4wNDlDNy4wNjk2OSA0Ljk2Mzc5IDcuMDM3NjUgNC44Njk2OSA3LjAyNDczIDQuNzcyMDlDNy4wMTE4MSA0LjY3NDQ5IDcuMDE4MjYgNC41NzUzIDcuMDQzNzEgNC40ODAxOUM3LjA2OTE2IDQuMzg1MDkgNy4xMTMxIDQuMjk1OTMgNy4xNzMwNCA0LjIxNzgyQzcuMjMyOTggNC4xMzk3MiA3LjMwNzcyIDQuMDc0MTkgNy4zOTMwMSA0LjAyNVY0LjAyNVpNNy41MDAwMSAxN0M3LjUwMDAxIDE2Ljg2NzQgNy41NTI2OCAxNi43NDAyIDcuNjQ2NDUgMTYuNjQ2NEM3Ljc0MDIyIDE2LjU1MjcgNy44Njc0IDE2LjUgOC4wMDAwMSAxNi41SDE2QzE2LjEzMjYgMTYuNSAxNi4yNTk4IDE2LjU1MjcgMTYuMzUzNiAxNi42NDY0QzE2LjQ0NzMgMTYuNzQwMiAxNi41IDE2Ljg2NzQgMTYuNSAxN1YxOUMxNi41IDE5LjEzMjYgMTYuNDQ3MyAxOS4yNTk4IDE2LjM1MzYgMTkuMzUzNkMxNi4yNTk4IDE5LjQ0NzMgMTYuMTMyNiAxOS41IDE2IDE5LjVIOC4wMDAwMUM3Ljg2NzQgMTkuNSA3Ljc0MDIyIDE5LjQ0NzMgNy42NDY0NSAxOS4zNTM2QzcuNTUyNjggMTkuMjU5OCA3LjUwMDAxIDE5LjEzMjYgNy41MDAwMSAxOVYxN1pNMTcuODA5IDguN0MxNy43MDk3IDguNTI3ODUgMTcuNjgyNyA4LjMyMzMgMTcuNzM0MSA4LjEzMTNDMTcuNzg1NSA3LjkzOTMgMTcuOTExIDcuNzc1NTQgMTguMDgzIDcuNjc2TDE4Ljk0OSA3LjE3NkMxOS4xMjE0IDcuMDc2NTQgMTkuMzI2MiA3LjA0OTY0IDE5LjUxODUgNy4xMDEyMkMxOS43MTA3IDcuMTUyNzkgMTkuODc0NiA3LjI3ODYxIDE5Ljk3NCA3LjQ1MUMyMC4wNzM1IDcuNjIzMzkgMjAuMTAwNCA3LjgyODIzIDIwLjA0ODggOC4wMjA0NUMxOS45OTcyIDguMjEyNjggMTkuODcxNCA4LjM3NjU0IDE5LjY5OSA4LjQ3NkwxOC44MzIgOC45NzZDMTguNjU5NyA5LjA3NDg1IDE4LjQ1NTIgOS4xMDEzMSAxOC4yNjM0IDkuMDQ5NTZDMTguMDcxNiA4Ljk5NzgyIDE3LjkwODIgOC44NzIxIDE3LjgwOSA4LjdaTTE4LjY5IDEyLjA2NUMxOC42OSAxMS44NjYxIDE4Ljc2OSAxMS42NzUzIDE4LjkwOTcgMTEuNTM0N0MxOS4wNTAzIDExLjM5NCAxOS4yNDExIDExLjMxNSAxOS40NCAxMS4zMTVIMjAuNDRDMjAuNjM4OSAxMS4zMTUgMjAuODI5NyAxMS4zOTQgMjAuOTcwMyAxMS41MzQ3QzIxLjExMSAxMS42NzUzIDIxLjE5IDExLjg2NjEgMjEuMTkgMTIuMDY1QzIxLjE5IDEyLjI2MzkgMjEuMTExIDEyLjQ1NDcgMjAuOTcwMyAxMi41OTUzQzIwLjgyOTcgMTIuNzM2IDIwLjYzODkgMTIuODE1IDIwLjQ0IDEyLjgxNUgxOS40NEMxOS4yNDEzIDEyLjgxNSAxOS4wNTA3IDEyLjczNjEgMTguOTEgMTIuNTk1N0MxOC43Njk0IDEyLjQ1NTIgMTguNjkwMyAxMi4yNjQ3IDE4LjY5IDEyLjA2NlYxMi4wNjVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZnVlbFwiIGRhdGEtbmFtZT1cImZ1ZWxcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMy45OSAzLjM1ODU4QzI0LjAyNzUgMy42MjExMyAyMy45NTkxIDMuODg3ODMgMjMuOCA0LjFMMjEuNzUgNi44MzNWOEgyM0MyMy4xMzI2IDggMjMuMjU5OCA4LjA1MjY4IDIzLjM1MzYgOC4xNDY0NUMyMy40NDczIDguMjQwMjEgMjMuNSA4LjM2NzM5IDIzLjUgOC41VjExQzIzLjUgMTEuMDgyMyAyMy40Nzk2IDExLjE2MzQgMjMuNDQwNyAxMS4yMzZDMjMuNDAxOCAxMS4zMDg1IDIzLjM0NTYgMTEuMzcwNCAyMy4yNzcgMTEuNDE2TDIxLjc3NyAxMi40MTZMMjEuNzUgMTIuNDMzVjE1LjVDMjEuNzUgMTYuMjk1NiAyMS40MzM5IDE3LjA1ODcgMjAuODcxMyAxNy42MjEzQzIwLjMwODcgMTguMTgzOSAxOS41NDU2IDE4LjUgMTguNzUgMTguNUgxOC41QzE4LjM2NzQgMTguNSAxOC4yNDAyIDE4LjU1MjcgMTguMTQ2NCAxOC42NDY0QzE4LjA1MjcgMTguNzQwMiAxOCAxOC44Njc0IDE4IDE5VjIyLjVDMTggMjIuODk3OCAxNy44NDIgMjMuMjc5NCAxNy41NjA3IDIzLjU2MDdDMTcuMjc5NCAyMy44NDIgMTYuODk3OCAyNCAxNi41IDI0SDMuNUMzLjEwMjE4IDI0IDIuNzIwNjQgMjMuODQyIDIuNDM5MzQgMjMuNTYwN0MyLjE1ODA0IDIzLjI3OTQgMiAyMi44OTc4IDIgMjIuNVYxLjVDMiAxLjEwMjE4IDIuMTU4MDQgMC43MjA2NDQgMi40MzkzNCAwLjQzOTM0QzIuNzIwNjQgMC4xNTgwMzUgMy4xMDIxOCAwIDMuNSAwSDE2LjVDMTYuODk3OCAwIDE3LjI3OTQgMC4xNTgwMzUgMTcuNTYwNyAwLjQzOTM0QzE3Ljg0MiAwLjcyMDY0NCAxOCAxLjEwMjE4IDE4IDEuNVYxNkMxOCAxNi4xMzI2IDE4LjA1MjcgMTYuMjU5OCAxOC4xNDY0IDE2LjM1MzZDMTguMjQwMiAxNi40NDczIDE4LjM2NzQgMTYuNSAxOC41IDE2LjVIMTguNzVDMTkuMDE1MiAxNi41IDE5LjI2OTYgMTYuMzk0NiAxOS40NTcxIDE2LjIwNzFDMTkuNjQ0NiAxNi4wMTk2IDE5Ljc1IDE1Ljc2NTIgMTkuNzUgMTUuNVY2LjVDMTkuNzUgNi4yODM2MyAxOS44MjAyIDYuMDczMSAxOS45NSA1LjlMMjIuMiAyLjlDMjIuMzU5MSAyLjY4NzgzIDIyLjU5NiAyLjU0NzU2IDIyLjg1ODYgMi41MTAwNUMyMi45ODg2IDIuNDkxNDggMjMuMTIxIDIuNDk4NjkgMjMuMjQ4MiAyLjUzMTI5QzIzLjM3NTQgMi41NjM4OCAyMy40OTQ5IDIuNjIxMjEgMjMuNiAyLjdDMjMuODEyMiAyLjg1OTEzIDIzLjk1MjQgMy4wOTYwMyAyMy45OSAzLjM1ODU4Wk0xNS44NTM2IDcuODUzNTVDMTUuOTQ3MyA3Ljc1OTc5IDE2IDcuNjMyNjEgMTYgNy41VjIuNUMxNiAyLjM2NzM5IDE1Ljk0NzMgMi4yNDAyMSAxNS44NTM2IDIuMTQ2NDVDMTUuNzU5OCAyLjA1MjY4IDE1LjYzMjYgMiAxNS41IDJINC41QzQuMzY3MzkgMiA0LjI0MDIxIDIuMDUyNjggNC4xNDY0NSAyLjE0NjQ1QzQuMDUyNjggMi4yNDAyMSA0IDIuMzY3MzkgNCAyLjVWNy41QzQgNy42MzI2MSA0LjA1MjY4IDcuNzU5NzkgNC4xNDY0NSA3Ljg1MzU1QzQuMjQwMjEgNy45NDczMiA0LjM2NzM5IDggNC41IDhIMTUuNUMxNS42MzI2IDggMTUuNzU5OCA3Ljk0NzMyIDE1Ljg1MzYgNy44NTM1NVpNMTMgMTFDMTIuNDQ3NyAxMSAxMiAxMS40NDc3IDEyIDEyVjE2QzEyIDE2LjU1MjMgMTIuNDQ3NyAxNyAxMyAxN0gxNEMxNC41NTIzIDE3IDE1IDE2LjU1MjMgMTUgMTZWMTJDMTUgMTEuNDQ3NyAxNC41NTIzIDExIDE0IDExSDEzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWluc3BlY3Rpb25cIiBkYXRhLW5hbWU9XCJpbnNwZWN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEyIDBDOS42MjY2MyAwIDcuMzA2NTUgMC43MDM3ODggNS4zMzMxNiAyLjAyMjM2QzMuMzU5NzcgMy4zNDA5NCAxLjgyMTcgNS4yMTUwOSAwLjkxMzQ1MSA3LjQwNzhDMC4wMDUxOTk0MyA5LjYwMDUxIC0wLjIzMjQ0MSAxMi4wMTMzIDAuMjMwNTgyIDE0LjM0MTFDMC42OTM2MDUgMTYuNjY4OSAxLjgzNjQ5IDE4LjgwNzEgMy41MTQ3MiAyMC40ODUzQzUuMTkyOTUgMjIuMTYzNSA3LjMzMTE1IDIzLjMwNjQgOS42NTg5MiAyMy43Njk0QzExLjk4NjcgMjQuMjMyNCAxNC4zOTk1IDIzLjk5NDggMTYuNTkyMiAyMy4wODY2QzE4Ljc4NDkgMjIuMTc4MyAyMC42NTkxIDIwLjY0MDIgMjEuOTc3NiAxOC42NjY4QzIzLjI5NjIgMTYuNjkzNSAyNCAxNC4zNzM0IDI0IDEyQzIzLjk5NjMgOC44MTg1NCAyMi43MzA4IDUuNzY4NDQgMjAuNDgxMiAzLjUxODgxQzE4LjIzMTYgMS4yNjkxOCAxNS4xODE1IDAuMDAzNzA1MjIgMTIgMFYwWk0xOC45MjcgOC4yTDEyLjA4MiAxNy40ODlDMTIuMDAxMiAxNy41OTYyIDExLjg5OTggMTcuNjg2MyAxMS43ODM4IDE3Ljc1MzlDMTEuNjY3OCAxNy44MjE1IDExLjUzOTUgMTcuODY1NCAxMS40MDY0IDE3Ljg4MjlDMTEuMjczMyAxNy45MDA0IDExLjEzOCAxNy44OTEyIDExLjAwODUgMTcuODU1OEMxMC44NzkgMTcuODIwNSAxMC43NTc4IDE3Ljc1OTcgMTAuNjUyIDE3LjY3N0w1Ljc2NDAxIDEzLjc2OUM1LjY2MTQ0IDEzLjY4NjkgNS41NzYwNSAxMy41ODU1IDUuNTEyNyAxMy40NzA0QzUuNDQ5MzYgMTMuMzU1MyA1LjQwOTMgMTMuMjI4OSA1LjM5NDgxIDEzLjA5ODNDNS4zNjU1NiAxMi44MzQ2IDUuNDQyMjQgMTIuNTcwMSA1LjYwODAxIDEyLjM2M0M1Ljc3Mzc3IDEyLjE1NTkgNi4wMTUwMiAxMi4wMjMxIDYuMjc4NyAxMS45OTM4QzYuNTQyMzcgMTEuOTY0NiA2LjgwNjg3IDEyLjA0MTIgNy4wMTQwMSAxMi4yMDdMMTEuMDkgMTUuNDY4TDE3LjMxNyA3LjAxN0MxNy4zOTIgNi45MDQ1MSAxNy40ODkgNi44MDgzOCAxNy42MDIxIDYuNzM0NDNDMTcuNzE1MyA2LjY2MDQ4IDE3Ljg0MjMgNi42MTAyNSAxNy45NzU0IDYuNTg2NzZDMTguMTA4NSA2LjU2MzI3IDE4LjI0NSA2LjU2NzAyIDE4LjM3NjcgNi41OTc3N0MxOC41MDgzIDYuNjI4NTMgMTguNjMyMyA2LjY4NTY1IDE4Ljc0MTMgNi43NjU3QzE4Ljg1MDIgNi44NDU3NCAxOC45NDE4IDYuOTQ3MDUgMTkuMDEwNSA3LjA2MzQ4QzE5LjA3OTIgNy4xNzk5MiAxOS4xMjM1IDcuMzA5MDcgMTkuMTQwOSA3LjQ0MzEzQzE5LjE1ODIgNy41NzcxOSAxOS4xNDgyIDcuNzEzMzkgMTkuMTExNSA3Ljg0MzQ3QzE5LjA3NDcgNy45NzM1NiAxOS4wMTIgOC4wOTQ4NSAxOC45MjcgOC4yWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWlzc3VlXCIgZGF0YS1uYW1lPVwiaXNzdWVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMgMTAuNTg2TDEzLjQxNCAxQzEzLjAzODkgMC42MjUwNTkgMTIuNTMwMyAwLjQxNDQyOSAxMiAwLjQxNDQyOUMxMS40Njk3IDAuNDE0NDI5IDEwLjk2MTEgMC42MjUwNTkgMTAuNTg2IDFMMSAxMC41ODdDMC42MjUwNTkgMTAuOTYyMSAwLjQxNDQyOSAxMS40NzA3IDAuNDE0NDI5IDEyLjAwMUMwLjQxNDQyOSAxMi41MzEzIDAuNjI1MDU5IDEzLjAzOTkgMSAxMy40MTVMMTAuNTg2IDIzQzEwLjk2MTEgMjMuMzc0OSAxMS40Njk3IDIzLjU4NTYgMTIgMjMuNTg1NkMxMi41MzAzIDIzLjU4NTYgMTMuMDM4OSAyMy4zNzQ5IDEzLjQxNCAyM0wyMyAxMy40MTVDMjMuMTg1OCAxMy4yMjkzIDIzLjMzMzIgMTMuMDA4OCAyMy40MzM4IDEyLjc2NjFDMjMuNTM0MyAxMi41MjM0IDIzLjU4NjEgMTIuMjYzMiAyMy41ODYxIDEyLjAwMDVDMjMuNTg2MSAxMS43Mzc4IDIzLjUzNDMgMTEuNDc3NyAyMy40MzM4IDExLjIzNDlDMjMuMzMzMiAxMC45OTIyIDIzLjE4NTggMTAuNzcxNyAyMyAxMC41ODZaTTExLjA2OCA2LjQxN0MxMS4wNjggNi4xNTE3OCAxMS4xNzM0IDUuODk3NDMgMTEuMzYwOSA1LjcwOTg5QzExLjU0ODQgNS41MjIzNiAxMS44MDI4IDUuNDE3IDEyLjA2OCA1LjQxN0MxMi4zMzMyIDUuNDE3IDEyLjU4NzYgNS41MjIzNiAxMi43NzUxIDUuNzA5ODlDMTIuOTYyNiA1Ljg5NzQzIDEzLjA2OCA2LjE1MTc4IDEzLjA2OCA2LjQxN1YxMi40MTdDMTMuMDY4IDEyLjY4MjIgMTIuOTYyNiAxMi45MzY2IDEyLjc3NTEgMTMuMTI0MUMxMi41ODc2IDEzLjMxMTYgMTIuMzMzMiAxMy40MTcgMTIuMDY4IDEzLjQxN0MxMS44MDI4IDEzLjQxNyAxMS41NDg0IDEzLjMxMTYgMTEuMzYwOSAxMy4xMjQxQzExLjE3MzQgMTIuOTM2NiAxMS4wNjggMTIuNjgyMiAxMS4wNjggMTIuNDE3VjYuNDE3Wk0xMi4xMTkgMTcuOTI3SDEyLjA5MUMxMS42OTY3IDE3LjkyNTUgMTEuMzE4MyAxNy43NzE3IDExLjAzNDYgMTcuNDk3OEMxMC43NTEgMTcuMjIzOSAxMC41ODQyIDE2Ljg1MSAxMC41NjkgMTYuNDU3QzEwLjU2MTcgMTYuMjYxIDEwLjU5MzUgMTYuMDY1NSAxMC42NjI2IDE1Ljg4MTlDMTAuNzMxOCAxNS42OTgzIDEwLjgzNjggMTUuNTMwNCAxMC45NzE3IDE1LjM4NzlDMTEuMTA2NSAxNS4yNDU0IDExLjI2ODQgMTUuMTMxMyAxMS40NDc5IDE1LjA1MjFDMTEuNjI3NCAxNC45NzMgMTEuODIwOSAxNC45MzA1IDEyLjAxNyAxNC45MjdIMTIuMDQ1QzEyLjQzOTQgMTQuOTI4IDEyLjgxODIgMTUuMDgxNiAxMy4xMDE5IDE1LjM1NTZDMTMuMzg1NiAxNS42Mjk3IDEzLjU1MjMgMTYuMDAyOCAxMy41NjcgMTYuMzk3QzEzLjU3NDMgMTYuNTkzIDEzLjU0MjUgMTYuNzg4NSAxMy40NzM0IDE2Ljk3MjFDMTMuNDA0MiAxNy4xNTU3IDEzLjI5OTIgMTcuMzIzNiAxMy4xNjQzIDE3LjQ2NjFDMTMuMDI5NSAxNy42MDg2IDEyLjg2NzYgMTcuNzIyNyAxMi42ODgxIDE3LjgwMTlDMTIuNTA4NiAxNy44ODEgMTIuMzE1MSAxNy45MjM1IDEyLjExOSAxNy45MjdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbGVhZGVyYm9hcmRcIiBkYXRhLW5hbWU9XCJsZWFkZXJib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk01LjUgOS41SDEuNUMxLjEwMjE4IDkuNSAwLjcyMDY0NCA5LjY1ODA0IDAuNDM5MzQgOS45MzkzNEMwLjE1ODAzNSAxMC4yMjA2IDAgMTAuNjAyMiAwIDExTDAgMjBDMCAyMC4zOTc4IDAuMTU4MDM1IDIwLjc3OTQgMC40MzkzNCAyMS4wNjA3QzAuNzIwNjQ0IDIxLjM0MiAxLjEwMjE4IDIxLjUgMS41IDIxLjVINS41QzUuNjMyNjEgMjEuNSA1Ljc1OTc5IDIxLjQ0NzMgNS44NTM1NSAyMS4zNTM2QzUuOTQ3MzIgMjEuMjU5OCA2IDIxLjEzMjYgNiAyMVYxMEM2IDkuODY3MzkgNS45NDczMiA5Ljc0MDIxIDUuODUzNTUgOS42NDY0NUM1Ljc1OTc5IDkuNTUyNjggNS42MzI2MSA5LjUgNS41IDkuNVpcIi8+PHBhdGggZD1cIk0yMi41IDEzLjVIMTguNUMxOC4zNjc0IDEzLjUgMTguMjQwMiAxMy41NTI3IDE4LjE0NjQgMTMuNjQ2NEMxOC4wNTI3IDEzLjc0MDIgMTggMTMuODY3NCAxOCAxNFYyMUMxOCAyMS4xMzI2IDE4LjA1MjcgMjEuMjU5OCAxOC4xNDY0IDIxLjM1MzZDMTguMjQwMiAyMS40NDczIDE4LjM2NzQgMjEuNSAxOC41IDIxLjVIMjIuNUMyMi44OTc4IDIxLjUgMjMuMjc5NCAyMS4zNDIgMjMuNTYwNyAyMS4wNjA3QzIzLjg0MiAyMC43Nzk0IDI0IDIwLjM5NzggMjQgMjBWMTVDMjQgMTQuNjAyMiAyMy44NDIgMTQuMjIwNiAyMy41NjA3IDEzLjkzOTNDMjMuMjc5NCAxMy42NTggMjIuODk3OCAxMy41IDIyLjUgMTMuNVpcIi8+PHBhdGggZD1cIk0xNSAyLjVIOUM4LjYwMjE4IDIuNSA4LjIyMDY0IDIuNjU4MDQgNy45MzkzNCAyLjkzOTM0QzcuNjU4MDQgMy4yMjA2NCA3LjUgMy42MDIxOCA3LjUgNFYyMUM3LjUgMjEuMTMyNiA3LjU1MjY4IDIxLjI1OTggNy42NDY0NSAyMS4zNTM2QzcuNzQwMjEgMjEuNDQ3MyA3Ljg2NzM5IDIxLjUgOCAyMS41SDE2QzE2LjEzMjYgMjEuNSAxNi4yNTk4IDIxLjQ0NzMgMTYuMzUzNiAyMS4zNTM2QzE2LjQ0NzMgMjEuMjU5OCAxNi41IDIxLjEzMjYgMTYuNSAyMVY0QzE2LjUgMy42MDIxOCAxNi4zNDIgMy4yMjA2NCAxNi4wNjA3IDIuOTM5MzRDMTUuNzc5NCAyLjY1ODA0IDE1LjM5NzggMi41IDE1IDIuNVpNMTMgMTAuNzVIMTFDMTAuODAxMSAxMC43NSAxMC42MTAzIDEwLjY3MSAxMC40Njk3IDEwLjUzMDNDMTAuMzI5IDEwLjM4OTcgMTAuMjUgMTAuMTk4OSAxMC4yNSAxMEMxMC4yNSA5LjgwMTA5IDEwLjMyOSA5LjYxMDMyIDEwLjQ2OTcgOS40Njk2N0MxMC42MTAzIDkuMzI5MDIgMTAuODAxMSA5LjI1IDExIDkuMjVDMTEuMDY2MyA5LjI1IDExLjEyOTkgOS4yMjM2NiAxMS4xNzY4IDkuMTc2NzhDMTEuMjIzNyA5LjEyOTg5IDExLjI1IDkuMDY2MyAxMS4yNSA5VjdDMTEuMjUgNi45MzM3IDExLjIyMzcgNi44NzAxMSAxMS4xNzY4IDYuODIzMjJDMTEuMTI5OSA2Ljc3NjM0IDExLjA2NjMgNi43NSAxMSA2Ljc1QzEwLjgwMTEgNi43NSAxMC42MTAzIDYuNjcwOTggMTAuNDY5NyA2LjUzMDMzQzEwLjMyOSA2LjM4OTY4IDEwLjI1IDYuMTk4OTEgMTAuMjUgNkMxMC4yNSA1LjgwMTA5IDEwLjMyOSA1LjYxMDMyIDEwLjQ2OTcgNS40Njk2N0MxMC42MTAzIDUuMzI5MDIgMTAuODAxMSA1LjI1IDExIDUuMjVIMTEuNUMxMS44MzE0IDUuMjUwNTMgMTIuMTQ5IDUuMzgyMzkgMTIuMzgzMyA1LjYxNjdDMTIuNjE3NiA1Ljg1MTAxIDEyLjc0OTUgNi4xNjg2NCAxMi43NSA2LjVWOUMxMi43NSA5LjA2NjMgMTIuNzc2MyA5LjEyOTg5IDEyLjgyMzIgOS4xNzY3OEMxMi44NzAxIDkuMjIzNjYgMTIuOTMzNyA5LjI1IDEzIDkuMjVDMTMuMTk4OSA5LjI1IDEzLjM4OTcgOS4zMjkwMiAxMy41MzAzIDkuNDY5NjdDMTMuNjcxIDkuNjEwMzIgMTMuNzUgOS44MDEwOSAxMy43NSAxMEMxMy43NSAxMC4xOTg5IDEzLjY3MSAxMC4zODk3IDEzLjUzMDMgMTAuNTMwM0MxMy4zODk3IDEwLjY3MSAxMy4xOTg5IDEwLjc1IDEzIDEwLjc1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA4OC40MiA1Mi4yOFwiIHdpZHRoPVwiODhcIiBoZWlnaHQ9XCI1MlwiPjx0aXRsZT5mbGVldGlvLWxvZ28tbWFyay1vbmx5PC90aXRsZT48Zz48Zz48cGF0aCBkPVwiTTc2LjQ0LDE2LjE1QTQuNDksNC40OSwwLDAsMCw3MiwxOS44OUw2NC4zLDBIMTcuNzZMMTAsMTkuODlhNC40OSw0LjQ5LDAsMSwwLTQuNDIsNS4yNlY0OGwxMC42Ny03Ljc0aC0uMjNhNiw2LDAsMSwxLDUuNjItMy45MmwuMTEtLjA4TDU0LDQ4LjU3bDIyLjQ2LTEzVjI1LjE1YTQuNSw0LjUsMCwwLDAsMC05Wm0tMzMsNC41SDE0TDIwLjUsNEg2MS41Nkw2OCwyMC42NUg2NC40NWMwLS4wNiwwLS4xMiwwLS4xOGExMC41LDEwLjUsMCwxLDAtMjEsMEM0My40NiwyMC41Myw0My40NywyMC41OSw0My40NywyMC42NVptMy41LDBjMC0uMDYsMC0uMTIsMC0uMThhNyw3LDAsMCwxLDE0LDBjMCwuMDYsMCwuMTIsMCwuMThaTTY2LDQwLjMyYTYsNiwwLDEsMSw2LTZBNiw2LDAsMCwxLDY2LDQwLjMyWlwiIGZpbGw9XCIjMjQyYjJlXCIvPjxwb2x5Z29uIHBvaW50cz1cIjg4LjQyIDI4LjM0IDg0LjY4IDM3LjU2IDgzLjE5IDM1LjA3IDUzLjk2IDUyLjI4IDIxLjczIDM5LjUxIDAgNTIuMjggMjEuNzMgMzIuMzcgNTMuOTYgNDUuMTIgNzkuOTcgMjkuNzEgNzguNTIgMjcuMjcgODguNDIgMjguMzRcIiBmaWxsPVwiIzE4Y2M2Y1wiLz48L2c+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbWFwXCIgZGF0YS1uYW1lPVwibWFwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuNzk5OTcgMTguMDI1TDAuNDY2OTY2IDIyLjAyNUMwLjM5MTc1OCAyMi4yNTAzIDAuMzcxMTE3IDIyLjQ5MDIgMC40MDY3NDIgMjIuNzI1QzAuNDQyMzY4IDIyLjk1OTggMC41MzMyNDEgMjMuMTgyOCAwLjY3MTg4NSAyMy4zNzU2QzAuODEwNTI4IDIzLjU2ODUgMC45OTI5NzkgMjMuNzI1NiAxLjIwNDIyIDIzLjgzNDJDMS40MTU0NyAyMy45NDI3IDEuNjQ5NDcgMjMuOTk5NiAxLjg4Njk3IDI0SDIyLjExM0MyMi4zNTA2IDIzLjk5OTkgMjIuNTg0OSAyMy45NDMzIDIyLjc5NjQgMjMuODM0OUMyMy4wMDc5IDIzLjcyNjQgMjMuMTkwNiAyMy41NjkzIDIzLjMyOTUgMjMuMzc2NUMyMy40NjgzIDIzLjE4MzYgMjMuNTU5NCAyMi45NjA1IDIzLjU5NTEgMjIuNzI1NUMyMy42MzA4IDIyLjQ5MDUgMjMuNjEwMiAyMi4yNTA0IDIzLjUzNSAyMi4wMjVMMjIuMjAyIDE4LjAyNUMyMi4xMDI0IDE3LjcyNjYgMjEuOTExNSAxNy40NjcxIDIxLjY1NjMgMTcuMjgzMkMyMS40MDExIDE3LjA5OTIgMjEuMDk0NSAxNy4wMDAyIDIwLjc4IDE3SDE1LjIxMUMxNS4xNjg0IDE3LjAwMDEgMTUuMTI2NSAxNy4wMTA5IDE1LjA4OTMgMTcuMDMxNkMxNS4wNTIgMTcuMDUyMiAxNS4wMjA2IDE3LjA4MTkgMTQuOTk4IDE3LjExOEMxNC4yMTIgMTguMzg4IDEzLjU1NCAxOS4zOCAxMy4yNDQgMTkuODRDMTMuMTA2NyAyMC4wNDM4IDEyLjkyMTQgMjAuMjEwNyAxMi43MDQ1IDIwLjMyNjFDMTIuNDg3NiAyMC40NDE1IDEyLjI0NTcgMjAuNTAxOSAxMiAyMC41MDE5QzExLjc1NDMgMjAuNTAxOSAxMS41MTIzIDIwLjQ0MTUgMTEuMjk1NCAyMC4zMjYxQzExLjA3ODUgMjAuMjEwNyAxMC44OTMzIDIwLjA0MzggMTAuNzU2IDE5Ljg0QzEwLjQ0NiAxOS4zOCA5Ljc4Nzk3IDE4LjM4OCA5LjAwMTk3IDE3LjExOEM4Ljk3OTI1IDE3LjA4MiA4Ljk0NzgzIDE3LjA1MjMgOC45MTA2IDE3LjAzMTdDOC44NzMzNiAxNy4wMTExIDguODMxNTMgMTcuMDAwMiA4Ljc4ODk3IDE3SDMuMjIwOTdDMi45MDY1NyAxNy4wMDA0IDIuNjAwMjQgMTcuMDk5NSAyLjM0NTI2IDE3LjI4MzVDMi4wOTAyNyAxNy40Njc0IDEuODk5NTMgMTcuNzI2OCAxLjc5OTk3IDE4LjAyNVYxOC4wMjVaXCIvPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMi4xMTg0IDE4Ljc3MDFDMTIuMDgyIDE4Ljc4OTYgMTIuMDQxMyAxOC43OTk5IDEyIDE4LjhDMTEuOTU4OSAxOC44IDExLjkxODQgMTguNzkwMiAxMS44ODIgMTguNzcxMkMxMS44NDU2IDE4Ljc1MjIgMTEuODE0NCAxOC43MjQ3IDExLjc5MSAxOC42OTFDMTAuNjk3IDE3LjAzMSA1LjY3Mzk1IDkuMjQ4OTcgNS42NzM5NSA2LjE5OTk3QzUuNjgxOTIgNS4zNzc0MiA1Ljg1MTkgNC41NjQ0OSA2LjE3NDE5IDMuODA3NjZDNi40OTY0NyAzLjA1MDgyIDYuOTY0NzMgMi4zNjQ5MSA3LjU1MjIyIDEuNzg5MTNDOC4xMzk3IDEuMjEzMzUgOC44MzQ4OSAwLjc1ODk3NyA5LjU5ODA1IDAuNDUxOTg0QzEwLjM2MTIgMC4xNDQ5OTIgMTEuMTc3NCAtMC4wMDg2MDQyOSAxMiAtMi41NzExMWUtMDVDMTIuODIyNSAtMC4wMDg0NzI0NyAxMy42Mzg2IDAuMTQ1MjE0IDE0LjQwMTcgMC40NTIyNTNDMTUuMTY0OCAwLjc1OTI5MyAxNS44NTk5IDEuMjEzNjcgMTYuNDQ3NCAxLjc4OTQzQzE3LjAzNDkgMi4zNjUxOCAxNy41MDMxIDMuMDUxMDQgMTcuODI1NCAzLjgwNzgyQzE4LjE0NzggNC41NjQ1OSAxOC4zMTc5IDUuMzc3NDUgMTguMzI2IDYuMTk5OTdDMTguMzI2IDkuMjQ1OTcgMTMuMyAxNy4wMjkgMTIuMjA5IDE4LjY4OEMxMi4xODYgMTguNzIyNCAxMi4xNTQ5IDE4Ljc1MDYgMTIuMTE4NCAxOC43NzAxWk0xMiA4Ljk5OTk3QzEzLjY1NjkgOC45OTk5NyAxNSA3LjY1NjgyIDE1IDUuOTk5OTdDMTUgNC4zNDMxMiAxMy42NTY5IDIuOTk5OTcgMTIgMi45OTk5N0MxMC4zNDMxIDIuOTk5OTcgOSA0LjM0MzEyIDkgNS45OTk5N0M5IDcuNjU2ODIgMTAuMzQzMSA4Ljk5OTk3IDEyIDguOTk5OTdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbmF2LW1lbnVcIiBkYXRhLW5hbWU9XCJuYXYtbWVudVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMi45NTY1IDNIMS4wNDM0OEMwLjQ2NzE4MSAzIDAgMy40NDc3MiAwIDRWNUMwIDUuNTUyMjggMC40NjcxODEgNiAxLjA0MzQ4IDZIMjIuOTU2NUMyMy41MzI4IDYgMjQgNS41NTIyOCAyNCA1VjRDMjQgMy40NDc3MiAyMy41MzI4IDMgMjIuOTU2NSAzWlwiLz48cGF0aCBkPVwiTTIyLjk1NjUgMTAuNUgxLjA0MzQ4QzAuNDY3MTgxIDEwLjUgMCAxMC45NDc3IDAgMTEuNVYxMi41QzAgMTMuMDUyMyAwLjQ2NzE4MSAxMy41IDEuMDQzNDggMTMuNUgyMi45NTY1QzIzLjUzMjggMTMuNSAyNCAxMy4wNTIzIDI0IDEyLjVWMTEuNUMyNCAxMC45NDc3IDIzLjUzMjggMTAuNSAyMi45NTY1IDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjIuOTU2NSAxOEgxLjA0MzQ4QzAuNDY3MTgxIDE4IDAgMTguNDQ3NyAwIDE5VjIwQzAgMjAuNTUyMyAwLjQ2NzE4MSAyMSAxLjA0MzQ4IDIxSDIyLjk1NjVDMjMuNTMyOCAyMSAyNCAyMC41NTIzIDI0IDIwVjE5QzI0IDE4LjQ0NzcgMjMuNTMyOCAxOCAyMi45NTY1IDE4WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBhcnRcIiBkYXRhLW5hbWU9XCJwYXJ0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE1Ljk3MyA4LjI3MUMxNi4wMTY2IDguMjUxMTEgMTYuMDUzNiA4LjIxOTA5IDE2LjA3OTYgOC4xNzg3NUMxNi4xMDU1IDguMTM4NDEgMTYuMTE5MyA4LjA5MTQ2IDE2LjExOTMgOC4wNDM1QzE2LjExOTMgNy45OTU1NCAxNi4xMDU1IDcuOTQ4NTggMTYuMDc5NiA3LjkwODI1QzE2LjA1MzYgNy44Njc5MSAxNi4wMTY2IDcuODM1ODkgMTUuOTczIDcuODE2TDYuMjE1OTYgMy4zNjhDNi4xNTIwNSAzLjMzOTYxIDYuMDgyOSAzLjMyNDk0IDYuMDEyOTYgMy4zMjQ5NEM1Ljk0MzAzIDMuMzI0OTQgNS44NzM4NyAzLjMzOTYxIDUuODA5OTYgMy4zNjhMMS45OTI5NiA1LjAyNEMxLjk0Nzg3IDUuMDQzMjEgMS45MDk0MSA1LjA3NTI2IDEuODgyMzggNS4xMTYxNUMxLjg1NTM1IDUuMTU3MDQgMS44NDA5NCA1LjIwNDk4IDEuODQwOTQgNS4yNTRDMS44NDA5NCA1LjMwMzAyIDEuODU1MzUgNS4zNTA5NiAxLjg4MjM4IDUuMzkxODVDMS45MDk0MSA1LjQzMjc0IDEuOTQ3ODcgNS40NjQ3OSAxLjk5Mjk2IDUuNDg0TDEyLjI4MyA5Ljc3MkMxMi4zNDY1IDkuNzk4NTkgMTIuNDE0OCA5LjgxMTc4IDEyLjQ4MzYgOS44MTA3NUMxMi41NTI0IDkuODA5NzEgMTIuNjIwMyA5Ljc5NDQ4IDEyLjY4MyA5Ljc2NkwxNS45NzMgOC4yNzFaXCIvPjxwYXRoIGQ9XCJNMjIuMDYyIDUuNUMyMi4xMDU5IDUuNDgwMjUgMjIuMTQzMiA1LjQ0ODIyIDIyLjE2OTQgNS40MDc3N0MyMi4xOTU2IDUuMzY3MzIgMjIuMjA5NSA1LjMyMDE3IDIyLjIwOTUgNS4yNzJDMjIuMjA5NSA1LjIyMzgzIDIyLjE5NTYgNS4xNzY2OSAyMi4xNjk0IDUuMTM2MjRDMjIuMTQzMiA1LjA5NTc5IDIyLjEwNTkgNS4wNjM3NiAyMi4wNjIgNS4wNDRMMTIuNCAwLjg0NzAwNEMxMi4yNzM5IDAuNzkxOTQxIDEyLjEzNzcgMC43NjM1MTkgMTIgMC43NjM1MTlDMTEuODYyNCAwLjc2MzUxOSAxMS43MjYyIDAuNzkxOTQxIDExLjYgMC44NDcwMDRMOC4zODAwMiAyLjI0N0M4LjMzNTggMi4yNjY2MyA4LjI5ODIzIDIuMjk4NjcgOC4yNzE4NSAyLjMzOTIzQzguMjQ1NDggMi4zNzk3OSA4LjIzMTQ1IDIuNDI3MTMgOC4yMzE0NSAyLjQ3NTVDOC4yMzE0NSAyLjUyMzg4IDguMjQ1NDggMi41NzEyMiA4LjI3MTg1IDIuNjExNzhDOC4yOTgyMyAyLjY1MjM0IDguMzM1OCAyLjY4NDM4IDguMzgwMDIgMi43MDRMMTguMDggNy4xMjZDMTguMTQ1IDcuMTU1NTcgMTguMjE1NiA3LjE3MDg3IDE4LjI4NyA3LjE3MDg3QzE4LjM1ODQgNy4xNzA4NyAxOC40MjkgNy4xNTU1NyAxOC40OTQgNy4xMjZMMjIuMDYyIDUuNVpcIi8+PHBhdGggZD1cIk0wLjg0NiA2LjYzMDAxQzAuODA3OTk4IDYuNjE0MiAwLjc2NjY4MyA2LjYwODAyIDAuNzI1NzIgNi42MTIwMkMwLjY4NDc1OCA2LjYxNjAyIDAuNjQ1NDE2IDYuNjMwMDcgMC42MTExODYgNi42NTI5MkMwLjU3Njk1NyA2LjY3NTc3IDAuNTQ4ODk5IDYuNzA2NzIgMC41Mjk1MDMgNi43NDMwMkMwLjUxMDEwNyA2Ljc3OTMyIDAuNDk5OTczIDYuODE5ODUgMC41IDYuODYxMDFWMTguMDA3QzAuNDk5OTg0IDE4LjIwNDQgMC41NTgzNzIgMTguMzk3MyAwLjY2NzgxMSAxOC41NjE2QzAuNzc3MjUgMTguNzI1OCAwLjkzMjg0NiAxOC44NTQgMS4xMTUgMTguOTNMMTEuNCAyMy4yMTdDMTEuNDM4IDIzLjIzMjggMTEuNDc5MyAyMy4yMzkgMTEuNTIwMyAyMy4yMzVDMTEuNTYxMiAyMy4yMzEgMTEuNjAwNiAyMy4yMTY5IDExLjYzNDggMjMuMTk0MUMxMS42NjkgMjMuMTcxMiAxMS42OTcxIDIzLjE0MDMgMTEuNzE2NSAyMy4xMDRDMTEuNzM1OSAyMy4wNjc3IDExLjc0NiAyMy4wMjcyIDExLjc0NiAyMi45ODZWMTEuMzRDMTEuNzQ1OSAxMS4yOTA2IDExLjczMTIgMTEuMjQyNCAxMS43MDM4IDExLjIwMTNDMTEuNjc2NSAxMS4xNjAyIDExLjYzNzUgMTEuMTI4MSAxMS41OTIgMTEuMTA5TDAuODQ2IDYuNjMwMDFaXCIvPjxwYXRoIGQ9XCJNMTMuMjUgMjIuOTQ0QzEzLjI1MDIgMjIuOTg1NyAxMy4yNjA4IDIzLjAyNjcgMTMuMjgwOSAyMy4wNjMzQzEzLjMwMDkgMjMuMDk5OSAxMy4zMjk4IDIzLjEzMDkgMTMuMzY0OCAyMy4xNTM1QzEzLjM5OTkgMjMuMTc2MSAxMy40NCAyMy4xODk3IDEzLjQ4MTYgMjMuMTkyOUMxMy41MjMyIDIzLjE5NjEgMTMuNTY0OSAyMy4xODkgMTMuNjAzIDIzLjE3MkwyMi45MTQgMTguOTRDMjMuMDg4NyAxOC44NjA2IDIzLjIzNjggMTguNzMyNSAyMy4zNDA4IDE4LjU3MTFDMjMuNDQ0NyAxOC40MDk4IDIzLjQ5OTkgMTguMjIxOSAyMy41IDE4LjAzVjYuODg2MDFDMjMuNSA2Ljg0NDIgMjMuNDg5NiA2LjgwMzA1IDIzLjQ2OTYgNi43NjYzM0MyMy40NDk2IDYuNzI5NjEgMjMuNDIwOCA2LjY5ODQ4IDIzLjM4NTYgNi42NzU4QzIzLjM1MDUgNi42NTMxMiAyMy4zMTAzIDYuNjM5NiAyMy4yNjg2IDYuNjM2NUMyMy4yMjY5IDYuNjMzMzkgMjMuMTg1MSA2LjY0MDc4IDIzLjE0NyA2LjY1ODAxTDEzLjQgMTEuMDlDMTMuMzU2MiAxMS4xMDk2IDEzLjMxODkgMTEuMTQxNCAxMy4yOTI4IDExLjE4MTdDMTMuMjY2NyAxMS4yMjIgMTMuMjUyOSAxMS4yNjkgMTMuMjUzIDExLjMxN0wxMy4yNSAyMi45NDRaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGxhY2VcIiBkYXRhLW5hbWU9XCJwbGFjZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk04IDBDNS44NzkgMC4wMDIzODIxMSAzLjg0NTU1IDAuODQ2MDAyIDIuMzQ1NzggMi4zNDU3OEMwLjg0NjAwMiAzLjg0NTU1IDAuMDAyMzgyMTEgNS44NzkgMCA4QzAgMTEuMzQzIDQuNTA5IDE4LjkxMiA2LjU3NiAyMi4yQzYuNjMzMzEgMjIuMjkxNyA2LjcxODgxIDIyLjM2MjQgNi44MTk2OCAyMi40MDE0QzYuOTIwNTUgMjIuNDQwNCA3LjAzMTM1IDIyLjQ0NTYgNy4xMzU0NiAyMi40MTYzQzcuMjM5NTYgMjIuMzg3MSA3LjMzMTM3IDIyLjMyNDggNy4zOTcwOSAyMi4yMzg5QzcuNDYyODIgMjIuMTUzIDcuNDk4OTMgMjIuMDQ4MSA3LjUgMjEuOTRWMTZDNy40OTk5MiAxNS42Mjg2IDcuNjAzMjUgMTUuMjY0NSA3Ljc5ODQyIDE0Ljk0ODZDNy45OTM1OCAxNC42MzI2IDguMjcyODcgMTQuMzc3MiA4LjYwNSAxNC4yMTFMMTEuNjA1IDEyLjcxMUMxMS44ODMgMTIuNTcyNCAxMi4xODk0IDEyLjUwMDMgMTIuNSAxMi41MDAzQzEyLjgxMDYgMTIuNTAwMyAxMy4xMTcgMTIuNTcyNCAxMy4zOTUgMTIuNzExTDEzLjk0IDEyLjk4NEMxNC4wMDA2IDEzLjAxNDQgMTQuMDY2OCAxMy4wMzIyIDE0LjEzNDUgMTMuMDM2MkMxNC4yMDIyIDEzLjA0MDIgMTQuMjcgMTMuMDMwNCAxNC4zMzM4IDEzLjAwNzRDMTQuMzk3NiAxMi45ODQ0IDE0LjQ1NjEgMTIuOTQ4NiAxNC41MDU2IDEyLjkwMjNDMTQuNTU1MSAxMi44NTYgMTQuNTk0NyAxMi44MDAxIDE0LjYyMiAxMi43MzhDMTUuMzY3OSAxMS4yNTY1IDE1LjgzNSA5LjY1MDQ1IDE2IDhDMTUuOTk3NiA1Ljg3OSAxNS4xNTQgMy44NDU1NSAxMy42NTQyIDIuMzQ1NzhDMTIuMTU0NCAwLjg0NjAwMiAxMC4xMjEgMC4wMDIzODIxMSA4IDBWMFpNOCAxMUM3LjQwNjY2IDExIDYuODI2NjQgMTAuODI0MSA2LjMzMzI5IDEwLjQ5NDRDNS44Mzk5NCAxMC4xNjQ4IDUuNDU1NDIgOS42OTYyMyA1LjIyODM2IDkuMTQ4MDVDNS4wMDEzIDguNTk5ODcgNC45NDE4OSA3Ljk5NjY3IDUuMDU3NjQgNy40MTQ3M0M1LjE3MzQgNi44MzI3OSA1LjQ1OTEyIDYuMjk4MjQgNS44Nzg2OCA1Ljg3ODY4QzYuMjk4MjQgNS40NTkxMiA2LjgzMjc5IDUuMTczNCA3LjQxNDczIDUuMDU3NjRDNy45OTY2NyA0Ljk0MTg5IDguNTk5ODcgNS4wMDEzIDkuMTQ4MDUgNS4yMjgzNkM5LjY5NjIzIDUuNDU1NDIgMTAuMTY0OCA1LjgzOTk0IDEwLjQ5NDQgNi4zMzMyOUMxMC44MjQxIDYuODI2NjQgMTEgNy40MDY2NiAxMSA4QzExIDguNzk1NjUgMTAuNjgzOSA5LjU1ODcxIDEwLjEyMTMgMTAuMTIxM0M5LjU1ODcxIDEwLjY4MzkgOC43OTU2NSAxMSA4IDExWlwiLz48cGF0aCBkPVwiTTE1LjcyNCAxNS41NTNMMTIuNzI0IDE0LjA1M0MxMi42NTQ1IDE0LjAxODIgMTIuNTc3OCAxNCAxMi41IDE0QzEyLjQyMjIgMTQgMTIuMzQ1NSAxNC4wMTgyIDEyLjI3NiAxNC4wNTNMOS4yNzYgMTUuNTUzQzkuMTkzMDUgMTUuNTk0NiA5LjEyMzMxIDE1LjY1ODQgOS4wNzQ1NiAxNS43MzczQzkuMDI1ODIgMTUuODE2MyA5IDE1LjkwNzIgOSAxNlYyMy41QzkgMjMuNjMyNiA5LjA1MjY4IDIzLjc1OTggOS4xNDY0NSAyMy44NTM2QzkuMjQwMjEgMjMuOTQ3MyA5LjM2NzM5IDI0IDkuNSAyNEgxMUMxMS4xMzI2IDI0IDExLjI1OTggMjMuOTQ3MyAxMS4zNTM2IDIzLjg1MzZDMTEuNDQ3MyAyMy43NTk4IDExLjUgMjMuNjMyNiAxMS41IDIzLjVWMjIuNUMxMS41IDIyLjM2NzQgMTEuNTUyNyAyMi4yNDAyIDExLjY0NjQgMjIuMTQ2NEMxMS43NDAyIDIyLjA1MjcgMTEuODY3NCAyMiAxMiAyMkgxM0MxMy4xMzI2IDIyIDEzLjI1OTggMjIuMDUyNyAxMy4zNTM2IDIyLjE0NjRDMTMuNDQ3MyAyMi4yNDAyIDEzLjUgMjIuMzY3NCAxMy41IDIyLjVWMjMuNUMxMy41IDIzLjYzMjYgMTMuNTUyNyAyMy43NTk4IDEzLjY0NjQgMjMuODUzNkMxMy43NDAyIDIzLjk0NzMgMTMuODY3NCAyNCAxNCAyNEgxNS41QzE1LjYzMjYgMjQgMTUuNzU5OCAyMy45NDczIDE1Ljg1MzYgMjMuODUzNkMxNS45NDczIDIzLjc1OTggMTYgMjMuNjMyNiAxNiAyMy41VjE2QzE2IDE1LjkwNzIgMTUuOTc0MiAxNS44MTYzIDE1LjkyNTQgMTUuNzM3M0MxNS44NzY3IDE1LjY1ODQgMTUuODA2OSAxNS41OTQ2IDE1LjcyNCAxNS41NTNaTTE0IDIwSDExQzEwLjg2NzQgMjAgMTAuNzQwMiAxOS45NDczIDEwLjY0NjQgMTkuODUzNkMxMC41NTI3IDE5Ljc1OTggMTAuNSAxOS42MzI2IDEwLjUgMTkuNUMxMC41IDE5LjM2NzQgMTAuNTUyNyAxOS4yNDAyIDEwLjY0NjQgMTkuMTQ2NEMxMC43NDAyIDE5LjA1MjcgMTAuODY3NCAxOSAxMSAxOUgxNEMxNC4xMzI2IDE5IDE0LjI1OTggMTkuMDUyNyAxNC4zNTM2IDE5LjE0NjRDMTQuNDQ3MyAxOS4yNDAyIDE0LjUgMTkuMzY3NCAxNC41IDE5LjVDMTQuNSAxOS42MzI2IDE0LjQ0NzMgMTkuNzU5OCAxNC4zNTM2IDE5Ljg1MzZDMTQuMjU5OCAxOS45NDczIDE0LjEzMjYgMjAgMTQgMjBaTTE0IDE3LjVIMTFDMTAuODY3NCAxNy41IDEwLjc0MDIgMTcuNDQ3MyAxMC42NDY0IDE3LjM1MzZDMTAuNTUyNyAxNy4yNTk4IDEwLjUgMTcuMTMyNiAxMC41IDE3QzEwLjUgMTYuODY3NCAxMC41NTI3IDE2Ljc0MDIgMTAuNjQ2NCAxNi42NDY0QzEwLjc0MDIgMTYuNTUyNyAxMC44Njc0IDE2LjUgMTEgMTYuNUgxNEMxNC4xMzI2IDE2LjUgMTQuMjU5OCAxNi41NTI3IDE0LjM1MzYgMTYuNjQ2NEMxNC40NDczIDE2Ljc0MDIgMTQuNSAxNi44Njc0IDE0LjUgMTdDMTQuNSAxNy4xMzI2IDE0LjQ0NzMgMTcuMjU5OCAxNC4zNTM2IDE3LjM1MzZDMTQuMjU5OCAxNy40NDczIDE0LjEzMjYgMTcuNSAxNCAxNy41WlwiLz48cGF0aCBkPVwiTTIzLjY5MiAxMi4wMzhMMTcuNjkyIDkuNTM4QzE3LjYxNiA5LjUwNjM5IDE3LjUzMzQgOS40OTQwMyAxNy40NTE0IDkuNTAyMDNDMTcuMzY5NSA5LjUxMDAyIDE3LjI5MDggOS41MzgxMiAxNy4yMjI0IDkuNTgzODJDMTcuMTUzOSA5LjYyOTUzIDE3LjA5NzggOS42OTE0MyAxNy4wNTkgOS43NjQwM0MxNy4wMjAyIDkuODM2NjMgMTYuOTk5OSA5LjkxNzY4IDE3IDEwVjIzLjVDMTcgMjMuNjMyNiAxNy4wNTI3IDIzLjc1OTggMTcuMTQ2NCAyMy44NTM2QzE3LjI0MDIgMjMuOTQ3MyAxNy4zNjc0IDI0IDE3LjUgMjRIMjMuNUMyMy42MzI2IDI0IDIzLjc1OTggMjMuOTQ3MyAyMy44NTM2IDIzLjg1MzZDMjMuOTQ3MyAyMy43NTk4IDI0IDIzLjYzMjYgMjQgMjMuNVYxMi41QzI0LjAwMDEgMTIuNDAxMiAyMy45NzA4IDEyLjMwNDUgMjMuOTE2IDEyLjIyMjNDMjMuODYxMiAxMi4xNDAxIDIzLjc4MzIgMTIuMDc1OSAyMy42OTIgMTIuMDM4Wk0yMiAyMEgxOUMxOC44Njc0IDIwIDE4Ljc0MDIgMTkuOTQ3MyAxOC42NDY0IDE5Ljg1MzZDMTguNTUyNyAxOS43NTk4IDE4LjUgMTkuNjMyNiAxOC41IDE5LjVDMTguNSAxOS4zNjc0IDE4LjU1MjcgMTkuMjQwMiAxOC42NDY0IDE5LjE0NjRDMTguNzQwMiAxOS4wNTI3IDE4Ljg2NzQgMTkgMTkgMTlIMjJDMjIuMTMyNiAxOSAyMi4yNTk4IDE5LjA1MjcgMjIuMzUzNiAxOS4xNDY0QzIyLjQ0NzMgMTkuMjQwMiAyMi41IDE5LjM2NzQgMjIuNSAxOS41QzIyLjUgMTkuNjMyNiAyMi40NDczIDE5Ljc1OTggMjIuMzUzNiAxOS44NTM2QzIyLjI1OTggMTkuOTQ3MyAyMi4xMzI2IDIwIDIyIDIwWk0yMiAxNy41SDE5QzE4Ljg2NzQgMTcuNSAxOC43NDAyIDE3LjQ0NzMgMTguNjQ2NCAxNy4zNTM2QzE4LjU1MjcgMTcuMjU5OCAxOC41IDE3LjEzMjYgMTguNSAxN0MxOC41IDE2Ljg2NzQgMTguNTUyNyAxNi43NDAyIDE4LjY0NjQgMTYuNjQ2NEMxOC43NDAyIDE2LjU1MjcgMTguODY3NCAxNi41IDE5IDE2LjVIMjJDMjIuMTMyNiAxNi41IDIyLjI1OTggMTYuNTUyNyAyMi4zNTM2IDE2LjY0NjRDMjIuNDQ3MyAxNi43NDAyIDIyLjUgMTYuODY3NCAyMi41IDE3QzIyLjUgMTcuMTMyNiAyMi40NDczIDE3LjI1OTggMjIuMzUzNiAxNy4zNTM2QzIyLjI1OTggMTcuNDQ3MyAyMi4xMzI2IDE3LjUgMjIgMTcuNVpNMjIgMTVIMTlDMTguODY3NCAxNSAxOC43NDAyIDE0Ljk0NzMgMTguNjQ2NCAxNC44NTM2QzE4LjU1MjcgMTQuNzU5OCAxOC41IDE0LjYzMjYgMTguNSAxNC41QzE4LjUgMTQuMzY3NCAxOC41NTI3IDE0LjI0MDIgMTguNjQ2NCAxNC4xNDY0QzE4Ljc0MDIgMTQuMDUyNyAxOC44Njc0IDE0IDE5IDE0SDIyQzIyLjEzMjYgMTQgMjIuMjU5OCAxNC4wNTI3IDIyLjM1MzYgMTQuMTQ2NEMyMi40NDczIDE0LjI0MDIgMjIuNSAxNC4zNjc0IDIyLjUgMTQuNUMyMi41IDE0LjYzMjYgMjIuNDQ3MyAxNC43NTk4IDIyLjM1MzYgMTQuODUzNkMyMi4yNTk4IDE0Ljk0NzMgMjIuMTMyNiAxNSAyMiAxNVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1xdWVzdGlvblwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48ZyBjbGlwLXBhdGg9XCJ1cmwoI2RlZi1zdmctcXVlc3Rpb24tMClcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTAuMTYxOCAzLjQ0NzQ3QzEwLjgxMzIgMy4xMTA0NSAxMS41NDQ2IDIuOTU4OTUgMTIuMjc2MiAzLjAwOTUzQzEzLjAwNzggMy4wNjAxMSAxMy43MTE0IDMuMzEwODMgMTQuMzEwMSAzLjczNDI5QzE0LjkwODkgNC4xNTc3NCAxNS4zNzk3IDQuNzM3NjMgMTUuNjcxMSA1LjQxMDU4QzE1Ljk2MjUgNi4wODM1MyAxNi4wNjM0IDYuODIzNjUgMTUuOTYyNiA3LjU1MDAzQzE1Ljg2MTggOC4yNzY0MiAxNS41NjMzIDguOTYxMTIgMTUuMDk5NiA5LjUyOTMxQzE0LjYzNiAxMC4wOTc1IDE0LjAyNTEgMTAuNTI3MyAxMy4zMzM3IDEwLjc3MTdDMTIuNTA0NyAxMS4wNjQ4IDExLjc4NyAxMS42MDc4IDExLjI3OTUgMTIuMzI1OUMxMC43NzIyIDEzLjA0MzggMTAuNSAxMy45MDIgMTAuNTAwMyAxNC43ODFMMTAuNSAxNS41QzEwLjUgMTYuMzI4NCAxMS4xNzE2IDE3IDEyIDE3QzEyLjgyODQgMTcgMTMuNSAxNi4zMjg0IDEzLjUgMTUuNUwxMy41MDAzIDE0Ljc3OTVDMTMuNTAwMSAxNC41MjA4IDEzLjU4MDIgMTQuMjY4NSAxMy43Mjk1IDE0LjA1NzNDMTMuODc4NyAxMy44NDYxIDE0LjA4OTggMTMuNjg2NCAxNC4zMzM3IDEzLjYwMDJDMTUuNTQzNiAxMy4xNzI0IDE2LjYxMjcgMTIuNDIwMyAxNy40MjQgMTEuNDI2QzE4LjIzNTMgMTAuNDMxNyAxOC43NTc3IDkuMjMzNDcgMTguOTM0MSA3Ljk2MjMzQzE5LjExMDUgNi42OTExOSAxOC45MzQgNS4zOTYwMyAxOC40MjQgNC4yMTg0QzE3LjkxNDEgMy4wNDA3NyAxNy4wOTAyIDIuMDI1OTggMTYuMDQyNCAxLjI4NDk2QzE0Ljk5NDcgMC41NDM5MzggMTMuNzYzNCAwLjEwNTE5MiAxMi40ODMxIDAuMDE2Njc0NUMxMS4yMDI4IC0wLjA3MTg0MjYgOS45MjI4OSAwLjE5MzI3NyA4Ljc4MzEzIDAuNzgzMDU1QzcuNjQzMzYgMS4zNzI4MyA2LjY4NzY1IDIuMjY0NTcgNi4wMjA0NiAzLjM2MDgyQzUuMzUzMjYgNC40NTcwNiA1LjAwMDI1IDUuNzE1NjEgNSA2Ljk5ODkzQzQuOTk5ODQgNy44MjczNiA1LjY3MTI5IDguNDk5MDYgNi40OTk3MSA4LjQ5OTIyQzcuMzI4MTQgOC40OTkzNyA3Ljk5OTg0IDcuODI3OTMgOCA2Ljk5OTVDOC4wMDAxNCA2LjI2NjE2IDguMjAxODcgNS41NDY5NiA4LjU4MzEzIDQuOTIwNTJDOC45NjQ0IDQuMjk0MDggOS41MTA1MyAzLjc4NDUgMTAuMTYxOCAzLjQ0NzQ3Wk0xMiAyNEMxMy4yNDI2IDI0IDE0LjI1IDIyLjk5MjYgMTQuMjUgMjEuNzVDMTQuMjUgMjAuNTA3NCAxMy4yNDI2IDE5LjUgMTIgMTkuNUMxMC43NTc0IDE5LjUgOS43NSAyMC41MDc0IDkuNzUgMjEuNzVDOS43NSAyMi45OTI2IDEwLjc1NzQgMjQgMTIgMjRaXCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlbWluZGVyXCIgZGF0YS1uYW1lPVwicmVtaW5kZXJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMy41IDMuMTgyNjJWMS41QzEzLjUgMS4xMDIxOCAxMy4zNDIgMC43MjA2NDQgMTMuMDYwNyAwLjQzOTM0QzEyLjc3OTQgMC4xNTgwMzUgMTIuMzk3OCAwIDEyIDBDMTEuNjAyMiAwIDExLjIyMDYgMC4xNTgwMzUgMTAuOTM5MyAwLjQzOTM0QzEwLjY1OCAwLjcyMDY0NCAxMC41IDEuMTAyMTggMTAuNSAxLjVWMy4xODI2MkM4LjgzMzEyIDMuNjA0NjkgNy4zNDI3NCA0LjU1NzA2IDYuMjU3OTggNS45MDNDNS4wNjU4MyA3LjM4MjE4IDQuNDQyMjYgOS4yMzkwOSA0LjUgMTEuMTM4VjE2QzQuNSAxNi4zOTc4IDQuMzQxOTYgMTYuNzc5NCA0LjA2MDY2IDE3LjA2MDdDMy43NzkzNiAxNy4zNDIgMy4zOTc4MiAxNy41IDMgMTcuNUMyLjczNDc4IDE3LjUgMi40ODA0MyAxNy42MDU0IDIuMjkyODkgMTcuNzkyOUMyLjEwNTM2IDE3Ljk4MDQgMiAxOC4yMzQ4IDIgMTguNUMyIDE4Ljc2NTIgMi4xMDUzNiAxOS4wMTk2IDIuMjkyODkgMTkuMjA3MUMyLjQ4MDQzIDE5LjM5NDYgMi43MzQ3OCAxOS41IDMgMTkuNUgyMUMyMS4yNjUyIDE5LjUgMjEuNTE5NiAxOS4zOTQ2IDIxLjcwNzEgMTkuMjA3MUMyMS44OTQ2IDE5LjAxOTYgMjIgMTguNzY1MiAyMiAxOC41QzIyIDE4LjIzNDggMjEuODk0NiAxNy45ODA0IDIxLjcwNzEgMTcuNzkyOUMyMS41MTk2IDE3LjYwNTQgMjEuMjY1MiAxNy41IDIxIDE3LjVDMjAuNjAyMiAxNy41IDIwLjIyMDYgMTcuMzQyIDE5LjkzOTMgMTcuMDYwN0MxOS42NTggMTYuNzc5NCAxOS41IDE2LjM5NzggMTkuNSAxNlYxMS4xMzhDMTkuNTU3NyA5LjIzOTA5IDE4LjkzNDIgNy4zODIxOCAxNy43NDIgNS45MDNDMTYuNjU3MyA0LjU1NzA2IDE1LjE2NjkgMy42MDQ2OSAxMy41IDMuMTgyNjJaTTE0LjIzNiAyMUg5Ljc2NDAxQzkuNzAyNjMgMjEuMDAwMSA5LjY0MzQzIDIxLjAyMjggOS41OTc2OSAyMS4wNjM3QzkuNTUxOTYgMjEuMTA0NyA5LjUyMjg4IDIxLjE2MSA5LjUxNjAxIDIxLjIyMkM5LjUwNTExIDIxLjMxNDMgOS40OTk3NyAyMS40MDcxIDkuNTAwMDEgMjEuNUM5LjUwMDAxIDIyLjE2MyA5Ljc2MzQgMjIuNzk4OSAxMC4yMzIyIDIzLjI2NzhDMTAuNzAxMSAyMy43MzY2IDExLjMzNyAyNCAxMiAyNEMxMi42NjMgMjQgMTMuMjk4OSAyMy43MzY2IDEzLjc2NzggMjMuMjY3OEMxNC4yMzY2IDIyLjc5ODkgMTQuNSAyMi4xNjMgMTQuNSAyMS41QzE0LjUwMDIgMjEuNDA3MSAxNC40OTQ5IDIxLjMxNDMgMTQuNDg0IDIxLjIyMkMxNC40Nzc2IDIxLjE2MDggMTQuNDQ4NiAyMS4xMDQyIDE0LjQwMjggMjEuMDYzMkMxNC4zNTcgMjEuMDIyMiAxNC4yOTc1IDIwLjk5OTcgMTQuMjM2IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlcG9ydFwiIGRhdGEtbmFtZT1cInJlcG9ydFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMyAxMC41QzIzLjEzMjYgMTAuNSAyMy4yNTk4IDEwLjQ0NzMgMjMuMzUzNiAxMC4zNTM2QzIzLjQ0NzMgMTAuMjU5OCAyMy41IDEwLjEzMjYgMjMuNSAxMEMyMy40OTY4IDcuMzQ4ODEgMjIuNDQyMiA0LjgwNzEyIDIwLjU2NzYgMi45MzI0NEMxOC42OTI5IDEuMDU3NzYgMTYuMTUxMiAwLjAwMzE3NTcyIDEzLjUgMEMxMy4zNjc0IDAgMTMuMjQwMiAwLjA1MjY3ODQgMTMuMTQ2NCAwLjE0NjQ0N0MxMy4wNTI3IDAuMjQwMjE1IDEzIDAuMzY3MzkyIDEzIDAuNVY5LjUyNUMxMy4wMDAzIDkuNzgzNiAxMy4xMDMgMTAuMDMxNSAxMy4yODU4IDEwLjIxNDVDMTMuNDY4NiAxMC4zOTc0IDEzLjcxNjQgMTAuNTAwNSAxMy45NzUgMTAuNTAxTDIzIDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjMuNSAxMkgxNEMxMy44NTI3IDExLjk4MTIgMTMuNzAzMiAxMi4wMTE0IDEzLjU3NDcgMTIuMDg1OUMxMy40NDYxIDEyLjE2MDUgMTMuMzQ1NyAxMi4yNzUyIDEzLjI4ODggMTIuNDEyNUMxMy4yMzIgMTIuNTQ5NyAxMy4yMjE5IDEyLjcwMTkgMTMuMjYgMTIuODQ1NUMxMy4yOTgyIDEyLjk4OSAxMy4zODI1IDEzLjExNjEgMTMuNSAxMy4yMDdMMjAuMjE4IDE5LjkyNUMyMC4zMTE4IDIwLjAxODcgMjAuNDM4OSAyMC4wNzE0IDIwLjU3MTUgMjAuMDcxNEMyMC43MDQxIDIwLjA3MTQgMjAuODMxMyAyMC4wMTg3IDIwLjkyNSAxOS45MjVDMjEuOTAzIDE4Ljk1MjEgMjIuNjc4MyAxNy43OTUgMjMuMjA2MiAxNi41MjA1QzIzLjczNCAxNS4yNDYgMjQuMDAzOCAxMy44Nzk1IDI0IDEyLjVDMjQgMTIuMzY3NCAyMy45NDc0IDEyLjI0MDIgMjMuODUzNiAxMi4xNDY0QzIzLjc1OTggMTIuMDUyNyAyMy42MzI2IDEyIDIzLjUgMTJaXCIvPjxwYXRoIGQ9XCJNMTAuNTg4IDI0QzExLjk1NDIgMjMuOTk3MSAxMy4zMDYyIDIzLjcyMyAxNC41NjU3IDIzLjE5MzZDMTUuODI1MiAyMi42NjQyIDE2Ljk2NyAyMS44OSAxNy45MjUgMjAuOTE2QzE4LjAxODggMjAuODIyMiAxOC4wNzE0IDIwLjY5NTEgMTguMDcxNCAyMC41NjI1QzE4LjA3MTQgMjAuNDI5OSAxOC4wMTg4IDIwLjMwMjggMTcuOTI1IDIwLjIwOUwxMS4yMDcgMTMuNDkxQzExLjA4ODkgMTMuMzQ5MiAxMS4wMTY3IDEzLjE3NDggMTEgMTIuOTkxVjMuNDkxQzExIDMuMzU4MzkgMTAuOTQ3MyAzLjIzMTIxIDEwLjg1MzYgMy4xMzc0NEMxMC43NTk4IDMuMDQzNjggMTAuNjMyNiAyLjk5MSAxMC41IDIuOTkxQzcuNzE0MDUgMy4wMDI2NyA1LjA0NjgzIDQuMTIwNTggMy4wODUxMSA2LjA5ODgxQzEuMTIzMzggOC4wNzcwMyAwLjAyNzg1MTUgMTAuNzUzNSAwLjAzOTUyMSAxMy41Mzk1QzAuMDUxMTkwNSAxNi4zMjU1IDEuMTY5MSAxOC45OTI3IDMuMTQ3MzMgMjAuOTU0NEM1LjEyNTU2IDIyLjkxNjEgNy44MDIwNSAyNC4wMTE3IDEwLjU4OCAyNFYyNFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZWFyY2hcIiBkYXRhLW5hbWU9XCJzZWFyY2hcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMjQuNDE0IDIxLjU5MUwxOS43NjkgMTYuOTQ2QzIxLjE4MzMgMTQuODI4OSAyMS43NTk2IDEyLjI2MTMgMjEuMzg1NyA5Ljc0Mjg1QzIxLjAxMTggNy4yMjQzNSAxOS43MTQ1IDQuOTM0OTcgMTcuNzQ2MSAzLjMyMDAyQzE1Ljc3NzggMS43MDUwNiAxMy4yNzkgMC44ODAwMDggMTAuNzM2IDEuMDA1MzRDOC4xOTMwMyAxLjEzMDY3IDUuNzg3NTYgMi4xOTc0MiAzLjk4NzUyIDMuOTk4MUMyLjE4NzQ4IDUuNzk4NzggMS4xMjE1NyA4LjIwNDYzIDAuOTk3MTQzIDEwLjc0NzdDMC44NzI3MTIgMTMuMjkwNyAxLjY5ODY1IDE1Ljc4OTEgMy4zMTQzIDE3Ljc1N0M0LjkyOTk1IDE5LjcyNDggNy4yMTk3OSAyMS4wMjEzIDkuNzM4NDEgMjEuMzk0M0MxMi4yNTcgMjEuNzY3MiAxNC44MjQ0IDIxLjE5MDEgMTYuOTQxIDE5Ljc3NUwyMS41ODYgMjQuNDE5QzIxLjk2NDIgMjQuNzg3OSAyMi40NzE2IDI0Ljk5NDQgMjMgMjQuOTk0NEMyMy41Mjg0IDI0Ljk5NDQgMjQuMDM1OCAyNC43ODc5IDI0LjQxNCAyNC40MTlDMjQuNzg4OSAyNC4wNDM5IDI0Ljk5OTYgMjMuNTM1MyAyNC45OTk2IDIzLjAwNUMyNC45OTk2IDIyLjQ3NDcgMjQuNzg4OSAyMS45NjYxIDI0LjQxNCAyMS41OTFaTTExLjI1IDQuMDA1QzEyLjY4MzkgNC4wMDUgMTQuMDg1NiA0LjQzMDIxIDE1LjI3NzkgNS4yMjY4NUMxNi40NzAxIDYuMDIzNDkgMTcuMzk5NCA3LjE1NTc4IDE3Ljk0ODEgOC40ODA1NUMxOC40OTY5IDkuODA1MzEgMTguNjQwNCAxMS4yNjMgMTguMzYwNyAxMi42Njk0QzE4LjA4MDkgMTQuMDc1OCAxNy4zOTA1IDE1LjM2NzYgMTYuMzc2NSAxNi4zODE1QzE1LjM2MjYgMTcuMzk1NSAxNC4wNzA4IDE4LjA4NTkgMTIuNjY0NCAxOC4zNjU3QzExLjI1OCAxOC42NDU0IDkuODAwMzEgMTguNTAxOSA4LjQ3NTU0IDE3Ljk1MzFDNy4xNTA3OCAxNy40MDQ0IDYuMDE4NDggMTYuNDc1MSA1LjIyMTg0IDE1LjI4MjlDNC40MjUyIDE0LjA5MDYgNCAxMi42ODg5IDQgMTEuMjU1QzQuMDAyMTEgOS4zMzI4MyA0Ljc2NjYzIDcuNDg5OTkgNi4xMjU4MSA2LjEzMDgxQzcuNDg0OTkgNC43NzE2MyA5LjMyNzgzIDQuMDA3MTIgMTEuMjUgNC4wMDVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2VydmljZVwiIGRhdGEtbmFtZT1cInNlcnZpY2VcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMuNTgyIDQuOTg2QzIzLjU1NTggNC45MDQyIDIzLjUwOSA0LjgzMDUxIDIzLjQ0NjEgNC43NzIwNUMyMy4zODMyIDQuNzEzNTggMjMuMzA2MyA0LjY3MjMxIDIzLjIyMjggNC42NTIyMUMyMy4xMzkzIDQuNjMyMTIgMjMuMDUyIDQuNjMzODcgMjIuOTY5NCA0LjY1NzNDMjIuODg2NyA0LjY4MDc0IDIyLjgxMTUgNC43MjUwNiAyMi43NTEgNC43ODZMMTkuMTk0IDguMzQxQzE5LjE0MiA4LjM5MjkyIDE5LjA3OTIgOC40MzI3NCAxOS4wMTAxIDguNDU3NjNDMTguOTQwOSA4LjQ4MjUyIDE4Ljg2NzIgOC40OTE4NiAxOC43OTQgOC40ODVMMTYuMiA4LjI0OUMxNi4wODM2IDguMjM4NTEgMTUuOTc0NSA4LjE4NzU0IDE1Ljg5MTcgOC4xMDQ5NkMxNS44MDkgOC4wMjIzOSAxNS43NTc4IDcuOTEzNDIgMTUuNzQ3IDcuNzk3TDE1LjUxMyA1LjJDMTUuNTA2MyA1LjEyNjc3IDE1LjUxNTggNS4wNTI5NSAxNS41NDA4IDQuOTgzODFDMTUuNTY1OSA0LjkxNDY3IDE1LjYwNTkgNC44NTE5MSAxNS42NTggNC44TDE5LjIxNiAxLjI0MkMxOS4yNzY3IDEuMTgxNDYgMTkuMzIwOCAxLjEwNjMzIDE5LjM0NDEgMS4wMjM4MkMxOS4zNjc0IDAuOTQxMzEzIDE5LjM2OTEgMC44NTQyMDQgMTkuMzQ5IDAuNzcwODU4QzE5LjMyODkgMC42ODc1MTIgMTkuMjg3NyAwLjYxMDczMSAxOS4yMjk0IDAuNTQ3ODg4QzE5LjE3MTEgMC40ODUwNDQgMTkuMDk3NiAwLjQzODI1MSAxOS4wMTYgMC40MTIwMDFDMTcuNzcwNyAwLjA0NjIwNjcgMTYuNDQ5NiAwLjAyNDY4NzkgMTUuMTkzMSAwLjM0OTczM0MxMy45MzY2IDAuNjc0Nzc3IDEyLjc5MTcgMS4zMzQyNCAxMS44OCAyLjI1OEMxMC45MTMgMy4yMTcyMiAxMC4yNDc1IDQuNDM4MiA5Ljk2NTMzIDUuNzcwNzJDOS42ODMxOSA3LjEwMzI0IDkuNzk2NzQgOC40ODkxNyAxMC4yOTIgOS43NThDMTAuMzI5NCA5Ljg0NjY5IDEwLjMzOTkgOS45NDQ0NSAxMC4zMjIxIDEwLjAzOTFDMTAuMzA0MyAxMC4xMzM3IDEwLjI1OTEgMTAuMjIxIDEwLjE5MiAxMC4yOUwwLjkxMjAwMSAxOS41NjNDMC41Mzc0MzYgMTkuOTIyMyAwLjI3OTgzOCAyMC4zODYxIDAuMTcyODA4IDIwLjg5MzlDMC4wNjU3NzgzIDIxLjQwMTggMC4xMTQyODUgMjEuOTMwMSAwLjMxMjAwMSAyMi40MUMwLjQ3ODQ5NCAyMi43NzkxIDAuNzMxNjY0IDIzLjEwMjUgMS4wNDk5OCAyMy4zNTI3QzEuMzY4MjkgMjMuNjAyOSAxLjc0MjMyIDIzLjc3MjUgMi4xNDAyNyAyMy44NDcxQzIuNTM4MjIgMjMuOTIxOCAyLjk0ODMgMjMuODk5MiAzLjMzNTY0IDIzLjc4MTNDMy43MjI5OCAyMy42NjM0IDQuMDc2MTEgMjMuNDUzNyA0LjM2NSAyMy4xN0wxMy43IDEzLjgzNEMxMy43NjkzIDEzLjc2NzMgMTMuODU2NSAxMy43MjIyIDEzLjk1MSAxMy43MDQ1QzE0LjA0NTYgMTMuNjg2NyAxNC4xNDMyIDEzLjY5NyAxNC4yMzIgMTMuNzM0QzE1LjQ5ODUgMTQuMjMzNyAxNi44ODM2IDE0LjM1MTcgMTguMjE2NCAxNC4wNzM0QzE5LjU0OTEgMTMuNzk1MSAyMC43NzEzIDEzLjEzMjcgMjEuNzMyIDEyLjE2OEMyMi42NjEgMTEuMjUwMSAyMy4zMjM3IDEwLjA5NzQgMjMuNjQ5NSA4LjgzMjY1QzIzLjk3NTMgNy41Njc5MyAyMy45NTE5IDYuMjM4NTIgMjMuNTgyIDQuOTg2VjQuOTg2WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNldHRpbmdzXCIgZGF0YS1uYW1lPVwic2V0dGluZ3NcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjIuNSA5LjVIMjAuNjM4QzIwLjQ1MjkgOC44NjAyIDIwLjE5NyA4LjI0MzA1IDE5Ljg3NSA3LjY2TDIxLjE5MiA2LjM0NEMyMS4zMzE0IDYuMjA0NyAyMS40NDIgNi4wMzkzIDIxLjUxNzQgNS44NTcyNUMyMS41OTI4IDUuNjc1MiAyMS42MzE3IDUuNDgwMDYgMjEuNjMxNyA1LjI4M0MyMS42MzE3IDUuMDg1OTQgMjEuNTkyOCA0Ljg5MDggMjEuNTE3NCA0LjcwODc1QzIxLjQ0MiA0LjUyNjcgMjEuMzMxNCA0LjM2MTMgMjEuMTkyIDQuMjIyTDE5Ljc3NyAyLjgwOUMxOS40OTU3IDIuNTI3NzkgMTkuMTE0MiAyLjM2OTgyIDE4LjcxNjUgMi4zNjk4MkMxOC4zMTg4IDIuMzY5ODIgMTcuOTM3MyAyLjUyNzc5IDE3LjY1NiAyLjgwOUwxNi4zMzggNC4xMjZDMTUuNzU1OCAzLjgwMzggMTUuMTM5MiAzLjU0Nzg3IDE0LjUgMy4zNjNWMS41QzE0LjUgMS4xMDIxOCAxNC4zNDIgMC43MjA2NDQgMTQuMDYwNyAwLjQzOTM0QzEzLjc3OTQgMC4xNTgwMzUgMTMuMzk3OCAwIDEzIDBMMTEgMEMxMC42MDIyIDAgMTAuMjIwNiAwLjE1ODAzNSA5LjkzOTM0IDAuNDM5MzRDOS42NTgwNCAwLjcyMDY0NCA5LjUgMS4xMDIxOCA5LjUgMS41VjMuMzYzQzguODYwNTggMy41NDgzIDguMjQzNzggMy44MDQyIDcuNjYxIDQuMTI2TDYuMzQzIDIuODA5QzYuMDYxNzEgMi41Mjc3OSA1LjY4MDI1IDIuMzY5ODIgNS4yODI1IDIuMzY5ODJDNC44ODQ3NSAyLjM2OTgyIDQuNTAzMjkgMi41Mjc3OSA0LjIyMiAyLjgwOUwyLjgwNyA0LjIyM0MyLjY2NzYxIDQuMzYyMyAyLjU1NzA0IDQuNTI3NyAyLjQ4MTU5IDQuNzA5NzVDMi40MDYxNSA0Ljg5MTggMi4zNjczMiA1LjA4Njk0IDIuMzY3MzIgNS4yODRDMi4zNjczMiA1LjQ4MTA2IDIuNDA2MTUgNS42NzYyIDIuNDgxNTkgNS44NTgyNUMyLjU1NzA0IDYuMDQwMyAyLjY2NzYxIDYuMjA1NyAyLjgwNyA2LjM0NUw0LjEyNSA3LjY2MkMzLjgwMjU5IDguMjQ0MTQgMy41NDY2NSA4Ljg2MDY3IDMuMzYyIDkuNUgxLjVDMS4xMDIxOCA5LjUgMC43MjA2NDQgOS42NTgwNCAwLjQzOTM0IDkuOTM5MzRDMC4xNTgwMzUgMTAuMjIwNiAwIDEwLjYwMjIgMCAxMUwwIDEzQzAgMTMuMzk3OCAwLjE1ODAzNSAxMy43Nzk0IDAuNDM5MzQgMTQuMDYwN0MwLjcyMDY0NCAxNC4zNDIgMS4xMDIxOCAxNC41IDEuNSAxNC41SDMuMzYyQzMuNTQ2NTcgMTUuMTM5NyAzLjgwMjUyIDE1Ljc1NjUgNC4xMjUgMTYuMzM5TDIuODA2IDE3LjY1OEMyLjUyNDc5IDE3LjkzOTMgMi4zNjY4MiAxOC4zMjA4IDIuMzY2ODIgMTguNzE4NUMyLjM2NjgyIDE5LjExNjIgMi41MjQ3OSAxOS40OTc3IDIuODA2IDE5Ljc3OUw0LjIyIDIxLjE5M0M0LjUwNjgyIDIxLjQ2NCA0Ljg4NjQzIDIxLjYxNDkgNS4yODEgMjEuNjE0OUM1LjY3NTU3IDIxLjYxNDkgNi4wNTUxOCAyMS40NjQgNi4zNDIgMjEuMTkzTDcuNjYgMTkuODc2QzguMjQzMDkgMjAuMTk4MSA4Ljg2MDIyIDIwLjQ1NDQgOS41IDIwLjY0VjIyLjVDOS41IDIyLjg5NzggOS42NTgwNCAyMy4yNzk0IDkuOTM5MzQgMjMuNTYwN0MxMC4yMjA2IDIzLjg0MiAxMC42MDIyIDI0IDExIDI0SDEzQzEzLjM5NzggMjQgMTMuNzc5NCAyMy44NDIgMTQuMDYwNyAyMy41NjA3QzE0LjM0MiAyMy4yNzk0IDE0LjUgMjIuODk3OCAxNC41IDIyLjVWMjAuNjRDMTUuMTM5NCAyMC40NTQ3IDE1Ljc1NjIgMjAuMTk4OCAxNi4zMzkgMTkuODc3TDE3LjY1NyAyMS4xOTRDMTcuOTM4MyAyMS40NzUyIDE4LjMxOTggMjEuNjMzMiAxOC43MTc1IDIxLjYzMzJDMTkuMTE1MiAyMS42MzMyIDE5LjQ5NjcgMjEuNDc1MiAxOS43NzggMjEuMTk0TDIxLjE5MiAxOS43OEMyMS40NzMyIDE5LjQ5ODcgMjEuNjMxMiAxOS4xMTcyIDIxLjYzMTIgMTguNzE5NUMyMS42MzEyIDE4LjMyMTggMjEuNDczMiAxNy45NDAzIDIxLjE5MiAxNy42NTlMMTkuODc1IDE2LjM0MkMyMC4xOTczIDE1Ljc1OTEgMjAuNDUzMiAxNS4xNDE5IDIwLjYzOCAxNC41MDJIMjIuNUMyMi42OTcyIDE0LjUwMiAyMi44OTI0IDE0LjQ2MzEgMjMuMDc0NSAxNC4zODc2QzIzLjI1NjYgMTQuMzEyMSAyMy40MjIxIDE0LjIwMTUgMjMuNTYxNCAxNC4wNjJDMjMuNzAwNyAxMy45MjI1IDIzLjgxMTEgMTMuNzU2OSAyMy44ODY0IDEzLjU3NDZDMjMuOTYxNyAxMy4zOTI0IDI0LjAwMDMgMTMuMTk3MiAyNCAxM1YxMUMyNCAxMC42MDIyIDIzLjg0MiAxMC4yMjA2IDIzLjU2MDcgOS45MzkzNEMyMy4yNzk0IDkuNjU4MDQgMjIuODk3OCA5LjUgMjIuNSA5LjVaTTEyIDE3QzExLjAxMTEgMTcgMTAuMDQ0NCAxNi43MDY4IDkuMjIyMTUgMTYuMTU3M0M4LjM5OTkgMTUuNjA3OSA3Ljc1OTA0IDE0LjgyNyA3LjM4MDYgMTMuOTEzNEM3LjAwMjE2IDEyLjk5OTggNi45MDMxNSAxMS45OTQ1IDcuMDk2MDcgMTEuMDI0NUM3LjI4OSAxMC4wNTQ2IDcuNzY1MiA5LjE2MzczIDguNDY0NDcgOC40NjQ0N0M5LjE2MzczIDcuNzY1MiAxMC4wNTQ2IDcuMjg5IDExLjAyNDUgNy4wOTYwN0MxMS45OTQ1IDYuOTAzMTUgMTIuOTk5OCA3LjAwMjE2IDEzLjkxMzQgNy4zODA2QzE0LjgyNyA3Ljc1OTA0IDE1LjYwNzkgOC4zOTk5IDE2LjE1NzMgOS4yMjIxNUMxNi43MDY4IDEwLjA0NDQgMTcgMTEuMDExMSAxNyAxMkMxNi45OTg0IDEzLjMyNTYgMTYuNDcxMSAxNC41OTY0IDE1LjUzMzggMTUuNTMzOEMxNC41OTY0IDE2LjQ3MTEgMTMuMzI1NiAxNi45OTg0IDEyIDE3VjE3WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRyaXBcIiBkYXRhLW5hbWU9XCJ0cmlwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE5LjAxMiAxNC41NTJDMTguOTk4OCAxNC41MTk4IDE4Ljk3ODcgMTQuNDkwOCAxOC45NTMxIDE0LjQ2NzFDMTguOTI3NiAxNC40NDM1IDE4Ljg5NzEgMTQuNDI1NyAxOC44NjQgMTQuNDE1QzE4LjU1MDEgMTQuMzEzNCAxOC4yNjY3IDE0LjEzNDYgMTguMDQgMTMuODk1QzE2LjM0IDEyLjA4IDEzLjUgOC42MDkgMTMuNSA1Ljc1QzEzLjUgNS41NzkgMTMuNTA5IDUuNDExIDEzLjUyNCA1LjI0NEMxMy41MzkgNS4wNzcgMTMuNjA0IDQuNzUgMTMuMjc1IDQuNzVIMTJDMTEuOTMzNyA0Ljc1IDExLjg3MDEgNC43NzYzNCAxMS44MjMyIDQuODIzMjJDMTEuNzc2MyA0Ljg3MDExIDExLjc1IDQuOTMzNyAxMS43NSA1VjcuNzVDMTEuNzUgNy45NDg5MSAxMS42NzA5IDguMTM5NjggMTEuNTMwMyA4LjI4MDMzQzExLjM4OTYgOC40MjA5OCAxMS4xOTg5IDguNSAxMSA4LjVDMTAuODAxIDguNSAxMC42MTAzIDguNDIwOTggMTAuNDY5NiA4LjI4MDMzQzEwLjMyOSA4LjEzOTY4IDEwLjI1IDcuOTQ4OTEgMTAuMjUgNy43NVY1QzEwLjI1IDQuOTMzNyAxMC4yMjM2IDQuODcwMTEgMTAuMTc2NyA0LjgyMzIyQzEwLjEyOTkgNC43NzYzNCAxMC4wNjYzIDQuNzUgOS45OTk5NiA0Ljc1SDcuMTgwOTZDNy4wODA1OSA0Ljc1MDA2IDYuOTgyNTYgNC43ODAzMyA2Ljg5OTYzIDQuODM2ODdDNi44MTY2OSA0Ljg5MzQgNi43NTI3IDQuOTczNTkgNi43MTU5NiA1LjA2N0wwLjAzMzk2MDUgMjIuMDY3QzAuMDA0MTIyOTEgMjIuMTQyOSAtMC4wMDY3MTE0NiAyMi4yMjQ5IDAuMDAyNDAxMjIgMjIuMzA1OUMwLjAxMTUxMzkgMjIuMzg2OSAwLjA0MDI5NzIgMjIuNDY0NSAwLjA4NjI0MzYgMjIuNTMxOEMwLjEzMjE5IDIyLjU5OTEgMC4xOTM5MDYgMjIuNjU0MiAwLjI2NjAxNCAyMi42OTIzQzAuMzM4MTIzIDIyLjczMDMgMC40MTg0MzcgMjIuNzUwMSAwLjQ5OTk2IDIyLjc1SDkuOTk5OTZDMTAuMDY2MyAyMi43NSAxMC4xMjk5IDIyLjcyMzcgMTAuMTc2NyAyMi42NzY4QzEwLjIyMzYgMjIuNjI5OSAxMC4yNSAyMi41NjYzIDEwLjI1IDIyLjVWMTkuNzVDMTAuMjUgMTkuNTUxMSAxMC4zMjkgMTkuMzYwMyAxMC40Njk2IDE5LjIxOTdDMTAuNjEwMyAxOS4wNzkgMTAuODAxIDE5IDExIDE5QzExLjE5ODkgMTkgMTEuMzg5NiAxOS4wNzkgMTEuNTMwMyAxOS4yMTk3QzExLjY3MDkgMTkuMzYwMyAxMS43NSAxOS41NTExIDExLjc1IDE5Ljc1VjIyLjVDMTEuNzUgMjIuNTY2MyAxMS43NzYzIDIyLjYyOTkgMTEuODIzMiAyMi42NzY4QzExLjg3MDEgMjIuNzIzNyAxMS45MzM3IDIyLjc1IDEyIDIyLjc1SDIxLjVDMjEuNTgxNSAyMi43NTAxIDIxLjY2MTggMjIuNzMwMyAyMS43MzM5IDIyLjY5MjNDMjEuODA2IDIyLjY1NDIgMjEuODY3NyAyMi41OTkxIDIxLjkxMzcgMjIuNTMxOEMyMS45NTk2IDIyLjQ2NDUgMjEuOTg4NCAyMi4zODY5IDIxLjk5NzUgMjIuMzA1OUMyMi4wMDY2IDIyLjIyNDkgMjEuOTk1OCAyMi4xNDI5IDIxLjk2NiAyMi4wNjdMMTkuMDEyIDE0LjU1MlpNMTEuNzUgMTUuNzUyQzExLjc1IDE1Ljk1MDkgMTEuNjcwOSAxNi4xNDE3IDExLjUzMDMgMTYuMjgyM0MxMS4zODk2IDE2LjQyMyAxMS4xOTg5IDE2LjUwMiAxMSAxNi41MDJDMTAuODAxIDE2LjUwMiAxMC42MTAzIDE2LjQyMyAxMC40Njk2IDE2LjI4MjNDMTAuMzI5IDE2LjE0MTcgMTAuMjUgMTUuOTUwOSAxMC4yNSAxNS43NTJWMTEuNzUyQzEwLjI1IDExLjU1MzEgMTAuMzI5IDExLjM2MjMgMTAuNDY5NiAxMS4yMjE3QzEwLjYxMDMgMTEuMDgxIDEwLjgwMSAxMS4wMDIgMTEgMTEuMDAyQzExLjE5ODkgMTEuMDAyIDExLjM4OTYgMTEuMDgxIDExLjUzMDMgMTEuMjIxN0MxMS42NzA5IDExLjM2MjMgMTEuNzUgMTEuNTUzMSAxMS43NSAxMS43NTJWMTUuNzUyWlwiLz48cGF0aCBkPVwiTTE5Ljg2NCAxMi44N0MyMC45MzUgMTEuNzIzIDI0IDguMjI2IDI0IDUuNzVDMjQgNC41NTY1MyAyMy41MjU5IDMuNDExOTMgMjIuNjgyIDIuNTY4MDJDMjEuODM4MSAxLjcyNDExIDIwLjY5MzUgMS4yNSAxOS41IDEuMjVDMTguMzA2NSAxLjI1IDE3LjE2MTkgMS43MjQxMSAxNi4zMTggMi41NjgwMkMxNS40NzQxIDMuNDExOTMgMTUgNC41NTY1MyAxNSA1Ljc1QzE1IDguMjI2IDE4LjA2NSAxMS43MjMgMTkuMTM2IDEyLjg3QzE5LjE4MjcgMTIuOTE5NiAxOS4yMzkyIDEyLjk1OTIgMTkuMzAxOCAxMi45ODYyQzE5LjM2NDMgMTMuMDEzMyAxOS40MzE4IDEzLjAyNzIgMTkuNSAxMy4wMjcyQzE5LjU2ODIgMTMuMDI3MiAxOS42MzU3IDEzLjAxMzMgMTkuNjk4MiAxMi45ODYyQzE5Ljc2MDggMTIuOTU5MiAxOS44MTczIDEyLjkxOTYgMTkuODY0IDEyLjg3VjEyLjg3Wk0xOCA1Ljc1QzE4IDUuNDUzMzMgMTguMDg4IDUuMTYzMzIgMTguMjUyOCA0LjkxNjY0QzE4LjQxNzYgNC42Njk5NyAxOC42NTE5IDQuNDc3NzEgMTguOTI2IDQuMzY0MThDMTkuMjAwMSA0LjI1MDY1IDE5LjUwMTcgNC4yMjA5NCAxOS43OTI2IDQuMjc4ODJDMjAuMDgzNiA0LjMzNjcgMjAuMzUwOSA0LjQ3OTU2IDIwLjU2MDcgNC42ODkzNEMyMC43NzA0IDQuODk5MTIgMjAuOTEzMyA1LjE2NjM5IDIwLjk3MTIgNS40NTczNkMyMS4wMjkxIDUuNzQ4MzQgMjAuOTk5MyA2LjA0OTk0IDIwLjg4NTggNi4zMjQwM0MyMC43NzIzIDYuNTk4MTEgMjAuNTggNi44MzIzOCAyMC4zMzM0IDYuOTk3MkMyMC4wODY3IDcuMTYyMDMgMTkuNzk2NyA3LjI1IDE5LjUgNy4yNUMxOS4xMDIyIDcuMjUgMTguNzIwNiA3LjA5MTk2IDE4LjQzOTMgNi44MTA2NkMxOC4xNTggNi41MjkzNiAxOCA2LjE0NzgyIDE4IDUuNzVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVoaWNsZVwiIGRhdGEtbmFtZT1cInZlaGljbGVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMi4xOTI5IDEwLjMzMDhDMjIuMjA0OCAxMC4zNTc4IDIyLjIyMTQgMTAuMzgyNiAyMi4yNDIgMTAuNDA0QzIzLjA0OCAxMS4yMzM5IDIzLjQ5OTIgMTIuMzQ1MSAyMy41IDEzLjUwMlYxNS41MDJDMjMuNDk4NCAxNi4wMDMyIDIzLjM0NTcgMTYuNDkyNCAyMy4wNjE4IDE2LjkwNTVDMjIuNzk2NiAxNy4yOTE2IDIyLjQyODQgMTcuNTk0NiAyMiAxNy43ODA2VjIwQzIyIDIwLjU1MjMgMjEuNTUyMyAyMSAyMSAyMUgxOUMxOC40NDc3IDIxIDE4IDIwLjU1MjMgMTggMjBWMTcuODE3Mkw2IDE3LjgxNDhWMjBDNiAyMC41NTIzIDUuNTUyMjggMjEgNSAyMUgzQzIuNDQ3NzIgMjEgMiAyMC41NTIzIDIgMjBWMTcuNzc2NkMxLjU3MTU2IDE3LjU5MDYgMS4yMDMzNCAxNy4yODc2IDAuOTM4MTE1IDE2LjkwMTVDMC42NTQyOTkgMTYuNDg4NCAwLjUwMTYxMyAxNS45OTkyIDAuNDk5OTgzIDE1LjQ5OFYxMy40OThDMC41MDE1MTQgMTIuMzQzNiAwLjk1MTUwNiAxMS4yMzQ5IDEuNzU0OTggMTAuNDA2QzEuNzgxMzcgMTAuMzc4NiAxLjgwMTE5IDEwLjM0NTUgMS44MTI5NyAxMC4zMDkzTDEuODEzNDEgMTAuMzA4OEMxLjgxNDUzIDEwLjMwNDIgMS44MTU1MyAxMC4yOTk1IDEuODE2MzkgMTAuMjk0N0MxLjgyNTE3IDEwLjI0NjUgMS44MTk1NiAxMC4xOTY3IDEuODAwMjcgMTAuMTUxN0MxLjc4MDk4IDEwLjEwNjYgMS43NDg4NSAxMC4wNjgxIDEuNzA3ODkgMTAuMDQxMkMxLjY2NjkzIDEwLjAxNDIgMS42MTg5NCA5Ljk5OTkgMS41Njk5IDEwSDEuMjgxOThDMS4wMTY3NyAxMCAwLjc2MjQxMSA5Ljg5NDY0IDAuNTc0ODc1IDkuNzA3MTFDMC4zODczMzggOS41MTk1NyAwLjI4MTk4MiA5LjI2NTIyIDAuMjgxOTgyIDlWOEMwLjI4MTk4MiA3LjczNDc4IDAuMzg3MzM4IDcuNDgwNDMgMC41NzQ4NzUgNy4yOTI4OUMwLjc2MjQxMSA3LjEwNTM2IDEuMDE2NzcgNyAxLjI4MTk4IDdIMi42MzE5OEMyLjg2NDc0IDcuMDAwNjIgMy4wOTQyIDcuMDU1MSAzLjMwMjM4IDcuMTU5MkMzLjQ4MzggNy4yNDk5MSAzLjY0NDc3IDcuMzc2MTQgMy43NzU5MSA3LjUzMDA3TDMuNzg3NTggNy41MDE2NUMzLjgxMTk3IDcuNDY5NDUgMy44MjgyMyA3LjQzMTg0IDMuODM0OTggNy4zOTIwMUw0LjIzNDk4IDUuMDA5MDFDNC4zNDk1NSA0LjMwNzM3IDQuNzEwMjkgMy42Njk0OCA1LjI1MjUzIDMuMjA5N0M1Ljc5NDc3IDIuNzQ5OTIgNi40ODMwNSAyLjQ5ODMyIDcuMTkzOTggMi41MDAwMUgxNi44MDJDMTcuNTEyNiAyLjQ5ODI1IDE4LjIwMDcgMi43NDk1NiAxOC43NDI5IDMuMjA4OTRDMTkuMjg1MSAzLjY2ODMyIDE5LjY0NiA0LjMwNTc0IDE5Ljc2MSA1LjAwNzAxTDIwLjE2MSA3LjM5MDAxQzIwLjE2NzYgNy40Mjk4MSAyMC4xODM3IDcuNDY3NDMgMjAuMjA4IDcuNDk5NjRDMjAuMjE0NSA3LjUwODI5IDIwLjIyMTYgNy41MTY0OCAyMC4yMjkxIDcuNTI0MTdDMjAuMzU5MyA3LjM3MjkxIDIwLjUxODUgNy4yNDg3NCAyMC42OTc2IDcuMTU5MkMyMC45MDU4IDcuMDU1MSAyMS4xMzUyIDcuMDAwNjIgMjEuMzY4IDdIMjIuNzE4QzIyLjk4MzIgNyAyMy4yMzc2IDcuMTA1MzYgMjMuNDI1MSA3LjI5Mjg5QzIzLjYxMjYgNy40ODA0MyAyMy43MTggNy43MzQ3OCAyMy43MTggOFY5QzIzLjcxOCA5LjI2NTIyIDIzLjYxMjYgOS41MTk1NyAyMy40MjUxIDkuNzA3MTFDMjMuMjM3NiA5Ljg5NDY0IDIyLjk4MzIgMTAgMjIuNzE4IDEwSDIyLjQzMDFDMjIuMzgxIDkuOTk5OSAyMi4zMzMgMTAuMDE0MiAyMi4yOTIxIDEwLjA0MTJDMjIuMjUxMSAxMC4wNjgxIDIyLjIxOSAxMC4xMDY2IDIyLjE5OTcgMTAuMTUxN0MyMi4xODA0IDEwLjE5NjcgMjIuMTc0OCAxMC4yNDY1IDIyLjE4MzYgMTAuMjk0N0MyMi4xODU4IDEwLjMwNyAyMi4xODg5IDEwLjMxOTEgMjIuMTkyOSAxMC4zMzA4Wk03LjE5Mzk4IDQuNTAyMDFIMTYuODA2QzE3LjA0MjcgNC41MDIxMiAxNy4yNzE3IDQuNTg2MTkgMTcuNDUyMiA0LjczOTI3QzE3LjYzMjggNC44OTIzNSAxNy43NTMyIDUuMTA0NTEgMTcuNzkyIDUuMzM4MDFMMTguMjcxIDguMjExMDFDMTguMjc2MyA4LjI0NjQxIDE4LjI3NDEgOC4yODI1NCAxOC4yNjQ1IDguMzE3MDJDMTguMjU0OCA4LjM1MTUgMTguMjM3OSA4LjM4MzUzIDE4LjIxNSA4LjQxMTAxQzE4LjE5MTUgOC40Mzg2NyAxOC4xNjIyIDguNDYwODcgMTguMTI5MiA4LjQ3NjA3QzE4LjA5NjIgOC40OTEyNyAxOC4wNjAzIDguNDk5MDkgMTguMDI0IDguNDk5MDFINS45NzU5OEM1LjkzOTY1IDguNDk5MDcgNS45MDM3NCA4LjQ5MTIgNS44NzA3NiA4LjQ3NTk3QzUuODM3NzggOC40NjA3MyA1LjgwODUxIDguNDM4NDkgNS43ODUgOC40MTA3OUM1Ljc2MTQ5IDguMzgzMDkgNS43NDQzIDguMzUwNiA1LjczNDYyIDguMzE1NThDNS43MjQ5NSA4LjI4MDU2IDUuNzIzMDIgOC4yNDM4NSA1LjcyODk4IDguMjA4MDFMNi4yMDc5OCA1LjMzNTAxQzYuMjQ3NDQgNS4xMDIwNiA2LjM2ODEgNC44OTA2IDYuNTQ4NTkgNC43MzgxMkM2LjcyOTA3IDQuNTg1NjUgNi45NTc3MSA0LjUwMiA3LjE5Mzk4IDQuNTAyMDFaTTcgMTMuNUM3IDE0LjMyODQgNi4zMjg0MyAxNSA1LjUgMTVDNC42NzE1NyAxNSA0IDE0LjMyODQgNCAxMy41QzQgMTIuNjcxNiA0LjY3MTU3IDEyIDUuNSAxMkM2LjMyODQzIDEyIDcgMTIuNjcxNiA3IDEzLjVaTTE4LjUgMTVDMTkuMzI4NCAxNSAyMCAxNC4zMjg0IDIwIDEzLjVDMjAgMTIuNjcxNiAxOS4zMjg0IDEyIDE4LjUgMTJDMTcuNjcxNiAxMiAxNyAxMi42NzE2IDE3IDEzLjVDMTcgMTQuMzI4NCAxNy42NzE2IDE1IDE4LjUgMTVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVuZG9yXCIgZGF0YS1uYW1lPVwidmVuZG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIxLjM3OSAxMS45QzIwLjgwNzQgMTEuODkxNSAyMC4yNDU1IDExLjc1MDYgMTkuNzM3NSAxMS40ODg0QzE5LjIyOTUgMTEuMjI2MyAxOC43ODkxIDEwLjg0OTkgMTguNDUxIDEwLjM4OUMxOC40Mjc3IDEwLjM1OCAxOC4zOTc1IDEwLjMzMjggMTguMzYyOCAxMC4zMTU0QzE4LjMyODEgMTAuMjk4IDE4LjI4OTggMTAuMjg5IDE4LjI1MSAxMC4yODlDMTguMjEyMiAxMC4yODkgMTguMTczOSAxMC4yOTggMTguMTM5MiAxMC4zMTU0QzE4LjEwNDUgMTAuMzMyOCAxOC4wNzQzIDEwLjM1OCAxOC4wNTEgMTAuMzg5QzE3LjcxODkgMTAuODU2MyAxNy4yNzk5IDExLjIzNzMgMTYuNzcwNSAxMS41MDAyQzE2LjI2MTEgMTEuNzYzMSAxNS42OTYyIDExLjkwMDMgMTUuMTIzIDExLjkwMDNDMTQuNTQ5OCAxMS45MDAzIDEzLjk4NDkgMTEuNzYzMSAxMy40NzU1IDExLjUwMDJDMTIuOTY2MSAxMS4yMzczIDEyLjUyNyAxMC44NTYzIDEyLjE5NSAxMC4zODlDMTIuMTcxNyAxMC4zNTggMTIuMTQxNSAxMC4zMzI4IDEyLjEwNjggMTAuMzE1NEMxMi4wNzIxIDEwLjI5OCAxMi4wMzM4IDEwLjI4OSAxMS45OTUgMTAuMjg5QzExLjk1NjIgMTAuMjg5IDExLjkxNzkgMTAuMjk4IDExLjg4MzIgMTAuMzE1NEMxMS44NDg1IDEwLjMzMjggMTEuODE4MyAxMC4zNTggMTEuNzk1IDEwLjM4OUMxMS40NTc2IDEwLjg0OSAxMS4wMTgzIDExLjIyNDggMTAuNTExNiAxMS40ODY5QzEwLjAwNDkgMTEuNzQ5IDkuNDQ0NDEgMTEuODkwNCA4Ljg3Mzk5IDExLjlDOC4zMDIyMSAxMS44OTE2IDcuNzQwMTYgMTEuNzUwOCA3LjIzMTk2IDExLjQ4ODZDNi43MjM3NiAxMS4yMjY1IDYuMjgzMjQgMTAuODUwMSA1Ljk0NDk5IDEwLjM4OUM1LjkyMTcgMTAuMzU4IDUuODkxNTEgMTAuMzMyOCA1Ljg1Njc5IDEwLjMxNTRDNS44MjIwOCAxMC4yOTggNS43ODM4IDEwLjI4OSA1Ljc0NDk5IDEwLjI4OUM1LjcwNjE4IDEwLjI4OSA1LjY2NzkgMTAuMjk4IDUuNjMzMTkgMTAuMzE1NEM1LjU5ODQ3IDEwLjMzMjggNS41NjgyOCAxMC4zNTggNS41NDQ5OSAxMC4zODlDNS4yMDcyNSAxMC44NDk0IDQuNzY3NTMgMTEuMjI1NCA0LjI2MDI1IDExLjQ4NzVDMy43NTI5OCAxMS43NDk3IDMuMTkxOTIgMTEuODkwOCAyLjYyMDk5IDExLjlDMi40OTI2OCAxMS44OTk4IDIuMzY0NDkgMTEuODkyNCAyLjIzNjk5IDExLjg3OEMyLjIwMTk0IDExLjg3MzkgMi4xNjY0MiAxMS44NzczIDIuMTMyNzggMTEuODg3OUMyLjA5OTEzIDExLjg5ODYgMi4wNjgxNCAxMS45MTYzIDIuMDQxODYgMTEuOTM5OEMyLjAxNTU3IDExLjk2MzQgMS45OTQ1OSAxMS45OTIyIDEuOTgwMyAxMi4wMjQ1QzEuOTY2MDEgMTIuMDU2OCAxLjk1ODc1IDEyLjA5MTcgMS45NTg5OSAxMi4xMjdWMjEuMTVDMS45NTg5OSAyMS41NDc4IDIuMTE3MDMgMjEuOTI5NCAyLjM5ODMzIDIyLjIxMDdDMi42Nzk2MyAyMi40OTIgMy4wNjExNyAyMi42NSAzLjQ1ODk5IDIyLjY1SDIwLjQ1OUMyMC44NTY4IDIyLjY1IDIxLjIzODMgMjIuNDkyIDIxLjUxOTcgMjIuMjEwN0MyMS44MDEgMjEuOTI5NCAyMS45NTkgMjEuNTQ3OCAyMS45NTkgMjEuMTVWMTIuMTM0QzIxLjk1ODggMTIuMDk5MiAyMS45NTE1IDEyLjA2NDggMjEuOTM3NCAxMi4wMzI5QzIxLjkyMzMgMTIuMDAxMSAyMS45MDI3IDExLjk3MjUgMjEuODc3IDExLjk0OUMyMS44NTE0IDExLjkyNTYgMjEuODIxMiAxMS45MDc4IDIxLjc4ODMgMTEuODk2N0MyMS43NTU0IDExLjg4NTcgMjEuNzIwNSAxMS44ODE3IDIxLjY4NiAxMS44ODVDMjEuNTg0IDExLjg5NCAyMS40ODIgMTEuOSAyMS4zNzkgMTEuOVpNMTQuOTU3IDE1LjAxQzE0Ljk2MjQgMTQuOTA5MiAxNS4wMDc1IDE0LjgxNDYgMTUuMDgyNSAxNC43NDdDMTUuMTU3NSAxNC42NzkzIDE1LjI1NjEgMTQuNjQ0MSAxNS4zNTcgMTQuNjQ5SDE4LjU1N0MxOC42NTc4IDE0LjY0NDEgMTguNzU2NSAxNC42NzkzIDE4LjgzMTUgMTQuNzQ3QzE4LjkwNjQgMTQuODE0NiAxOC45NTE2IDE0LjkwOTIgMTguOTU3IDE1LjAxVjIwLjE0OUMxOC45NTcgMjAuMjgxNiAxOC45MDQzIDIwLjQwODggMTguODEwNSAyMC41MDI2QzE4LjcxNjggMjAuNTk2MyAxOC41ODk2IDIwLjY0OSAxOC40NTcgMjAuNjQ5SDE1LjQ1N0MxNS4zMjQ0IDIwLjY0OSAxNS4xOTcyIDIwLjU5NjMgMTUuMTAzNCAyMC41MDI2QzE1LjAwOTcgMjAuNDA4OCAxNC45NTcgMjAuMjgxNiAxNC45NTcgMjAuMTQ5VjE1LjAxWk01LjQ1Njk5IDE0Ljk4MkM1LjQ2MjY2IDE0Ljg4ODMgNS41MDUxOSAxNC44MDA3IDUuNTc1MjcgMTQuNzM4M0M1LjY0NTM2IDE0LjY3NTkgNS43MzczIDE0LjY0MzggNS44MzA5OSAxNC42NDlIMTEuMDc4QzExLjE3MTggMTQuNjQzOCAxMS4yNjM4IDE0LjY3NTkgMTEuMzM0MSAxNC43MzgzQzExLjQwNDMgMTQuODAwNiAxMS40NDcxIDE0Ljg4ODIgMTEuNDUzIDE0Ljk4MlYxOC4zMTZDMTEuNDQ3MSAxOC40MDk4IDExLjQwNDMgMTguNDk3NCAxMS4zMzQxIDE4LjU1OTdDMTEuMjYzOCAxOC42MjIxIDExLjE3MTggMTguNjU0MiAxMS4wNzggMTguNjQ5SDUuODMwOTlDNS43MzczIDE4LjY1NDIgNS42NDUzNiAxOC42MjIxIDUuNTc1MjcgMTguNTU5N0M1LjUwNTE5IDE4LjQ5NzMgNS40NjI2NiAxOC40MDk3IDUuNDU2OTkgMTguMzE2VjE0Ljk4MlpcIi8+PHBhdGggZD1cIk0yMS4zNzkgMTAuNEMyMS45MDE4IDEwLjM2NTggMjIuMzk5OSAxMC4xNjU0IDIyLjgwMDcgOS44MjgxMkMyMy4yMDE2IDkuNDkwODEgMjMuNDg0MSA5LjAzNDIxIDIzLjYwNyA4LjUyNDk5QzIzLjc0NDMgOC4wNzc5NCAyMy43Mzk4IDcuNTk5MzUgMjMuNTk0IDcuMTU0OTlMMjEuNzk0IDEuNjg0OTlDMjEuNzc1NyAxLjYwMTAxIDIxLjczMjcgMS41MjQ0MyAyMS42NzA1IDEuNDY1MDlDMjEuNjA4MyAxLjQwNTc1IDIxLjUyOTggMS4zNjYzNyAyMS40NDUgMS4zNTE5OUgyLjU1MTA0QzIuNDY2MjkgMS4zNjYzNyAyLjM4Nzc4IDEuNDA1NzUgMi4zMjU1OSAxLjQ2NTA5QzIuMjYzNCAxLjUyNDQzIDIuMjIwMzcgMS42MDEwMSAyLjIwMjA0IDEuNjg0OTlMMC40MDUwMzggNy4xNTI5OUMwLjI2MDE0OSA3LjU5Nzg4IDAuMjU1OTU5IDguMDc2NjMgMC4zOTMwMzggOC41MjM5OUMwLjUxNTgyNyA5LjAzMzQgMC43OTgyNTkgOS40OTAyMSAxLjE5OTA5IDkuODI3NzJDMS41OTk5MiAxMC4xNjUyIDIuMDk4MTYgMTAuMzY1NyAyLjYyMTA0IDEwLjRDMy4zMTUzOCAxMC4zMjc2IDMuOTUzNTkgOS45ODU2NCA0LjM5ODQ2IDkuNDQ3NjRDNC44NDMzMyA4LjkwOTY1IDUuMDU5MzQgOC4yMTg1NyA1LjAwMDA0IDcuNTIyOTlDNS4wMDAwNCA3LjMyNDA4IDUuMDc5MDYgNy4xMzMzMSA1LjIxOTcxIDYuOTkyNjZDNS4zNjAzNiA2Ljg1MjAxIDUuNTUxMTMgNi43NzI5OSA1Ljc1MDA0IDYuNzcyOTlDNS45NDg5NSA2Ljc3Mjk5IDYuMTM5NzIgNi44NTIwMSA2LjI4MDM3IDYuOTkyNjZDNi40MjEwMiA3LjEzMzMxIDYuNTAwMDQgNy4zMjQwOCA2LjUwMDA0IDcuNTIyOTlDNi40NDA2NyA4LjIxNzc5IDYuNjU2IDguOTA4MTggNy4wOTk4MiA5LjQ0NjA0QzcuNTQzNjQgOS45ODM5IDguMTgwNiAxMC4zMjY0IDguODc0MDQgMTAuNEM5LjU2Nzg0IDEwLjMyNjkgMTAuMjA1MyA5Ljk4NDYgMTAuNjQ5NSA5LjQ0NjY4QzExLjA5MzggOC45MDg3NyAxMS4zMDk0IDguMjE4MSAxMS4yNSA3LjUyMjk5QzExLjI1IDcuMzI0MDggMTEuMzI5MSA3LjEzMzMxIDExLjQ2OTcgNi45OTI2NkMxMS42MTA0IDYuODUyMDEgMTEuODAxMSA2Ljc3Mjk5IDEyIDYuNzcyOTlDMTIuMTk5IDYuNzcyOTkgMTIuMzg5NyA2Ljg1MjAxIDEyLjUzMDQgNi45OTI2NkMxMi42NzEgNy4xMzMzMSAxMi43NSA3LjMyNDA4IDEyLjc1IDcuNTIyOTlDMTIuNjkwNyA4LjIxODI2IDEyLjkwNjQgOC45MDkwNiAxMy4zNTA5IDkuNDQ3QzEzLjc5NTMgOS45ODQ5NCAxNC40MzMxIDEwLjMyNzEgMTUuMTI3IDEwLjRDMTUuODIwNCAxMC4zMjY0IDE2LjQ1NzMgOS45ODM4NyAxNi45MDA5IDkuNDQ1OThDMTcuMzQ0NiA4LjkwODA4IDE3LjU1OTcgOC4yMTc2OSAxNy41IDcuNTIyOTlDMTcuNSA3LjMyNDA4IDE3LjU3OTEgNy4xMzMzMSAxNy43MTk3IDYuOTkyNjZDMTcuODYwNCA2Ljg1MjAxIDE4LjA1MTEgNi43NzI5OSAxOC4yNSA2Ljc3Mjk5QzE4LjQ0OSA2Ljc3Mjk5IDE4LjYzOTcgNi44NTIwMSAxOC43ODA0IDYuOTkyNjZDMTguOTIxIDcuMTMzMzEgMTkgNy4zMjQwOCAxOSA3LjUyMjk5QzE4Ljk0MSA4LjIxODUxIDE5LjE1NzEgOC45MDk0NSAxOS42MDE5IDkuNDQ3MzlDMjAuMDQ2NyA5Ljk4NTMyIDIwLjY4NDggMTAuMzI3MyAyMS4zNzkgMTAuNFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hbGVydC10cmlhbmdsZVwiIGRhdGEtbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIzLjExOSAxOUwxMy43NzIgMS4xNUMxMy42MDI2IDAuODI2NzM5IDEzLjM0OCAwLjU1NTk5MyAxMy4wMzU3IDAuMzY3MDg4QzEyLjcyMzUgMC4xNzgxODQgMTIuMzY1NSAwLjA3ODMyMzQgMTIuMDAwNSAwLjA3ODMyMzRDMTEuNjM1NSAwLjA3ODMyMzQgMTEuMjc3NSAwLjE3ODE4NCAxMC45NjUzIDAuMzY3MDg4QzEwLjY1MyAwLjU1NTk5MyAxMC4zOTg0IDAuODI2NzM5IDEwLjIyOSAxLjE1TDAuODgxMDAyIDE5QzAuNzIxMzIyIDE5LjMwNDggMC42NDMwMDYgMTkuNjQ1NyAwLjY1MzYyNCAxOS45ODk3QzAuNjY0MjQzIDIwLjMzMzcgMC43NjM0MzggMjAuNjY5MSAwLjk0MTYxNyAyMC45NjM1QzEuMTE5OCAyMS4yNTc5IDEuMzcwOTMgMjEuNTAxNCAxLjY3MDczIDIxLjY3MDRDMS45NzA1NCAyMS44MzkzIDIuMzA4ODcgMjEuOTI4MSAyLjY1MyAyMS45MjhIMjEuMzQ3QzIxLjY5MTEgMjEuOTI4MSAyMi4wMjk1IDIxLjgzOTMgMjIuMzI5MyAyMS42NzA0QzIyLjYyOTEgMjEuNTAxNCAyMi44ODAyIDIxLjI1NzkgMjMuMDU4NCAyMC45NjM1QzIzLjIzNjYgMjAuNjY5MSAyMy4zMzU4IDIwLjMzMzcgMjMuMzQ2NCAxOS45ODk3QzIzLjM1NyAxOS42NDU3IDIzLjI3ODcgMTkuMzA0OCAyMy4xMTkgMTlaTTExIDcuNDIzQzExIDcuMTU3NzggMTEuMTA1NCA2LjkwMzQzIDExLjI5MjkgNi43MTU4OUMxMS40ODA0IDYuNTI4MzYgMTEuNzM0OCA2LjQyMyAxMiA2LjQyM0MxMi4yNjUyIDYuNDIzIDEyLjUxOTYgNi41MjgzNiAxMi43MDcxIDYuNzE1ODlDMTIuODk0NiA2LjkwMzQzIDEzIDcuMTU3NzggMTMgNy40MjNWMTMuNDIzQzEzIDEzLjY4ODIgMTIuODk0NiAxMy45NDI2IDEyLjcwNzEgMTQuMTMwMUMxMi41MTk2IDE0LjMxNzYgMTIuMjY1MiAxNC40MjMgMTIgMTQuNDIzQzExLjczNDggMTQuNDIzIDExLjQ4MDQgMTQuMzE3NiAxMS4yOTI5IDE0LjEzMDFDMTEuMTA1NCAxMy45NDI2IDExIDEzLjY4ODIgMTEgMTMuNDIzVjcuNDIzWk0xMi4wNSAxOC45MzNIMTIuMDIyQzExLjYyNzYgMTguOTMxNyAxMS4yNDkgMTguNzc4IDEwLjk2NTQgMTguNTA0MUMxMC42ODE3IDE4LjIzMDEgMTAuNTE1IDE3Ljg1NzEgMTAuNSAxNy40NjNDMTAuNDkyOCAxNy4yNjcgMTAuNTI0NyAxNy4wNzE1IDEwLjU5MzkgMTYuODg4QzEwLjY2MzEgMTYuNzA0NSAxMC43NjgyIDE2LjUzNjYgMTAuOTAzIDE2LjM5NDJDMTEuMDM3OCAxNi4yNTE3IDExLjE5OTYgMTYuMTM3NiAxMS4zNzkxIDE2LjA1ODRDMTEuNTU4NSAxNS45NzkyIDExLjc1MTkgMTUuOTM2NiAxMS45NDggMTUuOTMzSDExLjk3NkMxMi4zNzAzIDE1LjkzMzUgMTIuNzQ5MSAxNi4wODY0IDEzLjAzMzIgMTYuMzU5OUMxMy4zMTcyIDE2LjYzMzMgMTMuNDg0NSAxNy4wMDYgMTMuNSAxNy40QzEzLjUwNzggMTcuNTk2NCAxMy40NzYyIDE3Ljc5MjQgMTMuNDA3MSAxNy45NzY1QzEzLjMzOCAxOC4xNjA1IDEzLjIzMjggMTguMzI4OSAxMy4wOTc3IDE4LjQ3MThDMTIuOTYyNiAxOC42MTQ2IDEyLjgwMDQgMTguNzI5IDEyLjYyMDQgMTguODA4MkMxMi40NDA1IDE4Ljg4NzQgMTIuMjQ2NiAxOC45Mjk4IDEyLjA1IDE4LjkzM1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pbmRpY2F0b3ItZG90XCIgZGF0YS1uYW1lPVwiaW5kaWNhdG9yLWRvdFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMS41XCIvPjwvc3ltYm9sPjwvc3ZnPicpXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvbGlua3M6bG9hZFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWJlZCgpIH0pXG4gIH1cblxuICBlbWJlZCgpXG59KSgpXG4iLCJ2YXIgdG9vbGJveCAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIEV2ZW50TWFuYWdlciA9IEV2ZW50LmNhbGxiYWNrTWFuYWdlcixcbiAgICBTdGFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcbiAgICBpbml0aWFsaXplZCAgPSBmYWxzZSxcbiAgICBNb2RhbHMgICAgICAgPSBbXSxcbiAgICBTdGFjayAgICAgICAgPSBbXSxcbiAgICBGb2N1c1N0YWNrICAgPSBbXVxuXG4vLyBDU1Mgc3R5bGVzIHRvIGhlbHAgcHJldmVudCBzdHJheSBtb2RhbCBjbGlja3MgKGRvZXNuJ3Qgd29yayBpbiBsZXNzIHRoYW4gSUUgMTEpXG52YXIgc3R5bGUgICAgICAgID0gJzxzdHlsZSBpZD1cIm1vZGFsLXRvZ2dsZS1zdHlsZVwiPmJvZHlbZGF0YS1hY3RpdmUtbW9kYWxdICogeyBwb2ludGVyLWV2ZW50czogbm9uZSB9IC5hY3RpdmUtbW9kYWwsIC5hY3RpdmUtbW9kYWwgKiB7IHBvaW50ZXItZXZlbnRzOiBhbGwgfTwvc3R5bGU+J1xuXG4vLyB0eXBlcyBvZiBtb2RhbHNcbi8vIE1lbnUgLSB0cmlnZ2VyIHRvZ2dsZXMsIGNsaWNraW5nIG91dHNpZGUgY2xvc2VzXG4vLyBQYW5lbCAtIHRyaWdnZXIgb3BlbnMsIGJ1dCBkb2VzIG5vdCBjbG9zZSwgY2xpY2tpbmcgb3V0c2lkZSBjbG9zZXNcbi8vIERpYWxvZyAtIHRyaWdnZXIgb3BlbnMsIGNsaWNraW5nIG91dHNpZGUgaXMgaWdub3JlZCwgbXVzdCBiZSBjbG9zZWQgYnkgY2xpY2tpbmcgYSBjbG9zZSBidXR0b24gb3IgdGhlIGVzY2FwZSBrZXlcblxuXG52YXIgTW9kYWwgPSB7XG4gIG5ldzogZnVuY3Rpb24oIGVsLCB0eXBlLCB0cmlnZ2VyICkge1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBtb2RhbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHRyaWdnZXIgZm9yIGEgbW9kYWxcbiAgICB2YXIgbSA9IGdldE1vZGFsKCBlbCApXG4gICAgaWYgKCBtICkge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHRyaWdnZXIgYW5kIHJldHVyblxuICAgICAgaWYgKCB0cmlnZ2VyICkgbS50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcbiAgICAgIHJldHVybiBnZXRNb2RhbCggZWwgKVxuICAgIH1cblxuICAgIHZhciBtb2RhbCA9IHtcbiAgICAgIHRyaWdnZXJzOiBbXSxcbiAgICAgIF9tb2RhbDogICB0cnVlLFxuICAgICAgdHlwZTogICAgIHR5cGUsXG4gICAgICBpZDogICAgICAgTW9kYWxzLmxlbmd0aCxcbiAgICAgIGVsOiAgICAgICBlbCxcblxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIG9wZW46IEV2ZW50TWFuYWdlci5uZXcoKSxcbiAgICAgICAgY2xvc2U6IEV2ZW50TWFuYWdlci5uZXcoKVxuICAgICAgfSxcblxuICAgICAgaXNPcGVuOiBmYWxzZVxuICAgIH1cblxuICAgIG1vZGFsWyB0eXBlIF0gPSB0cnVlIC8vIGNvbnZlbmllbmNlIHR5cGUgY2hlY2tcbiAgICBNb2RhbHMucHVzaCggbW9kYWwgKVxuXG4gICAgLy8gVGFnIG1vZGFsIGVsZW1lbnQgd2l0aCBhbiBpZFxuICAgIGVsLmRhdGFzZXQubW9kYWxJZCA9IG1vZGFsLmlkXG4gICAgLy8gSGlkZSBtb2RhbCBieSBkZWZhdWx0XG4gICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG4gICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1tb2RhbCcsIHRydWUgKVxuXG4gICAgLy8gUmVnaXN0ZXIgZWxlbWVudHMgd2hpY2ggdHJpZ2dlciB0aGUgbW9kYWxcbiAgICBpZiAoIHRyaWdnZXIgKSBtb2RhbC50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcblxuICAgIG1vZGFsLm9uID0gZnVuY3Rpb24gKCB0eXBlLCBjYWxsYmFjayApIHtcbiAgICAgIGlmICggbW9kYWwuZXZlbnRzW3R5cGVdICkge1xuICAgICAgICBtb2RhbC5ldmVudHNbdHlwZV0uYWRkKCBjYWxsYmFjayApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGRlZmF1bHQgb3BlbmluZyBiZWhhdmlvclxuICAgIG1vZGFsLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIG1vZGFsLmlzT3BlbiApIHJldHVyblxuICAgICAgbW9kYWwuaXNPcGVuID0gdHJ1ZVxuICAgICAgbW9kYWwuZXZlbnRzLm9wZW4uc3RhcnQoKVxuICAgICAgbW9kYWwuZXZlbnRzLmNsb3NlLnN0b3AoKVxuXG4gICAgICAvLyBMaXN0ZW4gdG8gZXNjYXBlIGtleSBwcmVzc2VzIGluICdtb2RhbC1hY3RpdmUnIHNjb3BlXG4gICAgICBpZiAoICFTdGFjay5sZW5ndGggKSBFdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5UHJlc3MgKVxuXG4gICAgICBGb2N1c1N0YWNrLnB1c2goIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKVxuICAgICAgU3RhY2sucHVzaCggbW9kYWwgKVxuXG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICdtb2RhbC1hY3RpdmUnIClcbiAgICAgIGRvY3VtZW50LmJvZHkuZGF0YXNldC5tb2RhbCA9IGVsLmlkIHx8ICcnXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgZmFsc2UgKVxuXG4gICAgICAvLyBTZXQgc3RhdGUgb24gbW9kYWwgdHJpZ2dlcnNcbiAgICAgIG1vZGFsLnRyaWdnZXJzLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ21vZGFsLWFjdGl2ZScgKVxuICAgICAgfSlcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdtb2RhbC1pcy1vcGVuaW5nJyApXG5cbiAgICAgIC8vIEFmdGVyIG9wZW5pbmcgYW5pbWF0aW9uLCByZW1vdmUgYW5pbWF0aW9uIGNsYXNzXG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIG1vZGFsLmV2ZW50cy5vcGVuLmZpcmUsIDUwKVxuICAgIH1cblxuICAgIC8vIEFkZCBmaXJzdCBvcGVuIGNhbGxiYWNrXG4gICAgbW9kYWwuZXZlbnRzLm9wZW4uYWRkKCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtaXMtb3BlbmluZycgKVxuICAgIH0pXG5cbiAgICBtb2RhbC5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICggIW1vZGFsLmlzT3BlbiApIHJldHVyblxuXG4gICAgICAvLyBUb2dnbGUgZXZlbnQgY2FsbGJhY2tzXG4gICAgICBtb2RhbC5ldmVudHMub3Blbi5zdG9wKClcbiAgICAgIG1vZGFsLmV2ZW50cy5jbG9zZS5zdGFydCgpXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1pcy1vcGVuaW5nJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnbW9kYWwtaXMtY2xvc2luZycgKVxuICAgICAgXG4gICAgICAvLyBBZnRlciBjbG9zaW5nIGFuaW1hdGlvbiwgaGlkZSwgcG9wIHN0YWNrLCBmaXJlIGNsb3NlIGV2ZW50cy5cbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgbW9kYWwuZXZlbnRzLmNsb3NlLmZpcmUsIDUwIClcbiAgICB9XG5cbiAgICAvLyBBZGQgZmlyc3QgY2xvc2UgY2FsbGJhY2tcbiAgICBtb2RhbC5ldmVudHMuY2xvc2UuYWRkKCBmdW5jdGlvbigpe1xuICAgICAgbW9kYWwuaXNPcGVuID0gZmFsc2VcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG5cbiAgICAgIC8vIFNldCBzdGF0ZSBvbiBtb2RhbCB0cmlnZ2Vyc1xuICAgICAgbW9kYWwudHJpZ2dlcnMuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICB9KVxuICAgICAgXG4gICAgICAvLyBSZW1vdmUgdGhpcyBtb2RhbCBmcm9tIHRoZSBzdGFja1xuICAgICAgU3RhY2sucG9wKClcblxuICAgICAgLy8gUmVzdG9yZSBmb3VjcyBmb3IgZGlhbG9ncyBhbmQgbW9kYWwgbWVudXNcbiAgICAgIC8vIFRoaXMgcmV0dXJucyB1c2VycyB0byB0aGVpciBwbGFjZSBvbiB0aGUgcGFnZVxuICAgICAgLy8gVGhpcyBkb2Vzbid0IG9jY3VyIG9uIG1vZGFsIHBhbmVscyBiZWNhdXNlIGZvY3VzaW5nXG4gICAgICAvLyBvcGVucyBwYW5lbHMuIFRoZXJlIG1heSBiZSBhIGdvb2QgZml4IGZvciB0aGlzIGF0IHNvbWUgcG9pbnQuXG4gICAgICB2YXIgZm9jdXNFbCA9IEZvY3VzU3RhY2sucG9wKClcbiAgICAgIGlmICggbW9kYWwuZGlhbG9nIHx8IG1vZGFsLm1lbnUgKSBmb2N1c0VsLmZvY3VzKClcblxuICAgICAgLy8gSWYgaXQncyB0aGUgbGFzdCBtb2RhbCBvcGVuLCByZXN0b3JlIG5vbi1tb2RhbCBzdGF0ZVxuICAgICAgaWYgKCAhU3RhY2subGVuZ3RoICkge1xuICAgICAgICBFdmVudC5vZmYoIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVByZXNzIClcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICAgIGRvY3VtZW50LmJvZHkuZGF0YXNldC5tb2RhbCA9ICcnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmRhdGFzZXQubW9kYWwgPSBhY3RpdmVNb2RhbCgpLmVsLmlkXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBtb2RhbFxuICB9XG59XG5cbi8vIEFkZCBldmVudHMgdG8gbW9kYWxcbmZ1bmN0aW9uIG9uICggc2VsZWN0b3IsIGV2ZW50LCBjYWxsYmFjayApIHtcbiAgdmFyIG1vZGFsID0gZ2V0TW9kYWwoIHNlbGVjdG9yIClcbiAgaWYgKCBtb2RhbCAmJiBtb2RhbC5ldmVudHNbZXZlbnRdICkge1xuICAgIG1vZGFsLmV2ZW50c1tldmVudF0uYWRkKCBjYWxsYmFjayApXG4gICAgcmV0dXJuIG1vZGFsXG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2UgKCBtb2RhbCApIHtcbiAgLy8gRGlkIHRoZXkgc3BlY2lmeSBhIG1vZGFsIHRvIGNsb3NlP1xuICBpZiAoIHR5cGVvZiBtb2RhbCAhPSAndW5kZWZpbmVkJyApIHtcbiAgICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gICAgaWYgKCBtb2RhbCApIG1vZGFsLmNsb3NlKClcblxuICAvLyBObz8gQXNzdW1lIGN1cnJlbnQgbW9kYWwgc2hvdWxkIGJlIGNsb3NlZFxuICB9IGVsc2Uge1xuICAgIG1vZGFsID0gYWN0aXZlTW9kYWwoKVxuICAgIGlmICggbW9kYWwgKSBtb2RhbC5jbG9zZSgpXG4gIH1cblxuICByZXR1cm4gbW9kYWxcbn1cblxuZnVuY3Rpb24gb3BlbiAoIG1vZGFsICkge1xuICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gIGlmICggbW9kYWwgKSBtb2RhbC5vcGVuKClcblxuICByZXR1cm4gbW9kYWxcbn1cblxuLy8gQ2xpY2tzIHdoaWNoIG9jY3VyIHdoZW4gYSBtb2RhbCBpcyBhY3RpdmVcbmZ1bmN0aW9uIGFjdGl2ZUNsaWNrICggZXZlbnQgKSB7XG4gIHZhciBtb2RhbCA9IGFjdGl2ZU1vZGFsKClcblxuICAvLyBEaWQgdGhlIGNsaWNrIGhhcHBlbiBpbiBzaWRlIHRoZSBtb2RhbCwgb3IgaW4gYSBtb2RhbCBzYWZlIGNvbnRyb2w/XG4gIHZhciBtb2RhbENsaWNrID0gdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdbZGF0YS1tb2RhbC1pZD1cIicrbW9kYWwuaWQrJ1wiXScgKVxuICB2YXIgcGFuZWxDbGljayA9IG1vZGFsLnBhbmVsICYmIHRvb2xib3guZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnW2RhdGEtZm9yLW1vZGFsPVwiJyttb2RhbC5pZCsnXCJdJyApXG5cbiAgLy8gU3RvcCB0aGUgY2xpY2sgaWYgaXQgaGFwcGVuZWQgb3V0c2lkZSB0aGUgbW9kYWwgb3IgcGFuZWwgY29udHJvbFxuICBpZiAoICFtb2RhbENsaWNrICYmICFwYW5lbENsaWNrICkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgaWYgKCBtb2RhbC5wYW5lbCApIG1vZGFsLmNsb3NlKClcbiAgfVxufVxuXG4vLyBVc2UgdGhlIHN0YWNrIHBvc2l0aW9uIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBtb2RhbFxuZnVuY3Rpb24gYWN0aXZlTW9kYWwgKCkge1xuICByZXR1cm4gU3RhY2tbIFN0YWNrLmxlbmd0aCAtIDEgXVxufVxuXG5mdW5jdGlvbiBhY3RpdmVQYW5lbCAoKSB7XG4gIHJldHVybiBhY3RpdmVNb2RhbCgpLnF1ZXJ5U2VsZWN0b3IoICdbYXJpYS1tb2RhbD10cnVlXVthcmlhLWV4cGFuZGVkPXRydWVdJyApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG4vLyBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYnkgaWQgb3Igc2VsZWN0b3JcbmZ1bmN0aW9uIGdldE1vZGFsICggc2VhcmNoICkge1xuXG4gIC8vIERvbid0IGFjY2VwdCBnYXJiYWdlIGlucHV0XG4gIGlmICggIXNlYXJjaCApIHJldHVyblxuXG4gIC8vIFdhcyBhIG1vZGFsIG9iamVjdCBwYXNzZWQgaW4/IEp1c3QgcmV0dXJuIGl0XG4gIGlmICggc2VhcmNoLl9tb2RhbCApIHJldHVybiBzZWFyY2hcblxuICAvLyBJcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/IChwYXNzZWQgYW4gaWQpXG4gIGlmICggTW9kYWxzWyBzZWFyY2ggXSApIHJldHVybiBNb2RhbHNbIHNlYXJjaCBdXG5cbiAgLy8gVHJ5IG1vZGFsIHRyaWdnZXJzXG4gIGlmICggaXNFbGVtZW50KCBzZWFyY2ggKSApIHtcbiAgICAvLyBJcyBpdCBhIG1vZGFsIHRyaWdnZXI/XG4gICAgaWYgKCBzZWFyY2guZGF0YXNldC5mb3JNb2RhbCApIHJldHVybiBNb2RhbHNbIHNlYXJjaC5kYXRhc2V0LmZvck1vZGFsIF1cbiAgICBcbiAgICAvLyBJcyBpdCB0aGUgY2hpbGQgb2YgYSBtb2RhbCB0cmlnZ2VyP1xuICAgIHZhciBwYXJlbnQgPSB0b29sYm94LmdldENsb3Nlc3QoIHNlYXJjaCAsICdbZGF0YS1mb3ItbW9kYWxdJyApXG4gICAgaWYgKCBwYXJlbnQgKSByZXR1cm4gTW9kYWxzWyBwYXJlbnQuZGF0YXNldC5mb3JNb2RhbCBdXG4gIH1cblxuICBpZiAoIHR5cGVvZiBzZWFyY2ggPT09ICdzdHJpbmcnICkge1xuXG4gICAgLy8gV2VsbCwgbGV0J3MgaG9wZSBpdCdzIGEgRE9NIHNlbGVjdG9yXG4gICAgdmFyIG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VhcmNoIClcblxuICAgIC8vIElmIGl0IGlzIHdvbyBob29cbiAgICBpZiAoIG1vZGFsICYmIG1vZGFsLmRhdGFzZXQubW9kYWxJZCApIHtcbiAgICAgIHJldHVybiBNb2RhbHNbIG1vZGFsLmRhdGFzZXQubW9kYWxJZCBdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKCkge1xuICAvLyBTZWFyY2ggZm9yIHRocmVlIHR5cGVzIG9mIG1vZGFsc1xuICBbJ3BhbmVsJywgJ21lbnUnLCAnZGlhbG9nJ10uZm9yRWFjaCggZnVuY3Rpb24oIHR5cGUgKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtc2hvdy0nK3R5cGUrJ10nICksIGZ1bmN0aW9uKCB0cmlnZ2VyRWwgKSB7XG4gICAgICB2YXIgbW9kYWxFbFxuXG4gICAgICAvLyBHZXQgc2VsZWN0b3JcbiAgICAgIHZhciBzZWxlY3RvciA9IHRyaWdnZXJFbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNob3ctJyt0eXBlIClcbiAgICAgIGlmICggc2VsZWN0b3IgKSBtb2RhbEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKVxuXG4gICAgICBpZiAoIG1vZGFsRWwgKSB7XG4gICAgICAgIHZhciBtb2RhbCA9IE1vZGFsLm5ldyggbW9kYWxFbCwgdHlwZSwgdHJpZ2dlckVsIClcblxuICAgICAgICAvLyBBc3NpZ24gdGhlIHRyaWdnZXIgdG8gdGhpcyBtb2RhbElkIGZvciBlYXN5IHJlZmVyZW5jZSBsYXRlclxuICAgICAgICB0cmlnZ2VyRWwuZGF0YXNldC5mb3JNb2RhbCA9IG1vZGFsLmlkXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoIE1vZGFscy5sZW5ndGggPiAwICYmICFpbml0aWFsaXplZCApIHtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyYmVnaW4nLCBzdHlsZSApIFxuICAgIGluaXRpYWxpemVkID0gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCAoIGV2ZW50ICkge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCggZXZlbnQuY3VycmVudFRhcmdldCApXG4gIHZhciBlbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICBpZiAoIGVsLnRhZ05hbWUgPT0gJ0lOUFVUJyApIHtcblxuICAgIC8vIERvbid0IG9wZW4gd2hlbiBpbnB1dCBpcyBmb2N1c2VkXG4gICAgLy9pZiAoIGV2ZW50LnR5cGUgPT0gJ2ZvY3VzaW4nICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG5cbiAgICAvLyBEbyBub3QgdHJpZ2dlciBvcGVuIGlmIGlucHV0IGV2ZW50IGNsZWFycyBpbnB1dCB2YWx1ZVxuICAgIGlmICggZXZlbnQudHlwZSA9PSAnaW5wdXQnICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG4gIH1cblxuICAvLyBEb24ndCBmb2xsb3cgbGlua3MgdXNlZCB0byB0cmlnZ2VyIG1vZGFsc1xuICBpZiAoIGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYScgJiYgZWwuaHJlZiA9PSAnIycgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cblxuICBvcGVuKCBtb2RhbCApXG5cbn1cblxuZnVuY3Rpb24ga2V5UHJlc3MgKCBldmVudCApIHtcbiAgdmFyIGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gIC8vIEVTQyB3YXMgcHJlc3NlZFxuICBpZiAoIEV2ZW50LmtleS5pc1ByZXNzZWQoXCJlc2NcIikgKSB7XG4gICAgLy8gQSB3YXkgdG8gc3RvcCBjbGVhcmluZyB0aGUgaW5wdXQgdmFsdWVcbiAgICAvL2lmICggYWN0aXZlRWwudGFnTmFtZSA9PSAnSU5QVVQnICYmIGFjdGl2ZUVsLnZhbHVlICE9ICcnICkge1xuICAgICAgLy9ldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgLy99XG4gICAgcmV0dXJuIGNsb3NlKClcbiAgfVxuXG4gIGlmICggYWN0aXZlTW9kYWwoKS5tb2RhbCAmJiBFdmVudC5rZXkuaXNQcmVzc2VkKFwidGFiXCIpICkge1xuICAgIGZvY3VzTmV4dCggZXZlbnQgKVxuICB9XG5cbiAgLy8gXG4gIGlmICggYWN0aXZlTW9kYWwoKS5wYW5lbCB8fCBhY3RpdmVNb2RhbCgpLm1lbnUgKSB7XG4gICAgdmFyIGxpbmtcblxuICAgIGlmICggRXZlbnQua2V5LmlzUHJlc3NlZChcImRvd25cIikgKSB7XG4gICAgICAvLyBQcmV2ZW50IHBhZ2Ugc2Nyb2xsaW5nIGFzIGEgcmVzdWx0IG9mIGtleXByZXNzXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsaW5rID0gZ2V0TmV4dExpbmsoKVxuICAgIH1cblxuICAgIGlmICggRXZlbnQua2V5LmlzUHJlc3NlZChcInVwXCIpICkge1xuICAgICAgLy8gUHJldmVudCBwYWdlIHNjcm9sbGluZyBhcyBhIHJlc3VsdCBvZiBrZXlwcmVzc1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgbGluayA9IGdldFByZXZpb3VzTGluaygpXG4gICAgfVxuXG4gICAgLy8gT25seSBmb2N1cyBpZiB0aGVyZSBpcyBhIG5leHQgb3IgcHJldmlvdXMgbGluayB0byBtb3ZlIHRvXG4gICAgLy8gQXQgdG9wIG9yIGJvdHRvbSBvZiBhIGxpc3QgdGhlcmUgaXMgbm8gXCJuZXh0XCIgb3IgXCJwcmV2aW91c1wiXG4gICAgaWYgKCBsaW5rICkgbGluay5mb2N1cygpXG5cbiAgfVxufVxuXG5mdW5jdGlvbiBmb2N1c05leHQoIGV2ZW50ICkge1xuICB2YXIgbW9kYWxFbCAgICAgPSBhY3RpdmVNb2RhbCgpLmVsLFxuICAgICAgZm9jdXNhYmxlICAgPSBtb2RhbEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uJyksXG4gICAgICBmaXJzdCAgICAgICA9IGZvY3VzYWJsZVswXSxcbiAgICAgIGxhc3QgICAgICAgID0gZm9jdXNhYmxlW2ZvY3VzYWJsZS5sZW5ndGggLSAxXSxcbiAgICAgIGZvY3VzZWQgICAgID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gIC8vIElmIGZvY3VzZWQgb24gdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsIHRhYiB0byB0aGUgZmlyc3QgZWxlbWVudC5cbiAgaWYgKCBmb2N1c2VkID09IGxhc3QgJiYgIUV2ZW50LmtleS5zaGlmdCApIHtcbiAgICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuICAgIGZpcnN0LmZvY3VzKClcbiAgfVxuXG4gIGlmICggZm9jdXNlZCA9PSBmaXJzdCAmJiBFdmVudC5rZXkuc2hpZnQgKSB7XG4gICAgaWYgKCBldmVudCApeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cbiAgICBsYXN0LmZvY3VzKClcbiAgfVxuXG4gIC8vIEZvY3VzIG9uIHRoZSBmaXJzdCBlbGVtZW50IGlmIHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIG1vZGFsXG4gIGlmICggIWZvY3VzZWQgfHwgIXRvb2xib3guY2hpbGRPZiggZm9jdXNlZCwgbW9kYWxFbCApICkge1xuICAgIGZpcnN0LmZvY3VzKClcbiAgfVxufVxuXG4vLyBGaW5kIHRoZSBuZXh0IGZvY3VzYWJsZSBsaW5rXG5mdW5jdGlvbiBnZXROZXh0TGluayAoZWwpIHtcbiAgdmFyIGl0ZW1zID0gbGlua3MoKVxuICB2YXIgcG9zID0gYWN0aXZlUG9zaXRpb24oKVxuXG4gIC8vIE5vIGFjdGl2ZSBlbGVtZW50OiByZXR1cm4gZmlyc3QgZWxlbWVudFxuICBpZiAoIHBvcyA9PSAtMSApIHJldHVybiBpdGVtc1sgMCBdXG5cbiAgLy8gTGFzdCBlbGVtZW50IGZvY3VzZWQsIHJldHVybiBub3RoaW5nIChubyBuZXh0IGVsZW1lbnQpXG4gIGVsc2UgaWYgKCBwb3MgPT0gaXRlbXMubGVuZ3RoICkgcmV0dXJuXG5cbiAgLy8gcmV0dXJuIG5leHQgZm9jdXNhYmxlIGxpbmtcbiAgZWxzZSByZXR1cm4gaXRlbXNbIHBvcyArIDEgXVxufVxuXG4vLyBGaW5kIHRoZSBwcmV2aW91cyBmb2N1c2FibGUgbGlua1xuZnVuY3Rpb24gZ2V0UHJldmlvdXNMaW5rIChlbCkge1xuICB2YXIgaXRlbXMgPSBsaW5rcygpXG4gIHZhciBwb3MgPSBhY3RpdmVQb3NpdGlvbigpXG5cbiAgLy8gTm8gcHJldmlvdXMgZWxlbWVudCB0byBzZWxlY3RcbiAgaWYgKCBwb3MgPT0gLTEgfHwgcG9zID09IDAgKSByZXR1cm5cblxuICAvLyByZXR1cm4gcHJldmlvdXMgZm9jdXNhYmxlIGxpbmtcbiAgZWxzZSByZXR1cm4gaXRlbXNbIHBvcyAtIDEgXVxufVxuXG4vLyBTZWFyY2ggbGlua3MgaW4gdGhlIGN1cnJlbnQgbW9kYWwgZm9yIGFuIGFjdGl2ZSAoZm9jdXNlZCkgZWxlbWVudFxuZnVuY3Rpb24gYWN0aXZlUG9zaXRpb24gKCkge1xuICByZXR1cm4gbGlua3MoKS5pbmRleE9mKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IClcbn1cblxuLy8gUmV0dXJuIGFsbCBsaW5rcyBpbiBjdXJyZW50IG1vZGFsXG5mdW5jdGlvbiBsaW5rcyAoKSB7XG4gIHJldHVybiB0b29sYm94LnNsaWNlKCBhY3RpdmVNb2RhbCgpLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoICdhJyApICkuZmlsdGVyKCBmdW5jdGlvbiggYSApIHtcbiAgICByZXR1cm4gIXRvb2xib3guZ2V0Q2xvc2VzdCggYSwgJ1thcmlhLWhpZGRlbj1cInRydWVcIl0nIClcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0dXAgKCkge1xuICBFdmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIGluaXQoKVxuXG4gICAgLy8gQ2hlY2sgYWxsIGJvZHkgY2xpY2tzIHRvIHNlZSBpZiB0aGV5IHNob3VsZCBiZSBwZXJtaXR0ZWRcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdib2R5Lm1vZGFsLWFjdGl2ZScsIGFjdGl2ZUNsaWNrLCB7IHVzZUNhcHR1cmU6IHRydWUgfSkgXG5cbiAgICAvLyBUcmlnZ2VyIG1vZGFscyBvbiBpbnB1dCBldmVudHMgKGxpa2UgYSBzZWFyY2ggcmVzdWx0cyBwYW5lbCB0aGF0IHdhaXRzIHVudGlsIHR5cGluZyB0byBzaG93KVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ2lucHV0W2RhdGEtZm9yLW1vZGFsXSwgW2RhdGEtZm9yLW1vZGFsXSBpbnB1dCcsIEV2ZW50LmRlYm91bmNlKCB0cmlnZ2VyRXZlbnQsIDUwLCB7IGxlYWRpbmc6IHRydWUgfSkgKVxuICAgIFxuICAgIC8vIFRyaWdnZXIgbW9kYWxzIG9uIGtleXVwIGV2ZW50cyBpbiBpbnB1dHMgKGxpa2UgYSBzZWFyY2ggcmVzdWx0cyBwYW5lbCB0aGF0IHdhaXRzIHVudGlsIHR5cGluZyB0byBzaG93KVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrIGZvY3VzaW4nLCAnaW5wdXRbZGF0YS1mb3ItbW9kYWxdLCBbZGF0YS1mb3ItbW9kYWxdIGlucHV0JywgdHJpZ2dlckV2ZW50IClcblxuICAgIC8vIFRyaWdnZXIgbW9kYWxzIG9uIGNsaWNrIGV2ZW50cyBmb3IgYW5jaG9ycyBhbmQgYnV0dG9uc1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ2FbZGF0YS1mb3ItbW9kYWxdLCBidXR0b25bZGF0YS1mb3ItbW9kYWxdLCBbZGF0YS1mb3ItbW9kYWxdIGEsIFtkYXRhLWZvci1tb2RhbF0gYnV0dG9uJywgdHJpZ2dlckV2ZW50IClcblxuICAgIEV2ZW50LmtleU9uKCAnZXNjJywgY2xvc2UgKVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV3OiBNb2RhbC5uZXcsXG4gIGxpbmtzOiBsaW5rcyxcbiAgc2V0dXA6IHNldHVwLFxuICBtb2RhbHM6IE1vZGFscyxcbiAgaW5pdDogaW5pdCxcbiAgZ2V0OiBnZXRNb2RhbCxcbiAgYWN0aXZlOiBhY3RpdmVNb2RhbCxcbiAgb246IG9uLFxuICBpc0VsZW1lbnQ6IGlzRWxlbWVudFxufVxuIiwidmFyIHRvb2xib3ggID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgbW9kYWwgICAgPSByZXF1aXJlKCAnLi9fbW9kYWwnICksXG4gICAgc3RhY2sgICAgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcblxuLy8gRm9jdXMgb24gc2VhcmNoIHdoZW4gYC9gIGtleSBpcyBwcmVzc2VkXG5FdmVudC5rZXlPbiggJy8nLCBmdW5jdGlvbihldmVudCl7IFxuICB2YXIgcSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXFdJylcbiAgaWYgKCBxICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBxLmZvY3VzKClcbiAgfVxufSlcblxuLy8gUmVzZXQgc2VhcmNoIHJlc3VsdHMgcGFuZWwgd2hlbiBxdWVyeSBpcyBjbGVhcmVkXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKSB7XG4gIHZhciBzZWFyY2hTdGFjayA9IHN0YWNrLmdldCggJyNzZWFyY2gtc3RhY2snIClcbiAgdmFyIHEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1xXScpXG4gIHZhciBzZWFyY2hNb2RhbCA9IG1vZGFsLmdldCggJyNzZWFyY2gtcmVzdWx0cycgKVxuXG4gIGlmICggIXNlYXJjaE1vZGFsIHx8ICFxICkgcmV0dXJuXG5cbiAgZnVuY3Rpb24ga2V5V2F0Y2hlciAoIGV2ZW50ICkge1xuICAgIHZhciBmb2N1c0VsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gICAgLy8gSWYgYSBsZXR0ZXIsIG51bWJlciwgb3IgYmFja3NwYWNlIGlzIHByZXNzZWQgZm9jdXMgb24gc2VhcmNoIGlucHV0XG4gICAgaWYgKCBmb2N1c0VsICE9IHEgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSB8fCBFdmVudC5rZXkuaXNQcmVzc2VkKFwiYmFja3NwYWNlXCIpICkge1xuICAgICAgcS5mb2N1cygpXG5cbiAgICAvLyBSZXN0b3JlIGRlZmF1bHQgc2VhcmNoIGlucHV0IGJlaGF2aW9yXG4gICAgLy8gV2hlbiBmb3Vjc2VkLCBlc2MgY2xlYXJzIGlucHV0XG4gICAgfSBlbHNlIGlmICggZm9jdXNFbCA9PSBxICYmIEV2ZW50LmtleS5pc1ByZXNzZWQoIFwiZXNjXCIgKSApIHtcbiAgICAgIHEudmFsdWUgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIC8vIFNjcm9sbCBhbGwgbmF2cyBiYWNrIHRvIHRvcFxuICBmdW5jdGlvbiByZXNldFNjcm9sbCAoKSB7XG4gICAgdG9vbGJveC5lYWNoKCBzZWFyY2hTdGFjay5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoICduYXYnICksIGZ1bmN0aW9uIChuYXYpIHtcbiAgICAgIG5hdi5zY3JvbGxUb3AgPSAwXG4gICAgfSlcbiAgfVxuXG4gIHNlYXJjaE1vZGFsLm9uKCAnb3BlbicsIGZ1bmN0aW9uKCkge1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2tleWRvd24nLCBrZXlXYXRjaGVyIClcbiAgfSlcblxuICAvLyBSZXNldCBzdGFjayB3aGVuIG1vZGFsIGlzIGNsb3NlZCBhbmQgcXVlcnkgaXMgY2xlYXJcbiAgc2VhcmNoTW9kYWwub24oICdjbG9zZScsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFJlc3RvcmUgc3RhdGUgb2Ygc2VhcmNoIHBhbmVsXG4gICAgaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbbmFtZT1xXScgKS52YWx1ZSA9PSAnJyApIHtcbiAgICAgIHNlYXJjaFN0YWNrLnJlc2V0KClcbiAgICAgIHJlc2V0U2Nyb2xsKClcbiAgICB9XG5cbiAgICBFdmVudC5vZmYoIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVdhdGNoZXIgKVxuICB9KVxuXG4gIC8vIFNob3cgZmlyc3QgcGFuZWwgc3RhY2sgd2hlbiBxdWVyeSBpcyBjbGVhcmVkXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ1tuYW1lPXFdJywgRXZlbnQuZGVib3VuY2UoIGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgaWYgKCBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlID09ICcnICkge1xuICAgICAgc2VhcmNoU3RhY2suc2hvdyggMCApXG4gICAgICByZXNldFNjcm9sbCgpXG4gICAgfVxuICB9LCA1MCApKVxuXG4gIC8vIFdpcmUgdXAgY2xlYXIgc2VhcmNoIGlucHV0IGJlaGF2aW9yXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5jbGVhci1zZWFyY2gnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICAgIHZhciBzZWFyY2hJbnB1dCA9IHRvb2xib3guZ2V0Q2xvc2VzdCggYnV0dG9uLCAnbGFiZWwnICkucXVlcnlTZWxlY3RvciggJy5pbnB1dC1jb250YWluZXIgaW5wdXQnIClcbiAgICBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnXG4gICAgRXZlbnQuZmlyZSggc2VhcmNoSW5wdXQsICdpbnB1dCcgKVxuXG4gICAgc2VhcmNoSW5wdXQuZm9jdXMoKVxuICB9LCB7IHVzZUNhcHR1cmU6IHRydWUgfSlcbn0pXG4iLCJ2YXIgdG9vbGJveCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGNvb2tpZSAgICAgID0gcmVxdWlyZSggJy4vX2Nvb2tpZScgKSxcbiAgICBFdmVudCAgICAgICA9IHRvb2xib3guZXZlbnRcblxuRXZlbnQucmVhZHkoIGZ1bmN0aW9uKCkge1xuICBFdmVudC5rZXlPbiggJ2VzYycsICdzaWRlYmFyJywgdG9nZ2xlIClcbiAgRXZlbnQua2V5T24oICddLFssXFxcXCcsIHRvZ2dsZSApXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5zaWRlYmFyLW5hdi10b2dnbGUnLCB0b2dnbGUgKVxufSlcblxuZnVuY3Rpb24gdG9nZ2xlKCkge1xuXG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSggJ3Nob3ctc2lkZWJhcicgKVxuXG4gIGlmICggZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoICdzaG93LXNpZGViYXInICkgKVxuICAgIEV2ZW50LmtleS5zZXRTY29wZSggJ3NpZGViYXInIClcbiAgZWxzZVxuICAgIEV2ZW50LmtleS5zZXRTY29wZSggJ2FsbCcgKVxufVxuIiwidmFyIHRvb2xib3ggICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgICAgICAgID0gdG9vbGJveC5ldmVudCxcbiAgICBTdGFja3MgICAgICAgPSBbXVxuXG52YXIgU3RhY2sgPSB7XG4gIG5ldzogZnVuY3Rpb24oIHJvb3QgKSB7XG5cbiAgICBpZiAoICFpc0VsZW1lbnQoIHJvb3QgKSApIHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCByb290IClcblxuICAgIC8vIERvbid0IGFkZCBhIG5ldyBzdGFjayBpZiBubyBlbGVtZW50IGZvdW5kIG9yIGlmIHN0YWNrIGFscmVhZHkgZXhpc3RzXG4gICAgaWYgKCAhaXNFbGVtZW50KCByb290ICkgfHwgcm9vdC5kYXRhc2V0LnN0YWNrSWQgKSByZXR1cm5cblxuICAgIC8vIFNldCB1cCBzdGFjayBieSBzZWFyY2hpbmcgRE9NIG5vZGUgdW5kZXIgaXQuXG4gICAgLy8gVGhlIGZpcnN0IGNoaWxkIGZvdW5kIHdpbGwgYmUgc2V0IHVwIGFzIGEgZGVmYXVsdFxuICAgIC8vIEFmdGVyIHRoYXQgZWFjaCBjaGlsZCB3aWxsIGJlIGFkZGVkIGFzIGEgc3RhY2sgcHVzaFxuXG4gICAgdmFyIHN0YWNrID0ge1xuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIHBhbmVsczogW10sXG4gICAgICBmb2N1czogW10sXG4gICAgICBjdXJyZW50OiBudWxsLFxuXG4gICAgICBhZGQ6IGZ1bmN0aW9uICggcGFuZWxFbCwgbmFtZSApIHtcbiAgICAgICAgcGFuZWxFbC5kYXRhc2V0LnN0YWNrSW5kZXggPSBzdGFjay5wYW5lbHMubGVuZ3RoXG5cbiAgICAgICAgaGlkZUVsKCBwYW5lbEVsIClcblxuICAgICAgICBzdGFjay5wYW5lbHMucHVzaCggcGFuZWxFbCApXG4gICAgICB9LFxuXG4gICAgICAvLyBSZXNldCBzdGFjayB0byBmaXJzdCBwYW5lbFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQWxyZWFkeSByZXNldD8gV2UncmUgZG9uZS5cbiAgICAgICAgaWYgKCBzdGFjay5jdXJyZW50ID09IDAgKSByZXR1cm5cblxuICAgICAgICAvLyBJZiBoaWRkZW4gb3IgZmlyc3QgaXMgZW1wdHksIGhpZGUgYWxsXG4gICAgICAgIGlmICggc3RhY2sucm9vdC5vZmZzZXRQYXJlbnQgPT0gbnVsbCApIHtcbiAgICAgICAgICBzdGFjay5mb2N1cyA9IFtdIC8vIENsZWFyIGZvY3VzIHN0YWNrXG5cbiAgICAgICAgICAvLyBIaWRlIGFuZCByZXNldCBzY3JvbGwgb24gYWxsIHBhbmVsc1xuICAgICAgICAgIHN0YWNrLmhpZGVQYW5lbHMoKVxuXG4gICAgICAgICAgLy8gU2hvdyBmaXJzdCBwYW5lbFxuICAgICAgICAgIGlmICggaXNFbXB0eSggcGFuZWwgKSApIHtcbiAgICAgICAgICAgIHN0YWNrLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YWNrLmN1cnJlbnQgPSAwXG4gICAgICAgICAgfVxuICAgICAgICAgIHNob3dFbCggc3RhY2sucGFuZWxzWzBdIClcbiAgICAgICAgICBzdGFjay51cGRhdGVXYXRjaGVycygpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBub3QgaGlkZGVuLCBkaXNtaXNzIGN1cnJlbnQgcGFuZWwgYW5kIHJlc2V0IHRvIGZpcnN0IHBhbmVsXG4gICAgICAgIGVsc2Ugc3RhY2suc2hvdyggMCApXG4gICAgICB9LFxuXG4gICAgICAvLyBTaG93IGEgc3BlY2lmaWMgcGFuZWwsIGhpZGluZyBhbGwgb3RoZXJzXG4gICAgICBzaG93OiBmdW5jdGlvbiAoIG5hbWUgKSB7XG4gICAgICAgIHZhciBwYW5lbCA9IHN0YWNrLmZpbmRQYW5lbCggbmFtZSApXG4gICAgICAgIGlmICggIXBhbmVsICkgcmV0dXJuIC8vIFRoaXMgcGFuZWwgZG9lc24ndCBleGlzdFxuXG4gICAgICAgIGlmICggaXNFbXB0eSggcGFuZWwgKSApIHtcbiAgICAgICAgICBzdGFjay5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIHN0YWNrLmhpZGVQYW5lbHMoKVxuICAgICAgICAgIHN0YWNrLnVwZGF0ZVdhdGNoZXJzKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJyZW50ID0gc3RhY2suY3VycmVudFBhbmVsKClcbiAgICAgICAgaWYgKCAhY3VycmVudCApIHJldHVybiBzdGFjay5lbnRlciggcGFuZWwgKSAvLyB0aGUgc3RhY2sgaXNuJ3QgY3VycmVudGx5IGFjdGl2ZVxuXG4gICAgICAgIC8vIElmIGEgcGFuZWwgaXNuJ3QgdGhlIGN1cnJlbnQgcGFuZWxcbiAgICAgICAgaWYgKCBwYW5lbCAhPSBjdXJyZW50ICkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIERpc21pc3MgaXQgd2l0aCB0aGUgY2FsbGJhY2sgbG9hZCBpbiB0aGUgbmV4dCBwYW5lbFxuICAgICAgICAgIHJldHVybiBzdGFjay5kaXNtaXNzKCBzdGFjay5kaXJlY3Rpb24oIHBhbmVsICksIGZ1bmN0aW9uKCkgeyBcbiAgICAgICAgICAgIHN0YWNrLmVudGVyKCBwYW5lbCApXG4gICAgICAgICAgfSlcblxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBlbnRlcjogZnVuY3Rpb24gKCBlbCApIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHN0YWNrLmRpcmVjdGlvbiggZWwgKVxuICAgICAgICBlbC5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuICAgICAgICBzdGFjay5jdXJyZW50ID0gTnVtYmVyKCBlbC5kYXRhc2V0LnN0YWNrSW5kZXggKVxuXG4gICAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWwuZGF0YXNldC5kaXJlY3Rpb24gPSAnJ1xuICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdlbnRlcicgKVxuICAgICAgICB9LCA1MCApXG5cbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2VudGVyJyApXG4gICAgICAgIHNob3dFbCggZWwgKVxuXG4gICAgICAgIHN0YWNrLnVwZGF0ZVdhdGNoZXJzKClcblxuICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAnZm9yd2FyZCcgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3YXMgaW4gdGhlIHN0YWNrXG4gICAgICAgICAgLy9pZiAoIHRvb2xib3guY2hpbGRPZiggc3RhY2subGFzdEZvY3VzKCksIHN0YWNrLnJvb3QgKSApIHtcblxuICAgICAgICAgICAgLy8gZm9jdXMgb24gdGhlIGZpcnN0IGlucHV0XG4gICAgICAgICAgICAvL3ZhciBmaXJzdEl0ZW0gPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQ6bm90KFtoaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYVt0YWJpbmRleF0nIClcbiAgICAgICAgICAgIC8vaWYgKCBmaXJzdEl0ZW0gKSBmaXJzdEl0ZW0uZm9jdXMoKVxuICAgICAgICAgIFxuICAgICAgICAgIC8vfVxuXG4gICAgICAgIH0gXG5cbiAgICAgICAgLy8gV2hlbiByZXZlcnNpbmcsIGZvY3VzIG9uIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudFxuICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAncmV2ZXJzZScgJiYgc3RhY2suZm9jdXMubGVuZ3RoID4gMCApIHtcbiAgICAgICAgICBzdGFjay5mb2N1cy5wb3AoKS5mb2N1cygpXG4gICAgICAgIH0gICAgICBcbiAgICAgIH0sXG5cbiAgICAgIGRpc21pc3M6IGZ1bmN0aW9uICggZGlyZWN0aW9uLCBjYWxsYmFjayApIHtcblxuICAgICAgICB2YXIgZWwgPSBzdGFjay5jdXJyZW50UGFuZWwoKVxuXG4gICAgICAgIGlmICggZGlyZWN0aW9uID09ICdmb3J3YXJkJyApXG4gICAgICAgICAgc3RhY2suZm9jdXMucHVzaCggZG9jdW1lbnQuYWN0aXZlRWxlbWVudCApXG5cbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2VudGVyJyApXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdleGl0JyApXG4gICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBFbnN1cmUgcGFuZWwgaXMgc2Nyb2xsZWQgdG8gdG9wXG4gICAgICAgICAgaWYgKCBkaXJlY3Rpb24gPT0gJ3JldmVyc2UnICkgZWwuc2Nyb2xsVG9wID0gMFxuXG4gICAgICAgICAgaGlkZUVsKCBlbCApXG4gICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2V4aXQnIClcbiAgICAgICAgICBlbC5kYXRhc2V0LmRpcmVjdGlvbiA9ICcnXG5cbiAgICAgICAgICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIGNhbGxiYWNrKClcblxuICAgICAgICB9LCA1MCApXG5cbiAgICAgIH0sXG5cbiAgICAgIGhpZGVQYW5lbHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdGFjay5wYW5lbHMuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkgeyBcbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSAwXG4gICAgICAgICAgaGlkZUVsKCBlbCApXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICBsYXN0Rm9jdXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RhY2suZm9jdXNbIHN0YWNrLmZvY3VzLmxlbmd0aCAtMSBdIFxuICAgICAgfSxcblxuICAgICAgLy8gRmluZCBhIHBhbmVsIGJ5IG5hbWUgb3IgaW5kZXhcbiAgICAgIGZpbmRQYW5lbDogZnVuY3Rpb24gKCBuYW1lICkge1xuICAgICAgICBpZiAoIGlzRWxlbWVudCggbmFtZSApICkgXG4gICAgICAgICAgcmV0dXJuIG5hbWUgXG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvciggJ1tkYXRhLXN0YWNrPVwiJytuYW1lKydcIl0sIFtkYXRhLXN0YWNrLWluZGV4PVwiJytuYW1lKydcIl0nIClcbiAgICAgIH0sXG5cbiAgICAgIC8vIFdhbGsgYmFja3dhcmRzIGluIHRoZSBzdGFjaywgc2hvd2luZyB0aGUgcGFuZWwgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgcGFuZWxcbiAgICAgIGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RhY2suc2hvdyggc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50IC0gMSBdIClcbiAgICAgIH0sXG5cbiAgICAgIC8vIGFkZCBhcmlhLWhpZGRlbj1mYWxzZSB0byB0aGUgZmlyc3QgaGlkZGVuIGVsZW1lbnRcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RhY2suc2hvdyggc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50ICsgMSBdIClcbiAgICAgIH0sXG5cbiAgICAgIGRpcmVjdGlvbjogZnVuY3Rpb24oIHBhbmVsICkge1xuICAgICAgICB2YXIgaW5kZXggPSBzdGFjay5wYW5lbEluZGV4KCBwYW5lbCApXG5cbiAgICAgICAgaWYgKCBpbmRleCA9PSBzdGFjay5jdXJyZW50IHx8IHN0YWNrLmN1cnJlbnQgPT0gbnVsbCApIHJldHVybiAnbm9uZSdcbiAgICAgICAgZWxzZSByZXR1cm4gKCBzdGFjay5jdXJyZW50IDwgaW5kZXggKSA/ICdmb3J3YXJkJyA6ICdyZXZlcnNlJ1xuICAgICAgIFxuICAgICAgfSxcblxuICAgICAgY3VycmVudFBhbmVsOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG4gICAgICAgIGlmICggdHlwZW9mIHN0YWNrLmN1cnJlbnQgPT0gJ3VuZGVmaW5lZCcgKSByZXR1cm5cblxuICAgICAgICBpZiAoIG5hbWUgKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCBdID09IHN0YWNrLmZpbmRQYW5lbCggbmFtZSApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCBdXG4gICAgICB9LFxuXG4gICAgICBwYW5lbEluZGV4OiBmdW5jdGlvbiAoIHBhbmVsICkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKCBwYW5lbC5kYXRhc2V0LnN0YWNrSW5kZXggKVxuICAgICAgfSxcblxuICAgICAgdXBkYXRlV2F0Y2hlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdG9vbGJveC5lYWNoKCBzdGFjay53YXRjaGVycywgZnVuY3Rpb24oIGVsICkge1xuICAgICAgICAgIGlmICggc3RhY2suY3VycmVudCA9PSBudWxsIClcbiAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtYWN0aXZlLXN0YWNrJyApXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZWwuZGF0YXNldC5hY3RpdmVTdGFjayA9IHN0YWNrLmN1cnJlbnRQYW5lbCgpLmRhdGFzZXQuc3RhY2sgfHwgc3RhY2suY3VycmVudFBhbmVsKCkuZGF0YXNldC5zdGFja0luZGV4XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9vbGJveC5lYWNoKCByb290LmNoaWxkcmVuLCBzdGFjay5hZGQgKVxuXG4gICAgaWYgKCByb290LmlkICkgc3RhY2sud2F0Y2hlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS13YXRjaC1zdGFjaz1cIiMnK3Jvb3QuaWQrJ1wiXScpXG5cbiAgICAvLyBPbmx5IHNob3cgdGhlIGZpcnN0IHBhbmVsIGlmIGl0IGhhcyBjb250ZW50LlxuICAgIC8vIElmIGl0IGRvZXNuJ3QsIGFzc3VtZSBhc3luYyBhbmQgbWFudWFsIHBhbmVsIHNob3dpbmcuXG4gICAgaWYgKCAhaXNFbXB0eSggc3RhY2sucGFuZWxzWzBdICkgKSBzdGFjay5zaG93KDApXG5cbiAgICAvLyBBZGQgYSBxdWVyeWFibGUgc3RhY2sgaWRcbiAgICByb290LmRhdGFzZXQuc3RhY2tJZCA9IFN0YWNrcy5sZW5ndGhcblxuICAgIFN0YWNrcy5wdXNoKCBzdGFjayApXG5cbiAgICByZXR1cm4gc3RhY2tcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG93RWwgKCBlbCApIHtcbiAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCBmYWxzZSApXG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkgKCBlbCApIHtcbiAgcmV0dXJuIGVsLmNoaWxkRWxlbWVudENvdW50ID09IDBcbn1cblxuZnVuY3Rpb24gaGlkZUVsICggZWwgKSB7XG4gIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG5mdW5jdGlvbiBuYXZDbGljayAoIGV2ZW50ICkge1xuICB2YXIgZWwgPSBldmVudC5jdXJyZW50VGFyZ2V0XG4gIHZhciBwYW5lbCA9IGVsLmRhdGFzZXQuc3RhY2tOYXZcbiAgdmFyIHN0YWNrID0gZ2V0U3RhY2soIHRvb2xib3guZ2V0Q2xvc2VzdCggZWwsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nICkgKVxuICBpZiAoICFzdGFjayApIHJldHVyblxuXG4gIGlmICggcGFuZWwgPT0gJ25leHQnICkgc3RhY2submV4dCgpXG4gIGVsc2UgaWYgKCBwYW5lbCA9PSAnYmFjaycgKSBzdGFjay5iYWNrKClcbiAgZWxzZSBpZiAoIHN0YWNrLmZpbmRQYW5lbCggcGFuZWwgKSApIHN0YWNrLnNob3coIHBhbmVsIClcbiAgZWxzZSByZXR1cm5cblxuICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cblxuZnVuY3Rpb24gcHJldlBhbmVsICggZXZlbnQgKSB7XG4gIHZhciBzdGFjayA9IGdldFN0YWNrKCB0b29sYm94LmdldENsb3Nlc3QoIGV2ZW50LnRhcmdldCwgJ1tkYXRhLXN0YWNrPVwicm9vdFwiXScgKSApXG4gIHN0YWNrLmJhY2soKVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIHNldHVwICgpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nKSwgU3RhY2submV3IClcbiAgfSlcblxuICAvLyBMb2NhbGlzZSBjbGlja3MgdG8gYSBzdGFjayByb290XG4gIC8vIEZ1dHVyZTogY29uc2lkZXIgZXhwYW5kaW5nIHRoaXMgdG8gYWxsb3cgY29udHJvbHMgdG8gbGl2ZSBhbnl3aGVyZSBhbmQgcG9pbnQgdG8gYSBzdGFja1xuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0gW2RhdGEtc3RhY2stbmF2XScsIG5hdkNsaWNrIClcbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCBzZWFyY2ggKSB7XG5cbiAgaWYgKCBpc0VsZW1lbnQoIHNlYXJjaCApICkge1xuICAgIGlmICggc2VhcmNoLmRhdGFzZXQuc3RhY2tJZCApIHJldHVybiBTdGFja3NbIHNlYXJjaC5kYXRhc2V0LnN0YWNrSWQgXVxuICB9XG5cbiAgaWYgKCB0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJyApIHtcblxuICAgIC8vIFdlbGwsIGxldCdzIGhvcGUgaXQncyBhIERPTSBzZWxlY3RvclxuICAgIHZhciBzdGFjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHNlYXJjaCApXG5cbiAgICAvLyBJZiBpdCBpcyB3b28gaG9vXG4gICAgaWYgKCBzdGFjayAmJiBzdGFjay5kYXRhc2V0LnN0YWNrSWQgKSB7XG4gICAgICByZXR1cm4gU3RhY2tzWyBzdGFjay5kYXRhc2V0LnN0YWNrSWQgXVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV3OiBTdGFjay5uZXcsXG4gIHNldHVwOiBzZXR1cCxcbiAgZ2V0OiBnZXRTdGFjayxcbiAgc3RhY2tzOiBTdGFja3Ncbn1cbiIsIi8vIFB1cnBvc2U6IFRvZ2dsZXMgZXhwYW5zaW9uIG9mIHRyZWUgbmF2IGFuZCBzdG9yZXMgY29va2llcyB0byByZXRhaW4gc3RhdGVcbi8vXG4vLyBVc2FnZTpcbi8vIC0gVHJlZXMgbXVzdCBoYXZlIGEgW2RhdGEtdHJlZT0ndHJlZS1rZXknXVxuLy8gLSBOb2RlcyBhcmUgbmFtZWQgYnkgW2RhdGEtbm9kZT0nbm9kZS1uYW1lJ11cbi8vXG4vLyBDb29raWVzIGFyZSBzdG9yZWQgYXMgdHJlZS1rZXkgPT4geyBub2RlLW5hbWU6IHRydWUgfVxuLy8gbm9kZSBib29sZWFuIG1hdGNoZXMgYXJpYS1leHBhbmRlZCBzdGF0ZVxuLy9cblxudmFyIHRvb2xib3ggICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBjb29raWUgICAgICA9IHJlcXVpcmUoICcuL19jb29raWUnICksXG4gICAgRXZlbnQgICAgICAgPSB0b29sYm94LmV2ZW50XG5cbmZ1bmN0aW9uIHNldENvb2tpZSAoIG5vZGUgKSB7XG4gIGlmICggbm9kZS5kYXRhc2V0Lm5vZGUgKSB7XG4gICAgdmFyIHRyZWUgPSB0b29sYm94LmdldENsb3Nlc3QoIG5vZGUsICdbZGF0YS10cmVlXScgKVxuICAgIGlmICggdHJlZSApIHtcbiAgICAgIGRhdGEgPSB7fVxuICAgICAgZGF0YVsgbm9kZS5kYXRhc2V0Lm5vZGUgXSA9IG5vZGUuZ2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcgKSA9PSAndHJ1ZSdcbiAgICAgIGNvb2tpZS51cGRhdGUoIHRyZWUuZGF0YXNldC50cmVlLCBkYXRhIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xpY2sgKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCAgID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgIHBhcmVudCAgID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQsXG4gICAgICBleHBhbmRlZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJyApXG5cbiAgLy8gQWRkIGEgY2xhc3NuYW1lIHRvIGluZGljYXRlIHRoYXQgaXQgd2FzIG1hbnVhbGx5IHRyaWdnZXJlZFxuICAvLyBUaGlzIGFsbG93cyBmb3IgYW5pbWF0aW5nIGludGVyYWN0aW9ucywgYnV0IG5vdCBvdGhlciBhdHRyaWJ1dGUgY2hhbmdlc1xuICBwYXJlbnQuY2xhc3NMaXN0LmFkZCggJ3RyaWdnZXJlZCcgKVxuICBwYXJlbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsIGV4cGFuZGVkICE9ICd0cnVlJyApXG5cbiAgc2V0Q29va2llKCBwYXJlbnQgKVxufVxuXG4vLyBTZXRzIHRyZWUgbmF2IHN0YXRlIGJhc2VkIG9mZiBvZiBjb29raWVzXG5mdW5jdGlvbiByZXN0b3JlTmF2ICgpIHtcbiAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdHJlZV0nICksIGZ1bmN0aW9uKCB0cmVlICkge1xuICAgIHZhciBrZXkgPSB0cmVlLmRhdGFzZXQudHJlZVxuICAgIGlmICgga2V5ICkge1xuICAgICAgdmFyIGRhdGEgPSBjb29raWUuZ2V0KCBrZXkgKVxuXG4gICAgICBPYmplY3Qua2V5cyggZGF0YSApLmZvckVhY2goIGZ1bmN0aW9uKCBub2RlICkge1xuICAgICAgICB2YXIgbm9kZUVsID0gdHJlZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtbm9kZT0nK25vZGUrJ10nIClcbiAgICAgICAgLy8gVXNlIGNvb2tpZXMgdG8gZXhwYW5kLlxuICAgICAgICBpZiAoIG5vZGVFbCAmJiBkYXRhW25vZGVdID09ICd0cnVlJyApIG5vZGVFbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJywgZGF0YVtub2RlXSApXG4gICAgICB9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIEV2ZW50LnJlYWR5KCBmdW5jdGlvbigpIHtcblxuICAgIC8vIFRoZSBmaXJzdCBjaGlsZCBvZiBhIG5vZGUgaXMgdGhlIHRyaWdnZXJcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbYXJpYS1leHBhbmRlZF0gPiAqOmZpcnN0LWNoaWxkJywgY2xpY2sgKVxuXG4gICAgLy8gU2V0IHN0YXRlcyBhY2NvcmRpbmcgdG8gY29va2llc1xuICAgIC8vcmVzdG9yZU5hdigpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXR1cDogc2V0dXBcbn1cbiIsIi8qKlxuICogQWRkIGRhdGFzZXQgc3VwcG9ydCB0byBlbGVtZW50c1xuICogTm8gZ2xvYmFscywgbm8gb3ZlcnJpZGluZyBwcm90b3R5cGUgd2l0aCBub24tc3RhbmRhcmQgbWV0aG9kcywgXG4gKiAgIGhhbmRsZXMgQ2FtZWxDYXNlIHByb3Blcmx5LCBhdHRlbXB0cyB0byB1c2Ugc3RhbmRhcmQgXG4gKiAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIChhbmQgRnVuY3Rpb24gYmluZCgpKSBtZXRob2RzLCBcbiAqICAgZmFsbHMgYmFjayB0byBuYXRpdmUgaW1wbGVtZW50YXRpb24gd2hlbiBleGlzdGluZ1xuICogSW5zcGlyZWQgYnkgaHR0cDovL2NvZGUuZWxpZ3JleS5jb20vaHRtbDUvZGF0YXNldC8gXG4gKiAgICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2FkYWxnaXNvL2h0bWw1LWRhdGFzZXQvYmxvYi9tYXN0ZXIvaHRtbDUtZGF0YXNldC5qcyApXG4gKiBEZXBlbmRzIG9uIEZ1bmN0aW9uLmJpbmQgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0eS9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChzaGltcyBiZWxvdylcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBYMTEvTUlUIExpY2Vuc2VcbiovXG5cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCNDb21wYXRpYmlsaXR5XG5pZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7XG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAob1RoaXMpIHtcbiAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1IGludGVybmFsIElzQ2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgICAgIEZOT1AgPSBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIGZCb3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIEZOT1AgJiYgb1RoaXMgPyB0aGlzIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBGTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgICAgICBmQm91bmQucHJvdG90eXBlID0gbmV3IEZOT1AoKTtcblxuICAgICAgICByZXR1cm4gZkJvdW5kO1xuICAgIH07XG59XG5cbi8qXG4gKiBYY2Nlc3NvcnMgU3RhbmRhcmQ6IENyb3NzLWJyb3dzZXIgRUNNQVNjcmlwdCA1IGFjY2Vzc29yc1xuICogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL1hjY2Vzc29yc1xuICogXG4gKiAyMDEwLTA2LTIxXG4gKiBcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIFxuICogQSBzaGltIHRoYXQgcGFydGlhbGx5IGltcGxlbWVudHMgT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGluIGJyb3dzZXJzIHRoYXQgaGF2ZVxuICogbGVnYWN5IF9fKGRlZmluZXxsb29rdXApW0dTXWV0dGVyX18gc3VwcG9ydC5cbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIFgxMS9NSVQgTGljZW5zZVxuICogICBTZWUgTElDRU5TRS5tZFxuKi9cblxuLy8gUmVtb3ZlZCBhIGZldyBKU0xpbnQgb3B0aW9ucyBhcyBOb3RlcGFkKysgSlNMaW50IHZhbGlkYXRvciBjb21wbGFpbmluZyBhbmQgXG4vLyAgIG1hZGUgY29tcGx5IHdpdGggSlNMaW50OyBhbHNvIG1vdmVkICd1c2Ugc3RyaWN0JyBpbnNpZGUgZnVuY3Rpb25cbi8qanNsaW50IHdoaXRlOiB0cnVlLCB1bmRlZjogdHJ1ZSwgcGx1c3BsdXM6IHRydWUsXG4gIGJpdHdpc2U6IHRydWUsIHJlZ2V4cDogdHJ1ZSwgbmV3Y2FwOiB0cnVlLCBtYXhsZW46IDkwICovXG5cbi8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9YY2Nlc3NvcnMvYmxvYi9tYXN0ZXIveGNjZXNzb3JzLXN0YW5kYXJkLmpzKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBkZWZpbmVHZXR0ZXIgPSBPYmplY3RQcm90by5fX2RlZmluZUdldHRlcl9fLFxuICAgIGRlZmluZVNldHRlciA9IE9iamVjdFByb3RvLl9fZGVmaW5lU2V0dGVyX18sXG4gICAgbG9va3VwR2V0dGVyID0gT2JqZWN0UHJvdG8uX19sb29rdXBHZXR0ZXJfXyxcbiAgICBsb29rdXBTZXR0ZXIgPSBPYmplY3RQcm90by5fX2xvb2t1cFNldHRlcl9fLFxuICAgIGhhc093blByb3AgPSBPYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcbiAgICBcbiAgICBpZiAoZGVmaW5lR2V0dGVyICYmIGRlZmluZVNldHRlciAmJiBsb29rdXBHZXR0ZXIgJiYgbG9va3VwU2V0dGVyKSB7XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgLy8gYWxsIGFyZ3VtZW50cyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIG5vdCBvcHRpb25hbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29rdXBHZXR0ZXIuY2FsbChvYmosIHByb3ApICYmICFsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHByb3BlcnR5IGRlZmluZWQgYW5kIG5vIHByZS1leGlzdGluZyBhY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcImdldFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcInNldFwiKSkpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGhhcyBhIHZhbHVlIHByb3AgYnV0IGFjY2Vzc29yIGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYW4gYWNjZXNzb3IgYW5kIGEgdmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYW4ndCBzd2l0Y2ggb2ZmIHRoZXNlIGZlYXR1cmVzIGluIEVDTUFTY3JpcHQgM1xuICAgICAgICAgICAgICAgIC8vIHNvIHRocm93IGEgVHlwZUVycm9yIGlmIGFueSBhcmUgZmFsc2VcbiAgICAgICAgICAgICAgICBpZiAoIShkZXNjcmlwdG9yLndyaXRhYmxlICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGZhbHNlIGZvciBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIuY2FsbChvYmosIHByb3AsIGRlc2NyaXB0b3IuZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVNldHRlci5jYWxsKG9iaiwgcHJvcCwgZGVzY3JpcHRvci5zZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgeyAvLyBhbGwgYXJndW1lbnRzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgbm90IG9wdGlvbmFsLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlICA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlICAgIDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gbG9va3VwR2V0dGVyLmNhbGwob2JqLCBwcm9wKSxcbiAgICAgICAgICAgICAgICBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IG9yIGlzIGluaGVyaXRlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFnZXR0ZXIgJiYgIXNldHRlcikgeyAvLyBub3QgYW4gYWNjZXNzb3Igc28gcmV0dXJuIHByb3BcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHJlbW92ZSBkZXNjcmlwdG9yLndyaXRhYmxlO1xuICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGRlc2NyaXB0b3IuZ2V0IGFuZCBkZXNjcmlwdG9yLnNldCAoSUUncyBiZWhhdmlvcilcbiAgICAgICAgICAgICAgICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IGRlc2NyaXB0b3Iuc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXQgPSBnZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5zZXQgPSBzZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaiwgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChwcm9wcywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHByb3BzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59KCkpO1xuXG4vLyBCZWdpbiBkYXRhc2V0IGNvZGVcblxuaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldCAmJiBcbiAgICAgICAgIC8vIEZGIGlzIGVtcHR5IHdoaWxlIElFIGdpdmVzIGVtcHR5IG9iamVjdFxuICAgICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdkYXRhc2V0JykgIHx8XG4gICAgICAgICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcpLmdldClcbiAgICApIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3IgPSB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgdmFyIGksIFxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIEhUTUw1X0RPTVN0cmluZ01hcCwgXG4gICAgICAgICAgICAgICAgYXR0clZhbCwgYXR0ck5hbWUsIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGF0dHNMZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB0b1VwcGVyQ2FzZSA9IGZ1bmN0aW9uIChuMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjAuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24gKGF0dHJOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpID8gXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpIDogXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7IC8vIFNpbXVsYXRlIERPTVN0cmluZ01hcCB3L2FjY2Vzc29yIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHNldHRpbmcgYWNjZXNzb3Igb24gbm9ybWFsIG9iamVjdFxuICAgICAgICAgICAgICAgICh7fSkuX19kZWZpbmVHZXR0ZXJfXygndGVzdCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlMSkgeyAvLyBVc2UgYSBET00gb2JqZWN0IGZvciBJRThcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdHRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZpeDogVGhpcyB0ZXN0IHJlYWxseSBzaG91bGQgYWxsb3cgYW55IFhNTCBOYW1lIHdpdGhvdXQgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb2xvbnMgKGFuZCBub24tdXBwZXJjYXNlIGZvciBYSFRNTClcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5uYW1lICYmIFxuICAgICAgICAgICAgICAgICAgICAoL15kYXRhLVxcd1tcXHdcXC1dKiQvKS50ZXN0KGF0dHJpYnV0ZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyVmFsID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdG8gQ2FtZWxDYXNlXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gYXR0ck5hbWUuc3Vic3RyKDUpLnJlcGxhY2UoLy0uL2csIHRvVXBwZXJDYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MNV9ET01TdHJpbmdNYXAsIHByb3BOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdGhpcy5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZ2V0dGVyLmJpbmQoYXR0clZhbCB8fCAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIuYmluZCh0aGF0LCBhdHRyTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlMikgeyAvLyBpZiBhY2Nlc3NvcnMgYXJlIG5vdCB3b3JraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXBbcHJvcE5hbWVdID0gYXR0clZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIVE1MNV9ET01TdHJpbmdNYXA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZGIGVudW1lcmF0ZXMgb3ZlciBlbGVtZW50J3MgZGF0YXNldCwgYnV0IG5vdCBcbiAgICAgICAgLy8gICBFbGVtZW50LnByb3RvdHlwZS5kYXRhc2V0OyBJRTkgaXRlcmF0ZXMgb3ZlciBib3RoXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ2RhdGFzZXQnLCBwcm9wRGVzY3JpcHRvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm9wRGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7IC8vIElFOCBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIHRvIHRydWVcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcsIHByb3BEZXNjcmlwdG9yKTtcbiAgICB9XG59XG4iLCIvLyBSZXF1aXJlIG1vZHVsZXMsIGFkZCBjb2RlLCBldGNcbnJlcXVpcmUoICcuL3NoaW1zL19kYXRhc2V0JyApXG52YXIgZXN2ZyAgICAgPSByZXF1aXJlKCAnLi9fZXN2ZycgKVxudmFyIGljb25zICAgID0gcmVxdWlyZSggJy4vX2ljb25zJyApXG52YXIgdG9nZ2xlciAgPSByZXF1aXJlKCAnY29tcG9zZS10b2dnbGVyJyApXG52YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApXG52YXIgbW9kYWwgICAgPSByZXF1aXJlKCAnLi9fbW9kYWwnIClcbnZhciBzdGFjayAgICA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxudmFyIHNlYXJjaCAgID0gcmVxdWlyZSggJy4vX3NlYXJjaCcgKVxudmFyIHRyZWUgICAgID0gcmVxdWlyZSggJy4vX3RyZWUnIClcbnZhciBjb29raWUgICA9IHJlcXVpcmUoICcuL19jb29raWUnIClcblxucmVxdWlyZSggJy4vX3NpZGViYXInIClcblxubW9kYWwuc2V0dXAoKVxuc3RhY2suc2V0dXAoKVxudHJlZS5zZXR1cCgpXG5cbndpbmRvdy5zcGFyayA9IG1vZHVsZS5leHBvcnRzID0gdG9vbGJveC5tZXJnZSh7XG4gIGVzdmc6IGVzdmcsXG4gIHRvZ2dsZXI6IHRvZ2dsZXIsXG4gIG1vZGFsOiBtb2RhbCxcbiAgc3RhY2s6IHN0YWNrLFxuICBjb29raWU6IGNvb2tpZSxcbiAgYmVhbjogcmVxdWlyZSggJ2JlYW4nIClcbn0sIHRvb2xib3ggKVxuXG4vLyBTaW1wbGUgaWdub3JlIGNsaWNrIG9uIGFuY2hvciB0cmlnZ2Vyc1xudG9vbGJveC5ldmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbaHJlZj1cIiNcIl0nLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG59KVxuIiwiLyohXG4gICogQmVhbiAtIGNvcHlyaWdodCAoYykgSmFjb2IgVGhvcm50b24gMjAxMS0yMDEyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2ZhdC9iZWFuXG4gICogTUlUIGxpY2Vuc2VcbiAgKi9cbihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIGNvbnRleHRbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0pKCdiZWFuJywgdGhpcywgZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgbmFtZSAgICA9IG5hbWUgICAgfHwgJ2JlYW4nXG4gIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXNcblxuICB2YXIgd2luICAgICAgICAgICAgPSB3aW5kb3dcbiAgICAsIG9sZCAgICAgICAgICAgID0gY29udGV4dFtuYW1lXVxuICAgICwgbmFtZXNwYWNlUmVnZXggPSAvW15cXC5dKig/PVxcLi4qKVxcLnwuKi9cbiAgICAsIG5hbWVSZWdleCAgICAgID0gL1xcLi4qL1xuICAgICwgYWRkRXZlbnQgICAgICAgPSAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICAsIHJlbW92ZUV2ZW50ICAgID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInXG4gICAgLCBkb2MgICAgICAgICAgICA9IGRvY3VtZW50IHx8IHt9XG4gICAgLCByb290ICAgICAgICAgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQgfHwge31cbiAgICAsIFczQ19NT0RFTCAgICAgID0gcm9vdFthZGRFdmVudF1cbiAgICAsIGV2ZW50U3VwcG9ydCAgID0gVzNDX01PREVMID8gYWRkRXZlbnQgOiAnYXR0YWNoRXZlbnQnXG4gICAgLCBPTkUgICAgICAgICAgICA9IHt9IC8vIHNpbmdsZXRvbiBmb3IgcXVpY2sgbWF0Y2hpbmcgbWFraW5nIGFkZCgpIGRvIG9uZSgpXG5cbiAgICAsIHNsaWNlICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgLCBzdHIyYXJyICAgICAgICA9IGZ1bmN0aW9uIChzLCBkKSB7IHJldHVybiBzLnNwbGl0KGQgfHwgJyAnKSB9XG4gICAgLCBpc1N0cmluZyAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnc3RyaW5nJyB9XG4gICAgLCBpc0Z1bmN0aW9uICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnZnVuY3Rpb24nIH1cbiAgICAsIGlzT2JqZWN0ICAgICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdvYmplY3QnIH1cblxuICAgIC8vIFRyeSB0byBidWlsZCBhbiBvcHRpb25zIG9iamVjdC4gSWYgYW55IGtleSBpbiBgbWF5YmVPcHRpb25zYFxuICAgIC8vIG1hdGNoZXMgYSBrZXkgaW4gYGRlZmF1bHRzYCwgaXQgd2lsbCBiZSBjb3BpZWQgaW50byBhIGNsb25lXG4gICAgLy8gb2YgYGRlZmF1bHRzYCwgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0LlxuICAgICwgYnVpbGRPcHRpb25zID0gZnVuY3Rpb24gKG9yaWdpbmFsRGVmYXVsdHMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7fVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcmlnaW5hbERlZmF1bHRzKSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsRGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9yaWdpbmFsRGVmYXVsdHNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2JqZWN0KG1heWJlT3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG1heWJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gbWF5YmVPcHRpb25zW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdHNcbiAgICAgIH1cblxuICAgICAgLy8gZXZlbnRzIHRoYXQgd2UgY29uc2lkZXIgdG8gYmUgJ25hdGl2ZScsIGFueXRoaW5nIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbFxuICAgICAgLy8gYmUgdHJlYXRlZCBhcyBhIGN1c3RvbSBldmVudFxuICAgICwgc3RhbmRhcmROYXRpdmVFdmVudHMgPVxuICAgICAgICAnY2xpY2sgZGJsY2xpY2sgbW91c2V1cCBtb3VzZWRvd24gY29udGV4dG1lbnUgJyAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnbW91c2V3aGVlbCBtb3VzZW11bHRpd2hlZWwgRE9NTW91c2VTY3JvbGwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2Ugd2hlZWxcbiAgICAgICAgJ21vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgc2VsZWN0c3RhcnQgc2VsZWN0ZW5kICcgICAgICAgICAgICArIC8vIG1vdXNlIG1vdmVtZW50XG4gICAgICAgICdrZXlkb3duIGtleXByZXNzIGtleXVwICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBrZXlib2FyZFxuICAgICAgICAnb3JpZW50YXRpb25jaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW9iaWxlXG4gICAgICAgICdmb2N1cyBibHVyIGNoYW5nZSByZXNldCBzZWxlY3Qgc3VibWl0ICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBmb3JtIGVsZW1lbnRzXG4gICAgICAgICdsb2FkIHVubG9hZCBiZWZvcmV1bmxvYWQgcmVzaXplIG1vdmUgRE9NQ29udGVudExvYWRlZCAnICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgbWVzc2FnZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnZXJyb3IgYWJvcnQgc2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzY1xuICAgICAgLy8gZWxlbWVudC5maXJlRXZlbnQoJ29uWFlaJy4uLiBpcyBub3QgZm9yZ2l2aW5nIGlmIHdlIHRyeSB0byBmaXJlIGFuIGV2ZW50XG4gICAgICAvLyB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoZXNlIG9uIG5ld2VyIGJyb3dzZXJzXG4gICAgLCB3M2NOYXRpdmVFdmVudHMgPVxuICAgICAgICAnc2hvdyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnaW5wdXQgaW52YWxpZCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gdG91Y2hcbiAgICAgICAgJ2dlc3R1cmVzdGFydCBnZXN0dXJlY2hhbmdlIGdlc3R1cmVlbmQgJyAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGdlc3R1cmVcbiAgICAgICAgJ3RleHRpbnB1dCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIFRleHRFdmVudFxuICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZSBwYWdlc2hvdyBwYWdlaGlkZSBwb3BzdGF0ZSAnICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdoYXNoY2hhbmdlIG9mZmxpbmUgb25saW5lICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2FmdGVycHJpbnQgYmVmb3JlcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHByaW50aW5nXG4gICAgICAgICdkcmFnc3RhcnQgZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcmFnIGRyb3AgZHJhZ2VuZCAnICAgICAgKyAvLyBkbmRcbiAgICAgICAgJ2xvYWRzdGFydCBwcm9ncmVzcyBzdXNwZW5kIGVtcHRpZWQgc3RhbGxlZCBsb2FkbWV0YWRhdGEgJyAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdsb2FkZWRkYXRhIGNhbnBsYXkgY2FucGxheXRocm91Z2ggcGxheWluZyB3YWl0aW5nIHNlZWtpbmcgJyAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnc2Vla2VkIGVuZGVkIGR1cmF0aW9uY2hhbmdlIHRpbWV1cGRhdGUgcGxheSBwYXVzZSByYXRlY2hhbmdlICcgICsgLy8gbWVkaWFcbiAgICAgICAgJ3ZvbHVtZWNoYW5nZSBjdWVjaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdjaGVja2luZyBub3VwZGF0ZSBkb3dubG9hZGluZyBjYWNoZWQgdXBkYXRlcmVhZHkgb2Jzb2xldGUgJyAgICAgICAvLyBhcHBjYWNoZVxuXG4gICAgICAvLyBjb252ZXJ0IHRvIGEgaGFzaCBmb3IgcXVpY2sgbG9va3Vwc1xuICAgICwgbmF0aXZlRXZlbnRzID0gKGZ1bmN0aW9uIChoYXNoLCBldmVudHMsIGkpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgZXZlbnRzW2ldICYmIChoYXNoW2V2ZW50c1tpXV0gPSAxKVxuICAgICAgICByZXR1cm4gaGFzaFxuICAgICAgfSh7fSwgc3RyMmFycihzdGFuZGFyZE5hdGl2ZUV2ZW50cyArIChXM0NfTU9ERUwgPyB3M2NOYXRpdmVFdmVudHMgOiAnJykpKSlcblxuICAgICAgLy8gY3VzdG9tIGV2ZW50cyBhcmUgZXZlbnRzIHRoYXQgd2UgKmZha2UqLCB0aGV5IGFyZSBub3QgcHJvdmlkZWQgbmF0aXZlbHkgYnV0XG4gICAgICAvLyB3ZSBjYW4gdXNlIG5hdGl2ZSBldmVudHMgdG8gZ2VuZXJhdGUgdGhlbVxuICAgICwgY3VzdG9tRXZlbnRzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzQW5jZXN0b3IgPSAnY29tcGFyZURvY3VtZW50UG9zaXRpb24nIGluIHJvb3RcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIChjb250YWluZXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudCkgJiAxNikgPT09IDE2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6ICdjb250YWlucycgaW4gcm9vdFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDkgfHwgY29udGFpbmVyID09PSB3aW5kb3cgPyByb290IDogY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIgIT09IGVsZW1lbnQgJiYgY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSByZXR1cm4gMVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICwgY2hlY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgIHJldHVybiAhcmVsYXRlZFxuICAgICAgICAgICAgICAgID8gcmVsYXRlZCA9PSBudWxsXG4gICAgICAgICAgICAgICAgOiAocmVsYXRlZCAhPT0gdGhpcyAmJiByZWxhdGVkLnByZWZpeCAhPT0gJ3h1bCcgJiYgIS9kb2N1bWVudC8udGVzdCh0aGlzLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICYmICFpc0FuY2VzdG9yKHJlbGF0ZWQsIHRoaXMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3VzZWVudGVyOiB7IGJhc2U6ICdtb3VzZW92ZXInLCBjb25kaXRpb246IGNoZWNrIH1cbiAgICAgICAgICAsIG1vdXNlbGVhdmU6IHsgYmFzZTogJ21vdXNlb3V0JywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZXdoZWVsOiB7IGJhc2U6IC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdoZWVsJyB9XG4gICAgICAgIH1cbiAgICAgIH0oKSlcblxuICAgICAgLy8gd2UgcHJvdmlkZSBhIGNvbnNpc3RlbnQgRXZlbnQgb2JqZWN0IGFjcm9zcyBicm93c2VycyBieSB0YWtpbmcgdGhlIGFjdHVhbCBET01cbiAgICAgIC8vIGV2ZW50IG9iamVjdCBhbmQgZ2VuZXJhdGluZyBhIG5ldyBvbmUgZnJvbSBpdHMgcHJvcGVydGllcy5cbiAgICAsIEV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGEgd2hpdGVsaXN0IG9mIHByb3BlcnRpZXMgKGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMpIHRlbGxzIHVzIHdoYXQgdG8gY2hlY2sgZm9yIGFuZCBjb3B5XG4gICAgICAgIHZhciBjb21tb25Qcm9wcyAgPSBzdHIyYXJyKCdhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0ICcgK1xuICAgICAgICAgICAgICAnZGV0YWlsIGV2ZW50UGhhc2UgZ2V0TW9kaWZpZXJTdGF0ZSBpc1RydXN0ZWQgbWV0YUtleSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5ICcgICtcbiAgICAgICAgICAgICAgJ3NyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0eXBlIHZpZXcgd2hpY2ggcHJvcGVydHlOYW1lIHBhdGgnKVxuICAgICAgICAgICwgbW91c2VQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2J1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBkYXRhVHJhbnNmZXIgJyAgICAgICtcbiAgICAgICAgICAgICAgJ2Zyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IG1vdmVtZW50WCBtb3ZlbWVudFkgcmVnaW9uJykpXG4gICAgICAgICAgLCBtb3VzZVdoZWVsUHJvcHMgPSBtb3VzZVByb3BzLmNvbmNhdChzdHIyYXJyKCd3aGVlbERlbHRhIHdoZWVsRGVsdGFYIHdoZWVsRGVsdGFZIHdoZWVsRGVsdGFaICcgK1xuICAgICAgICAgICAgICAnYXhpcycpKSAvLyAnYXhpcycgaXMgRkYgc3BlY2lmaWNcbiAgICAgICAgICAsIGtleVByb3BzICAgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIGtleUlkZW50aWZpZXIgJyAgICAgICAgICArXG4gICAgICAgICAgICAgICdrZXlMb2NhdGlvbiBsb2NhdGlvbiBpc0NvbXBvc2luZyBjb2RlJykpXG4gICAgICAgICAgLCB0ZXh0UHJvcHMgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignZGF0YScpKVxuICAgICAgICAgICwgdG91Y2hQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3RvdWNoZXMgdGFyZ2V0VG91Y2hlcyBjaGFuZ2VkVG91Y2hlcyBzY2FsZSByb3RhdGlvbicpKVxuICAgICAgICAgICwgbWVzc2FnZVByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEgb3JpZ2luIHNvdXJjZScpKVxuICAgICAgICAgICwgc3RhdGVQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3N0YXRlJykpXG4gICAgICAgICAgLCBvdmVyT3V0UmVnZXggPSAvb3ZlcnxvdXQvXG4gICAgICAgICAgICAvLyBzb21lIGV2ZW50IHR5cGVzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBhbmQgc29tZSBuZWVkIHNwZWNpYWwgcHJvcGVydGllcywgZG8gdGhhdCBhbGwgaGVyZVxuICAgICAgICAgICwgdHlwZUZpeGVycyAgID0gW1xuICAgICAgICAgICAgICAgIHsgLy8ga2V5IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9rZXkvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5rZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL2NsaWNrfG1vdXNlKD8hKC4qd2hlZWx8c2Nyb2xsKSl8bWVudXxkcmFnfGRyb3AvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yaWdodENsaWNrID0gZXZlbnQud2hpY2ggPT09IDMgfHwgZXZlbnQuYnV0dG9uID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucG9zID0geyB4OiAwLCB5OiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFnZVggfHwgZXZlbnQucGFnZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5wYWdlWFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5jbGllbnRYICsgZG9jLmJvZHkuc2Nyb2xsTGVmdCArIHJvb3Quc2Nyb2xsTGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LmNsaWVudFkgKyBkb2MuYm9keS5zY3JvbGxUb3AgKyByb290LnNjcm9sbFRvcFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3Zlck91dFJlZ2V4LnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50Wyh0eXBlID09ICdtb3VzZW92ZXInID8gJ2Zyb20nIDogJ3RvJykgKyAnRWxlbWVudCddXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3VzZVByb3BzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtb3VzZSB3aGVlbCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvbW91c2UuKih3aGVlbHxzY3JvbGwpL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtb3VzZVdoZWVsUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIFRleHRFdmVudFxuICAgICAgICAgICAgICAgICAgICByZWc6IC9edGV4dC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGV4dFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyB0b3VjaCBhbmQgZ2VzdHVyZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRvdWNofF5nZXN0dXJlL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0b3VjaFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtZXNzYWdlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ebWVzc2FnZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gcG9wc3RhdGUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL15wb3BzdGF0ZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0YXRlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZWc6IC8uKi9cbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tb25Qcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgICwgdHlwZUZpeGVyTWFwID0ge30gLy8gdXNlZCB0byBtYXAgZXZlbnQgdHlwZXMgdG8gZml4ZXIgZnVuY3Rpb25zIChhYm92ZSksIGEgYmFzaWMgY2FjaGUgbWVjaGFuaXNtXG5cbiAgICAgICAgICAsIEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVyblxuICAgICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8ICgoZWxlbWVudC5vd25lckRvY3VtZW50IHx8IGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCkucGFyZW50V2luZG93IHx8IHdpbikuZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgICA9IGlzTmF0aXZlXG4gICAgICAgICAgICAgIHRoaXMuaXNCZWFuICAgICAgICAgPSB0cnVlXG5cbiAgICAgICAgICAgICAgaWYgKCFldmVudCkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgdmFyIHR5cGUgICA9IGV2ZW50LnR5cGVcbiAgICAgICAgICAgICAgICAsIHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50XG4gICAgICAgICAgICAgICAgLCBpLCBsLCBwLCBwcm9wcywgZml4ZXJcblxuICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT09IDMgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldFxuXG4gICAgICAgICAgICAgIGlmIChpc05hdGl2ZSkgeyAvLyB3ZSBvbmx5IG5lZWQgYmFzaWMgYXVnbWVudGF0aW9uIG9uIGN1c3RvbSBldmVudHMsIHRoZSByZXN0IGV4cGVuc2l2ZSAmIHBvaW50bGVzc1xuICAgICAgICAgICAgICAgIGZpeGVyID0gdHlwZUZpeGVyTWFwW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKCFmaXhlcikgeyAvLyBoYXZlbid0IGVuY291bnRlcmVkIHRoaXMgZXZlbnQgdHlwZSBiZWZvcmUsIG1hcCBhIGZpeGVyIGZ1bmN0aW9uIGZvciBpdFxuICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHR5cGVGaXhlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRml4ZXJzW2ldLnJlZy50ZXN0KHR5cGUpKSB7IC8vIGd1YXJhbnRlZWQgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lLCBsYXN0IGlzIC4qXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZUZpeGVyTWFwW3R5cGVdID0gZml4ZXIgPSB0eXBlRml4ZXJzW2ldLmZpeFxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGZpeGVyKGV2ZW50LCB0aGlzLCB0eXBlKVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IHByb3BzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoKHAgPSBwcm9wc1tpXSkgaW4gdGhpcykgJiYgcCBpbiBldmVudCkgdGhpc1twXSA9IGV2ZW50W3BdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQoKSBhbmQgc3RvcFByb3BhZ2F0aW9uKCkgYXJlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gdGhvc2UgZnVuY3Rpb25zXG4gICAgICAgIC8vIG9uIHRoZSBET00sIHN0b3AoKSBpcyBhbiBhbGlhcyBmb3IgYm90aCBvZiB0aGVtIHRvZ2V0aGVyXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KSB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGVsc2UgdGhpcy5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICAvLyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgdG8gYmUgaGFuZGxlZCBpbnRlcm5hbGx5IGJlY2F1c2Ugd2UgbWFuYWdlIHRoZSBldmVudCBsaXN0IGZvclxuICAgICAgICAvLyBlYWNoIGVsZW1lbnRcbiAgICAgICAgLy8gbm90ZSB0aGF0IG9yaWdpbmFsRWxlbWVudCBtYXkgYmUgYSBCZWFuI0V2ZW50IG9iamVjdCBpbiBzb21lIHNpdHVhdGlvbnNcbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkICYmIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgaXMgcmlwZSBmb3Igb3B0aW1pc2F0aW9uLCBuZXcgZXZlbnRzIGFyZSAqZXhwZW5zaXZlKlxuICAgICAgICAgIC8vIGltcHJvdmluZyB0aGlzIHdpbGwgc3BlZWQgdXAgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIHZhciBuZSA9IG5ldyBFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMuaXNOYXRpdmUpXG4gICAgICAgICAgbmUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICByZXR1cm4gbmVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudFxuICAgICAgfSgpKVxuXG4gICAgICAvLyBpZiB3ZSdyZSBpbiBvbGQgSUUgd2UgY2FuJ3QgZG8gb25wcm9wZXJ0eWNoYW5nZSBvbiBkb2Mgb3Igd2luIHNvIHdlIHVzZSBkb2MuZG9jdW1lbnRFbGVtZW50IGZvciBib3RoXG4gICAgLCB0YXJnZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGlzTmF0aXZlKSB7XG4gICAgICAgIHJldHVybiAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiAoZWxlbWVudCA9PT0gZG9jIHx8IGVsZW1lbnQgPT09IHdpbikgPyByb290IDogZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBCZWFuIG1haW50YWlucyBhbiBpbnRlcm5hbCByZWdpc3RyeSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBXZSBkb24ndCB0b3VjaCBlbGVtZW50cywgb2JqZWN0c1xuICAgICAgICAqIG9yIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB0aGVtLCBpbnN0ZWFkIHdlIHN0b3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICAqIEVhY2ggZXZlbnQgbGlzdGVuZXIgaGFzIGEgUmVnRW50cnkgb2JqZWN0LCB3ZSBoYXZlIG9uZSAncmVnaXN0cnknIGZvciB0aGUgd2hvbGUgaW5zdGFuY2UuXG4gICAgICAgICovXG4gICAgLCBSZWdFbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVhY2ggaGFuZGxlciBpcyB3cmFwcGVkIHNvIHdlIGNhbiBoYW5kbGUgZGVsZWdhdGlvbiBhbmQgY3VzdG9tIGV2ZW50c1xuICAgICAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZm4sIGNvbmRpdGlvbiwgYXJncykge1xuICAgICAgICAgICAgdmFyIGNhbGwgPSBmdW5jdGlvbiAoZXZlbnQsIGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgYXJncyA/IHNsaWNlLmNhbGwoZWFyZ3MsIGV2ZW50ID8gMCA6IDEpLmNvbmNhdChhcmdzKSA6IGVhcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKGV2ZW50LCBldmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5fX2JlYW5EZWwgPyBmbi5fX2JlYW5EZWwuZnQoZXZlbnQudGFyZ2V0LCBlbGVtZW50KSA6IGV2ZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBoYW5kbGVyID0gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBmaW5kVGFyZ2V0KGV2ZW50LCB0aGlzKSAvLyBkZWxlYXRlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQpIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChmbi5fX2JlYW5EZWwpIGV2ZW50ID0gZXZlbnQuY2xvbmUoZmluZFRhcmdldChldmVudCkpIC8vIGRlbGVnYXRlZCBldmVudCwgZml4IHRoZSBmaXhcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IGZuLl9fYmVhbkRlbFxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICAgICAgICB9XG5cbiAgICAgICAgLCBSZWdFbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcmlnaW5hbCwgbmFtZXNwYWNlcywgYXJncywgcm9vdCkge1xuICAgICAgICAgICAgdmFyIGN1c3RvbVR5cGUgICAgID0gY3VzdG9tRXZlbnRzW3R5cGVdXG4gICAgICAgICAgICAgICwgaXNOYXRpdmVcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3VubG9hZCcpIHtcbiAgICAgICAgICAgICAgLy8gc2VsZiBjbGVhbi11cFxuICAgICAgICAgICAgICBoYW5kbGVyID0gb25jZShyZW1vdmVMaXN0ZW5lciwgZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21UeXBlKSB7XG4gICAgICAgICAgICAgIGlmIChjdXN0b21UeXBlLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjdXN0b21UeXBlLmNvbmRpdGlvbiwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlID0gY3VzdG9tVHlwZS5iYXNlIHx8IHR5cGVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgID0gaXNOYXRpdmUgPSBuYXRpdmVFdmVudHNbdHlwZV0gJiYgISFlbGVtZW50W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tVHlwZSAgICA9ICFXM0NfTU9ERUwgJiYgIWlzTmF0aXZlICYmIHR5cGVcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCAgICAgICA9IGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgICAgICA9IG9yaWdpbmFsXG4gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXMgICAgPSBuYW1lc3BhY2VzXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSAgICAgPSBXM0NfTU9ERUwgfHwgaXNOYXRpdmUgPyB0eXBlIDogJ3Byb3BlcnR5Y2hhbmdlJ1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgICAgICAgID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgICAgIHRoaXNbZXZlbnRTdXBwb3J0XSA9ICEhdGhpcy50YXJnZXRbZXZlbnRTdXBwb3J0XVxuICAgICAgICAgICAgdGhpcy5yb290ICAgICAgICAgID0gcm9vdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyICAgICAgID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgbnVsbCwgYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzcGFjZXMsIGlzIG91ciBlbnRyeSBpbiBhbnkgb2YgdGhlbT9cbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLmluTmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChjaGVja05hbWVzcGFjZXMpIHtcbiAgICAgICAgICB2YXIgaSwgaiwgYyA9IDBcbiAgICAgICAgICBpZiAoIWNoZWNrTmFtZXNwYWNlcykgcmV0dXJuIHRydWVcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZXNwYWNlcykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgZm9yIChpID0gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgZm9yIChqID0gdGhpcy5uYW1lc3BhY2VzLmxlbmd0aDsgai0tOykge1xuICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lc3BhY2VzW2ldID09IHRoaXMubmFtZXNwYWNlc1tqXSkgYysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja05hbWVzcGFjZXMubGVuZ3RoID09PSBjXG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaCBieSBlbGVtZW50LCBvcmlnaW5hbCBmbiAob3B0KSwgaGFuZGxlciBmbiAob3B0KVxuICAgICAgICBSZWdFbnRyeS5wcm90b3R5cGUubWF0Y2hlcyA9IGZ1bmN0aW9uIChjaGVja0VsZW1lbnQsIGNoZWNrT3JpZ2luYWwsIGNoZWNrSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgPT09IGNoZWNrRWxlbWVudCAmJlxuICAgICAgICAgICAgKCFjaGVja09yaWdpbmFsIHx8IHRoaXMub3JpZ2luYWwgPT09IGNoZWNrT3JpZ2luYWwpICYmXG4gICAgICAgICAgICAoIWNoZWNrSGFuZGxlciB8fCB0aGlzLmhhbmRsZXIgPT09IGNoZWNrSGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWdFbnRyeVxuICAgICAgfSgpKVxuXG4gICAgLCByZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIG91ciBtYXAgc3RvcmVzIGFycmF5cyBieSBldmVudCB0eXBlLCBqdXN0IGJlY2F1c2UgaXQncyBiZXR0ZXIgdGhhbiBzdG9yaW5nXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgYXJyYXkuXG4gICAgICAgIC8vIHVzZXMgJyQnIGFzIGEgcHJlZml4IGZvciB0aGUga2V5cyBmb3Igc2FmZXR5IGFuZCAncicgYXMgYSBzcGVjaWFsIHByZWZpeCBmb3JcbiAgICAgICAgLy8gcm9vdExpc3RlbmVycyBzbyB3ZSBjYW4gbG9vayB0aGVtIHVwIGZhc3RcbiAgICAgICAgdmFyIG1hcCA9IHt9XG5cbiAgICAgICAgICAvLyBnZW5lcmljIGZ1bmN0aW9uYWwgc2VhcmNoIG9mIG91ciByZWdpc3RyeSBmb3IgbWF0Y2hpbmcgbGlzdGVuZXJzLFxuICAgICAgICAgIC8vIGBmbmAgcmV0dXJucyBmYWxzZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3BcbiAgICAgICAgICAsIGZvckFsbCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgaGFuZGxlciwgcm9vdCwgZm4pIHtcbiAgICAgICAgICAgICAgdmFyIHBmeCA9IHJvb3QgPyAncicgOiAnJCdcbiAgICAgICAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VhcmNoIHRoZSB3aG9sZSByZWdpc3RyeVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gcGZ4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckFsbChlbGVtZW50LCB0LnN1YnN0cigxKSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGwsIGxpc3QgPSBtYXBbcGZ4ICsgdHlwZV0sIGFsbCA9IGVsZW1lbnQgPT0gJyonXG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0KSByZXR1cm5cbiAgICAgICAgICAgICAgICBmb3IgKGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKChhbGwgfHwgbGlzdFtpXS5tYXRjaGVzKGVsZW1lbnQsIG9yaWdpbmFsLCBoYW5kbGVyKSkgJiYgIWZuKGxpc3RbaV0sIGxpc3QsIGksIHR5cGUpKSByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgaGFzID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCB1c2luZyBmb3JBbGwgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCdzIGEgYml0IHNsb3dlciBhbmQgdGhpc1xuICAgICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBmYXN0XG4gICAgICAgICAgICAgIHZhciBpLCBsaXN0ID0gbWFwWyhyb290ID8gJ3InIDogJyQnKSArIHR5cGVdXG4gICAgICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghbGlzdFtpXS5yb290ICYmIGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgbnVsbCkpIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBnZXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIHJvb3QpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBbXVxuICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIG51bGwsIHJvb3QsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIHB1dCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICB2YXIgaGFzID0gIWVudHJ5LnJvb3QgJiYgIXRoaXMuaGFzKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICAgICAgICwga2V5ID0gKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZVxuICAgICAgICAgICAgICA7KG1hcFtrZXldIHx8IChtYXBba2V5XSA9IFtdKSkucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgcmV0dXJuIGhhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBkZWwgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgZm9yQWxsKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGVudHJ5LmhhbmRsZXIsIGVudHJ5LnJvb3QsIGZ1bmN0aW9uIChlbnRyeSwgbGlzdCwgaSkge1xuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIGRlbGV0ZSBtYXBbKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZV1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZHVtcCBhbGwgZW50cmllcywgdXNlZCBmb3Igb251bmxvYWRcbiAgICAgICAgICAsIGVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciB0LCBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yICh0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0LmNoYXJBdCgwKSA9PSAnJCcpIGVudHJpZXMgPSBlbnRyaWVzLmNvbmNhdChtYXBbdF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBoYXM6IGhhcywgZ2V0OiBnZXQsIHB1dDogcHV0LCBkZWw6IGRlbCwgZW50cmllczogZW50cmllcyB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIG5lZWQgYSBzZWxlY3RvciBlbmdpbmUgZm9yIGRlbGVnYXRlZCBldmVudHMsIHVzZSBxdWVyeVNlbGVjdG9yQWxsIGlmIGl0IGV4aXN0c1xuICAgICAgLy8gYnV0IGZvciBvbGRlciBicm93c2VycyB3ZSBuZWVkIFF3ZXJ5LCBTaXp6bGUgb3Igc2ltaWxhclxuICAgICwgc2VsZWN0b3JFbmdpbmVcbiAgICAsIHNldFNlbGVjdG9yRW5naW5lID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBkb2MucXVlcnlTZWxlY3RvckFsbFxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocywgcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnF1ZXJ5U2VsZWN0b3JBbGwocylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZWFuOiBObyBzZWxlY3RvciBlbmdpbmUgaW5zdGFsbGVkJykgLy8gZWVla1xuICAgICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gd2UgYXR0YWNoIHRoaXMgbGlzdGVuZXIgdG8gZWFjaCBET00gZXZlbnQgdGhhdCB3ZSBuZWVkIHRvIGxpc3RlbiB0bywgb25seSBvbmNlXG4gICAgICAvLyBwZXIgZXZlbnQgdHlwZSBwZXIgRE9NIGVsZW1lbnRcbiAgICAsIHJvb3RMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgdHlwZSkge1xuICAgICAgICBpZiAoIVczQ19NT0RFTCAmJiB0eXBlICYmIGV2ZW50ICYmIGV2ZW50LnByb3BlcnR5TmFtZSAhPSAnX29uJyArIHR5cGUpIHJldHVyblxuXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSByZWdpc3RyeS5nZXQodGhpcywgdHlwZSB8fCBldmVudC50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCB0aGlzLCB0cnVlKVxuICAgICAgICBpZiAodHlwZSkgZXZlbnQudHlwZSA9IHR5cGVcblxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgY2FsbGluZyB0aGVtIHVubGVzcyB0aGV5IGhhdmVcbiAgICAgICAgLy8gYmVlbiByZW1vdmVkIGJ5IGEgcHJldmlvdXMgaGFuZGxlciBvciBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgZm9yICg7IGkgPCBsICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXS5yZW1vdmVkKSBsaXN0ZW5lcnNbaV0uaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVycyB0byBET00gZWxlbWVudHNcbiAgICAsIGxpc3RlbmVyID0gVzNDX01PREVMXG4gICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgICAgICAvLyBuZXcgYnJvd3NlcnNcbiAgICAgICAgICAgIGVsZW1lbnRbYWRkID8gYWRkRXZlbnQgOiByZW1vdmVFdmVudF0odHlwZSwgcm9vdExpc3RlbmVyLCB1c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYWRkLCBjdXN0b20gLyosIHVzZUNhcHR1cmUgKi8pIHtcbiAgICAgICAgICAgIC8vIElFOCBhbmQgYmVsb3csIHVzZSBhdHRhY2hFdmVudC9kZXRhY2hFdmVudCBhbmQgd2UgaGF2ZSB0byBwaWdneS1iYWNrIHByb3BlcnR5Y2hhbmdlIGV2ZW50c1xuICAgICAgICAgICAgLy8gdG8gc2ltdWxhdGUgZXZlbnQgYnViYmxpbmcgZXRjLlxuICAgICAgICAgICAgdmFyIGVudHJ5XG4gICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgIHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAsIGN1c3RvbSB8fCB0eXBlXG4gICAgICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXZlbnQpIHsgLy8gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICByb290TGlzdGVuZXIuY2FsbChlbGVtZW50LCBldmVudCwgY3VzdG9tKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICwgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCB0cnVlIC8vIGlzIHJvb3RcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgaWYgKGN1c3RvbSAmJiBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9PSBudWxsKSBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9IDBcbiAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyeSA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCBjdXN0b20gfHwgdHlwZSwgcm9vdExpc3RlbmVyLCB0cnVlKVswXVxuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50YXJnZXQuZGV0YWNoRXZlbnQoJ29uJyArIGVudHJ5LmV2ZW50VHlwZSwgZW50cnkuaGFuZGxlcilcbiAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWwoZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAsIG9uY2UgPSBmdW5jdGlvbiAocm0sIGVsZW1lbnQsIHR5cGUsIGZuLCBvcmlnaW5hbEZuKSB7XG4gICAgICAgIC8vIHdyYXAgdGhlIGhhbmRsZXIgaW4gYSBoYW5kbGVyIHRoYXQgZG9lcyBhIHJlbW92ZSBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIHJtKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICwgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3JnVHlwZSwgaGFuZGxlciwgbmFtZXNwYWNlcywgdXNlQ2FwdHVyZSkge1xuICAgICAgICB2YXIgdHlwZSAgICAgPSBvcmdUeXBlICYmIG9yZ1R5cGUucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICAgICwgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCByZW1vdmVkICA9IHt9XG4gICAgICAgICAgLCBpLCBsXG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcnNbaV0ub3JpZ2luYWwgPT09IGhhbmRsZXIpICYmIGhhbmRsZXJzW2ldLmluTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UgaGF2ZSBhIHJlZ2lzdHJ5LmdldCgpIGFuZCByZWdpc3RyeS5kZWwoKSB0aGF0XG4gICAgICAgICAgICAvLyBib3RoIGRvIHJlZ2lzdHJ5IHNlYXJjaGVzIHNvIHdlIHdhc3RlIGN5Y2xlcyBkb2luZyB0aGlzLiBOZWVkcyB0byBiZSByb2xsZWQgaW50b1xuICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVnaXN0cnkuZm9yQWxsKGZuKSB0aGF0IHJlbW92ZXMgd2hpbGUgZmluZGluZywgYnV0IHRoZSBjYXRjaCBpcyB0aGF0XG4gICAgICAgICAgICAvLyB3ZSdsbCBiZSBzcGxpY2luZyB0aGUgYXJyYXlzIHRoYXQgd2UncmUgaXRlcmF0aW5nIG92ZXIuIE5lZWRzIGV4dHJhIHRlc3RzIHRvXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2NyZXcgaXQgdXAuIEBydmFnZ1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGhhbmRsZXJzW2ldKVxuICAgICAgICAgICAgaWYgKCFyZW1vdmVkW2hhbmRsZXJzW2ldLmV2ZW50VHlwZV0gJiYgaGFuZGxlcnNbaV1bZXZlbnRTdXBwb3J0XSlcbiAgICAgICAgICAgICAgcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdID0geyB0OiBoYW5kbGVyc1tpXS5ldmVudFR5cGUsIGM6IGhhbmRsZXJzW2ldLnR5cGUgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBlYWNoIHR5cGUvZWxlbWVudCBmb3IgcmVtb3ZlZCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyIHdoZXJlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZFxuICAgICAgICBmb3IgKGkgaW4gcmVtb3ZlZCkge1xuICAgICAgICAgIGlmICghcmVnaXN0cnkuaGFzKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgbnVsbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGxpc3RlbmVyIG9mIHRoaXMgdHlwZSwgcmVtb3ZlIHRoZSByb290TGlzdGVuZXJcbiAgICAgICAgICAgIGxpc3RlbmVyKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgZmFsc2UsIHJlbW92ZWRbaV0uYywgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIGEgZGVsZWdhdGUgaGVscGVyIHVzaW5nIHRoZSBnaXZlbiBzZWxlY3Rvciwgd3JhcCB0aGUgaGFuZGxlciBmdW5jdGlvblxuICAgICwgZGVsZWdhdGUgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIC8vVE9ETzogZmluZFRhcmdldCAodGhlcmVmb3JlICQpIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgbWF0Y2ggYW5kIG9uY2UgZm9yXG4gICAgICAgIC8vIHNldHRpbmcgZS5jdXJyZW50VGFyZ2V0LCBmaXggdGhpcyBzbyBpdCdzIG9ubHkgbmVlZGVkIG9uY2VcbiAgICAgICAgdmFyIGZpbmRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBpLCBhcnJheSA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IHNlbGVjdG9yRW5naW5lKHNlbGVjdG9yLCByb290KSA6IHNlbGVjdG9yXG4gICAgICAgICAgICAgIGZvciAoOyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSByb290OyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSB0YXJnZXQpIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kVGFyZ2V0KGUudGFyZ2V0LCB0aGlzKVxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIGZuLmFwcGx5KG1hdGNoLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gX19iZWFuRGVsIGlzbid0IHBsZWFzYW50IGJ1dCBpdCdzIGEgcHJpdmF0ZSBmdW5jdGlvbiwgbm90IGV4cG9zZWQgb3V0c2lkZSBvZiBCZWFuXG4gICAgICAgIGhhbmRsZXIuX19iZWFuRGVsID0ge1xuICAgICAgICAgICAgZnQgICAgICAgOiBmaW5kVGFyZ2V0IC8vIGF0dGFjaCBpdCBoZXJlIGZvciBjdXN0b21FdmVudHMgdG8gdXNlIHRvb1xuICAgICAgICAgICwgc2VsZWN0b3IgOiBzZWxlY3RvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICB9XG5cbiAgICAsIGZpcmVMaXN0ZW5lciA9IFczQ19NT0RFTCA/IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBtb2Rlcm4gYnJvd3NlcnMsIGRvIGEgcHJvcGVyIGRpc3BhdGNoRXZlbnQoKVxuICAgICAgICB2YXIgZXZ0ID0gZG9jLmNyZWF0ZUV2ZW50KGlzTmF0aXZlID8gJ0hUTUxFdmVudHMnIDogJ1VJRXZlbnRzJylcbiAgICAgICAgZXZ0W2lzTmF0aXZlID8gJ2luaXRFdmVudCcgOiAnaW5pdFVJRXZlbnQnXSh0eXBlLCB0cnVlLCB0cnVlLCB3aW4sIDEpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgICB9IDogZnVuY3Rpb24gKGlzTmF0aXZlLCB0eXBlLCBlbGVtZW50KSB7XG4gICAgICAgIC8vIG9sZCBicm93c2VyIHVzZSBvbnByb3BlcnR5Y2hhbmdlLCBqdXN0IGluY3JlbWVudCBhIGN1c3RvbSBwcm9wZXJ0eSB0byB0cmlnZ2VyIHRoZSBldmVudFxuICAgICAgICBlbGVtZW50ID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgaXNOYXRpdmUgPyBlbGVtZW50LmZpcmVFdmVudCgnb24nICsgdHlwZSwgZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KCkpIDogZWxlbWVudFsnX29uJyArIHR5cGVdKytcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogUHVibGljIEFQSTogb2ZmKCksIG9uKCksIGFkZCgpLCAocmVtb3ZlKCkpLCBvbmUoKSwgZmlyZSgpLCBjbG9uZSgpXG4gICAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9mZihlbGVtZW50WywgZXZlbnRUeXBlKHMpWywgaGFuZGxlciBdLCBvcHRpb25zXSlcbiAgICAgICAgKi9cbiAgICAsIG9mZiA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlU3BlYywgZm4pIHtcbiAgICAgICAgdmFyIGlzVHlwZVN0ciA9IGlzU3RyaW5nKHR5cGVTcGVjKSxcbiAgICAgICAgICBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgICwgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSlcbiAgICAgICAgICAsIGssIHR5cGUsIG5hbWVzcGFjZXMsIGlcblxuICAgICAgICBpZiAoaXNUeXBlU3RyICYmIHR5cGVTcGVjLmluZGV4T2YoJyAnKSA+IDApIHtcbiAgICAgICAgICAvLyBvZmYoZWwsICd0MSB0MiB0MycsIGZuKSBvciBvZmYoZWwsICd0MSB0MiB0MycpXG4gICAgICAgICAgdHlwZVNwZWMgPSBzdHIyYXJyKHR5cGVTcGVjKVxuICAgICAgICAgIGZvciAoaSA9IHR5cGVTcGVjLmxlbmd0aDsgaS0tOylcbiAgICAgICAgICAgIG9mZihlbGVtZW50LCB0eXBlU3BlY1tpXSwgZm4pXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICBpZiAodHlwZSAmJiBjdXN0b21FdmVudHNbdHlwZV0pIHR5cGUgPSBjdXN0b21FdmVudHNbdHlwZV0uYmFzZVxuXG4gICAgICAgIGlmICghdHlwZVNwZWMgfHwgaXNUeXBlU3RyKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsKSBvciBvZmYoZWwsIHQxLm5zKSBvciBvZmYoZWwsIC5ucykgb3Igb2ZmKGVsLCAubnMxLm5zMi5uczMpXG4gICAgICAgICAgaWYgKG5hbWVzcGFjZXMgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lc3BhY2VzID0gc3RyMmFycihuYW1lc3BhY2VzLCAnLicpXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZm4sIG5hbWVzcGFjZXMsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHR5cGVTcGVjKSkge1xuICAgICAgICAgIC8vIG9mZihlbCwgZm4pXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgbnVsbCwgdHlwZVNwZWMsIG51bGwsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIHsgdDE6IGZuMSwgdDIsIGZuMiB9KVxuICAgICAgICAgIGZvciAoayBpbiB0eXBlU3BlYykge1xuICAgICAgICAgICAgaWYgKHR5cGVTcGVjLmhhc093blByb3BlcnR5KGspKSBvZmYoZWxlbWVudCwgaywgdHlwZVNwZWNba10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogb24oZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdLCBbb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50cywgc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEZuLCB0eXBlLCB0eXBlcywgaSwgYXJncywgZW50cnksIGZpcnN0LCBvcHRzXG5cbiAgICAgICAgLy9UT0RPOiB0aGUgdW5kZWZpbmVkIGNoZWNrIG1lYW5zIHlvdSBjYW4ndCBwYXNzIGFuICdhcmdzJyBhcmd1bWVudCwgZml4IHRoaXMgcGVyaGFwcz9cbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGV2ZW50cyA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vVE9ETzogdGhpcyBjYW4ndCBoYW5kbGUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcbiAgICAgICAgICAgICAgb24uY2FsbCh0aGlzLCBlbGVtZW50LCB0eXBlLCBldmVudHNbdHlwZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICAgIG9yaWdpbmFsRm4gPSBmblxuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgNClcbiAgICAgICAgICBmbiAgICAgICAgID0gZGVsZWdhdGUoc2VsZWN0b3IsIG9yaWdpbmFsRm4sIHNlbGVjdG9yRW5naW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMylcbiAgICAgICAgICBmbiAgICAgICAgID0gb3JpZ2luYWxGbiA9IHNlbGVjdG9yXG4gICAgICAgIH1cblxuICAgICAgICBvcHRzID0gYnVpbGRPcHRpb25zKGRlZmF1bHRPcHRzLCBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pXG4gICAgICAgIHR5cGVzID0gc3RyMmFycihldmVudHMpXG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBvbmUoKSwgd3JhcCBpbiBhIHNlbGYtcmVtb3ZpbmcgaGFuZGxlclxuICAgICAgICBpZiAodGhpcyA9PT0gT05FKSB7XG4gICAgICAgICAgZm4gPSBvbmNlKG9mZiwgZWxlbWVudCwgZXZlbnRzLCBmbiwgb3JpZ2luYWxGbilcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIC8vIGFkZCBuZXcgaGFuZGxlciB0byB0aGUgcmVnaXN0cnkgYW5kIGNoZWNrIGlmIGl0J3MgdGhlIGZpcnN0IGZvciB0aGlzIGVsZW1lbnQvdHlwZVxuICAgICAgICAgIGZpcnN0ID0gcmVnaXN0cnkucHV0KGVudHJ5ID0gbmV3IFJlZ0VudHJ5KFxuICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAsIHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJykgLy8gZXZlbnQgdHlwZVxuICAgICAgICAgICAgLCBmblxuICAgICAgICAgICAgLCBvcmlnaW5hbEZuXG4gICAgICAgICAgICAsIHN0cjJhcnIodHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpLCAnLicpIC8vIG5hbWVzcGFjZXNcbiAgICAgICAgICAgICwgYXJnc1xuICAgICAgICAgICAgLCBmYWxzZSAvLyBub3Qgcm9vdFxuICAgICAgICAgICkpXG4gICAgICAgICAgaWYgKGVudHJ5W2V2ZW50U3VwcG9ydF0gJiYgZmlyc3QpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGV2ZW50IG9mIHRoaXMgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGFkZCByb290IGxpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCBlbnRyeS5ldmVudFR5cGUsIHRydWUsIGVudHJ5LmN1c3RvbVR5cGUsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBhZGQoZWxlbWVudFssIHNlbGVjdG9yXSwgZXZlbnRUeXBlKHMpLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogRGVwcmVjYXRlZDoga2VwdCAoZm9yIG5vdykgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHlcbiAgICAgICAgKi9cbiAgICAsIGFkZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudHMsIGZuLCBkZWxmbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgLCAhaXNTdHJpbmcoZm4pXG4gICAgICAgICAgICAgID8gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIDogWyBlbGVtZW50LCBmbiwgZXZlbnRzLCBkZWxmbiBdLmNvbmNhdChhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCA0KSA6IFtdKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uZShlbGVtZW50LCBldmVudFR5cGUocylbLCBzZWxlY3Rvcl0sIGhhbmRsZXJbLCBhcmdzIF0pXG4gICAgICAgICovXG4gICAgLCBvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvbi5hcHBseShPTkUsIGFyZ3VtZW50cylcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogZmlyZShlbGVtZW50LCBldmVudFR5cGUocylbLCBhcmdzIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUaGUgb3B0aW9uYWwgJ2FyZ3MnIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXksIGlmIG5vICdhcmdzJyBhcmd1bWVudCBpcyBwcm92aWRlZFxuICAgICAgICAqIHRoZW4gd2UgY2FuIHVzZSB0aGUgYnJvd3NlcidzIERPTSBldmVudCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB0cmlnZ2VyIGhhbmRsZXJzIG1hbnVhbGx5XG4gICAgICAgICovXG4gICAgLCBmaXJlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gc3RyMmFycih0eXBlKVxuICAgICAgICAgICwgaSwgaiwgbCwgbmFtZXMsIGhhbmRsZXJzXG5cbiAgICAgICAgZm9yIChpID0gdHlwZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdHlwZSA9IHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICBpZiAobmFtZXMgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpIG5hbWVzID0gc3RyMmFycihuYW1lcywgJy4nKVxuICAgICAgICAgIGlmICghbmFtZXMgJiYgIWFyZ3MgJiYgZWxlbWVudFtldmVudFN1cHBvcnRdKSB7XG4gICAgICAgICAgICBmaXJlTGlzdGVuZXIobmF0aXZlRXZlbnRzW3R5cGVdLCB0eXBlLCBlbGVtZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub24tbmF0aXZlIGV2ZW50LCBlaXRoZXIgYmVjYXVzZSBvZiBhIG5hbWVzcGFjZSwgYXJndW1lbnRzIG9yIGEgbm9uIERPTSBlbGVtZW50XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGxpc3RlbmVycyBhbmQgbWFudWFsbHkgJ2ZpcmUnXG4gICAgICAgICAgICBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgIGFyZ3MgPSBbZmFsc2VdLmNvbmNhdChhcmdzKVxuICAgICAgICAgICAgZm9yIChqID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcnNbal0uaW5OYW1lc3BhY2VzKG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmhhbmRsZXIuYXBwbHkoZWxlbWVudCwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBjbG9uZShkc3RFbGVtZW50LCBzcmNFbGVtZW50WywgZXZlbnRUeXBlIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUT0RPOiBwZXJoYXBzIGZvciBjb25zaXN0ZW5jeSB3ZSBzaG91bGQgYWxsb3cgdGhlIHNhbWUgZmxleGliaWxpdHkgaW4gdHlwZSBzcGVjaWZpZXJzP1xuICAgICAgICAqL1xuICAgICwgY2xvbmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgZnJvbSwgdHlwZSkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZnJvbSwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gaGFuZGxlcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuICAgICAgICAgICwgYXJncywgYmVhbkRlbFxuXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBhcmdzID0gWyBlbGVtZW50LCBoYW5kbGVyc1tpXS50eXBlIF1cbiAgICAgICAgICAgIGlmIChiZWFuRGVsID0gaGFuZGxlcnNbaV0uaGFuZGxlci5fX2JlYW5EZWwpIGFyZ3MucHVzaChiZWFuRGVsLnNlbGVjdG9yKVxuICAgICAgICAgICAgYXJncy5wdXNoKGhhbmRsZXJzW2ldLm9yaWdpbmFsKVxuICAgICAgICAgICAgb24uYXBwbHkobnVsbCwgYXJncylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICwgYmVhbiA9IHtcbiAgICAgICAgICAnb24nICAgICAgICAgICAgICAgIDogb25cbiAgICAgICAgLCAnYWRkJyAgICAgICAgICAgICAgIDogYWRkXG4gICAgICAgICwgJ29uZScgICAgICAgICAgICAgICA6IG9uZVxuICAgICAgICAsICdvZmYnICAgICAgICAgICAgICAgOiBvZmZcbiAgICAgICAgLCAncmVtb3ZlJyAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ2Nsb25lJyAgICAgICAgICAgICA6IGNsb25lXG4gICAgICAgICwgJ2ZpcmUnICAgICAgICAgICAgICA6IGZpcmVcbiAgICAgICAgLCAnRXZlbnQnICAgICAgICAgICAgIDogRXZlbnRcbiAgICAgICAgLCAnc2V0U2VsZWN0b3JFbmdpbmUnIDogc2V0U2VsZWN0b3JFbmdpbmVcbiAgICAgICAgLCAnbm9Db25mbGljdCcgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udGV4dFtuYW1lXSA9IG9sZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgLy8gZm9yIElFLCBjbGVhbiB1cCBvbiB1bmxvYWQgdG8gYXZvaWQgbGVha3NcbiAgaWYgKHdpbi5hdHRhY2hFdmVudCkge1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGksIGVudHJpZXMgPSByZWdpc3RyeS5lbnRyaWVzKClcbiAgICAgIGZvciAoaSBpbiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2ldLnR5cGUgJiYgZW50cmllc1tpXS50eXBlICE9PSAndW5sb2FkJykgb2ZmKGVudHJpZXNbaV0uZWxlbWVudCwgZW50cmllc1tpXS50eXBlKVxuICAgICAgfVxuICAgICAgd2luLmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gICAgICB3aW4uQ29sbGVjdEdhcmJhZ2UgJiYgd2luLkNvbGxlY3RHYXJiYWdlKClcbiAgICB9XG4gICAgd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gIH1cblxuICAvLyBpbml0aWFsaXplIHNlbGVjdG9yIGVuZ2luZSB0byBpbnRlcm5hbCBkZWZhdWx0IChxU0Egb3IgdGhyb3cgRXJyb3IpXG4gIHNldFNlbGVjdG9yRW5naW5lKClcblxuICByZXR1cm4gYmVhblxufSk7XG4iLCJyZXF1aXJlKCAnLi9saWIvc2hpbXMvY3VzdG9tLWV2ZW50JyApXG5cbnZhciBiZWFuID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAga2V5ICA9IHJlcXVpcmUoICdrZXltYXN0ZXInICksXG4gICAgYW5pbWF0aW9uRXZlbnQgICAgPSByZXF1aXJlKCAnLi9saWIvYW5pbWF0aW9uLWV2ZW50cycgKSxcbiAgICBhZnRlckFuaW1hdGlvbiAgICA9IHJlcXVpcmUoICcuL2xpYi9hZnRlci1hbmltYXRpb24nICksXG4gICAgcGFnZSAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcGFnZScgKSxcbiAgICB0YXAgICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90YXAtZXZlbnRzJyApLFxuICAgIGRlYm91bmNlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlYm91bmNlJyApLFxuICAgIHRocm90dGxlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Rocm90dGxlJyApLFxuICAgIGRlbGF5ICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlbGF5JyApLFxuICAgIHJlcGVhdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3JlcGVhdCcgKSxcbiAgICBidWJibGVGb3JtRXZlbnRzICA9IHJlcXVpcmUoICcuL2xpYi9idWJibGUtZm9ybS1ldmVudHMnICksXG4gICAgc3VibWl0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc3VibWl0JyApLFxuICAgIHNjcm9sbCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Njcm9sbCcgKSxcbiAgICByZXNpemUgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXNpemUnICksXG4gICAgY2FsbGJhY2tNYW5hZ2VyICAgPSByZXF1aXJlKCAnLi9saWIvY2FsbGJhY2stbWFuYWdlcicgKSxcbiAgICBtZWRpYSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9tZWRpYScgKSxcblxuICAgIHNsaWNlICAgICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgIGZvcm1CdWJibGluZyAgICAgID0gZmFsc2UsXG4gICAgd2F0Y2hBbmltYXRpb24gICAgPSB0cnVlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8vIERPTSBldmVudHNcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgb25lOiBvbmUsXG4gIGZpcmU6IGZpcmUsXG4gIGNsb25lOiBiZWFuLmNsb25lLFxuICByZWFkeTogcGFnZS5yZWFkeSxcbiAgY2hhbmdlOiBwYWdlLmNoYW5nZSxcbiAgYWZ0ZXJBbmltYXRpb246IGFmdGVyQW5pbWF0aW9uLFxuICB3YXRjaEFuaW1hdGlvbjogd2F0Y2hBbmltYXRpb24sXG5cbiAgLy8gTWVkaWEgcXVlcnkgZXZlbnRzXG4gIG1lZGlhOiBtZWRpYSxcblxuICAvLyBLZXlib2FyZCBldmVudHNcbiAga2V5OiBrZXksXG4gIGtleU9uOiBrZXksXG4gIGtleU9mZjoga2V5LnVuYmluZCxcbiAga2V5T25lOiBrZXlPbmUsXG5cbiAgLy8gVGltaW5nIHV0aWxpdGllc1xuICBkZWJvdW5jZTogZGVib3VuY2UsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgZGVsYXk6ICAgIGRlbGF5LFxuICByZXBlYXQ6ICAgcmVwZWF0LFxuXG4gIC8vIE9wdGltaXplZCBFdmVudCBNYW5hZ2Vyc1xuICBzY3JvbGw6ICAgICAgc2Nyb2xsLFxuICByZXNpemU6ICAgICAgcmVzaXplLFxuXG4gIGNhbGxiYWNrTWFuYWdlcjogY2FsbGJhY2tNYW5hZ2VyLFxuICBjYWxsYmFjazogY2FsbGJhY2tNYW5hZ2VyLmNhbGxiYWNrLFxuXG4gIC8vIEJ1YmJsaW5nIGZpeFxuICBidWJibGVGb3JtRXZlbnRzOiBidWJibGVGb3JtRXZlbnRzLFxuXG4gIHN1Ym1pdDogc3VibWl0XG59XG5cbnBhZ2UucmVhZHkoIGZ1bmN0aW9uKCkge1xuICBpZiAoIHdhdGNoQW5pbWF0aW9uICkgYWZ0ZXJBbmltYXRpb24ud2F0Y2goKVxufSlcblxuLy8gQmVhbiBkb2Vzbid0IGFjY291bnQgZm9yIGNyb3NzLWJyb3dzZXIgc3VwcG9ydCBvbiBhbmltYXRpb24gZXZlbnRzXG4vLyBTbyByYXRoZXIgdGhhbiBwYXNzIHRocm91Z2ggZXZlbnRzIHRvIGJlYW4sIHdlIHByb2Nlc3MgdGhlbSB0byBhZGRcbi8vIHZlbmRvciBwcmVmaXhlcyBvciByZW1vdmUgZXZlbnRzIGlmIGJyb3dzZXJzIGRvIG5vdCBzdXBwb3IgdGhlbVxuLy9cbmZ1bmN0aW9uIG9uICgpIHtcbiAgc2V0RXZlbnQoICdvbicsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gb2ZmICgpIHtcbiAgc2V0RXZlbnQoICdvZmYnLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9uZSAoKSB7XG4gIHNldEV2ZW50KCAnb25lJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBmaXJlICgpIHtcblxuICBhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgdmFyIGVsID0gYXJnc1swXVxuICB2YXIgZXZlbnRzID0gW11cblxuICBhcmdzWzFdLnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuXG4gICAgdmFyIGV2ZW50ID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBldmVudCApXG4gICAgaWYgKCAhaXNFbXB0eSggZXZlbnQgKSApIGV2ZW50cy5wdXNoKCBldmVudCApXG5cbiAgfSlcblxuICBpZiAoICFpc0VtcHR5KCBldmVudHMgKSApIHtcblxuICAgIGFyZ3NbMV0gPSBldmVudHMuam9pbiggJyAnIClcbiAgICBiZWFuLmZpcmUuYXBwbHkoIHRoaXMsIGFyZ3MgKVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnQoIHJlZ2lzdGVyVHlwZSwgYXJncyApIHtcbiAgdHJhbnNmb3JtQXJncyggYXJncyApLmZvckVhY2goIGZ1bmN0aW9uKCBhcmcgKSB7XG4gICAgYmVhblsgcmVnaXN0ZXJUeXBlIF0uYXBwbHkoIG51bGwsIGFyZyApXG4gIH0pXG5cbn1cblxuLy8gQWRkIHN1cHBvcnQgZm9yIHVuYmluZGluZyBhIGtleSBldmVudCBhZnRlciBpdCBpcyBjYWxsZWRcbi8vXG5mdW5jdGlvbiBrZXlPbmUgKCBrZXlzLCBzY29wZSwgZm4gKSB7XG5cbiAgaWYgKCB0eXBlb2Ygc2NvcGUgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBmbiA9IHNjb3BlXG4gICAgc2NvcGUgPSAnYWxsJ1xuICB9XG5cbiAga2V5KCBrZXlzLCBzY29wZSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGtleS51bmJpbmQoIGtleXMsIHNjb3BlIClcbiAgICBmbiggZXZlbnQgKVxuICB9KVxufVxuXG4vLyBUcmFuc2Zvcm0gZXZlbnQgYXJndW1lbnRzIHRvIGhhbmRsZSB0YXAgZXZlbnQgYW5kIGNyb3NzLWJyb3dzZXIgYW5pbWF0aW9uIGV2ZW50c1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBldmVudHMgdG8gYmUgcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHlcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BcmdzKCBhcmdzICkge1xuXG4gIHZhciB0cmFuc2Zvcm1lZEFyZ3MgPSBbXVxuICB2YXIgbmV3RXZlbnRzID0ge31cbiAgdmFyIGVsZW1lbnQgPSBhcmdzLnNoaWZ0KCkgLy8gcmV0cmlldmUgZWxlbWVudFxuICB2YXIgZXZlbnRzID0gYXJncy5zaGlmdCgpXG5cbiAgLy8gZGV0ZWN0IGV2ZW50IGRlbGVnYXRlIHNlbGVjdG9yXG4gIGlmICggdHlwZW9mIGFyZ3NbMF0gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgICB2YXIgZGVsZWdhdGUgPSBhcmdzLnNoaWZ0KClcbiAgfVxuXG4gIC8vIGNvbnZlcnQgZXZlbnQgc3RyaW5ncyB0byBvYmplY3QgYmFzZWQgZXZlbnRzIGZvciBjb2RlIHNpbXBsaWZpY2F0aW9uXG4gIC8vIGV4YW1wbGU6IGFyZ3VtZW50cyAoJ2hvdmVyIGZvY3VzJywgZnVuY3Rpb24pIHdvdWxkIGJlY29tZSAoeyAnaG92ZXIgZm9jdXMnOiBmdW5jdGlvbiB9KVxuICBpZiAoIHR5cGVvZiBldmVudHMgPT0gJ3N0cmluZycgKSB7XG4gICAgdmFyIG9iakV2ZW50cyA9IHt9XG4gICAgb2JqRXZlbnRzW2V2ZW50c10gPSBhcmdzLnNoaWZ0KClcbiAgICBldmVudHMgPSBvYmpFdmVudHNcbiAgfVxuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGtleSBpbiB0aGUgZXZlbnRzIG9iamVjdCBhbmQgYWRkIHZlbmRvciBwcmVmaXhlcyB0byAnYW5pbWF0aW9uJyBldmVudHNcbiAgLy8gYW5kIHdyYXAgY2FsbGJhY2sgaW4gdGhlIHRhcCBmdW5jdGlvbiBmb3IgYWxsICd0YXAnIGV2ZW50cy5cbiAgLy9cblxuICBPYmplY3Qua2V5cyggZXZlbnRzICkuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIHZhciBjYWxsYmFjayA9IGV2ZW50c1tldmVudF1cblxuICAgIC8vIEV2ZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBzcGFjZSBzZXBhcmF0ZWQgZ3JvdXBzIGxpa2UgXCJob3ZlciBmb2N1c1wiXG4gICAgLy8gVGhpcyBoYW5kbGVzIGVhY2ggZXZlbnQgaW5kZXBlbmRhbnRseVxuICAgIC8vXG4gICAgZXZlbnQuc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZSApe1xuXG4gICAgICAvLyBJZiBpdCBpcyBhbiBhbmltYXRpb24gZXZlbnQsIHZlbmRvciBwcmVmaXggaXQsIG9yIGZpcmUgdGhlIGNhbGxiYWNrIGFjY29yZGluZyB0byBicm93c2VyIHN1cHBvcnRcbiAgICAgIGUgPSBhbmltYXRpb25FdmVudC50cmFuc2Zvcm0oIGUgKVxuXG4gICAgICBpZiAoIGlzRW1wdHkoIGUgKSApIHtcbiAgICAgICAgLy8gSWYgaXQncyBlbXB0eSwgaXQgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBhbmltYXRpb24gZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHRyaWdnZXIgdGhlIGV2ZW50IGltbWVkaWF0ZWx5XG4gICAgICAgIGNhbGxiYWNrKClcblxuICAgICAgfSBlbHNlIGlmICggZS5tYXRjaCggL3RhcC8gKSApIHtcblxuICAgICAgICAvLyBJZiBpdCdzIGEgdGFwIGV2ZW50LCB3cmFwIHRoZSBjYWxsYmFjayBhbmQgc2V0IHRoZSBldmVudCB0byAndG91Y2hzdGFydCdcbiAgICAgICAgLy8gVGFwIGlzbid0IGEgcmVhbCBuYXRpdmUgZXZlbnQsIGJ1dCB0aGlzIHdyYXBwZXIgbGV0cyB1cyBzaW11bGF0ZSB3aGF0IGFcbiAgICAgICAgLy8gbmF0aXZlIHRhcCBldmVudCB3b3VsZCBiZS5cbiAgICAgICAgLy9cbiAgICAgICAgbmV3RXZlbnRzLnRvdWNoc3RhcnQgPSB0YXAoIGNhbGxiYWNrIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0V2ZW50c1sgZSBdID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKCBuZXdFdmVudHMgKS5mb3JFYWNoKCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgdmFyIGEgPSBbXVxuICAgIGEucHVzaCggZWxlbWVudCwgZXZlbnQgKVxuXG4gICAgaWYgKCBkZWxlZ2F0ZSApIGEucHVzaCggZGVsZWdhdGUgKVxuXG4gICAgYS5wdXNoKCBuZXdFdmVudHNbIGV2ZW50IF0gKVxuICAgIHRyYW5zZm9ybWVkQXJncy5wdXNoKCBhLmNvbmNhdCggYXJncyApIClcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRBcmdzXG59XG5cblxuZnVuY3Rpb24gaXNFbXB0eSggb2JqICkge1xuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuICBpZiAoIG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT09IDAgKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICggMCA8IG9iai5sZW5ndGggKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCBoYXNPd25Qcm9wZXJ0eS5jYWxsKCBvYmosIGtleSApICkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBFdmVudCAgICAgPSByZXF1aXJlKCAnYmVhbicgKSxcbiAgICBkZWxheSAgICAgPSByZXF1aXJlKCAnLi9kZWxheScgKSxcbiAgICBzdXBwb3J0ZWQgPSByZXF1aXJlKCAnLi9hbmltYXRpb24tZXZlbnRzJyApLnN1cHBvcnRlZFxuXG5mdW5jdGlvbiBhbmltYXRpb25EdXJhdGlvbiggZWwgKSB7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWwgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnYW5pbWF0aW9uLWR1cmF0aW9uJyApXG59XG5cbi8vIFdhdGNoZXMgYWxsIGRvY3VtZW50IGFuaW1hdGlvbiBhZGQgYWRkIGRhdGEgYXR0cmlidXRlcyB0byBlbGVtZW50cyB3aGVuIHRoZXkgYmVnaW5cbi8vIFRoaXMgZW5hYmxlcyBhbmltYXRpb25FbmQgdG8gd2F0Y2ggYW5pbWF0aW9ucyB3aGljaCBoYXZlbid0IGJlZ3VuXG5mdW5jdGlvbiB3YXRjaEFuaW1hdGlvbigpIHtcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZXZlbnQudGFyZ2V0LmRhdGFzZXQuaXNBbmltYXRpbmcgPSB0cnVlXG4gIH0pXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2FuaW1hdGlvbmVuZCcsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBldmVudC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWlzLWFuaW1hdGluZycpXG4gIH0pXG59XG5cbi8vIFRoaXMgcmVxdWlyZXMgdHJhY2tFbGVtZW50QW5pbWF0aW9uIHRvIGJlIGVuYWJsZWRcbmZ1bmN0aW9uIGFmdGVyQW5pbWF0aW9uKCBlbCwgY2FsbGJhY2ssIHN0YXJ0VGltZW91dCApIHtcbiAgLy8gQW5pbWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIGp1c3QgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgaWYgKCAhc3VwcG9ydGVkICkgcmV0dXJuIGNhbGxiYWNrKClcblxuICAvLyBBbmltYXRpb24gaGFzIGFscmVhZHkgYmVndW5cbiAgaWYgKCBlbC5kYXRhc2V0LmlzQW5pbWF0aW5nIHx8IGVsLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pcy1hbmltYXRpbmddJyApICkge1xuXG4gICAgLy8gV2F0Y2ggZm9yIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG5cbiAgLy8gQW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZ3VuIHNv4oCmXG4gIH0gZWxzZSB7XG5cbiAgICAvLyBzdGFydFRpbWVvdXQgaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgYSBjYWxsYmFjayBpcyBmaXJlZCBldmVuIGlmIFxuICAgIC8vIGFuIGFuaW1hdGlvbiBldmVudCwgb3IgaW4gdGhlIGNhc2UgdGhhdCBhbiBhbmltYXRpb24gZXZlbnQgaXMgbmV2ZXIgdHJpZ2dlcmVkXG4gICAgLy8gdGhpcyBtaWdodCBoYXBwZW4gaWYgYSB1c2VyIHdhbnRzIHRvIGZpcmUgYSBjYWxsYWNrIGFmdGVyIGFuIGVsZW1lbnQgYW5pbWF0ZXNcbiAgICAvLyBvciBmaXJlIHRoZSBjYWxsYmFjayBhbnl3YXkgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGFuaW1hdGlvbi5cbiAgICBpZiAoIHN0YXJ0VGltZW91dCApIHtcblxuICAgICAgLy8gU2V0IGEgZGVmYXVsdCB0aW1lb3V0IChhbGxvd2luZyBzdGFydFRpbWVvdXQgPT0gdHJ1ZSBvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsaXNlY29ucylcbiAgICAgIHZhciB0aW1lID0gKCh0eXBlb2Ygc3RhcnRUaW1lb3V0ID09IFwibnVtYmVyXCIpID8gc3RhcnRUaW1lb3V0IDogMzIpIC8vIDMybXM6IH4gdHdvIGZyYW1lcyBvZiBhbmltYXRpb24gZ3JhY2UgcGVyaW9kXG5cbiAgICAgIHZhciBkZWxheWVkRXZlbnQgPSBkZWxheSggZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgZm9yIGFuaW1hdGlvbiB0byBzdGFydFxuICAgICAgICAvLyBXaHk/IC0gSWYgdGhlIGFuaW1hdGlvbiBzdGFydHMgbGF0ZXIsIHRoZSBjYWxsYmFjayB3aWxsIGZpcmUgdHdpY2VcbiAgICAgICAgRXZlbnQub2ZmKCBlbCwgJ2FuaW1hdGlvbnN0YXJ0Jywgd2F0Y2hFbmRFdmVudCApIFxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9LCB0aW1lIClcbiAgICB9XG5cbiAgICAvLyBOZXh0OlxuICAgIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYXR0YWNoIGNhbGxiYWNrIHRvIGFuaW1hdGlvbkVuZCBldmVudFxuICAgIGZ1bmN0aW9uIHdhdGNoRW5kRXZlbnQgKCkge1xuICAgICAgaWYgKCBzdGFydFRpbWVvdXQgKSBkZWxheWVkRXZlbnQuc3RvcCgpICAgIC8vIGNhbmNlbCBkZWxheWVkIGZpcmVcbiAgICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApIC8vIHdhdGNoIGZvciBhbmltYXRpb24gdG8gZmluaXNoXG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmFsbHksIHdoZW4gdGhlIGFuaW1hdGlvbiBkb2VzIHN0YXJ0LCB3YXRjaCBmb3IgaXRzIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25zdGFydCcsIHdhdGNoRW5kRXZlbnQgKVxuICB9XG59XG5cbmFmdGVyQW5pbWF0aW9uLndhdGNoID0gd2F0Y2hBbmltYXRpb25cblxubW9kdWxlLmV4cG9ydHMgPSBhZnRlckFuaW1hdGlvblxuIiwidmFyIGNzc0FuaW1FdmVudFR5cGVzID0gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpXG52YXIgc3VwcG9ydGVkICAgICAgICAgPSBjc3NBbmltRXZlbnRUeXBlcy5hbmltYXRpb25zdGFydCAhPT0gdW5kZWZpbmVkXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50cyxcbiAgc3VwcG9ydGVkOiBzdXBwb3J0ZWRcbn1cblxuZnVuY3Rpb24gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgYW5pbWF0aW9uc3RhcnQ6IHByZWZpeCArICdBbmltYXRpb25TdGFydCcsXG4gICAgYW5pbWF0aW9uZW5kOiBwcmVmaXggKyAnQW5pbWF0aW9uRW5kJyxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IHByZWZpeCArICdBbmltYXRpb25JdGVyYXRpb24nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ2FuaW1hdGlvbmVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnYW5pbWF0aW9uaXRlcmF0aW9uJ1xuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gQW5pbWF0aW9uIGV2ZW50IHR5cGVzIHthbmltYXRpb25zdGFydCwgYW5pbWF0aW9uZW5kLCBhbmltYXRpb25pdGVyYXRpb259XG4gKi9cblxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpIHtcbiAgaWYgKCAhZG9jdW1lbnQgKSByZXR1cm4ge31cblxuICB2YXIgcHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdNb3onLCAnTycsICcnXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8vIGJyb3dzZXIgY29tcGxpYW50XG4gIGlmICh1bmRlZmluZWQgIT09IHN0eWxlLmFuaW1hdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByZWZpeGVzLmxlbmd0aCwgcHJlZml4OyBpIDwgbGVuOyBpKyspIHtcbiAgICBwcmVmaXggPSBwcmVmaXhlc1tpXTtcblxuICAgIGlmICh1bmRlZmluZWQgIT09IHN0eWxlW3ByZWZpeCArICdBbmltYXRpb25OYW1lJ10pIHtcbiAgICAgIC8vIFdlYmtpdFxuICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZWxzZSBpZiAoMSA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICAgICAgfVxuICAgICAgLy8gT3BlcmFcbiAgICAgIGVsc2UgaWYgKDIgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuXG4vLyBBZGRzIG5lY2Vzc2FyeSBhZGQgdmVuZG9yIHByZWZpeGVzIG9yIGNhbWVsQ2FzZWQgZXZlbnQgbmFtZXNcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHMgKGV2ZW50KSB7XG4gIGlmICghZXZlbnQubWF0Y2goL2FuaW1hdGlvbi9pKSkge1xuICAgIHJldHVybiBldmVudFxuICB9IGVsc2Uge1xuICAgIGlmIChjc3NBbmltRXZlbnRUeXBlc1tldmVudF0pIHtcbiAgICAgIHJldHVybiBjc3NBbmltRXZlbnRUeXBlc1tldmVudF1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYod2luZG93LmVudiAhPSAndGVzdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignXCInICsgZXZlbnQgKyAnXCIgaXMgbm90IGEgc3VwcG9ydGVkIGFuaW1hdGlvbiBldmVudCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdiZWFuJyApLFxuICAgIHBhZ2UgID0gcmVxdWlyZSggJy4vcGFnZScgKSxcbiAgICBmb3JtRWxzO1xuXG52YXIgZm9ybUJ1YmJsaW5nID0gZmFsc2VcblxudmFyIGZpcmVCdWJibGUgPSBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LmRldGFpbCAmJiBldmVudC5kZXRhaWwudHJpZ2dlcmVkICkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggZXZlbnQudHlwZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG5cbiAgLy8gU3RvcCBvbmx5ICdzdWJtaXQnIGV2ZW50cy4gU3RvcHBpbmcgYmx1ciBvciBmb3VjcyBldmVudHMgc2VlbXMgdG8gYnJlYWsgRmlyZUZveCBpbnB1dCBpbnRlcmFjdGlvbnMuXG4gIGlmICggZXZlbnQudHlwZSA9PSAnc3VibWl0JyApIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBQcmV2ZW50IGRlZmF1bHQgb24gb3JpZ2luYWwgZXZlbnQgaWYgY3VzdG9tIGV2ZW50IGlzIHByZXZlbnRlZFxuICBpZiAoIGV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxufVxuXG4vLyBTaW1wbGlmeSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIGJhc2VkIG9uIHRoZSBlbGVtZW50XG52YXIgZXZlbnRUeXBlID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgcmV0dXJuICggZWwudGFnTmFtZSA9PSAnRk9STScgKSA/ICdzdWJtaXQnIDogJ2ZvY3VzIGJsdXInXG59XG5cbi8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPbiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9uKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9mZiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9mZiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIEFkZC9SZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlRm9ybUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCBmb3JtQnViYmxpbmcgKSB7IHJldHVybiB9IFxuICBwYWdlLmNoYW5nZSggZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gcHJldmlvdXMgcGFnZVxuICAgIGlmICggZm9ybUVscyApIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9mZiApXG5cbiAgICAvLyBBZGQgbmV3IGxpc3RlbmVycyB0byB0aGlzIHBhZ2VcbiAgICBmb3JtRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm0sIGlucHV0JyApXG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPbiApXG4gIH0pXG5cbiAgdmFyIGZvcm1CdWJibGluZyA9IHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWJibGVGb3JtRXZlbnRzXG4iLCJ2YXIgTWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFuYWdlciA9IHtcblxuICAgICAgY2FsbGJhY2tzOiBbXSxcblxuICAgICAgYWRkOiBmdW5jdGlvbiggZm4gKSB7XG5cbiAgICAgICAgdmFyIGNiID0gTWFuYWdlci5jYWxsYmFjay5uZXcoIGZuIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MucHVzaCggY2IgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNiXG5cbiAgICAgIH0sXG5cbiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0b3AoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdGFydCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi50b2dnbGUoIGJvb2wgKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzID0gW11cbiAgICAgIH0sXG5cbiAgICAgIGZpcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuLmFwcGx5KCB0aGlzLCBhcmdzICkgfSApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbmFnZXJcbiAgfSxcblxuICBjYWxsYmFjazoge1xuICAgIG5ldzogZnVuY3Rpb24oIGZuICkge1xuICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggY2IuZW5hYmxlZCApIHsgZm4uYXBwbHkoIGZuLCBhcmd1bWVudHMgKSB9XG4gICAgICB9XG5cbiAgICAgIGNiLnN0b3AgICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gZmFsc2UgfVxuICAgICAgY2Iuc3RhcnQgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSB0cnVlIH1cbiAgICAgIGNiLnRvZ2dsZSA9IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBjYi5lbmFibGVkID0gKCAwIGluIGFyZ3VtZW50cyApID8gYm9vbCA6ICFjYi5lbmFibGVkXG4gICAgICB9XG4gICAgICBjYi5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICByZXR1cm4gY2JcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYW5hZ2VyXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBwaWNrRnVuY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZvdW5kXG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGNhbmRpZGF0ZSApIHtcbiAgICBpZiAoIHR5cGVvZiggY2FuZGlkYXRlICkgPT0gJ2Z1bmN0aW9uJyAmJiAhZm91bmQgKSB7IGZvdW5kID0gY2FuZGlkYXRlIH1cbiAgfSlcblxuICByZXR1cm4gZm91bmRcbn1cblxudmFyIGRlYm91bmNlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIC8vIEFsbG93IG9wdGlvbnMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudFxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuIH0gXG5cbiAgLy8gT3B0aW9ucyB3b24ndCBiZSBudWxsXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgd2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcblxuICB2YXIgbWF4ICAgICAgICAgICAgPSBvcHRpb25zLm1heCB8fCBmYWxzZSxcbiAgICAgIGxlYWRpbmcgICAgICAgID0gKCAoICdsZWFkaW5nJyAgaW4gb3B0aW9ucyApID8gb3B0aW9ucy5sZWFkaW5nICA6IGZhbHNlICksXG4gICAgICB0cmFpbGluZyAgICAgICA9ICggKCAndHJhaWxpbmcnIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cnVlICksXG4gICAgICBcbiAgICAgIC8vIEdyYWIgZnVuY3Rpb25zIGZyb20gb3B0aW9ucyBvciBkZWZhdWx0IHRvIGZpcnN0IGFyZ3VtZW50XG4gICAgICBsZWFkaW5nRm4gICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuICAgICAgdHJhaWxpbmdGbiAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcblxuICAgICAgLy8gU3RhdGUgdHJhY2tpbmcgdmFyc1xuICAgICAgYXJncywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVib3VuY2VkIGNhbGxiYWNrXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlLCAgLy8gSGFzIGEgY2FsbGJhY2sgYmVlbiBhZGRlZCB0byB0aGUgYW5pbWF0aW9uIGxvb3A/XG4gICAgICBoYW5kbGUgICAgICAgICA9IHt9LCAgICAgLy8gT2JqZWN0IGZvciB0cmFja2luZyBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrc1xuICAgICAgbGFzdENhbGxlZCAgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgZGVib3VuY2luZ1xuICAgICAgbGFzdEludm9rZWQgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgbWF4XG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlOyAgLy8gVHJhY2sgbGVhZGluZywgdGhyb3R0bGluZyBzdWJzZXF1ZW50IGxlYWRpbmcgY2FsbHNcblxuICAvLyBRdWV1ZSB0aGUgZnVuY3Rpb24gd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgdmFyIGludm9rZSA9IGZ1bmN0aW9uKCBjYWxsVHlwZSApIHtcblxuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGxhc3RJbnZva2VkID0gbm93KClcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIGxlYWRpbmdCbG9ja2VkID0gdHJ1ZVxuXG4gICAgaWYgKCBjYWxsVHlwZSA9PT0gJ2xlYWRpbmcnICkge1xuICAgICAgbGVhZGluZ0ZuLmFwcGx5KCBsZWFkaW5nRm4sIGFyZ3MgKSB9XG4gICAgZWxzZSB7XG4gICAgICB0cmFpbGluZ0ZuLmFwcGx5KCB0cmFpbGluZ0ZuLCBhcmdzICkgfVxuXG4gIH1cblxuICAvLyBMb2FkIHRoZSBsb29wIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICB2YXIgYWRkVG9RdWV1ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXF1ZXVlZCApIHtcbiAgICAgIHF1ZXVlZCA9IHRydWVcbiAgICAgIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggbG9vcCApICAvLyBBZGQgdG8gYnJvd3NlcidzIGFuaW1hdGlvbiBxdWV1ZVxuICAgIH1cblxuICB9XG5cbiAgLy8gUmVtb3ZlIGZyb20gYW5pbWF0aW9uIHF1ZXVlIGFuZCByZXNldCBkZWJvdW5jZSBcbiAgdmFyIHJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDBcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIC8vIHByZXZlbnQgaW5maW5pdGUgZGVib3VuY2luZyAoIGlmIG9wdGlvbnMubWF4IGlzIHNldCApXG4gIHZhciBtYXhQYXNzZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBtYXggJiYgbm93KCkgLSBsYXN0SW52b2tlZCA+PSBtYXggKVxuICB9XG5cbiAgdmFyIHdhaXRSZWFjaGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbm93KCkgLSBsYXN0Q2FsbGVkICkgPj0gd2FpdFxuICB9XG5cbiAgLy8gVGhpcyBnZXRzIGxvYWRlZCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWUgYW5kIGRldGVybWluZXMgd2hldGhlciB0byBpdm9rZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCkge1xuICBcbiAgICAvLyBMb29wIHdhcyBleGVjdXRlZCBzbyBpdCdzIG5vIGxvbmdlciBpbiB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBcbiAgICBpZiAoIGxlYWRpbmcgJiYgIWxlYWRpbmdCbG9ja2VkICkge1xuICAgICAgaW52b2tlKCAnbGVhZGluZycgKVxuICAgIH1cblxuICAgIC8vIElmIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0byBmcmVxdWVudGx5IHRvIGV4ZWN1dGVcbiAgICBlbHNlIGlmICggbWF4UGFzc2VkKCkgKSB7XG5cbiAgICAgIGlmICggbGVhZGluZyApIHsgaW52b2tlKCAnbGVhZGluZycgKSAgfVxuICAgICAgZWxzZSAgICAgICAgICAgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICB9IFxuICAgIFxuICAgIC8vIElmIGZ1bmN0aW9uIGhhc24ndCBiZWVuIGNhbGxlZCBzaW5jZSBsYXN0IHdhaXRcbiAgICBlbHNlIGlmICggd2FpdFJlYWNoZWQoKSApIHtcblxuICAgICAgLy8gSWYgdHJhaWxpbmcgaXQncyBzYWZlIHRvIGludm9rZVxuICAgICAgaWYgKCB0cmFpbGluZyApIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgICAvLyBJZiBsZWFkaW5nLCBpdCdzIHNhZmUgdG8gcmVtb3ZlIGJsb2NrXG4gICAgICBpZiAoIGxlYWRpbmcgKSAgeyBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlIH1cbiAgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFRvUXVldWUoKVxuICAgIH1cblxuICB9XG5cbiAgLy8gQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBxdWV1ZWluZyB1cCBmdW5jdGlvbiBjYWxsc1xuICAvL1xuICB2YXIgZGVib3VuY2VkID0gZnVuY3Rpb24oKSB7XG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgYXJncyA9IGFyZ3VtZW50c1xuICAgIGFkZFRvUXVldWUoKVxuICB9XG5cbiAgZGVib3VuY2VkLnN0b3AgPSByZW1vdmVGcm9tUXVldWVcblxuICByZXR1cm4gZGVib3VuY2VkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2VcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gKCBmbiwgd2FpdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gKCB3YWl0ICE9IG51bGwgKSA/IDIgOiAxO1xuICB2YXIgaGFuZGxlID0ge31cblxuICBoYW5kbGUuYXJncyAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUud2FpdCAgPSB3YWl0IHx8IDBcbiAgaGFuZGxlLnN0YXJ0ID0gbm93KClcblxuICBoYW5kbGUuc3RvcCAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZS5sb29wICA9IGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIElmIHdhaXQgbGltaXQgaGFzIGJlZW4gcmVhY2hlZFxuICAgIGlmICggbm93KCkgLSBoYW5kbGUuc3RhcnQgPj0gaGFuZGxlLndhaXQgKSB7XG4gICAgICBmbi5hcHBseSggZm4sIGhhbmRsZS5hcmdzIClcblxuICAgICAgLy8gSWYgcmVwZWF0IGlzIHNldCBhbmQgaXMgbm90IDBcbiAgICAgIGlmICggISFoYW5kbGUucmVwZWF0ICkge1xuICAgICAgICBoYW5kbGUucmVwZWF0ID0gaGFuZGxlLnJlcGVhdCAtIDFcbiAgICAgICAgaGFuZGxlLnN0YXJ0ID0gbm93KClcbiAgICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICAgIH0gZWxzZSBpZiAoIGhhbmRsZS5yZXBlYXQgPT09IDAgJiYgaGFuZGxlLmNvbXBsZXRlICkge1xuICAgICAgICBoYW5kbGUuY29tcGxldGUoKVxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgfVxuXG4gIH1cblxuXG4gIHJldHVybiBxdWV1ZURlbGF5KCBoYW5kbGUgKVxufVxuXG52YXIgcXVldWVEZWxheSA9IGZ1bmN0aW9uICggaGFuZGxlICkge1xuICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGhhbmRsZS5sb29wIClcbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGF5XG4iLCIvLyBUaGlzIHNpbXBsaWZpZXMgY29tbW9uIHVzZXMgZm9yIHdpbmRvdy5tYXRjaE1lZGlhIFxuLy8gbmFtZWx5LCBhZGRpbmcgbGlzdGVuZXJzIGZvciB3aWR0aCBhbmQgaGVpZ2h0IHF1ZXJpZXNcblxuZnVuY3Rpb24gcGFyc2VRdWVyeSggcXVlcnksIGRpbWVuc2lvbiApIHtcbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgaWYgKCB0eXBlb2YoIHF1ZXJ5ICkgPT09ICdzdHJpbmcnICkgeyByZXR1cm4gcXVlcnkgfVxuXG4gIHJlc3VsdC5taW4gPSBzaXplKCBxdWVyeS5taW4sICdtaW4tJyArIGRpbWVuc2lvbiApXG4gIHJlc3VsdC5tYXggPSBzaXplKCBxdWVyeS5tYXgsICdtYXgtJyArIGRpbWVuc2lvbiApXG5cbiAgaWYgKCByZXN1bHQubWluICYmIHJlc3VsdC5tYXggKVxuICAgIHJlc3VsdC5xdWVyeSA9IHJlc3VsdC5taW4gKyAnIGFuZCAnICsgcmVzdWx0Lm1heFxuXG4gIHJldHVybiByZXN1bHQucXVlcnkgfHwgcmVzdWx0Lm1pbiB8fCByZXN1bHQubWF4XG59XG5cbmZ1bmN0aW9uIHNpemUoIG51bSwgbGltaXQgKSB7XG4gIHJldHVybiAoIG51bSApID8gJygnK2xpbWl0Kyc6ICcgKyB0b1B4KCBudW0gKSArICcpJyA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9QeCggd2lkdGggKSB7XG4gIGlmICggdHlwZW9mKCB3aWR0aCApID09PSAnbnVtYmVyJyApIHsgcmV0dXJuIHdpZHRoICsgJ3B4J31cbiAgcmV0dXJuIHdpZHRoXG59XG5cbnZhciBtZWRpYSA9IHtcblxuICB3aWR0aDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ3dpZHRoJyApLCBmbiApXG4gIH0sXG5cbiAgbWluV2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heFdpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGhlaWdodDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ2hlaWdodCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbkhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heEhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgbGlzdGVuOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5tYXRjaE1lZGlhKCBxdWVyeSApXG5cbiAgICBpZiAoIGZuICkge1xuICAgICAgZm4oIG1hdGNoIClcbiAgICAgIG1hdGNoLmFkZExpc3RlbmVyKCBmbiApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gbWVkaWFcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcbnZhciB0aHJvdHRsZSAgICAgICAgPSByZXF1aXJlKCAnLi90aHJvdHRsZScgKVxudmFyIGRlYm91bmNlICAgICAgICA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciBvcHRpbWl6ZWRFdmVudE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oIG5hbWUgKSB7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY2FsbGJhY2sgbWFuYWdlclxuICAgIHZhciBtYW5hZ2VyID0ge1xuICAgICAgcnVuOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdGFydDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RvcDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpXG4gICAgfVxuXG4gICAgLy8gcnVuIGNhbGxiYWNrcyB3aGVuIGV2ZW50IGhhcHBlbnMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgcnVubmluZyA9IHRocm90dGxlKCBtYW5hZ2VyLnJ1bi5maXJlIClcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0YXJ0ZWQgPSBkZWJvdW5jZSh7XG4gICAgICBsZWFkaW5nOiBtYW5hZ2VyLnN0YXJ0LmZpcmUsXG4gICAgICB0cmFpbGluZzogZmFsc2UsXG4gICAgICB3YWl0OiAxNTBcbiAgICB9KVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RvcHBlZCA9IGRlYm91bmNlKCBtYW5hZ2VyLnN0b3AuZmlyZSwgMTUwIClcblxuICAgIEV2ZW50Lm9uKCB3aW5kb3csIG5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgcnVubmluZygpXG4gICAgICBzdGFydGVkKClcbiAgICAgIHN0b3BwZWQoKVxuICAgIH0pXG5cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgdmFyIHJ1biAgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIucnVuLmFkZCggZm4gKSB9XG4gICAgcnVuLnN0YXJ0ID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RhcnQuYWRkKCBmbiApIH1cbiAgICBydW4uc3RvcCAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdG9wLmFkZCggZm4gKSB9XG5cbiAgICAvLyBBZGQgY3VzdG9tIGV2ZW50cyBmb3IgdG8gcnVuIG9wdGltaXplZCBsaXN0ZW5lcnMuICggbmFtZSAtPiBOYW1lIClcbiAgICBydW4oIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csICdvcHRpbWl6ZWQnICsgIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpICkgfSApXG4gICAgcnVuLnN0YXJ0KCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0YXJ0JyApIH0gKVxuICAgIHJ1bi5zdG9wKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0b3AnICkgfSApXG5cbiAgICByZXR1cm4gcnVuXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpbWl6ZWRFdmVudE1hbmFnZXJcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcblxuLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgZXZlbnQgbWFuYWdlclxudmFyIG1hbmFnZXIgPSB7XG4gIHJlYWR5OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIGNoYW5nZTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICByZWFkeUFscmVhZHk6IGZhbHNlLFxuICBjaGFuZ2VkOiBmYWxzZSxcbn1cblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7XG4gIG1hbmFnZXIucmVhZHlBbHJlYWR5ID0gdHJ1ZSBcbn0pXG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpeyBcbiAgaWYgKCAhd2luZG93LlR1cmJvbGlua3MgJiYgIW1hbmFnZXIuY2hhbmdlZCApIHsgXG4gICAgbWFuYWdlci5jaGFuZ2VkID0gdHJ1ZSBcbiAgICBtYW5hZ2VyLmNoYW5nZS5maXJlKClcbiAgfVxufSlcblxudmFyIHJlYWR5ID0gZnVuY3Rpb24gKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLnJlYWR5QWxyZWFkeSApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLnJlYWR5LmFkZCggZm4gKSB9XG5cbnZhciBjaGFuZ2UgPSBmdW5jdGlvbiggZm4gKSB7XG4gIGlmICggbWFuYWdlci5jaGFuZ2VkICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIuY2hhbmdlLmFkZCggZm4gKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIHJlYWR5IGNhbGxiYWNrc1xucmVhZHkuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5yZWFkeS5maXJlKClcbiAgLy8gQmUgc3VyZSByZWFkeSBjYW4gb25seSBiZSBmaXJlZCBvbmNlXG4gIG1hbmFnZXIucmVhZHkuc3RvcCgpIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgY2hhbmdlIGNhbGxiYWNrc1xuY2hhbmdlLmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIuY2hhbmdlLmZpcmUoKSB9XG5cbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ0RPTUNvbnRlbnRMb2FkZWQnLCByZWFkeS5maXJlIClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ3BhZ2U6Y2hhbmdlIHR1cmJvbGlua3M6bG9hZCcsIGNoYW5nZS5maXJlICkgLy8gU3VwcG9ydCBjdXN0b20gYW5kIHJhaWxzIHR1cmJvbGlua3MgcGFnZSBsb2FkIGV2ZW50c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVhZHk6IHJlYWR5LFxuICBjaGFuZ2U6IGNoYW5nZVxufVxuIiwidmFyIGRlbGF5ID0gcmVxdWlyZSggJy4vZGVsYXknIClcblxudmFyIHJlcGVhdCA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgbGltaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9IDEsXG4gICAgICBoYW5kbGUgPSBkZWxheSAoIGZuLCB3YWl0ICk7XG5cbiAgaWYgICAgICAoIGxpbWl0ICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDMgfVxuICBlbHNlIGlmICggd2FpdCAgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMiB9XG5cbiAgLy8gRW5hYmxlIHJlcGVhdCAoIC0xIHdpbGwgcmVwZWF0IGZvcmV2ZXIgKVxuICBoYW5kbGUucmVwZWF0ID0gbGltaXQgfHwgLTFcbiAgaGFuZGxlLmFyZ3MgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS5zdG9wICAgPSBoYW5kbGUuY2FuY2VsXG5cbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGVhdFxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHJlc2l6ZSAgPSBtYW5hZ2VyLm5ldyggJ3Jlc2l6ZScgKVxuXG4vLyBQYXVzZSBhbmltYXRpb25zIGR1cmluZyByZXNpemluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG5yZXNpemUuZGlzYWJsZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSAnPHN0eWxlIGlkPVwiZnVsbHN0b3BcIj4ubm8tYW5pbWF0aW9uICosIC5uby1hbmltYXRpb24gKjphZnRlciwgLm5vLWFuaW1hdGlvbiAqOmJlZm9yZSB7XFxcbiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IGFuaW1hdGlvbjogbm9uZSAhaW1wb3J0YW50XFxcbiAgfTwvc3R5bGU+J1xuXG4gIC8vIEluamVjdCBzdHlsZSBmb3IgZWFzeSBjbGFzc25hbWUgbWFuaXB1bGF0aW9uXG4gIGlmICggIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlI2Z1bGxzdG9wJykgKSB7IFxuICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzdHlsZSlcbiAgfVxuXG4gIHJlc2l6ZS5zdGFydCggZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ25vLWFuaW1hdGlvbicgKSB9IClcbiAgcmVzaXplLnN0b3AoIGZ1bmN0aW9uKCkgeyAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc2l6ZVxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHNjcm9sbCAgPSBtYW5hZ2VyLm5ldyggJ3Njcm9sbCcgKVxuXG5zY3JvbGwuZGlzYWJsZVBvaW50ZXIgPSBmdW5jdGlvbigpIHtcblxuICAvLyBEaXNhYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0YXJ0KCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICB9KVxuXG4gIC8vIEVuYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdG9wKCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsXG4iLCIvLyBDdXN0b20gRXZlbnQgUG9seWZpbGxcbihmdW5jdGlvbiAoKSB7XG5cbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKVxuIiwiLy8gTWFudWFsbHkgdHJpZ2dlciBhIGNhbmNlbGFibGUgZm9ybSBzdWJtaXQgZXZlbnQuXG5mdW5jdGlvbiBzdWJtaXQoIGZvcm0gKSB7XG4gIGlmICggIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUgIT0gJ0ZPUk0nICkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKCAnVHJpZ2dlciB0aGlzIGV2ZW50IG9uIGEgZm9ybSBlbGVtZW50JyApXG4gIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoICdzdWJtaXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcbiAgZm9ybS5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gU3VibWl0IGZvcm0gdW5sZXNzIGV2ZW50IGRlZmF1bHQgaXMgcHJldmVudGVkXG4gIGlmICggIWV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBmb3JtLnN1Ym1pdCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3VibWl0XG4iLCJ2YXIgZW5kRXZlbnRzID0gW1xuICAndG91Y2hlbmQnXG5dXG5cbm1vZHVsZS5leHBvcnRzID0gVGFwXG5cbi8vIGRlZmF1bHQgdGFwIHRpbWVvdXQgaW4gbXNcblRhcC50aW1lb3V0ID0gMjAwXG5cbmZ1bmN0aW9uIFRhcChjYWxsYmFjaywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAvLyBpZiB0aGUgdXNlciBob2xkcyBoaXMvaGVyIGZpbmdlciBkb3duIGZvciBtb3JlIHRoYW4gMjAwbXMsXG4gIC8vIHRoZW4gaXQncyBub3QgcmVhbGx5IGNvbnNpZGVyZWQgYSB0YXAuXG4gIC8vIGhvd2V2ZXIsIHlvdSBjYW4gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgVGFwLnRpbWVvdXRcblxuICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lclxuICBsaXN0ZW5lci5oYW5kbGVyID0gY2FsbGJhY2tcblxuICByZXR1cm4gbGlzdGVuZXJcblxuICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgbGlzdGVuZXIpXG4gIGZ1bmN0aW9uIGxpc3RlbmVyKGUxKSB7XG4gICAgLy8gdGFwIHNob3VsZCBvbmx5IGhhcHBlbiB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIGlmICghZTEudG91Y2hlcyB8fCBlMS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVyblxuXG4gICAgdmFyIGVsID0gZTEudGFyZ2V0XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgdGltZW91dF9pZCA9IHNldFRpbWVvdXQoY2xlYW51cCwgdGltZW91dClcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGRvbmUoZTIpIHtcbiAgICAgIC8vIHNpbmNlIHRvdWNoc3RhcnQgaXMgYWRkZWQgb24gdGhlIHNhbWUgdGlja1xuICAgICAgLy8gYW5kIGJlY2F1c2Ugb2YgYnViYmxpbmcsXG4gICAgICAvLyBpdCdsbCBleGVjdXRlIHRoaXMgb24gdGhlIHNhbWUgdG91Y2hzdGFydC5cbiAgICAgIC8vIHRoaXMgZmlsdGVycyBvdXQgdGhlIHNhbWUgdG91Y2hzdGFydCBldmVudC5cbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhbnVwKClcblxuICAgICAgLy8gYWxyZWFkeSBoYW5kbGVkXG4gICAgICBpZiAoZTIuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSB0aGVzZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IGFsbCB0byBib3RoIHN0YXJ0IGFuZCBldmVudHMuXG4gICAgICB2YXIgcHJldmVudERlZmF1bHQgPSBlMS5wcmV2ZW50RGVmYXVsdFxuICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGUxLnN0b3BQcm9wYWdhdGlvblxuXG4gICAgICBlMS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUxKVxuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgZTEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTEpXG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGxzIHRoZSBoYW5kbGVyIHdpdGggdGhlIGBlbmRgIGV2ZW50LFxuICAgICAgLy8gYnV0IGkgZG9uJ3QgdGhpbmsgaXQgbWF0dGVycy5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuXG4gICAgLy8gY2xlYW51cCBlbmQgZXZlbnRzXG4gICAgLy8gdG8gY2FuY2VsIHRoZSB0YXAsIGp1c3QgcnVuIHRoaXMgZWFybHlcbiAgICBmdW5jdGlvbiBjbGVhbnVwKGUyKSB7XG4gICAgICAvLyBpZiBpdCdzIHRoZSBzYW1lIGV2ZW50IGFzIHRoZSBvcmlnaW4sXG4gICAgICAvLyB0aGVuIGRvbid0IGFjdHVhbGx5IGNsZWFudXAuXG4gICAgICAvLyBoaXQgaXNzdWVzIHdpdGggdGhpcyAtIGRvbid0IHJlbWVtYmVyXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRfaWQpXG5cbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuOyBmbiA9IHVuZGVmaW5lZCB9IFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIG9wdGlvbnMud2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcbiAgb3B0aW9ucy5tYXggID0gb3B0aW9ucy5tYXggfHwgb3B0aW9ucy53YWl0XG4gIG9wdGlvbnMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZuXG4gIG9wdGlvbnMubGVhZGluZyAgPSB0cnVlXG4gIG9wdGlvbnMudHJhaWxpbmcgPSB0cnVlXG5cbiAgcmV0dXJuIGRlYm91bmNlKG9wdGlvbnMpXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGVyID0ge1xuICBjaGVja2JveFNlbGVjdG9yOiBcIlt0eXBlPWNoZWNrYm94XVtkYXRhLXRvZ2dsZV0sIFt0eXBlPWNoZWNrYm94XVtkYXRhLXNob3ddLCBbdHlwZT1jaGVja2JveF1bZGF0YS1oaWRlXVwiLFxuICByYWRpb1NlbGVjdG9yOiBcImlucHV0W3R5cGU9cmFkaW9dW2RhdGEtc2hvd10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtaGlkZV0sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtYWRkLWNsYXNzXSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZW1vdmUtY2xhc3NdXCIsXG4gIHNlbGVjdFNlbGVjdG9yOiBcIm9wdGlvbltkYXRhLWhpZGVdLCBvcHRpb25bZGF0YS1zaG93XVwiLFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oKXtcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGljayBjaGFuZ2VcIiwgXCJbZGF0YS10b2dnbGVdLCBbZGF0YS1zaG93XSwgW2RhdGEtaGlkZV0sIFtkYXRhLXRvZ2dsZS1jbGFzc10sIFtkYXRhLWFkZC1jbGFzc10sIFtkYXRhLXJlbW92ZS1jbGFzc11cIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNoYW5nZVwiLCBcIi5zZWxlY3QtdG9nZ2xlclwiLCBUb2dnbGVyLnRyaWdnZXIpXG4gICAgRXZlbnQub24od2luZG93LCAnaGFzaGNoYW5nZScsIFRvZ2dsZXIuaGFzaENoYW5nZSlcbiAgfSxcblxuICBoYXNoQ2hhbmdlOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIHdpbmRvdy5sb2NhdGlvbi5oYXNoICkge1xuXG4gICAgICB2YXIgYW5jaG9yID0gJ1tkYXRhLWFuY2hvcj1cIicrd2luZG93LmxvY2F0aW9uLmhhc2grJ1wiXSdcbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnK2FuY2hvcisgJywgb3B0aW9uJythbmNob3IgKVxuXG4gICAgICBpZiAoIHRhcmdldCApIHtcbiAgICAgICAgaWYgKCB0YXJnZXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzZWxlY3QgPSBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24odGFyZ2V0KVxuICAgICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gdGFyZ2V0LmluZGV4XG4gICAgICAgICAgdGFyZ2V0ID0gc2VsZWN0XG4gICAgICAgIH1cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIHRhcmdldCApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlZnJlc2g6IGZ1bmN0aW9uKCl7XG4gICAgVG9nZ2xlci50b2dnbGVDaGVja2JveGVzKClcbiAgICBUb2dnbGVyLnNldHVwU2VsZWN0cygpXG4gICAgVG9nZ2xlci5zZXR1cFJhZGlvcygpXG4gIH0sXG5cbiAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBTdG9wIGV2ZW50IGFuZCBidWJibGluZyBpZiBsaW5rIGlzIG9ubHkgYmVpbmcgdXNlZCBhcyBhIHRvZ2dsZXJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PSBcIiNcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgZXZlbnQuc3RvcCgpXG4gICAgfSBcblxuICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGluZzogZnVuY3Rpb24odGFyZ2V0LCBldmVudCkge1xuICAgIHZhciBhY3Rpb25zID0gWydoaWRlJywgJ3RvZ2dsZScsICdzaG93JywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ2FkZENsYXNzJ11cbiAgICB2YXIgc2VsZWN0XG5cbiAgICAvLyBTdG9yZSB0aGUgc2VsZWN0LCBhbmQgc2V0IHRoZSB0YXJnZXQgdG8gdGhlIGN1cnJlbnQgb3B0aW9uXG4gICAgLy8gRXZlbnRzIGZpcmUgb24gdGhlIHNlbGVjdCwgYnV0IHRoZSBvcHRpb25zIGhhdmUgdG9nZ2xpbmcgYXR0cmlidXRlc1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS5tYXRjaCgvc2VsZWN0L2kpKSB7XG4gICAgICBzZWxlY3QgPSB0YXJnZXRcbiAgICAgIHRhcmdldCA9IHNlbGVjdC5zZWxlY3RlZE9wdGlvbnNbMF1cbiAgICB9XG5cbiAgICAvLyBSYWRpbyBpbnB1dHMgYW5kIHNlbGVjdHMgZG8gbm90IHN1cHBvcnQgdG9nZ2xpbmcsIHNvIHJlbW92ZSB0aGVtXG4gICAgYWN0aW9ucyA9IGFjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdCB8fCB0YXJnZXQudHlwZSA9PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLm1hdGNoKC90b2dnbGUvKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldC5kYXRhc2V0W2FjdGlvbl0gIT0gbnVsbFxuICAgIH0pXG4gICAgXG4gICAgLy8gRGlzcGF0Y2ggYWxsIGFjdGlvbnNcbiAgICBhY3Rpb25zLmZvckVhY2goIGZ1bmN0aW9uKCBhY3Rpb24gKSB7XG4gICAgICBUb2dnbGVyLmRpc3BhdGNoKCB0YXJnZXQsIGFjdGlvbiApXG4gICAgfSlcbiAgfSxcblxuICBkaXNwYXRjaDogZnVuY3Rpb24oZWwsIHR5cGUpIHtcbiAgICB2YXIgYWN0aW9uID0gdHlwZVxuICAgIHZhciBkYXRhID0gZWwuZGF0YXNldFt0eXBlXVxuXG4gICAgLy8gQWJvcnQgaWYgZWxlbWVudCBkb2Vzbid0IGhhdmUgZGF0YSBmb3IgdGhlIGFjdGlvblxuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSA9PSAndW5kZWZpbmVkJyB8fCBkYXRhID09ICcnKSByZXR1cm5cblxuICAgIC8vIFRvZ2dsZSBhbmQgc2hvdyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBmb3IgY2hlY2tib3hlc1xuICAgIGlmIChlbC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICBhY3Rpb24gPSAodHlwZS5tYXRjaCgvaGlkZXxyZW1vdmUvaSkgPyAhZWwuY2hlY2tlZCA6IGVsLmNoZWNrZWQpXG5cbiAgICBpZiAoZGF0YSl7XG4gICAgICBpZiAodHlwZS5tYXRjaCgvY2xhc3MvaSkpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKGRhdGEsIGFjdGlvbiwgZWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUb2dnbGVyLnNldFN0YXRlKGRhdGEsIGFjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gQWRkLCByZW1vdmUsIG9yIHRvZ2dsZSBjbGFzc25hbWVzLCB0cmlnZ2VyZWQgYnkgZWxlbWVudHMgd2l0aDpcbiAgLy8gIGRhdGEtaGlkZS1jbGFzcywgZGF0YS1zaG93LWNsYXNzLCBhbmQgZGF0YS10b2dnbGUtY2xhc3MgdmFsdWVzXG4gIC8vXG4gIC8vICBEYXRhIHZhbHVlIGV4YW1wbGVzOlxuICAvLyAgIC0gXCJjbGFzc25hbWVcIiAtIGFkZC9yZW1vdmUvdG9nZ2xlIGNsYXNzbmFtZSBvbiBjdXJyZW50IGVsZW1lbnRcbiAgLy8gICAtIFwiZm9vIGJhclwiICAgLSBtdWx0aXBsZSBjbGFzc25hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIChsaWtlIGh0bWwgY2xhc3MgcHJvcGVydHkpXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yXCIgLSBjaGFuZ2UgY2xhc3NuYW1lcyBvbiBlbGVtZW50cyBtYXRjaGVkIGJ5IHNlbGVjdG9yXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yLCBzZWxlY3RvclwiIC0gbWF0Y2ggbXVsdGlwbGUgc2VsZWN0b3JzXG4gIC8vXG4gIC8vICBZb3UgY2FuIHBlcmZvcm0gbXVsdGlwbGUgYWRkL3JlbW92ZSBjbGFzc2VzIGJ5IGpvaW5pbmcgdmFsdWVzIHdpdGggYW4gYCZgXG4gIC8vICBGb3IgZXhhbXBsZTogXCJjbGFzc25hbWUgJiBmb28gYmFyOyBzZWxlY3RvclwiXG4gIC8vICBUaGlzIHdvdWxkIHRvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50IGFuZCB0b2dnbGUgYGZvbyBiYXJgIGNsYXNzbmFtZXNcbiAgLy8gIG9uIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gIC8vXG5cbiAgc2V0Q2xhc3M6IGZ1bmN0aW9uIChzZWxlY3RvcnMsIGFjdGlvbiwgZWwpe1xuICAgIGlmKHR5cGVvZiBzZWxlY3RvcnMgPT0gJ3VuZGVmaW5lZCcgfHwgc2VsZWN0b3JzID09ICcnKSByZXR1cm5cblxuICAgIGlmICh0eXBlb2YoYWN0aW9uKSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIGFjdGlvbiA9IChhY3Rpb24gPyAnYWRkJyA6ICdyZW1vdmUnKVxuICAgIH1cblxuICAgIGlmIChzZWxlY3RvcnMubWF0Y2goLyYvKSkge1xuICAgICAgc2VsZWN0b3JzLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbihzZWwpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKHNlbC50cmltKCksIGFjdGlvbiwgZWwpIFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RvciBhbmQgY2xhc3NuYW1lcywgZm9ybWF0OiBcImNsYXNzbmFtZSBjbGFzc25hbWU7IHNlbGVjdG9yLHNlbGVjdG9yXCJcbiAgICB2YXIgc2V0dGluZ3MgPSBzZWxlY3RvcnMuc3BsaXQoJzsnKVxuICAgIHZhciBjbGFzc25hbWVzID0gc2V0dGluZ3NbMF0udHJpbSgpXG4gICAgdmFyIG1hdGNoZXMgPSBbXVxuICAgIHNlbGVjdG9ycyA9IHNldHRpbmdzWzFdXG5cbiAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMpXG5cbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgYW5kIGVsIGlzIGFuIE9QVElPTiwgdXNlIGl0cyBTRUxFQ1QgYXMgdGhlIG1hdGNoZWQgZWxlbWVudFxuICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwudGFnTmFtZS5tYXRjaCgvb3B0aW9uL2kpKSB7XG4gICAgICBtYXRjaGVzID0gW1RvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihlbCldXG4gICAgICBcbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgdXNlIHRoZSBjdXJyZW50IGVsIGZvciBjbGFzc25hbWVzXG4gICAgfSBlbHNlIGlmIChlbCkge1xuICAgICAgbWF0Y2hlcyA9IFtlbF1cbiAgICB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG1hdGNoZXMsIGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2xhc3NuYW1lcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc25hbWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbi5yZXBsYWNlKC9DbGFzcy8sJycpXG4gICAgICAgIG1hdGNoLmNsYXNzTGlzdFttZXRob2RdKGNsYXNzbmFtZSlcbiAgICAgIH0pXG5cbiAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuKG1hdGNoLCAnY2xhc3MnKVxuICAgIH0pXG4gIH0sXG5cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uKHNlbGVjdG9ycywgc3RhdGUpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICB2YXIgYWN0aW9uID0gVG9nZ2xlci50b2dnbGVBY3Rpb24obWF0Y2gsIHN0YXRlKVxuXG4gICAgICBUb2dnbGVyW2FjdGlvbl0obWF0Y2gpXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgYWN0aW9uKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQWN0aW9uOiBmdW5jdGlvbiggZWwsIGFjdGlvbiApIHtcblxuICAgIGlmICggdHlwZW9mIGFjdGlvbiA9PSAnYm9vbGVhbicgKSB7XG4gICAgICBhY3Rpb24gPSAoIGFjdGlvbiA/ICdzaG93JyA6ICdoaWRlJyApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PSAndG9nZ2xlJykge1xuICAgICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnaGlkaW5nJykgKSB7XG4gICAgICAgIGFjdGlvbiA9ICdzaG93J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uID0gJ2hpZGUnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvblxuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc2hvd2luZycgKSB8fFxuICAgICAgICAgZWwub2Zmc2V0UGFyZW50ICE9IG51bGwgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGRlbicsICdoaWRpbmcnIClcblxuICAgIHZhciBmdWxseVNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFJlbW92ZSBoaWRkZW4gYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Nob3dpbmcnLCAnaGlkZGVuJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKVxuXG4gICAgICAvLyBFbmFibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBzaG93blxuICAgICAgaWYgKCB0eXBlb2YgZWwuZGlzYWJsZWQgIT0gJ3VuZGVmaW5lZCcgKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBGb2N1cyBvbiBrZXkgZWxlbWVudCBpZiBhbiBlbGVtZW50IGV4cGVjdHMgZm9jdXNcbiAgICAgIHZhciBmb2N1c0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXNdJylcbiAgICAgIGlmIChmb2N1c0VsKSB7IGZvY3VzRWwuZm9jdXMoKSB9XG5cbiAgICAgIC8vIFRyaWdnZXIgaW5wdXQgZXZlbnQgb24gcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlblxuICAgICAgdmFyIHJhbmdlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXScpXG4gICAgfVxuXG4gICAgaWYgKCBlbC5kYXRhc2V0LmFuaW1hdGUgKSB7XG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bGx5U2hvdywgdHJ1ZSlcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdzaG93aW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5U2hvdygpXG4gICAgfVxuICB9LFxuXG4gIGhpZGU6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRkZW4nICkgfHwgXG4gICAgICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRpbmcnICkgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc2hvd2luZyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGFkZGVkIGJlZm9yZSB0aGlzIGZpcmVzXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnLCAnc2hvd2luZycgKVxuXG4gICAgdmFyIGZ1bGx5SGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGluZycsICd2aXNpYmxlJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkZGVuJyApXG5cbiAgICAgIC8vIERpc2FibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBoaWRkZW5cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseUhpZGUsIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkaW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5SGlkZSgpXG4gICAgfVxuICB9LFxuXG4gIGdldExlYWZOb2RlczogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIC8vIGlzIHRoZSBwYXJlbnQgaXRzZWxmIGEgbGVhZiBub2RlP1xuICAgIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgcmV0dXJuIFtwYXJlbnRdXG5cbiAgICB2YXIgbm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLCAwKVxuXG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gZWxlbS5jaGlsZHJlbiAmJiBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gIH0sXG5cbiAgdHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuOiBmdW5jdGlvbihlbCwgZXZlbnROYW1lKXtcbiAgICAvLyB3ZSBjYXJlIGFib3V0IGxlYWYgbm9kZXMgc2luY2UgdGhlIGV2ZW50IHdpbGwgYnViYmxlIHRvXG4gICAgLy8gbm9uLWxlYWYgbm9kZXMgZnJvbSB0aGUgbGVhZiBub2Rlc1xuICAgIHZhciBsZWFmQ2hpbGROb2RlcyA9IFRvZ2dsZXIuZ2V0TGVhZk5vZGVzKGVsKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsZWFmQ2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gJ3RvZ2dsZXI6c2hvdycsICd0b2dnbGVyOmhpZGUnLCBldGNcbiAgICAgIEV2ZW50LmZpcmUobm9kZSwgXCJ0b2dnbGVyOlwiICsgZXZlbnROYW1lKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQ2hlY2tib3hlczogZnVuY3Rpb24oY2hlY2tib3hlcykge1xuICAgIGNoZWNrYm94ZXMgPSBjaGVja2JveGVzIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5jaGVja2JveFNlbGVjdG9yKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjaGVja2JveGVzLCBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZylcbiAgfSxcblxuICBzZXR1cFJhZGlvczogZnVuY3Rpb24oKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIucmFkaW9TZWxlY3RvciksIGZ1bmN0aW9uKHJhZGlvLCBpbmRleCl7XG4gICAgICBpZiAoIXJhZGlvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIHZhciByYWRpb05hbWUgICAgICAgICA9IHJhZGlvLmdldEF0dHJpYnV0ZSgnbmFtZScpLFxuICAgICAgICAgICAgc2libGluZ3MgICAgICAgICAgPSBUb2dnbGVyLnBhcmVudEZvcm0ocmFkaW8pLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhZGlvXVtuYW1lPVwiJytyYWRpb05hbWUrJ1wiXScpLFxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnc2hvdycpLFxuICAgICAgICAgICAgYWRkQ2xhc3NTZWxlY3RvcnMgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnYWRkQ2xhc3MnKSxcbiAgICAgICAgICAgIGNoZWNrZWRcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNpYmxpbmdzLCBmdW5jdGlvbihyKXtcblxuICAgICAgICAgIGlmIChyLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrci5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICByLmNoZWNrZWQgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLXNob3cgdmFsdWUgb2YgJydcbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdW5zZXQgZGF0YS1zaG93IHZhbHVlcyB3aWxsIHRvZ2dsZSBvZmYgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LnNob3cgPSByLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggci5kYXRhc2V0LmhpZGUgJiYgci5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIHIuZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICByLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIGhhdmUgYSBkZWZhdWx0IGRhdGEtYWRkLWNsYXNzIHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtYWRkLWNsYXNzIHZhbHVlcyBhcmUgdG9nZ2xlIG9mZiBhbGwgY2xhc3Nlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LmFkZENsYXNzID0gci5kYXRhc2V0LmFkZENsYXNzIHx8ICcnXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZWxlY3RlZCByYWRpbyBidXR0b25zIHJlbW92ZSBjbGFzc2VzIGFjY29yZGluZ1xuICAgICAgICAgIC8vIHRvIHRoZSBkZXNlbGVjdGVkIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICByLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIHIuZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignJicpXG5cblxuICAgICAgICAgIHIuZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuXG5cbiAgICAgICAgICBpZiggci5jaGVja2VkICkgY2hlY2tlZCA9IHJcblxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICggY2hlY2tlZCApIHtcbiAgICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyggY2hlY2tlZCApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZSggc2hvd1NlbGVjdG9ycy5qb2luKCcsJyksICdoaWRlJyApXG4gICAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyggYWRkQ2xhc3NTZWxlY3RvcnMuam9pbignICYgJyksICdyZW1vdmVDbGFzcycgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICB9LFxuXG4gIC8vIEFkZCBkYXRhLWhpZGUgdG8gZWFjaCA8b3B0aW9uPiBjb250YWluaW5nIHRoZSBzZWxlY3RvcnMgZnJvbSBvdGhlclxuICAvLyBvcHRpb24ncyBkYXRhLXNob3cuIFRoaXMgbWFrZXMgdGhlIHRvZ2dsaW5nIG9mIGVsZW1lbnRzIGV4Y2x1c2l2ZS5cbiAgLy9cbiAgc2V0dXBTZWxlY3RzOiBmdW5jdGlvbigpe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnNlbGVjdFNlbGVjdG9yKSwgZnVuY3Rpb24ob3B0aW9uKXtcbiAgICAgIC8vIFByZXZlbnQgYW4gb3B0aW9uIGZyb20gYmVpbmcgY29uc2lkZXJlZCB0d2ljZVxuICAgICAgaWYgKCFvcHRpb24uZGF0YXNldC50b2dnbGVyQWN0aXZlKSB7XG5cbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc2hvdyA9IG9wdGlvbi5kYXRhc2V0LnNob3cgfHwgJydcblxuICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKG9wdGlvbilcbiAgICAgICAgc2VsZWN0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC10b2dnbGVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJylcblxuICAgICAgICB2YXIgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKG9wdGlvbnMsICdzaG93JylcbiAgICAgICAgdmFyIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnYWRkQ2xhc3MnKVxuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob3B0aW9ucywgZnVuY3Rpb24obywgaW5kZXgpIHtcblxuICAgICAgICAgIGlmIChvLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrby5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgby5kYXRhc2V0LnNob3cgPSBvLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIG8uZGF0YXNldC5hZGRDbGFzcyA9IG8uZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggby5kYXRhc2V0LmhpZGUgJiYgby5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIG8uZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICAvLyBJZiBzaG93IHNlbGVjdG9ycyBhcmUgbm90IHByZXNlbnQgaW4gZWxlbWVudCdzIGRhdGEtc2hvd1xuICAgICAgICAgIC8vIEFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycyB0byBiZSBoaWRkZW5cbiAgICAgICAgICBvLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG8uZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignICYgJylcblxuICAgICAgICAgIG8uZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdG9nZ2xlZCBwcm9wZXJseVxuICAgICAgICAvL1xuICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhzZWxlY3QpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICAvLyBGaW5kIHBhcmVudCA8c2VsZWN0PiBmb3IgYW4gb3B0aW9uIChhY2NvdW50cyBmb3Igb3B0aW9uIGdyb3VwcylcbiAgLy9cbiAgZ2V0U2VsZWN0RnJvbU9wdGlvbjogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgcCA9IGVsLnBhcmVudEVsZW1lbnRcblxuICAgIGlmIChwLnRhZ05hbWUgPT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybiBwXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24ocClcbiAgICB9XG4gIH0sXG5cblxuICAvLyBGaW5kIHBhcmVudCA8Zm9ybT4gb3IgZG9jdW1lbnQgaWYgdGhlcmUgaXMgbm8gZm9ybVxuICAvL1xuICBwYXJlbnRGb3JtOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdmFyIGVsID0gZWxlbWVudFxuXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBkb2N1bWVudFxuICB9LFxuXG4gIC8vIFJldHVybiBhIHVuaXF1ZSBhcnJheSBvZiBhbGwgZGF0YSBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZWxlbWVudHNcbiAgLy9cbiAgZGF0YUF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBhdHRyKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlbGVtZW50cywgZnVuY3Rpb24oZWwpIHsgXG4gICAgICByZXR1cm4gZWwuZGF0YXNldFthdHRyXVxuICAgIH0pLmZpbHRlcihmdW5jdGlvbihzZWxlY3RvcnMsIGluZGV4LCBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JzICE9IFwiXCIgJiYgdHlwZW9mIHNlbGVjdG9ycyAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLmluZGV4T2Yoc2VsZWN0b3JzKSA9PT0gaW5kZXhcbiAgICB9KVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KFRvZ2dsZXIubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRvZ2dsZXIucmVmcmVzaClcblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVyXG4iLCIvLyBTaGltc1xucmVxdWlyZSggJy4vbGliL3NoaW1zL19jbGFzc2xpc3QnIClcbnZhciBtZXJnZSAgICA9IHJlcXVpcmUoICcuL2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbicgKSxcbiAgICBldmVudCAgICA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIGx1eG9uICAgID0gcmVxdWlyZSggJ2x1eG9uJyApLFxuICAgIHRpbWUgICAgID0gbWVyZ2UocmVxdWlyZSggJy4vbGliL3RpbWUnICksIGx1eG9uKSxcbiAgICBzY3JvbGxUbyA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGx0bycgKSxcbiAgICBmcm9tVG9wICA9IHJlcXVpcmUoICcuL2xpYi9mcm9tdG9wJyApLFxuICAgIGVhc2UgICAgID0gcmVxdWlyZSggJy4vbGliL2Vhc2UnIClcblxudmFyIHRvb2xib3ggPSB7XG5cbiAgZXZlbnQ6IGV2ZW50LFxuICBzY3JvbGxUbzogc2Nyb2xsVG8sXG4gIGZyb21Ub3A6IGZyb21Ub3AsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZWFzZTogZWFzZSxcbiAgdGltZTogdGltZSxcblxuICAvLyBHZXQgY2xvc2VzdCBET00gZWxlbWVudCB1cCB0aGUgdHJlZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXRDbG9zZXN0OiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIGVsLCBzZWxlY3RvciApICkgcmV0dXJuIGVsXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIGNoaWxkT2Y6IGZ1bmN0aW9uICggZWwsIHBhcmVudCApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbCA9PSBwYXJlbnQgKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgLy8gR2V0IG5leHQgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0TmV4dDogZnVuY3Rpb24oIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApICkgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvLyBNYXRjaGVzIHNlbGVjdG9yIGZ1bmN0aW9uXG4gIC8vIEByZWZlcmVuY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICBtYXRjaGVzOiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gKCBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm9NYXRjaGVzU2VsZWN0b3IgKS5jYWxsKCBlbCwgc2VsZWN0b3IgKTtcbiAgfSxcblxuICB3b3JkQ291bnQ6IGZ1bmN0aW9uKCBzdHIgKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goIC9cXFMrL2cgKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbiAgfSxcblxuICAvLyBFYXN5IGFjY2VzcyB0byBzbGljZSBmb3IgY29udmVydGluZyBvYmplY3RzIGludG8gYXJyYXlzIG9mIHZhbHVlcy5cbiAgc2xpY2U6IGZ1bmN0aW9uKCBvYmosIGNvdW50ICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggb2JqLCBjb3VudCApXG4gIH0sXG5cbiAgZWFjaDogZnVuY3Rpb24oIGNvbGxlY3Rpb24sIGNhbGxiYWNrICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApXG4gIH0sXG5cbiAgaXNFbGVtZW50OiBmdW5jdGlvbiAoIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uY29uc3RydWN0b3IudG9TdHJpbmcoKS5zZWFyY2goL0hUTUwuK0VsZW1lbnQvKSA+IC0xXG4gIH0sXG5cbiAgZm9ybURhdGE6IGZ1bmN0aW9uKCByb290RWwgKSB7XG4gICAgdmFyIGZvcm1EYXRhICA9IG5ldyBGb3JtRGF0YSgpLFxuICAgICAgICBmaWVsZHMgPSB0b29sYm94LnNsaWNlKHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCAnaW5wdXRbbmFtZV06bm90KFtkaXNhYmxlZF0pLCBzZWxlY3RbbmFtZV06bm90KFtkaXNhYmxlZF0pLCB0ZXh0YXJlYVtuYW1lXTpub3QoW2Rpc2FibGVkXSknICkpXG4gICAgdmFyIGZpZWxkRGF0YSA9IHt9XG5cbiAgICAvLyBSZW1vdmUgYW55IGZpZWxkIHdoaWNoIGhhcyBhIHBhcmVudCB3aGljaCBpcyBkaXNhYmxlZFxuICAgIGZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoIGZ1bmN0aW9uKCBmICkgeyByZXR1cm4gIXRvb2xib3guZ2V0Q2xvc2VzdChmLCAnW2Rpc2FibGVkXScpIH0pXG5cbiAgICAvLyBMb29wIG92ZXIgZmllbGRzXG4gICAgLy8gcmV2ZXJzZSB0aGVtIGJlY2F1c2UgaWYgdGhlcmUgYXJlIHR3byBpbnB1dHMgd2l0aCB0aGUgc2FtZSBuYW1lXG4gICAgLy8gdGhlIGxhc3QgaW5wdXQgb3ZlcnJpZGVzIHRoZSBmaXJzdC5cbiAgICBmaWVsZHMucmV2ZXJzZSgpLmZvckVhY2goIGZ1bmN0aW9uKCBmaWVsZCApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBmaWVsZCwgJ1t0eXBlPXJhZGlvXSwgW3R5cGU9Y2hlY2tib3hdJykgKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGVja2JveCBvciByYWRpbyBpbnB1dCwgb3ZlcndyaXRlIHdpdGggY2hlY2tlZCB2YWx1ZXNcbiAgICAgICAgaWYgKCBmaWVsZC5jaGVja2VkICkgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIG9uZSB2YWx1ZSBwZXIgZmllbGQgbmFtZVxuICAgICAgICBmaWVsZERhdGFbZmllbGQubmFtZV0gPSBmaWVsZERhdGFbZmllbGQubmFtZV0gfHwgZmllbGRcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yICggdmFyIG5hbWUgaW4gZmllbGREYXRhICkge1xuICAgICAgLy8gQXBwZW5kIGN1cnJlbnQgZmllbGTigJlzIG5hbWUvdmFsdWUgdG8gbmV3IGZvcm1EYXRhIG9iamVjdFxuICAgICAgZm9ybURhdGEuYXBwZW5kKCBuYW1lLCBmaWVsZERhdGFbbmFtZV0udmFsdWUgKTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHJldHVybiBzYWlkIGZvcm1EYXRhIG9iamVjdFxuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0b29sYm94XG4iLCIvLyBlYXNpbmcgZnVuY3Rpb25zIGh0dHA6Ly9naXptYS5jb20vZWFzaW5nL1xudmFyIGVhc2UgPSB7XG5cbiAgaW5PdXRRdWFkOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yXG4gICAgaWYgKHQgPCAxKSB7IHJldHVybiBjLzIqdCp0ICsgYiB9XG4gICAgdC0tXG4gICAgcmV0dXJuIC1jLzIgKiAodCoodC0yKSAtIDEpICsgYlxuICB9LFxuXG4gIGluT3V0Q3ViaWM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG5cdHQgLz0gZC8yO1xuXHRpZiAodCA8IDEpIHJldHVybiBjLzIqdCp0KnQgKyBiO1xuXHR0IC09IDI7XG5cdHJldHVybiBjLzIqKHQqdCp0ICsgMikgKyBiO1xuICB9LFxuXG4gIGluT3V0UXVpbnQ6IGZ1bmN0aW9uKHQsIGIsIGMsIGQpIHtcbiAgICB2YXIgdHMgPSAodC89ZCkqdCxcbiAgICB0YyA9IHRzKnQ7XG4gICAgcmV0dXJuIGIrYyooNip0Yyp0cyArIC0xNSp0cyp0cyArIDEwKnRjKTtcbiAgfSxcblxuICBpbk91dENpcmM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG4gICAgdCAvPSBkLzI7XG4gICAgaWYgKHQgPCAxKSByZXR1cm4gLWMvMiAqIChNYXRoLnNxcnQoMSAtIHQqdCkgLSAxKSArIGI7XG4gICAgdCAtPSAyO1xuICAgIHJldHVybiBjLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpICsgMSkgKyBiO1xuICB9XG5cbn1cblxuZWFzZS5kZWZhdWx0ID0gZWFzZS5pbk91dFF1YWRcblxubW9kdWxlLmV4cG9ydHMgPSBlYXNlXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCBlbCApIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCApO1xufVxuIiwidmFyIGVhc2UgICAgPSByZXF1aXJlKCAnLi9lYXNlJyApXG52YXIgZnJvbVRvcCA9IHJlcXVpcmUoICcuL2Zyb210b3AnIClcblxuZnVuY3Rpb24gbW92ZShhbW91bnQpIHtcblxuICAvLyBTY3JvbGwgYWxsIGJlY2F1c2UgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCBpcyBzdGlsbCBleHBpcmVtZW50YWxcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBhbW91bnQ7XG5cbn1cblxuZnVuY3Rpb24gcG9zaXRpb24oKSB7XG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHRvLCBjYWxsYmFjaywgZHVyYXRpb24pIHtcblxuICAvLyBNYWtpbmcgYXJncyBmbGV4aWJsZVxuICAvL1xuICAvLyBBbGxvdyBmb3IgZWxlbWVudCBvciB5LWNvb3JkaW5hdGVzXG4gIGlmKCB0eXBlb2YoIHRvICkgPT09ICdvYmplY3QnICkgeyB0byA9IGZyb21Ub3AoIHRvICkgfVxuXG4gIC8vIEFjY2VwdCBkdXJhdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gIGlmKCB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdudW1iZXInICkgeyBkdXJhdGlvbiA9IGNhbGxiYWNrOyBjYWxsYmFjayA9IG51bGwgfVxuXG4gIC8vIERlZmF1bHQgZHVyYXRpb24gPSA1MDBcbiAgZHVyYXRpb24gPSAoIHR5cGVvZiggZHVyYXRpb24gKSA9PT0gJ3VuZGVmaW5lZCcgKSA/IDUwMCA6IGR1cmF0aW9uXG5cbiAgdmFyIHN0YXJ0ID0gcG9zaXRpb24oKSxcbiAgICBjaGFuZ2UgPSB0byAtIHN0YXJ0LFxuICAgIGN1cnJlbnRUaW1lID0gMCxcbiAgICBpbmNyZW1lbnQgPSAyMDtcblxuXG4gIHZhciBhbmltYXRlU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBpbmNyZW1lbnQgdGhlIHRpbWVcbiAgICBjdXJyZW50VGltZSArPSBpbmNyZW1lbnRcblxuICAgIC8vIGZpbmQgdGhlIHZhbHVlIHdpdGggdGhlIHF1YWRyYXRpYyBpbi1vdXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgdmFyIHZhbCA9IGVhc2UuZGVmYXVsdChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXG5cbiAgICAvLyBtb3ZlIHRoZSBkb2N1bWVudC5ib2R5XG4gICAgbW92ZSh2YWwpO1xuXG4gICAgLy8gZG8gdGhlIGFuaW1hdGlvbiB1bmxlc3MgaXRzIG92ZXJcbiAgICBpZiAoIGN1cnJlbnRUaW1lIDwgZHVyYXRpb24gKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGVTY3JvbGwgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIGNhbGxiYWNrICYmIHR5cGVvZiggY2FsbGJhY2sgKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYW5pbWF0ZVNjcm9sbCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG9cbiIsIi8qKlxuICogQ2xhc3NMaXN0IHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgZWxlbWVudC5jbGFzc0xpc3QgaW1wbGVtZW50YXRpb25cbiAqIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL2NsYXNzTGlzdC5qcy9ibG9iL21hc3Rlci9jbGFzc0xpc3QuanNcbiAqIEBhdXRob3IgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb21cbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoICdkb2N1bWVudCcgaW4gc2VsZiApIHtcblxuICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG4gIGlmICggISggJ2NsYXNzTGlzdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ18nICkgKSApIHtcblxuICAgICggZnVuY3Rpb24oIHZpZXcgKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBpZiAoICEoICdFbGVtZW50JyBpbiB2aWV3ICkgKSByZXR1cm47XG5cbiAgICB2YXJcbiAgICAgIGNsYXNzTGlzdFByb3AgPSAnY2xhc3NMaXN0JyxcbiAgICAgIHByb3RvUHJvcCAgICAgPSAncHJvdG90eXBlJyxcbiAgICAgIGVsZW1DdHJQcm90byAgPSB2aWV3LkVsZW1lbnRbIHByb3RvUHJvcCBdLFxuICAgICAgb2JqQ3RyICAgICAgICA9IE9iamVjdCxcblxuICAgICAgc3RyVHJpbSA9IFN0cmluZ1sgcHJvdG9Qcm9wIF0udHJpbSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSggL15cXHMrfFxccyskL2csICcnICk7XG4gICAgICB9LFxuXG4gICAgICBhcnJJbmRleE9mID0gQXJyYXlbIHByb3RvUHJvcCBdLmluZGV4T2YgfHwgZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgaWYgKCBpIGluIHRoaXMgJiYgdGhpc1sgaSBdID09PSBpdGVtICkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG5cbiAgICAgIERPTUV4ID0gZnVuY3Rpb24oIHR5cGUsIG1lc3NhZ2UgKSB7XG4gICAgICAgIHRoaXMubmFtZSAgICA9IHR5cGU7XG4gICAgICAgIHRoaXMuY29kZSAgICA9IERPTUV4Y2VwdGlvblsgdHlwZSBdO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSxcblxuICAgICAgY2hlY2tUb2tlbkFuZEdldEluZGV4ID0gZnVuY3Rpb24oIGNsYXNzTGlzdCwgdG9rZW4gKSB7XG4gICAgICAgIGlmICggdG9rZW4gPT09ICcnICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdTWU5UQVhfRVJSJyxcbiAgICAgICAgICAgICdBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIC9cXHMvLnRlc3QoIHRva2VuICkgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFxuICAgICAgICAgICAgJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsXG4gICAgICAgICAgICAnU3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbCggY2xhc3NMaXN0LCB0b2tlbiApO1xuICAgICAgfSxcblxuICAgICAgQ2xhc3NMaXN0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbCggZWxlbS5nZXRBdHRyaWJ1dGUoICdjbGFzcycgKSB8fCAnJyApLFxuICAgICAgICAgICAgY2xhc3NlcyA9IHRyaW1tZWRDbGFzc2VzID8gdHJpbW1lZENsYXNzZXMuc3BsaXQoIC9cXHMrLyApIDogW107XG5cbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICB0aGlzLnB1c2goIGNsYXNzZXNbIGkgXSApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIHRoaXMudG9TdHJpbmcoKSApO1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbIHByb3RvUHJvcCBdID0gW10sXG5cbiAgICAgIGNsYXNzTGlzdEdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdCggdGhpcyApO1xuICAgICAgfTtcblxuICAgIERPTUV4WyBwcm90b1Byb3AgXSA9IEVycm9yWyBwcm90b1Byb3AgXTtcblxuICAgIGNsYXNzTGlzdFByb3RvLml0ZW0gPSBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiB0aGlzWyBpIF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiggdG9rZW4gKSB7XG4gICAgICB0b2tlbiArPSAnJztcbiAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgIT09IC0xO1xuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW47XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpZiAoIGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKSA9PT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCB0b2tlbiApO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICggKytpdGVyIDwgbGVuICk7XG5cbiAgICAgIGlmICggdXBkYXRlZCApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyXG4gICAgICAgIHRva2VucyAgPSBhcmd1bWVudHMsXG4gICAgICAgIGl0ZXIgICAgPSAwLFxuICAgICAgICBsZW4gICAgID0gdG9rZW5zLmxlbmd0aCxcbiAgICAgICAgdXBkYXRlZCA9IGZhbHNlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgaW5kZXg7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcblxuICAgICAgICB3aGlsZSAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgICB0aGlzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG5cbiAgICAgIHZhclxuICAgICAgICByZXN1bHQgPSB0aGlzLmNvbnRhaW5zKCB0b2tlbiApLFxuICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiAncmVtb3ZlJyA6IGZvcmNlICE9PSBmYWxzZSAmJiAnYWRkJztcblxuICAgICAgaWYgKCBtZXRob2QgKSB7XG4gICAgICAgIHRoaXNbIG1ldGhvZCBdKCB0b2tlbiApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIGZvcmNlID09PSB0cnVlIHx8IGZvcmNlID09PSBmYWxzZSApIHtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5qb2luKCAnICcgKTtcbiAgICB9O1xuXG4gICAgaWYgKCBvYmpDdHIuZGVmaW5lUHJvcGVydHkgKSB7XG4gICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG4gICAgICAgICAgZ2V0ICAgICAgICAgIDogY2xhc3NMaXN0R2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGUgICA6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICB9XG5cbiAgICAgIGNhdGNoICggZXggKSB7XG4gICAgICAgIGlmICggZXgubnVtYmVyID09PSAtMHg3RkY1RUM1NCApIHtcbiAgICAgICAgICBjbGFzc0xpc3RQcm9wRGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoIG9iakN0clsgcHJvdG9Qcm9wIF0uX19kZWZpbmVHZXR0ZXJfXyApIHtcbiAgICAgIGVsZW1DdHJQcm90by5fX2RlZmluZUdldHRlcl9fKCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIgKTtcbiAgICB9XG5cbiAgICB9KCBzZWxmICkpO1xuXG4gIH0gZWxzZSB7XG5cbiAgICAoIGZ1bmN0aW9uKCkge1xuXG4gICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApO1xuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYzEnLCAnYzInICk7XG5cbiAgICAgIGlmICggIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MyJyApICkge1xuICAgICAgICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXTtcblxuICAgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgICAgICAgdmFyIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG4gICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzWyBpIF07XG4gICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAnYWRkJyApO1xuICAgICAgICBjcmVhdGVNZXRob2QoICdyZW1vdmUnICk7XG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoICdjMycsIGZhbHNlICk7XG5cbiAgICAgIGlmICggdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnYzMnICkgKSB7XG4gICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgICAgIGlmICggMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnMoIHRva2VuICkgPT09ICFmb3JjZSApIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIH1cblxuICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgfSgpKTtcblxuICB9XG59XG4iLCIvKipcbiAqIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbiAqIENyb3NzLWJyb3dzZXIgZnVsbCBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24jUG9seWZpbGxcbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoIHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicgKSB7XG4gICggZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG4gICAgICBmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KysgKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG4gICAgICAgIGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuICAgICAgICAgIGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcbiAgICAgICAgICAgIGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcbiAgICAgICAgICAgICAgb3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSkoKTtcbn1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIG1lcmdlIG9iamVjdHMgd2l0aG91dCBvdmVyd3JpdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0c1xudmFyIG1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gW3t9XS5jb25jYXQoIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG4gIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KCB0aGlzLCBhcmdzIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuIiwidmFyIERhdGVUaW1lID0gcmVxdWlyZSggJ2x1eG9uJyApLkRhdGVUaW1lXG5cbmZ1bmN0aW9uIGlzQmVmb3JlKCBkYXRlLCBlbmQgKSB7XG4gIGVuZCA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5taW4oIGVuZCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXIoIGRhdGUsIHN0YXJ0ICkge1xuICBzdGFydCA9IHBhcnNlKCBzdGFydCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4oIGRhdGUsIGRhdGUxLCBkYXRlMiApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgZGF0ZTEgPSBwYXJzZSggZGF0ZTEgKVxuICBkYXRlMiA9IHBhcnNlKCBkYXRlMiApXG5cbiAgaWYgKCBkYXRlLmlzVmFsaWQgJiYgZGF0ZTEuaXNWYWxpZCAmJiBkYXRlMi5pc1ZhbGlkICkge1xuICAgIC8vIERldGVybWluZSBzdGFydCBhbmQgZW5kIGRhdGVzICh0byBhbGxvdyBhbnkgb3JkZXIgaW4gYXJncylcbiAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5taW4oIGRhdGUxLCBkYXRlMiApXG4gICAgdmFyIGVuZCA9IERhdGVUaW1lLm1heCggZGF0ZTEsIGRhdGUyIClcblxuICAgIHJldHVybiBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlICkgPT0gRGF0ZVRpbWUubWluKCBkYXRlLCBlbmQgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlKCBkYXRlLCBvcHRpb25zICkge1xuICB2YXIgZm9ybWF0cyA9IFsgXCJJU09cIiwgXCJTUUxcIiwgXCJIVFRQXCIsIFwiUkZDMjgyMlwiIF0sXG4gICAgICBwYXJzZWREYXRlXG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoIG9wdGlvbnMubWlsbGlzICYmICFpc05hTiggZGF0ZSApICkge1xuICAgIGRhdGUgPSBOdW1iZXIoIGRhdGUgKVxuICAgIGZvcm1hdHMudW5zaGlmdCgnTWlsbGlzJylcbiAgfVxuXG4gIGlmICggdHlwZW9mIGRhdGUgPT0gJ29iamVjdCcgKSB7XG4gICAgXG4gICAgLy8gSXMgYWxyZWFkeSBhIERhdGVUaW1lIG9iamVjdFxuICAgIGlmICggZGF0ZS50b0lTTyApIHJldHVybiBkYXRlXG4gICAgZWxzZSBmb3JtYXRzLnVuc2hpZnQoICdPYmplY3QnIClcblxuICAvLyBQYXJzZSBzdHJpbmcgZm9ybWF0c1xuICB9XG5cbiAgZm9ybWF0cy5mb3JFYWNoKCBmdW5jdGlvbiggZm9ybWF0ICkge1xuICAgIGlmICgoICFwYXJzZWREYXRlIHx8ICFwYXJzZWREYXRlLmlzVmFsaWQgKSAmJiBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSApIHtcbiAgICAgIHBhcnNlZERhdGUgPSBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSggZGF0ZSwgb3B0aW9ucyApXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBwYXJzZWREYXRlLmlzVmFsaWQgPyBwYXJzZWREYXRlIDogZmFsc2Vcbn1cblxuLy8gUmVtb3ZlIGluc2lnbmlmaWNhbnQgZGlnaXRzXG5mdW5jdGlvbiBwcmV0dHlQcmludCggZGF0ZSwgb3B0aW9ucyApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlLCBvcHRpb25zIClcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnpvbmUpIGRhdGUgPSBkYXRlLnNldFpvbmUob3B0aW9ucy56b25lKVxuXG4gIGlmICggZGF0ZSApIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTTygpLnJlcGxhY2UoJ1QnLCAnICcpLnJlcGxhY2UoJy4wMDAnLCcgJykucmVwbGFjZSgnOjAwICcsJyAnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlVucGFyc2VhYmxlIGRhdGUgc3RyaW5nXCIgXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQmVmb3JlOiBpc0JlZm9yZSxcbiAgaXNBZnRlcjogaXNBZnRlcixcbiAgaXNCZXR3ZWVuOiBpc0JldHdlZW4sXG4gIHBhcnNlOiBwYXJzZSxcbiAgcHJldHR5UHJpbnQ6IHByZXR0eVByaW50XG59XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBIYXJ0bWFubiwgaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4vY29va2llLmpzXG5cbiFmdW5jdGlvbiAoZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdHZhciBjb29raWUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvb2tpZS5nZXQuYXBwbHkoY29va2llLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdHZhciB1dGlscyA9IGNvb2tpZS51dGlscyA9ICB7XG5cblx0XHQvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/IFVzZSBFUzUgQXJyYXkuaXNBcnJheSBpZiBpdCdzIGF2YWlsYWJsZS5cblx0XHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdFx0fSxcblxuXHRcdC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHBsYWluIG9iamVjdCAvIGFuIG9iamVjdCB3aG9zZSBjb25zdHJ1Y3RvciBpcyBgT2JqZWN0YD9cblx0XHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiAhIXZhbHVlICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuXHRcdH0sXG5cblx0XHQvLyBDb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGFuIGFycmF5IOKAkyBmb3IgZXhhbXBsZSBgYXJndW1lbnRzYC5cblx0XHR0b0FycmF5OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIEdldCB0aGUga2V5cyBvZiBhbiBvYmplY3QuIFVzZSBFUzUgT2JqZWN0LmtleXMgaWYgaXQncyBhdmFpbGFibGUuXG5cdFx0Z2V0S2V5czogT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIGtleXMgPSBbXSxcblx0XHRcdFx0IGtleSA9ICcnO1xuXHRcdFx0Zm9yIChrZXkgaW4gb2JqKSB7XG5cdFx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkga2V5cy5wdXNoKGtleSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9LFxuXG5cdFx0Ly8gVW5saWtlIEphdmFTY3JpcHQncyBidWlsdC1pbiBlc2NhcGUgZnVuY3Rpb25zLCB0aGlzIG1ldGhvZFxuXHRcdC8vIG9ubHkgZXNjYXBlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIGNvb2tpZXMuXG5cdFx0ZW5jb2RlOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1ssO1wiXFxcXD1cXHMlXS9nLCBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7XG5cdFx0XHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoY2hhcmFjdGVyKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRkZWNvZGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIFJldHVybiBmYWxsYmFjayBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gdmFsdWUuXG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uICh2YWx1ZSwgZmFsbGJhY2spIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gZmFsbGJhY2sgOiB2YWx1ZTtcblx0XHR9XG5cblx0fTtcblxuXHRjb29raWUuZGVmYXVsdHMgPSB7fTtcblxuXHRjb29raWUuZXhwaXJlc011bHRpcGxpZXIgPSA2MCAqIDYwICogMjQ7XG5cblx0Y29va2llLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoa2V5KSkge1xuXHRcdFx0Ly8gYGtleWAgY29udGFpbnMgYW4gb2JqZWN0IHdpdGgga2V5cyBhbmQgdmFsdWVzIGZvciBjb29raWVzLCBgdmFsdWVgIGNvbnRhaW5zIHRoZSBvcHRpb25zIG9iamVjdC5cblxuXHRcdFx0Zm9yICh2YXIgayBpbiBrZXkpIHtcblx0XHRcdFx0aWYgKGtleS5oYXNPd25Qcm9wZXJ0eShrKSkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMgPSB1dGlscy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHsgZXhwaXJlczogb3B0aW9ucyB9O1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmcgZm9yIHNlc3Npb24gY29va2llcy5cblx0XHRcdHZhciBleHBpcmVzID0gb3B0aW9ucy5leHBpcmVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZXMgOiAodGhpcy5kZWZhdWx0cy5leHBpcmVzIHx8ICcnKSxcblx0XHRcdCAgICBleHBpcmVzVHlwZSA9IHR5cGVvZihleHBpcmVzKTtcblxuXHRcdFx0aWYgKGV4cGlyZXNUeXBlID09PSAnc3RyaW5nJyAmJiBleHBpcmVzICE9PSAnJykgZXhwaXJlcyA9IG5ldyBEYXRlKGV4cGlyZXMpO1xuXHRcdFx0ZWxzZSBpZiAoZXhwaXJlc1R5cGUgPT09ICdudW1iZXInKSBleHBpcmVzID0gbmV3IERhdGUoK25ldyBEYXRlICsgMTAwMCAqIHRoaXMuZXhwaXJlc011bHRpcGxpZXIgKiBleHBpcmVzKTsgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgbWF4LWFnZWAgY29va2llIGF0dHJpYnV0ZS5cblxuXHRcdFx0aWYgKGV4cGlyZXMgIT09ICcnICYmICd0b0dNVFN0cmluZycgaW4gZXhwaXJlcykgZXhwaXJlcyA9ICc7ZXhwaXJlcz0nICsgZXhwaXJlcy50b0dNVFN0cmluZygpO1xuXG5cdFx0XHR2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCB0aGlzLmRlZmF1bHRzLnBhdGg7XG5cdFx0XHRwYXRoID0gcGF0aCA/ICc7cGF0aD0nICsgcGF0aCA6ICcnO1xuXG5cdFx0XHR2YXIgZG9tYWluID0gb3B0aW9ucy5kb21haW4gfHwgdGhpcy5kZWZhdWx0cy5kb21haW47XG5cdFx0XHRkb21haW4gPSBkb21haW4gPyAnO2RvbWFpbj0nICsgZG9tYWluIDogJyc7XG5cblx0XHRcdHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSB8fCB0aGlzLmRlZmF1bHRzLnNlY3VyZSA/ICc7c2VjdXJlJyA6ICcnO1xuXHRcdFx0aWYgKG9wdGlvbnMuc2VjdXJlID09PSBmYWxzZSkgc2VjdXJlID0gJyc7XG5cblx0XHRcdGRvY3VtZW50LmNvb2tpZSA9IHV0aWxzLmVuY29kZShrZXkpICsgJz0nICsgdXRpbHMuZW5jb2RlKHZhbHVlKSArIGV4cGlyZXMgKyBwYXRoICsgZG9tYWluICsgc2VjdXJlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5zZXREZWZhdWx0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAodXRpbHMuaXNQbGFpbk9iamVjdChrZXkpKSB7XG5cdFx0XHRmb3IgKHZhciBrIGluIGtleSkge1xuXHRcdFx0XHRpZiAodGhpcy5nZXQoaykgPT09IHVuZGVmaW5lZCkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29va2llO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoa2V5KSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHR9XG5cdH0sXG5cblx0Y29va2llLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXlzKSB7XG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogdXRpbHMudG9BcnJheShhcmd1bWVudHMpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIC0xKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBgY29va2llYCBvYmplY3QgdG8gbWFrZSBjaGFpbmluZyBwb3NzaWJsZS5cblx0fTtcblxuXHRjb29raWUucmVtb3ZlU3BlY2lmaWMgPSBmdW5jdGlvbiAoa2V5cywgb3B0aW9ucykge1xuXHRcdGlmICghb3B0aW9ucykgcmV0dXJuIHRoaXMucmVtb3ZlKGtleXMpO1xuXG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdO1xuXHRcdG9wdGlvbnMuZXhwaXJlcyA9IC0xO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUodXRpbHMuZ2V0S2V5cyh0aGlzLmFsbCgpKSk7XG5cdH07XG5cblx0Y29va2llLmdldCA9IGZ1bmN0aW9uIChrZXlzLCBmYWxsYmFjaykge1xuXHRcdHZhciBjb29raWVzID0gdGhpcy5hbGwoKTtcblxuXHRcdGlmICh1dGlscy5pc0FycmF5KGtleXMpKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0dmFyIHZhbHVlID0ga2V5c1tpXTtcblx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IHV0aWxzLnJldHJpZXZlKGNvb2tpZXNbdmFsdWVdLCBmYWxsYmFjayk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9IGVsc2UgcmV0dXJuIHV0aWxzLnJldHJpZXZlKGNvb2tpZXNba2V5c10sIGZhbGxiYWNrKTtcblx0fTtcblxuXHRjb29raWUuYWxsID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChkb2N1bWVudC5jb29raWUgPT09ICcnKSByZXR1cm4ge307XG5cblx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSxcblx0XHQgICAgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGNvb2tpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcblx0XHRcdHZhciBrZXkgPSB1dGlscy5kZWNvZGUoaXRlbS5zaGlmdCgpKTtcblx0XHRcdHZhciB2YWx1ZSA9IHV0aWxzLmRlY29kZShpdGVtLmpvaW4oJz0nKSk7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Y29va2llLmVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKG5hdmlnYXRvci5jb29raWVFbmFibGVkKSByZXR1cm4gdHJ1ZTtcblxuXHRcdHZhciByZXQgPSBjb29raWUuc2V0KCdfJywgJ18nKS5nZXQoJ18nKSA9PT0gJ18nO1xuXHRcdGNvb2tpZS5yZW1vdmUoJ18nKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdC8vIElmIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCB1c2UgQU1ELlxuXHQvLyBJZiBhIENvbW1vbkpTIGxvYWRlciBpcyBwcmVzZW50IHVzZSBDb21tb25KUy5cblx0Ly8gT3RoZXJ3aXNlIGFzc2lnbiB0aGUgYGNvb2tpZWAgb2JqZWN0IHRvIHRoZSBnbG9iYWwgc2NvcGUuXG5cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge2Nvb2tpZTogY29va2llfTtcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRleHBvcnRzLmNvb2tpZSA9IGNvb2tpZTtcblx0fSBlbHNlIHdpbmRvdy5jb29raWUgPSBjb29raWU7XG5cbi8vIElmIHVzZWQgZS5nLiB3aXRoIEJyb3dzZXJpZnkgYW5kIENvbW1vbkpTLCBkb2N1bWVudCBpcyBub3QgZGVjbGFyZWQuXG59KHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZG9jdW1lbnQpO1xuIiwiLy8gICAgIGtleW1hc3Rlci5qc1xuLy8gICAgIChjKSAyMDExLTIwMTMgVGhvbWFzIEZ1Y2hzXG4vLyAgICAga2V5bWFzdGVyLmpzIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG47KGZ1bmN0aW9uKGdsb2JhbCl7XG4gIHZhciBrLFxuICAgIF9oYW5kbGVycyA9IHt9LFxuICAgIF9tb2RzID0geyAxNjogZmFsc2UsIDE4OiBmYWxzZSwgMTc6IGZhbHNlLCA5MTogZmFsc2UgfSxcbiAgICBfc2NvcGUgPSAnYWxsJyxcbiAgICAvLyBtb2RpZmllciBrZXlzXG4gICAgX01PRElGSUVSUyA9IHtcbiAgICAgICfih6cnOiAxNiwgc2hpZnQ6IDE2LFxuICAgICAgJ+KMpSc6IDE4LCBhbHQ6IDE4LCBvcHRpb246IDE4LFxuICAgICAgJ+KMgyc6IDE3LCBjdHJsOiAxNywgY29udHJvbDogMTcsXG4gICAgICAn4oyYJzogOTEsIGNvbW1hbmQ6IDkxXG4gICAgfSxcbiAgICAvLyBzcGVjaWFsIGtleXNcbiAgICBfTUFQID0ge1xuICAgICAgYmFja3NwYWNlOiA4LCB0YWI6IDksIGNsZWFyOiAxMixcbiAgICAgIGVudGVyOiAxMywgJ3JldHVybic6IDEzLFxuICAgICAgZXNjOiAyNywgZXNjYXBlOiAyNywgc3BhY2U6IDMyLFxuICAgICAgbGVmdDogMzcsIHVwOiAzOCxcbiAgICAgIHJpZ2h0OiAzOSwgZG93bjogNDAsXG4gICAgICBkZWw6IDQ2LCAnZGVsZXRlJzogNDYsXG4gICAgICBob21lOiAzNiwgZW5kOiAzNSxcbiAgICAgIHBhZ2V1cDogMzMsIHBhZ2Vkb3duOiAzNCxcbiAgICAgICcsJzogMTg4LCAnLic6IDE5MCwgJy8nOiAxOTEsXG4gICAgICAnYCc6IDE5MiwgJy0nOiAxODksICc9JzogMTg3LFxuICAgICAgJzsnOiAxODYsICdcXCcnOiAyMjIsXG4gICAgICAnWyc6IDIxOSwgJ10nOiAyMjEsICdcXFxcJzogMjIwXG4gICAgfSxcbiAgICBjb2RlID0gZnVuY3Rpb24oeCl7XG4gICAgICByZXR1cm4gX01BUFt4XSB8fCB4LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKTtcbiAgICB9LFxuICAgIF9kb3duS2V5cyA9IFtdO1xuXG4gIGZvcihrPTE7azwyMDtrKyspIF9NQVBbJ2YnK2tdID0gMTExK2s7XG5cbiAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IEFycmF5I2luZGV4T2YsIHNvIGhhdmUgYSBzaW1wbGUgcmVwbGFjZW1lbnRcbiAgZnVuY3Rpb24gaW5kZXgoYXJyYXksIGl0ZW0pe1xuICAgIHZhciBpID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlKGktLSkgaWYoYXJyYXlbaV09PT1pdGVtKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBmb3IgY29tcGFyaW5nIG1vZHMgYmVmb3JlIHVuYXNzaWdubWVudFxuICBmdW5jdGlvbiBjb21wYXJlQXJyYXkoYTEsIGEyKSB7XG4gICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbW9kaWZpZXJNYXAgPSB7XG4gICAgICAxNjonc2hpZnRLZXknLFxuICAgICAgMTg6J2FsdEtleScsXG4gICAgICAxNzonY3RybEtleScsXG4gICAgICA5MTonbWV0YUtleSdcbiAgfTtcbiAgZnVuY3Rpb24gdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpIHtcbiAgICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGV2ZW50W21vZGlmaWVyTWFwW2tdXTtcbiAgfTtcblxuICAvLyBoYW5kbGUga2V5ZG93biBldmVudFxuICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkge1xuICAgIHZhciBrZXksIGhhbmRsZXIsIGssIGksIG1vZGlmaWVyc01hdGNoLCBzY29wZTtcbiAgICBrZXkgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgaWYgKGluZGV4KF9kb3duS2V5cywga2V5KSA9PSAtMSkge1xuICAgICAgICBfZG93bktleXMucHVzaChrZXkpO1xuICAgIH1cblxuICAgIC8vIGlmIGEgbW9kaWZpZXIga2V5LCBzZXQgdGhlIGtleS48bW9kaWZpZXJrZXluYW1lPiBwcm9wZXJ0eSB0byB0cnVlIGFuZCByZXR1cm5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7IC8vIHJpZ2h0IGNvbW1hbmQgb24gd2Via2l0LCBjb21tYW5kIG9uIEdlY2tvXG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gdHJ1ZTtcbiAgICAgIC8vICdhc3NpZ25LZXknIGZyb20gaW5zaWRlIHRoaXMgY2xvc3VyZSBpcyBleHBvcnRlZCB0byB3aW5kb3cua2V5XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpO1xuXG4gICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBrZXlwcmVzcyAoZmlsdGVyKCkgY2FuIGNhbiBiZSBvdmVycmlkZGVuKVxuICAgIC8vIGJ5IGRlZmF1bHQgaWdub3JlIGtleSBwcmVzc2VzIGlmIGEgc2VsZWN0LCB0ZXh0YXJlYSwgb3IgaW5wdXQgaXMgZm9jdXNlZFxuICAgIGlmKCFhc3NpZ25LZXkuZmlsdGVyLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICAvLyBhYm9ydCBpZiBubyBwb3RlbnRpYWxseSBtYXRjaGluZyBzaG9ydGN1dHMgZm91bmRcbiAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgcmV0dXJuO1xuXG4gICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuXG4gICAgLy8gZm9yIGVhY2ggcG90ZW50aWFsIHNob3J0Y3V0XG4gICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGVyID0gX2hhbmRsZXJzW2tleV1baV07XG5cbiAgICAgIC8vIHNlZSBpZiBpdCdzIGluIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICBpZihoYW5kbGVyLnNjb3BlID09IHNjb3BlIHx8IGhhbmRsZXIuc2NvcGUgPT0gJ2FsbCcpe1xuICAgICAgICAvLyBjaGVjayBpZiBtb2RpZmllcnMgbWF0Y2ggaWYgYW55XG4gICAgICAgIG1vZGlmaWVyc01hdGNoID0gaGFuZGxlci5tb2RzLmxlbmd0aCA+IDA7XG4gICAgICAgIGZvcihrIGluIF9tb2RzKVxuICAgICAgICAgIGlmKCghX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPiAtMSkgfHxcbiAgICAgICAgICAgIChfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA9PSAtMSkpIG1vZGlmaWVyc01hdGNoID0gZmFsc2U7XG4gICAgICAgIC8vIGNhbGwgdGhlIGhhbmRsZXIgYW5kIHN0b3AgdGhlIGV2ZW50IGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgaWYoKGhhbmRsZXIubW9kcy5sZW5ndGggPT0gMCAmJiAhX21vZHNbMTZdICYmICFfbW9kc1sxOF0gJiYgIV9tb2RzWzE3XSAmJiAhX21vZHNbOTFdKSB8fCBtb2RpZmllcnNNYXRjaCl7XG4gICAgICAgICAgaWYoaGFuZGxlci5tZXRob2QoZXZlbnQsIGhhbmRsZXIpPT09ZmFsc2Upe1xuICAgICAgICAgICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZihldmVudC5jYW5jZWxCdWJibGUpIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuc2V0IG1vZGlmaWVyIGtleXMgb24ga2V5dXBcbiAgZnVuY3Rpb24gY2xlYXJNb2RpZmllcihldmVudCl7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsIGssXG4gICAgICAgIGkgPSBpbmRleChfZG93bktleXMsIGtleSk7XG5cbiAgICAvLyByZW1vdmUga2V5IGZyb20gX2Rvd25LZXlzXG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBfZG93bktleXMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTtcbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSBmYWxzZTtcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVzZXRNb2RpZmllcnMoKSB7XG4gICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZmFsc2U7XG4gICAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gIH07XG5cbiAgLy8gcGFyc2UgYW5kIGFzc2lnbiBzaG9ydGN1dFxuICBmdW5jdGlvbiBhc3NpZ25LZXkoa2V5LCBzY29wZSwgbWV0aG9kKXtcbiAgICB2YXIga2V5cywgbW9kcztcbiAgICBrZXlzID0gZ2V0S2V5cyhrZXkpO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0aG9kID0gc2NvcGU7XG4gICAgICBzY29wZSA9ICdhbGwnO1xuICAgIH1cblxuICAgIC8vIGZvciBlYWNoIHNob3J0Y3V0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBzZXQgbW9kaWZpZXIga2V5cyBpZiBhbnlcbiAgICAgIG1vZHMgPSBbXTtcbiAgICAgIGtleSA9IGtleXNbaV0uc3BsaXQoJysnKTtcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMSl7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleSk7XG4gICAgICAgIGtleSA9IFtrZXlba2V5Lmxlbmd0aC0xXV07XG4gICAgICB9XG4gICAgICAvLyBjb252ZXJ0IHRvIGtleWNvZGUgYW5kLi4uXG4gICAgICBrZXkgPSBrZXlbMF1cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcbiAgICAgIC8vIC4uLnN0b3JlIGhhbmRsZXJcbiAgICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSBfaGFuZGxlcnNba2V5XSA9IFtdO1xuICAgICAgX2hhbmRsZXJzW2tleV0ucHVzaCh7IHNob3J0Y3V0OiBrZXlzW2ldLCBzY29wZTogc2NvcGUsIG1ldGhvZDogbWV0aG9kLCBrZXk6IGtleXNbaV0sIG1vZHM6IG1vZHMgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuYmluZCBhbGwgaGFuZGxlcnMgZm9yIGdpdmVuIGtleSBpbiBjdXJyZW50IHNjb3BlXG4gIGZ1bmN0aW9uIHVuYmluZEtleShrZXksIHNjb3BlKSB7XG4gICAgdmFyIG11bHRpcGxlS2V5cywga2V5cyxcbiAgICAgIG1vZHMgPSBbXSxcbiAgICAgIGksIGosIG9iajtcblxuICAgIG11bHRpcGxlS2V5cyA9IGdldEtleXMoa2V5KTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBtdWx0aXBsZUtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGtleXMgPSBtdWx0aXBsZUtleXNbal0uc3BsaXQoJysnKTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXlzKTtcbiAgICAgICAga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG5cbiAgICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghX2hhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9iaiA9IF9oYW5kbGVyc1trZXldW2ldO1xuICAgICAgICAvLyBvbmx5IGNsZWFyIGhhbmRsZXJzIGlmIGNvcnJlY3Qgc2NvcGUgYW5kIG1vZHMgbWF0Y2hcbiAgICAgICAgaWYgKG9iai5zY29wZSA9PT0gc2NvcGUgJiYgY29tcGFyZUFycmF5KG9iai5tb2RzLCBtb2RzKSkge1xuICAgICAgICAgIF9oYW5kbGVyc1trZXldW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2l0aCBjb2RlICdrZXlDb2RlJyBpcyBjdXJyZW50bHkgZG93blxuICAvLyBDb252ZXJ0cyBzdHJpbmdzIGludG8ga2V5IGNvZGVzLlxuICBmdW5jdGlvbiBpc1ByZXNzZWQoa2V5Q29kZSkge1xuICAgICAgaWYgKHR5cGVvZihrZXlDb2RlKT09J3N0cmluZycpIHtcbiAgICAgICAga2V5Q29kZSA9IGNvZGUoa2V5Q29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXgoX2Rvd25LZXlzLCBrZXlDb2RlKSAhPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZXNzZWRLZXlDb2RlcygpIHtcbiAgICAgIHJldHVybiBfZG93bktleXMuc2xpY2UoMCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQpe1xuICAgIHZhciB0YWdOYW1lID0gKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KS50YWdOYW1lO1xuICAgIC8vIGlnbm9yZSBrZXlwcmVzc2VkIGluIGFueSBlbGVtZW50cyB0aGF0IHN1cHBvcnQga2V5Ym9hcmQgZGF0YSBpbnB1dFxuICAgIHJldHVybiAhKHRhZ05hbWUgPT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09ICdTRUxFQ1QnIHx8IHRhZ05hbWUgPT0gJ1RFWFRBUkVBJyk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIGtleS48bW9kaWZpZXI+IHRvIGZhbHNlXG4gIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuXG4gIC8vIHNldCBjdXJyZW50IHNjb3BlIChkZWZhdWx0ICdhbGwnKVxuICBmdW5jdGlvbiBzZXRTY29wZShzY29wZSl7IF9zY29wZSA9IHNjb3BlIHx8ICdhbGwnIH07XG4gIGZ1bmN0aW9uIGdldFNjb3BlKCl7IHJldHVybiBfc2NvcGUgfHwgJ2FsbCcgfTtcblxuICAvLyBkZWxldGUgYWxsIGhhbmRsZXJzIGZvciBhIGdpdmVuIHNjb3BlXG4gIGZ1bmN0aW9uIGRlbGV0ZVNjb3BlKHNjb3BlKXtcbiAgICB2YXIga2V5LCBoYW5kbGVycywgaTtcblxuICAgIGZvciAoa2V5IGluIF9oYW5kbGVycykge1xuICAgICAgaGFuZGxlcnMgPSBfaGFuZGxlcnNba2V5XTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7ICkge1xuICAgICAgICBpZiAoaGFuZGxlcnNbaV0uc2NvcGUgPT09IHNjb3BlKSBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGVsc2UgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBhYnN0cmFjdCBrZXkgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0S2V5cyhrZXkpIHtcbiAgICB2YXIga2V5cztcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBrZXlzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgaWYgKChrZXlzW2tleXMubGVuZ3RoIC0gMV0pID09ICcnKSB7XG4gICAgICBrZXlzW2tleXMubGVuZ3RoIC0gMl0gKz0gJywnO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8vIGFic3RyYWN0IG1vZHMgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0TW9kcyhrZXkpIHtcbiAgICB2YXIgbW9kcyA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gMSk7XG4gICAgZm9yICh2YXIgbWkgPSAwOyBtaSA8IG1vZHMubGVuZ3RoOyBtaSsrKVxuICAgIG1vZHNbbWldID0gX01PRElGSUVSU1ttb2RzW21pXV07XG4gICAgcmV0dXJuIG1vZHM7XG4gIH1cblxuICAvLyBjcm9zcy1icm93c2VyIGV2ZW50c1xuICBmdW5jdGlvbiBhZGRFdmVudChvYmplY3QsIGV2ZW50LCBtZXRob2QpIHtcbiAgICBpZiAob2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICBvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbWV0aG9kLCBmYWxzZSk7XG4gICAgZWxzZSBpZihvYmplY3QuYXR0YWNoRXZlbnQpXG4gICAgICBvYmplY3QuYXR0YWNoRXZlbnQoJ29uJytldmVudCwgZnVuY3Rpb24oKXsgbWV0aG9kKHdpbmRvdy5ldmVudCkgfSk7XG4gIH07XG5cbiAgLy8gc2V0IHRoZSBoYW5kbGVycyBnbG9iYWxseSBvbiBkb2N1bWVudFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgeyBkaXNwYXRjaChldmVudCkgfSk7IC8vIFBhc3NpbmcgX3Njb3BlIHRvIGEgY2FsbGJhY2sgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgYnkgZXhlY3V0aW9uLiBGaXhlcyAjNDhcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcsIGNsZWFyTW9kaWZpZXIpO1xuXG4gIC8vIHJlc2V0IG1vZGlmaWVycyB0byBmYWxzZSB3aGVuZXZlciB0aGUgd2luZG93IGlzIChyZSlmb2N1c2VkLlxuICBhZGRFdmVudCh3aW5kb3csICdmb2N1cycsIHJlc2V0TW9kaWZpZXJzKTtcblxuICAvLyBzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5XG4gIHZhciBwcmV2aW91c0tleSA9IGdsb2JhbC5rZXk7XG5cbiAgLy8gcmVzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5IGFuZCByZXR1cm4gcmVmZXJlbmNlIHRvIG91ciBrZXkgb2JqZWN0XG4gIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgdmFyIGsgPSBnbG9iYWwua2V5O1xuICAgIGdsb2JhbC5rZXkgPSBwcmV2aW91c0tleTtcbiAgICByZXR1cm4gaztcbiAgfVxuXG4gIC8vIHNldCB3aW5kb3cua2V5IGFuZCB3aW5kb3cua2V5LnNldC9nZXQvZGVsZXRlU2NvcGUsIGFuZCB0aGUgZGVmYXVsdCBmaWx0ZXJcbiAgZ2xvYmFsLmtleSA9IGFzc2lnbktleTtcbiAgZ2xvYmFsLmtleS5zZXRTY29wZSA9IHNldFNjb3BlO1xuICBnbG9iYWwua2V5LmdldFNjb3BlID0gZ2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZGVsZXRlU2NvcGUgPSBkZWxldGVTY29wZTtcbiAgZ2xvYmFsLmtleS5maWx0ZXIgPSBmaWx0ZXI7XG4gIGdsb2JhbC5rZXkuaXNQcmVzc2VkID0gaXNQcmVzc2VkO1xuICBnbG9iYWwua2V5LmdldFByZXNzZWRLZXlDb2RlcyA9IGdldFByZXNzZWRLZXlDb2RlcztcbiAgZ2xvYmFsLmtleS5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgZ2xvYmFsLmtleS51bmJpbmQgPSB1bmJpbmRLZXk7XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIG1vZHVsZS5leHBvcnRzID0gYXNzaWduS2V5O1xuXG59KSh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbi8vIFRZUEVTXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn0gLy8gQ0FQQUJJTElUSUVTXG5cbmZ1bmN0aW9uIGhhc0ludGwoKSB7XG4gIHJldHVybiB0eXBlb2YgSW50bCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuZnVuY3Rpb24gaGFzRm9ybWF0VG9QYXJ0cygpIHtcbiAgcmV0dXJuICFpc1VuZGVmaW5lZChJbnRsLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzKTtcbn0gLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmZ1bmN0aW9uIG1heWJlQXJyYXkodGhpbmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpbmcpID8gdGhpbmcgOiBbdGhpbmddO1xufVxuZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKGJlc3QsIG5leHQpIHtcbiAgICB2YXIgcGFpciA9IFtieShuZXh0KSwgbmV4dF07XG5cbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZShiZXN0WzBdLCBwYWlyWzBdKSA9PT0gYmVzdFswXSkge1xuICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH1cbiAgfSwgbnVsbClbMV07XG59XG5mdW5jdGlvbiBwaWNrKG9iaiwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGspIHtcbiAgICBhW2tdID0gb2JqW2tdO1xuICAgIHJldHVybiBhO1xuICB9LCB7fSk7XG59IC8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZnVuY3Rpb24gbnVtYmVyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzTnVtYmVyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufSAvLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcblxuZnVuY3Rpb24gZmxvb3JNb2QoeCwgbikge1xuICByZXR1cm4geCAtIG4gKiBNYXRoLmZsb29yKHggLyBuKTtcbn1cbmZ1bmN0aW9uIHBhZFN0YXJ0KGlucHV0LCBuKSB7XG4gIGlmIChuID09PSB2b2lkIDApIHtcbiAgICBuID0gMjtcbiAgfVxuXG4gIGlmIChpbnB1dC50b1N0cmluZygpLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gKFwiMFwiLnJlcGVhdChuKSArIGlucHV0KS5zbGljZSgtbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzKGZyYWN0aW9uKSB7XG4gIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvbikpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHZhciBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzKSB7XG4gIHZhciBmYWN0b3IgPSBNYXRoLnBvdygxMCwgZGlnaXRzKTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyICogZmFjdG9yKSAvIGZhY3Rvcjtcbn0gLy8gREFURSBCQVNJQ1NcblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cbmZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gIHZhciBtb2RNb250aCA9IGZsb29yTW9kKG1vbnRoIC0gMSwgMTIpICsgMSxcbiAgICAgIG1vZFllYXIgPSB5ZWFyICsgKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG5cbiAgaWYgKG1vZE1vbnRoID09PSAyKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIobW9kWWVhcikgPyAyOSA6IDI4O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb2RNb250aCAtIDFdO1xuICB9XG59XG5mdW5jdGlvbiB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpIHtcbiAgdmFyIHAxID0gKHdlZWtZZWFyICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQpIC0gTWF0aC5mbG9vcih3ZWVrWWVhciAvIDEwMCkgKyBNYXRoLmZsb29yKHdlZWtZZWFyIC8gNDAwKSkgJSA3LFxuICAgICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICAgIHAyID0gKGxhc3QgKyBNYXRoLmZsb29yKGxhc3QgLyA0KSAtIE1hdGguZmxvb3IobGFzdCAvIDEwMCkgKyBNYXRoLmZsb29yKGxhc3QgLyA0MDApKSAlIDc7XG4gIHJldHVybiBwMSA9PT0gNCB8fCBwMiA9PT0gMyA/IDUzIDogNTI7XG59XG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufSAvLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlLCB0aW1lWm9uZSkge1xuICBpZiAodGltZVpvbmUgPT09IHZvaWQgMCkge1xuICAgIHRpbWVab25lID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgaW50bE9wdHMgPSB7XG4gICAgaG91cjEyOiBmYWxzZSxcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHRpbWVab25lTmFtZTogb2Zmc2V0Rm9ybWF0XG4gIH0sIGludGxPcHRzKSxcbiAgICAgIGludGwgPSBoYXNJbnRsKCk7XG5cbiAgaWYgKGludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgdmFyIHBhcnNlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdFRvUGFydHMoZGF0ZSkuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiO1xuICAgIH0pO1xuICAgIHJldHVybiBwYXJzZWQgPyBwYXJzZWQudmFsdWUgOiBudWxsO1xuICB9IGVsc2UgaWYgKGludGwpIHtcbiAgICAvLyB0aGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBmb3IgYWxsIGxvY2FsZXNcbiAgICB2YXIgd2l0aG91dCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgaW50bE9wdHMpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgaW5jbHVkZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGRpZmZlZCA9IGluY2x1ZGVkLnN1YnN0cmluZyh3aXRob3V0Lmxlbmd0aCksXG4gICAgICAgIHRyaW1tZWQgPSBkaWZmZWQucmVwbGFjZSgvXlssIFxcdTIwMGVdKy8sIFwiXCIpO1xuICAgIHJldHVybiB0cmltbWVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IC8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5cbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59IC8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge307XG5cbiAgZm9yICh2YXIgdSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHUpKSB7XG4gICAgICB2YXIgdiA9IG9ialt1XTtcblxuICAgICAgaWYgKHYgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHYpICYmICFOdW1iZXIuaXNOYU4odikpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IG5vcm1hbGl6ZXIodSwgaWdub3JlVW5rbm93bik7XG5cbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbiA9IFwibnVtZXJpY1wiLFxuICAgIHMgPSBcInNob3J0XCIsXG4gICAgbCA9IFwibG9uZ1wiLFxuICAgIGQyID0gXCIyLWRpZ2l0XCI7XG52YXIgREFURV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogblxufTtcbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcbnZhciBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsXG59O1xudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbnZhciBUSU1FXzI0X1NJTVBMRSA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG52YXIgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cblxudmFyIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBPYmplY3Qua2V5cyhvYmopLnNvcnQoKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgbW9udGhzTG9uZyA9IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdO1xudmFyIG1vbnRoc1Nob3J0ID0gW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdO1xudmFyIG1vbnRoc05hcnJvdyA9IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXTtcbmZ1bmN0aW9uIG1vbnRocyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gbW9udGhzU2hvcnQ7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIG1vbnRoc0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG52YXIgd2Vla2RheXNMb25nID0gW1wiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIl07XG52YXIgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcbnZhciB3ZWVrZGF5c05hcnJvdyA9IFtcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiLCBcIlNcIl07XG5mdW5jdGlvbiB3ZWVrZGF5cyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIl07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbnZhciBtZXJpZGllbXMgPSBbXCJBTVwiLCBcIlBNXCJdO1xudmFyIGVyYXNMb25nID0gW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdO1xudmFyIGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG52YXIgZXJhc05hcnJvdyA9IFtcIkJcIiwgXCJBXCJdO1xuZnVuY3Rpb24gZXJhcyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcblxuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIGVyYXNTaG9ydDtcblxuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gZXJhc0xvbmc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIHtcbiAgcmV0dXJuIG1lcmlkaWVtc1tkdC5ob3VyIDwgMTIgPyAwIDogMV07XG59XG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5mdW5jdGlvbiBtb250aEZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG1vbnRocyhsZW5ndGgpW2R0Lm1vbnRoIC0gMV07XG59XG5mdW5jdGlvbiBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBlcmFzKGxlbmd0aClbZHQueWVhciA8IDAgPyAwIDogMV07XG59XG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbXCJ3ZWVrZGF5XCIsIFwiZXJhXCIsIFwieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcInRpbWVab25lTmFtZVwiLCBcImhvdXIxMlwiXSksXG4gICAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgICAgZGF0ZVRpbWVIdWdlID0gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfU0lNUExFKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkhIOm1tOnNzXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRCk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbnZhciBMdXhvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIHJldHVybiBfRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEx1eG9uRXJyb3I7XG59KF93cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgSW52YWxpZERhdGVUaW1lRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREYXRlVGltZUVycm9yLCBfTHV4b25FcnJvcik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZERhdGVUaW1lRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yLmNhbGwodGhpcywgXCJJbnZhbGlkIERhdGVUaW1lOiBcIiArIHJlYXNvbi50b01lc3NhZ2UoKSkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRGF0ZVRpbWVFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3IyKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWRJbnRlcnZhbEVycm9yLCBfTHV4b25FcnJvcjIpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjIuY2FsbCh0aGlzLCBcIkludmFsaWQgSW50ZXJ2YWw6IFwiICsgcmVhc29uLnRvTWVzc2FnZSgpKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRJbnRlcnZhbEVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIEludmFsaWREdXJhdGlvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsIFwiSW52YWxpZCBEdXJhdGlvbjogXCIgKyByZWFzb24udG9NZXNzYWdlKCkpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNCkge1xuICBfaW5oZXJpdHNMb29zZShDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciwgX0x1eG9uRXJyb3I0KTtcblxuICBmdW5jdGlvbiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkVW5pdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFVuaXRFcnJvciwgX0x1eG9uRXJyb3I1KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkVW5pdEVycm9yKHVuaXQpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgXCJJbnZhbGlkIHVuaXQgXCIgKyB1bml0KSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSW52YWxpZEFyZ3VtZW50RXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNikge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkQXJndW1lbnRFcnJvciwgX0x1eG9uRXJyb3I2KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkQXJndW1lbnRFcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBab25lSXNBYnN0cmFjdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjcpIHtcbiAgX2luaGVyaXRzTG9vc2UoWm9uZUlzQWJzdHJhY3RFcnJvciwgX0x1eG9uRXJyb3I3KTtcblxuICBmdW5jdGlvbiBab25lSXNBYnN0cmFjdEVycm9yKCkge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCBcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIikgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICovXG5cbnZhciBab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWm9uZSgpIHt9XG5cbiAgdmFyIF9wcm90byA9IFpvbmUucHJvdG90eXBlO1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9mZnNldCdzIGNvbW1vbiBuYW1lIChzdWNoIGFzIEVTVCkgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXBcclxuICAgKiBAYWJzdHJhY3RcclxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gT3B0aW9ucyB0byBhZmZlY3QgdGhlIGZvcm1hdFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBvZmZzZXQgaW4gbWludXRlcyBmb3IgdGhpcyB6b25lIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVyXHJcbiAgICogQGFic3RyYWN0XHJcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcblxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9mZnNldCBpcyBrbm93biB0byBiZSBmaXhlZCBmb3IgdGhlIHdob2xlIHllYXIuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFpvbmU7XG59KCk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xuXG52YXIgTG9jYWxab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgcmV0dXJuIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMb2NhbFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJsb2NhbFwiO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhMb2NhbFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImxvY2FsXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgICB9IGVsc2UgcmV0dXJuIFwibG9jYWxcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImluc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9jYWxab25lO1xufShab25lKTtcblxudmFyIGR0ZkNhY2hlID0ge307XG5cbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIHNlY29uZDogXCIyLWRpZ2l0XCJcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkdGZDYWNoZVt6b25lXTtcbn1cblxudmFyIHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDVcbn07XG5cbmZ1bmN0aW9uIGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuICByZXR1cm4gW2ZZZWFyLCBmTW9udGgsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXTtcbn1cblxuZnVuY3Rpb24gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICAgIGZpbGxlZCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChwb3MpKSB7XG4gICAgICBmaWxsZWRbcG9zXSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShJQU5BWm9uZSwgX1pvbmUpO1xuXG4gIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIgPSBmdW5jdGlvbiBpc1ZhbGlkU3BlY2lmaWVyKHMpIHtcbiAgICByZXR1cm4gcyAmJiBzLm1hdGNoKC9eW2Etel8rLV17MSwyNTZ9KFxcL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0pPyk/JC9pKTtcbiAgfTtcblxuICBJQU5BWm9uZS5pc1ZhbGlkWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRab25lKHpvbmUpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7XG4gICAgICAgIHRpbWVab25lOiB6b25lXG4gICAgICB9KS5mb3JtYXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07IC8vIEV0Yy9HTVQrOCAtPiAtNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAtNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZnVuY3Rpb24gSUFOQVpvbmUobmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICBfdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJQU5BWm9uZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUsIHRoaXMuem9uZU5hbWUpO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgICAgZHRmID0gbWFrZURURih0aGlzLnpvbmVOYW1lKSxcbiAgICAgICAgX3JlZjIgPSBkdGYuZm9ybWF0VG9QYXJ0cyA/IHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkgOiBoYWNreU9mZnNldChkdGYsIGRhdGUpLFxuICAgICAgICBmWWVhciA9IF9yZWYyWzBdLFxuICAgICAgICBmTW9udGggPSBfcmVmMlsxXSxcbiAgICAgICAgZkRheSA9IF9yZWYyWzJdLFxuICAgICAgICBmSG91ciA9IF9yZWYyWzNdLFxuICAgICAgICBmTWludXRlID0gX3JlZjJbNF0sXG4gICAgICAgIGZTZWNvbmQgPSBfcmVmMls1XSxcbiAgICAgICAgYXNVVEMgPSBEYXRlLlVUQyhmWWVhciwgZk1vbnRoIC0gMSwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmQpO1xuXG4gICAgdmFyIGFzVFMgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICBhc1RTIC09IGFzVFMgJSAxMDAwO1xuICAgIHJldHVybiAoYXNVVEMgLSBhc1RTKSAvICg2MCAqIDEwMDApO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKElBTkFab25lLCBbe1xuICAgIGtleTogXCJ0eXBlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpYW5hXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElBTkFab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQxID0gbnVsbDtcblxuZnVuY3Rpb24gaG91cnNNaW51dGVzT2Zmc2V0KHopIHtcbiAgdmFyIGhvdXJzID0gTWF0aC50cnVuYyh6LmZpeGVkIC8gNjApLFxuICAgICAgbWludXRlcyA9IE1hdGguYWJzKHouZml4ZWQgJSA2MCksXG4gICAgICBzaWduID0gaG91cnMgPiAwID8gXCIrXCIgOiBcIi1cIixcbiAgICAgIGJhc2UgPSBzaWduICsgTWF0aC5hYnMoaG91cnMpO1xuICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBwYWRTdGFydChtaW51dGVzLCAyKSA6IGJhc2U7XG59XG5cbnZhciBGaXhlZE9mZnNldFpvbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9ab25lKSB7XG4gIF9pbmhlcml0c0xvb3NlKEZpeGVkT2Zmc2V0Wm9uZSwgX1pvbmUpO1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZSA9IGZ1bmN0aW9uIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH07XG5cbiAgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyID0gZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgciA9IHMubWF0Y2goL151dGMoPzooWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/KT8kL2kpO1xuXG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIG51bGwsIFt7XG4gICAga2V5OiBcInV0Y0luc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2luZ2xldG9uJDE7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gRml4ZWRPZmZzZXRab25lKG9mZnNldCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiZml4ZWRcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogXCJVVENcIiArIGhvdXJzTWludXRlc09mZnNldCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZTtcbn0oWm9uZSk7XG5cbnZhciBJbnZhbGlkWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkWm9uZSh6b25lTmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gem9uZU5hbWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEludmFsaWRab25lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaW52YWxpZFwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52YWxpZFpvbmU7XG59KFpvbmUpO1xuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0O1xuXG4gIGlmIChpc1VuZGVmaW5lZChpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFpvbmU7XG4gIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBab25lKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgIHZhciBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gXCJsb2NhbFwiKSByZXR1cm4gTG9jYWxab25lLmluc3RhbmNlO2Vsc2UgaWYgKGxvd2VyZWQgPT09IFwidXRjXCIgfHwgbG93ZXJlZCA9PT0gXCJnbXRcIikgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZTtlbHNlIGlmICgob2Zmc2V0ID0gSUFOQVpvbmUucGFyc2VHTVRPZmZzZXQoaW5wdXQpKSAhPSBudWxsKSB7XG4gICAgICAvLyBoYW5kbGUgRXRjL0dNVC00LCB3aGljaCBWOCBjaG9rZXMgb25cbiAgICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBuZXcgSUFOQVpvbmUoaW5wdXQpO2Vsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuLyoqXHJcbiAqIFNldHRpbmdzIGNvbnRhaW5zIHN0YXRpYyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgY29udHJvbCBMdXhvbidzIG92ZXJhbGwgYmVoYXZpb3IuIEx1eG9uIGlzIGEgc2ltcGxlIGxpYnJhcnkgd2l0aCBmZXcgb3B0aW9ucywgYnV0IHRoZSBvbmVzIGl0IGRvZXMgaGF2ZSBsaXZlIGhlcmUuXHJcbiAqL1xuXG5cbnZhciBTZXR0aW5ncyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNldHRpbmdzKCkge31cblxuICAvKipcclxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cclxuICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAqL1xuICBTZXR0aW5ncy5yZXNldENhY2hlcyA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGVzKCkge1xuICAgIExvY2FsZS5yZXNldENhY2hlKCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogXCJub3dcIixcblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5vdztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBudW1iZXIsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gRXBvY2ggbWlsbGlzZWNvbmQgY291bnRcclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IERhdGUubm93KCkgKyAzMDAwIC8vIHByZXRlbmQgaXQgaXMgMyBzZWNvbmRzIGluIHRoZSBmdXR1cmVcclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IDAgLy8gYWx3YXlzIHByZXRlbmQgaXQncyBKYW4gMSwgMTk3MCBhdCBtaWRuaWdodCBpbiBVVEMgdGltZVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHopIHtcbiAgICAgIGlmICgheikge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG5vcm1hbGl6ZVpvbmUoeik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtab25lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0Wm9uZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRMb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TG9jYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBsb2NhbGUgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChsb2NhbGUpIHtcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdE51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0T3V0cHV0Q2FsZW5kYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG91dHB1dENhbGVuZGFyKSB7XG4gICAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBvdXRwdXRDYWxlbmRhcjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0aHJvd09uSW52YWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodCkge1xuICAgICAgdGhyb3dPbkludmFsaWQgPSB0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZXR0aW5ncztcbn0oKTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHNwbGl0cywgdG9rZW5Ub1N0cmluZykge1xuICB2YXIgcyA9IFwiXCI7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc3BsaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gX3JlZjtcblxuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHM7XG59XG5cbnZhciB0b2tlblRvT2JqZWN0ID0ge1xuICBEOiBEQVRFX1NIT1JULFxuICBERDogREFURV9NRUQsXG4gIERERDogREFURV9GVUxMLFxuICBEREREOiBEQVRFX0hVR0UsXG4gIHQ6IFRJTUVfU0lNUExFLFxuICB0dDogVElNRV9XSVRIX1NFQ09ORFMsXG4gIHR0dDogVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogVElNRV9XSVRIX0xPTkdfT0ZGU0VULFxuICBUOiBUSU1FXzI0X1NJTVBMRSxcbiAgVFQ6IFRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIFRUVFQ6IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCxcbiAgZjogREFURVRJTUVfU0hPUlQsXG4gIGZmOiBEQVRFVElNRV9NRUQsXG4gIGZmZjogREFURVRJTUVfRlVMTCxcbiAgZmZmZjogREFURVRJTUVfSFVHRSxcbiAgRjogREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTLFxuICBGRjogREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyxcbiAgRkZGOiBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcbn07XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBGb3JtYXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBGb3JtYXR0ZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZvcm1hdHRlcihsb2NhbGUsIG9wdHMpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wYXJzZUZvcm1hdCA9IGZ1bmN0aW9uIHBhcnNlRm9ybWF0KGZtdCkge1xuICAgIHZhciBjdXJyZW50ID0gbnVsbCxcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuXG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBicmFja2V0ZWQsXG4gICAgICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgbGl0ZXJhbDogYnJhY2tldGVkLFxuICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXRzO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEZvcm1hdHRlcihsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdCA9IGZ1bmN0aW9uIGZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBvcHRzKSB7XG4gICAgaWYgKHRoaXMuc3lzdGVtTG9jID09PSBudWxsKSB7XG4gICAgICB0aGlzLnN5c3RlbUxvYyA9IHRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCk7XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5zeXN0ZW1Mb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdFRvUGFydHMoKTtcbiAgfTtcblxuICBfcHJvdG8ucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH07XG5cbiAgX3Byb3RvLm51bSA9IGZ1bmN0aW9uIG51bShuLCBwKSB7XG4gICAgaWYgKHAgPT09IHZvaWQgMCkge1xuICAgICAgcCA9IDA7XG4gICAgfVxuXG4gICAgLy8gd2UgZ2V0IHNvbWUgcGVyZiBvdXQgb2YgZG9pbmcgdGhpcyBoZXJlLCBhbm5veWluZ2x5XG4gICAgaWYgKHRoaXMub3B0cy5mb3JjZVNpbXBsZSkge1xuICAgICAgcmV0dXJuIHBhZFN0YXJ0KG4sIHApO1xuICAgIH1cblxuICAgIHZhciBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzKTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSBcImVuXCI7XG5cbiAgICB2YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKG9wdHMsIGV4dHJhY3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5sb2MuZXh0cmFjdChkdCwgb3B0cywgZXh0cmFjdCk7XG4gICAgfSxcbiAgICAgICAgZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KG9wdHMpIHtcbiAgICAgIGlmIChkdC5pc09mZnNldEZpeGVkICYmIGR0Lm9mZnNldCA9PT0gMCAmJiBvcHRzLmFsbG93Wikge1xuICAgICAgICByZXR1cm4gXCJaXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyBcIitcIiA6IFwiLVwiLFxuICAgICAgICAgIGJhc2UgPSBcIlwiICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHNpZ24gKyBfdGhpcy5udW0oTWF0aC5hYnMoaG91cnMpLCAyKSArIFwiOlwiICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgICAgICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBtaW51dGVzIDogYmFzZTtcblxuICAgICAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZhbHVlIGZvcm1hdCBcIiArIG9wdHMuZm9ybWF0ICsgXCIgaXMgb3V0IG9mIHJhbmdlIGZvciBwcm9wZXJ0eSBmb3JtYXRcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7XG4gICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICBob3VyMTI6IHRydWVcbiAgICAgIH0sIFwiZGF5cGVyaW9kXCIpO1xuICAgIH0sXG4gICAgICAgIG1vbnRoID0gZnVuY3Rpb24gbW9udGgobGVuZ3RoLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICBtb250aDogbGVuZ3RoXG4gICAgICB9IDoge1xuICAgICAgICBtb250aDogbGVuZ3RoLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIm1vbnRoXCIpO1xuICAgIH0sXG4gICAgICAgIHdlZWtkYXkgPSBmdW5jdGlvbiB3ZWVrZGF5KGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGhcbiAgICAgIH0gOiB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIndlZWtkYXlcIik7XG4gICAgfSxcbiAgICAgICAgbWF5YmVNYWNybyA9IGZ1bmN0aW9uIG1heWJlTWFjcm8odG9rZW4pIHtcbiAgICAgIHZhciBtYWNybyA9IHRva2VuVG9PYmplY3RbdG9rZW5dO1xuXG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH0sIFwiZXJhXCIpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyOyAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taWxsaXNlY29uZCk7XG5cbiAgICAgICAgY2FzZSBcInVcIjogLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuXG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5zZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kLCAyKTtcbiAgICAgICAgLy8gbWludXRlc1xuXG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuXG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgLy8gaG91cnNcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuXG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyKTtcblxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAvLyBvZmZzZXRcblxuICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGFsbG93WjogX3RoaXMub3B0cy5hbGxvd1pcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoe1xuICAgICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgICBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJ0ZWNoaWVcIixcbiAgICAgICAgICAgIGFsbG93WjogZmFsc2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcblxuICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgIHJldHVybiBkdC5vZmZzZXROYW1lTG9uZztcbiAgICAgICAgLy8gem9uZVxuXG4gICAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJkYXlcIikgOiBfdGhpcy5udW0oZHQuZGF5KTtcblxuICAgICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IF90aGlzLm51bShkdC5kYXksIDIpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIHN0YW5kYWxvbmVcblxuICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla2RheSk7XG5cbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG5cbiAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiBfdGhpcy5udW0oZHQubW9udGgsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcblxuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyB5ZWFyc1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyKTtcblxuICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIjItZGlnaXRcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhciwgNCk7XG5cbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLCA2KTtcbiAgICAgICAgLy8gZXJhc1xuXG4gICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgIHJldHVybiBlcmEoXCJzaG9ydFwiKTtcblxuICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICAvLyBsaWtlIEFubm8gRG9taW5pXG4gICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG5cbiAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgcmV0dXJuIGVyYShcIm5hcnJvd1wiKTtcblxuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyKTtcblxuICAgICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcblxuICAgICAgICBjYXNlIFwib29vXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsLCAzKTtcblxuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlcik7XG5cbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG5cbiAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG5cbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnRzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSwgdG9rZW5Ub1N0cmluZyk7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWNvbmRcIjtcblxuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuXG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuXG4gICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLFxuICAgICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAoZm91bmQsIF9yZWYyKSB7XG4gICAgICB2YXIgbGl0ZXJhbCA9IF9yZWYyLmxpdGVyYWwsXG4gICAgICAgICAgdmFsID0gX3JlZjIudmFsO1xuICAgICAgcmV0dXJuIGxpdGVyYWwgPyBmb3VuZCA6IGZvdW5kLmNvbmNhdCh2YWwpO1xuICAgIH0sIFtdKSxcbiAgICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8uYXBwbHkoZHVyLCByZWFsVG9rZW5zLm1hcCh0b2tlblRvRmllbGQpLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2Vucyh0b2tlbnMsIHRva2VuVG9TdHJpbmcoY29sbGFwc2VkKSk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1hdHRlcjtcbn0oKTtcblxudmFyIGludGxEVENhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldENhY2hlZERURihsb2NTdHJpbmcsIG9wdHMpIHtcbiAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBvcHRzXSk7XG4gIHZhciBkdGYgPSBpbnRsRFRDYWNoZVtrZXldO1xuXG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jU3RyaW5nLCBvcHRzKTtcbiAgICBpbnRsRFRDYWNoZVtrZXldID0gZHRmO1xuICB9XG5cbiAgcmV0dXJuIGR0Zjtcbn1cblxudmFyIGludGxOdW1DYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZW5kSU5GKGxvY1N0cmluZywgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgdmFyIGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuXG4gIGlmICghaW5mKSB7XG4gICAgaW5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bE51bUNhY2hlW2tleV0gPSBpbmY7XG4gIH1cblxuICByZXR1cm4gaW5mO1xufVxuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuXG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIGlmIChoYXNJbnRsKCkpIHtcbiAgICB2YXIgY29tcHV0ZWRTeXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTsgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuXG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBjb21wdXRlZFN5cyA9PT0gXCJ1bmRcIiA/IFwiZW4tVVNcIiA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IFwiZW4tVVNcIjtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlU3RyKSB7XG4gIC8vIEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQgd3JpdGluZyBhIEJDUCA0NyBwYXJzZXJcbiAgLy8gc2VlLCBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vYmNwLTQ3XG4gIC8vIEludGVhZCwgd2UnbGwgZG8gdGhpczpcbiAgLy8gYSkgaWYgdGhlIHN0cmluZyBoYXMgbm8gLXUgZXh0ZW5zaW9ucywganVzdCBsZWF2ZSBpdCBhbG9uZVxuICAvLyBiKSBpZiBpdCBkb2VzLCB1c2UgSW50bCB0byByZXNvbHZlIGV2ZXJ5dGhpbmdcbiAgLy8gYykgaWYgSW50bCBmYWlscywgdHJ5IGFnYWluIHdpdGhvdXQgdGhlIC11XG4gIHZhciB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcblxuICBpZiAodUluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBbbG9jYWxlU3RyXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcblxuICAgIHRyeSB7XG4gICAgICBvcHRpb25zID0gZ2V0Q2FjaGVkRFRGKGxvY2FsZVN0cikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihzbWFsbGVyKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX29wdGlvbnMuY2FsZW5kYXI7IC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuXG4gICAgcmV0dXJuIFtzbWFsbGVyLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRsQ29uZmlnU3RyaW5nKGxvY2FsZVN0ciwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikge1xuICBpZiAoaGFzSW50bCgpKSB7XG4gICAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgbG9jYWxlU3RyICs9IFwiLXVcIjtcblxuICAgICAgaWYgKG91dHB1dENhbGVuZGFyKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1jYS1cIiArIG91dHB1dENhbGVuZGFyO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1udS1cIiArIG51bWJlcmluZ1N5c3RlbTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcE1vbnRocyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cblxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIG1hcFdlZWtkYXlzKGYpIHtcbiAgdmFyIG1zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gNzsgaSsrKSB7XG4gICAgdmFyIGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMyArIGkpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gXCJlblwiKSB7XG4gICAgcmV0dXJuIGVuZ2xpc2hGbihsZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnRsRm4obGVuZ3RoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0Zhc3ROdW1iZXJzKGxvYykge1xuICBpZiAobG9jLm51bWJlcmluZ1N5c3RlbSAmJiBsb2MubnVtYmVyaW5nU3lzdGVtICE9PSBcImxhdG5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCIgfHwgIWxvYy5sb2NhbGUgfHwgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHwgaGFzSW50bCgpICYmIEludGwuRGF0ZVRpbWVGb3JtYXQobG9jLmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCI7XG4gIH1cbn1cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpIHtcbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNpbXBsZU51bWJlckZvcm1hdHRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgLy8gdG8gbWF0Y2ggdGhlIGJyb3dzZXIncyBudW1iZXJmb3JtYXR0ZXIgZGVmYXVsdHNcbiAgICB2YXIgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGxOdW1iZXJGb3JtYXR0ZXIoaW50bCwgb3B0cykge1xuICAgIHZhciBpbnRsT3B0cyA9IHtcbiAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAob3B0cy5wYWRUbyA+IDApIHtcbiAgICAgIGludGxPcHRzLm1pbmltdW1JbnRlZ2VyRGlnaXRzID0gb3B0cy5wYWRUbztcbiAgICB9XG5cbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vcjtcbiAgICB0aGlzLmluZiA9IGdldENhY2hlbmRJTkYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBJbnRsTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICB9O1xuXG4gIHJldHVybiBJbnRsTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBQb2x5RGF0ZUZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG4gICAgdmFyIHo7XG5cbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSBcIlVUQ1wiO1xuXG4gICAgICBpZiAob3B0cy50aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0Lm9mZnNldCA9PT0gMCA/IGR0IDogRGF0ZVRpbWUuZnJvbU1pbGxpcyhkdC50cyArIGR0Lm9mZnNldCAqIDYwICogMTAwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwibG9jYWxcIikge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciBpbnRsT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh6KSB7XG4gICAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8zID0gUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzMucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiBcImVuLVVTXCIsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogXCJsYXRuXCIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyOiBcImdyZWdvcnlcIlxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvbHlEYXRlRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBMb2NhbGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBMb2NhbGUuZnJvbU9wdHMgPSBmdW5jdGlvbiBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfTtcblxuICBMb2NhbGUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciwgZGVmYXVsdFRvRU4pIHtcbiAgICBpZiAoZGVmYXVsdFRvRU4gPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFRvRU4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgIC8vIHRoZSBzeXN0ZW0gbG9jYWxlIGlzIHVzZWZ1bCBmb3IgaHVtYW4gcmVhZGFibGUgc3RyaW5ncyBidXQgYW5ub3lpbmcgZm9yIHBhcnNpbmcvZm9ybWF0dGluZyBrbm93biBmb3JtYXRzXG4gICAgbG9jYWxlUiA9IHNwZWNpZmllZExvY2FsZSB8fCAoZGVmYXVsdFRvRU4gPyBcImVuLVVTXCIgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICAgIGludGxEVENhY2hlID0ge307XG4gICAgaW50bE51bUNhY2hlID0ge307XG4gIH07XG5cbiAgTG9jYWxlLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIExvY2FsZShsb2NhbGUsIG51bWJlcmluZywgb3V0cHV0Q2FsZW5kYXIsIHNwZWNpZmllZExvY2FsZSkge1xuICAgIHZhciBfcGFyc2VMb2NhbGVTdHJpbmcgPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpLFxuICAgICAgICBwYXJzZWRMb2NhbGUgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMF0sXG4gICAgICAgIHBhcnNlZE51bWJlcmluZ1N5c3RlbSA9IF9wYXJzZUxvY2FsZVN0cmluZ1sxXSxcbiAgICAgICAgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMl07XG5cbiAgICB0aGlzLmxvY2FsZSA9IHBhcnNlZExvY2FsZTtcbiAgICB0aGlzLm51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZyB8fCBwYXJzZWROdW1iZXJpbmdTeXN0ZW0gfHwgbnVsbDtcbiAgICB0aGlzLm91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXIgfHwgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgfHwgbnVsbDtcbiAgICB0aGlzLmludGwgPSBpbnRsQ29uZmlnU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgdGhpcy5vdXRwdXRDYWxlbmRhcik7XG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1lcmlkaWVtQ2FjaGUgPSBudWxsO1xuICAgIHRoaXMuZXJhQ2FjaGUgPSB7fTtcbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG80ID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG80Lmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoZGVmYXVsdE9LKSB7XG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09IFwiZW5cIiB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHwgaW50bCAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiKSAmJiAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSBcImdyZWdvcnlcIik7XG5cbiAgICBpZiAoIWhhc0ZUUCAmJiAhKGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykgJiYgIWRlZmF1bHRPSykge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gXCJlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJpbnRsXCI7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGFsdHMubG9jYWxlIHx8IHRoaXMuc3BlY2lmaWVkTG9jYWxlLCBhbHRzLm51bWJlcmluZ1N5c3RlbSB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgYWx0cy5vdXRwdXRDYWxlbmRhciB8fCB0aGlzLm91dHB1dENhbGVuZGFyLCBhbHRzLmRlZmF1bHRUb0VOIHx8IGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvNC5yZWRlZmF1bHRUb0VOID0gZnVuY3Rpb24gcmVkZWZhdWx0VG9FTihhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSkpO1xuICB9O1xuXG4gIF9wcm90bzQucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbShhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiBmYWxzZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG80Lm1vbnRocyA9IGZ1bmN0aW9uIG1vbnRocyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChmb3JtYXQgPT09IHZvaWQgMCkge1xuICAgICAgZm9ybWF0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGgsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0gOiB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGhcbiAgICAgIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsIFwibW9udGhcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQud2Vla2RheXMgPSBmdW5jdGlvbiB3ZWVrZGF5cyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAoZm9ybWF0ID09PSB2b2lkIDApIHtcbiAgICAgIGZvcm1hdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCB3ZWVrZGF5cywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSA6IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgICB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/IFwiZm9ybWF0XCIgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCBcIndlZWtkYXlcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQubWVyaWRpZW1zID0gZnVuY3Rpb24gbWVyaWRpZW1zJCQxKGRlZmF1bHRPSykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgdW5kZWZpbmVkLCBkZWZhdWx0T0ssIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXJpZGllbXM7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIGNvdWxkIGJlIGFyaWJpdHJhcnkgZGF5IHBlcmlvZHMuIFdlJ3JlIGdvbm5hIGFzc3VtZSB0aGVyZSBhcmUgZXhhY3RseSB0d29cbiAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgIGlmICghX3RoaXMzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgdmFyIGludGwgPSB7XG4gICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgaG91cjEyOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzMy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmV4dHJhY3QoZHQsIGludGwsIFwiZGF5cGVyaW9kXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoLCBkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBlcmFzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH07IC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cblxuICAgICAgaWYgKCFfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGR0LCBpbnRsT3B0cywgZmllbGQpIHtcbiAgICB2YXIgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICAgIHJlc3VsdHMgPSBkZi5mb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09IGZpZWxkO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBfcHJvdG80Lm51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uIG51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgaWYgKG9wdHMuZm9yY2VTaW1wbGUgfHwgdGhpcy5mYXN0TnVtYmVycyB8fCAhaGFzSW50bCgpKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZU51bWJlckZvcm1hdHRlcihvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuZHRGb3JtYXR0ZXIgPSBmdW5jdGlvbiBkdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpIHtcbiAgICBpZiAoaW50bE9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgaW50bE9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBvbHlEYXRlRm9ybWF0dGVyKGR0LCB0aGlzLmludGwsIGludGxPcHRzKTtcbiAgfTtcblxuICBfcHJvdG80LmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZSA9PT0gb3RoZXIubG9jYWxlICYmIHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBvdGhlci5udW1iZXJpbmdTeXN0ZW0gJiYgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXI7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKExvY2FsZSwgW3tcbiAgICBrZXk6IFwiZmFzdE51bWJlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IHN1cHBvcnRzRmFzdE51bWJlcnModGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXHJcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XHJcbiAqIFR3byB0aGluZ3MgZ28gaW50byBwYXJzaW5nOiBhIHJlZ2V4IHRvIG1hdGNoIHdpdGggYW5kIGFuIGV4dHJhY3RvciB0byB0YWtlIGFwYXJ0IHRoZSBncm91cHMgaW4gdGhlIG1hdGNoLlxyXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XHJcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxyXG4gKiBFeHRyYWN0b3JzIGNhbiB0YWtlIGEgXCJjdXJzb3JcIiByZXByZXNlbnRpbmcgdGhlIG9mZnNldCBpbiB0aGUgbWF0Y2ggdG8gbG9vayBhdC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNvbWJpbmUgZXh0cmFjdG9ycy5cclxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cclxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXHJcbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnZXhlcygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZ2V4ZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVnZXhlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoZnVuY3Rpb24gKGYsIHIpIHtcbiAgICByZXR1cm4gZiArIHIuc291cmNlO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFJlZ0V4cChcIl5cIiArIGZ1bGwgKyBcIiRcIik7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFeHRyYWN0b3JzKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGV4dHJhY3RvcnMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICBwYXR0ZXJuc1tfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwYXR0ZXJucy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX3BhdHRlcm5zJF9pID0gcGF0dGVybnNbX2ldLFxuICAgICAgICByZWdleCA9IF9wYXR0ZXJucyRfaVswXSxcbiAgICAgICAgZXh0cmFjdG9yID0gX3BhdHRlcm5zJF9pWzFdO1xuICAgIHZhciBtID0gcmVnZXguZXhlYyhzKTtcblxuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKG0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICBrZXlzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG1hdGNoLCBjdXJzb3IpIHtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn0gLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xuXG5cbnZhciBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gICAgaXNvVGltZUJhc2VSZWdleCA9IC8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Wy4sXShcXGR7MSw5fSkpPyk/KT8vLFxuICAgIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChcIlwiICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcIj9cIiksXG4gICAgaXNvVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKFwiKD86VFwiICsgaXNvVGltZVJlZ2V4LnNvdXJjZSArIFwiKT9cIiksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICAgIGlzb09yZGluYWxSZWdleCA9IC8oXFxkezR9KS0/KFxcZHszfSkvLFxuICAgIGV4dHJhY3RJU09XZWVrRGF0YSA9IHNpbXBsZVBhcnNlKFwid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla0RheVwiKSxcbiAgICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBcIiA/KD86XCIgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcInwoW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/XCIpLFxuICAgIHNxbFRpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OiBcIiArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPWW1kKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGl0ZW0gPSB7XG4gICAgeWVhcjogcGFyc2VJbnQobWF0Y2hbY3Vyc29yXSksXG4gICAgbW9udGg6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDFdKSB8fCAxLFxuICAgIGRheTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMl0pIHx8IDFcbiAgfTtcbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG4gIHJldHVybiBbaXRlbSwgbnVsbCwgY3Vyc29yICsgNF07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09PZmZzZXQobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgbG9jYWwgPSAhbWF0Y2hbY3Vyc29yXSAmJiAhbWF0Y2hbY3Vyc29yICsgMV0sXG4gICAgICBmdWxsT2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG1hdGNoW2N1cnNvciArIDFdLCBtYXRjaFtjdXJzb3IgKyAyXSksXG4gICAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIHpvbmUgPSBtYXRjaFtjdXJzb3JdID8gbmV3IElBTkFab25lKG1hdGNoW2N1cnNvcl0pIDogbnVsbDtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgMV07XG59IC8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KC0/XFxkezEsOX0pWSk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsOX0pRCk/KD86VCg/OigtP1xcZHsxLDl9KUgpPyg/OigtP1xcZHsxLDl9KU0pPyg/OigtP1xcZHsxLDl9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/fCgtP1xcZHsxLDl9KVcpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09EdXJhdGlvbihtYXRjaCkge1xuICB2YXIgeWVhclN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIG1pbGxpc2Vjb25kc1N0ciA9IG1hdGNoWzddLFxuICAgICAgd2Vla1N0ciA9IG1hdGNoWzhdO1xuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59IC8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcblxuXG52YXIgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50KHllYXJTdHIpKSA6IHBhcnNlSW50KHllYXJTdHIpLFxuICAgIG1vbnRoOiBtb250aFN0ci5sZW5ndGggPT09IDIgPyBwYXJzZUludChtb250aFN0ciwgMTApIDogbW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnQoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludChob3VyU3RyKSxcbiAgICBtaW51dGU6IHBhcnNlSW50KG1pbnV0ZVN0cilcbiAgfTtcbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50KHNlY29uZFN0cik7XG5cbiAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICByZXN1bHQud2Vla2RheSA9IHdlZWtkYXlTdHIubGVuZ3RoID4gMyA/IHdlZWtkYXlzTG9uZy5pbmRleE9mKHdlZWtkYXlTdHIpICsgMSA6IHdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSAvLyBSRkMgMjgyMi81MzIyXG5cblxudmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLFxccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoPzooWystXVxcZFxcZCkoXFxkXFxkKSkpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMyODIyKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFsyXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbM10sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNV0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzddLFxuICAgICAgb2JzT2Zmc2V0ID0gbWF0Y2hbOF0sXG4gICAgICBtaWxPZmZzZXQgPSBtYXRjaFs5XSxcbiAgICAgIG9mZkhvdXJTdHIgPSBtYXRjaFsxMF0sXG4gICAgICBvZmZNaW51dGVTdHIgPSBtYXRjaFsxMV0sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHZhciBvZmZzZXQ7XG5cbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIikudHJpbSgpO1xufSAvLyBodHRwIGRhdGVcblxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFszXSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzVdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbNl0sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5mdW5jdGlvbiBwYXJzZVJGQzI4MjJEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHByZXByb2Nlc3NSRkMyODIyKHMpLCBbcmZjMjgyMiwgZXh0cmFjdFJGQzI4MjJdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSFRUUERhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW2FzY2lpLCBleHRyYWN0QVNDSUldKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtjb21iaW5lUmVnZXhlcyhzcWxZbWRSZWdleCwgc3FsVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldLCBbY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldKTtcbn1cblxudmFyIEludmFsaWQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICB0aGlzLmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG4gIH1cblxuICB2YXIgX3Byb3RvID0gSW52YWxpZC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvTWVzc2FnZSA9IGZ1bmN0aW9uIHRvTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5leHBsYW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uICsgXCI6IFwiICsgdGhpcy5leHBsYW5hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gSW52YWxpZDtcbn0oKTtcblxudmFyIElOVkFMSUQgPSBcIkludmFsaWQgRHVyYXRpb25cIjsgLy8gdW5pdCBjb252ZXJzaW9uIGNvbnN0YW50c1xuXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3Vyczoge1xuICAgIG1pbnV0ZXM6IDYwLFxuICAgIHNlY29uZHM6IDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBtaW51dGVzOiB7XG4gICAgc2Vjb25kczogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDBcbiAgfSxcbiAgc2Vjb25kczoge1xuICAgIG1pbGxpc2Vjb25kczogMTAwMFxuICB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7IC8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuXG52YXIgb3JkZXJlZFVuaXRzID0gW1wieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl07XG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTsgLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcblxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhcikge1xuICBpZiAoY2xlYXIgPT09IHZvaWQgMCkge1xuICAgIGNsZWFyID0gZmFsc2U7XG4gIH1cblxuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIHZhciBjb25mID0ge1xuICAgIHZhbHVlczogY2xlYXIgPyBhbHRzLnZhbHVlcyA6IE9iamVjdC5hc3NpZ24oe30sIGR1ci52YWx1ZXMsIGFsdHMudmFsdWVzIHx8IHt9KSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeVxuICB9O1xuICByZXR1cm4gbmV3IER1cmF0aW9uKGNvbmYpO1xufVxuXG5mdW5jdGlvbiBhbnRpVHJ1bmMobikge1xuICByZXR1cm4gbiA8IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pO1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIHZhciBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgICAgc2FtZVNpZ24gPSBNYXRoLnNpZ24ocmF3KSA9PT0gTWF0aC5zaWduKHRvTWFwW3RvVW5pdF0pLFxuICAgICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICBhZGRlZCA9ICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59IC8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcblxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZXMobWF0cml4LCB2YWxzKSB7XG4gIHJldmVyc2VVbml0cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzLCBjdXJyZW50KSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh2YWxzW2N1cnJlbnRdKSkge1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnZlcnQobWF0cml4LCB2YWxzLCBwcmV2aW91cywgdmFscywgY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cbi8qKlxyXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZS5wbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gRHVyYXRpb246XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cclxuICogKiAqKlVuaXQgdmFsdWVzKiogU2VlIHRoZSB7QGxpbmsgRHVyYXRpb24ueWVhcnN9LCB7QGxpbmsgRHVyYXRpb24ubW9udGhzfSwge0BsaW5rIER1cmF0aW9uLndlZWtzfSwge0BsaW5rIER1cmF0aW9uLmRheXN9LCB7QGxpbmsgRHVyYXRpb24uaG91cnN9LCB7QGxpbmsgRHVyYXRpb24ubWludXRlc30sIHtAbGluayBEdXJhdGlvbi5zZWNvbmRzfSwge0BsaW5rIER1cmF0aW9uLm1pbGxpc2Vjb25kc30gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uLmxvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbi5udW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24ucGx1c30sIHtAbGluayBEdXJhdGlvbi5taW51c30sIHtAbGluayBEdXJhdGlvbi5ub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24uc2V0fSwge0BsaW5rIER1cmF0aW9uLnJlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uLm5lZ2F0ZX0uXHJcbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBEdXJhdGlvbiBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBEdXJhdGlvbi5hc30sIHtAbGluayBEdXJhdGlvbi50b0lTT30sIHtAbGluayBEdXJhdGlvbi50b0Zvcm1hdH0sIGFuZCB7QGxpbmsgRHVyYXRpb24udG9KU09OfVxyXG4gKlxyXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEdXJhdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIER1cmF0aW9uKGNvbmZpZykge1xuICAgIHZhciBhY2N1cmF0ZSA9IGNvbmZpZy5jb252ZXJzaW9uQWNjdXJhY3kgPT09IFwibG9uZ3Rlcm1cIiB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gXCJsb25ndGVybVwiIDogXCJjYXN1YWxcIjtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25EdXJhdGlvbiA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBvZiBtaWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbih7XG4gICAgICBtaWxsaXNlY29uZHM6IGNvdW50XG4gICAgfSwgb3B0cykpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzLlxyXG4gICAqIElmIHRoaXMgb2JqZWN0IGlzIGVtcHR5IHRoZW4gemVybyAgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2Ygb2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgIHZhbHVlczogbm9ybWFsaXplT2JqZWN0KG9iaiwgRHVyYXRpb24ubm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFcIik7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBkYXRldGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREdXJhdGlvbkVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCwgaWdub3JlVW5rbm93bikge1xuICAgIGlmIChpZ25vcmVVbmtub3duID09PSB2b2lkIDApIHtcbiAgICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICAgIHllYXI6IFwieWVhcnNcIixcbiAgICAgIHllYXJzOiBcInllYXJzXCIsXG4gICAgICBxdWFydGVyOiBcInF1YXJ0ZXJzXCIsXG4gICAgICBxdWFydGVyczogXCJxdWFydGVyc1wiLFxuICAgICAgbW9udGg6IFwibW9udGhzXCIsXG4gICAgICBtb250aHM6IFwibW9udGhzXCIsXG4gICAgICB3ZWVrOiBcIndlZWtzXCIsXG4gICAgICB3ZWVrczogXCJ3ZWVrc1wiLFxuICAgICAgZGF5OiBcImRheXNcIixcbiAgICAgIGRheXM6IFwiZGF5c1wiLFxuICAgICAgaG91cjogXCJob3Vyc1wiLFxuICAgICAgaG91cnM6IFwiaG91cnNcIixcbiAgICAgIG1pbnV0ZTogXCJtaW51dGVzXCIsXG4gICAgICBtaW51dGVzOiBcIm1pbnV0ZXNcIixcbiAgICAgIHNlY29uZDogXCJzZWNvbmRzXCIsXG4gICAgICBzZWNvbmRzOiBcInNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgbWlsbGlzZWNvbmRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gICAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRHVyYXRpb24uIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5pc0R1cmF0aW9uID0gZnVuY3Rpb24gaXNEdXJhdGlvbihvKSB7XG4gICAgcmV0dXJuIG8uaXNMdXhvbkR1cmF0aW9uO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLiBZb3UgbWF5IHVzZSB0aGVzZSB0b2tlbnM6XHJcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xyXG4gICAqICogYHNgIGZvciBzZWNvbmRzXHJcbiAgICogKiBgbWAgZm9yIG1pbnV0ZXNcclxuICAgKiAqIGBoYCBmb3IgaG91cnNcclxuICAgKiAqIGBkYCBmb3IgZGF5c1xyXG4gICAqICogYE1gIGZvciBtb250aHNcclxuICAgKiAqIGB5YCBmb3IgeWVhcnNcclxuICAgKiBOb3RlczpcclxuICAgKiAqIEFkZCBwYWRkaW5nIGJ5IHJlcGVhdGluZyB0aGUgdG9rZW4sIGUuZy4gXCJ5eVwiIHBhZHMgdGhlIHllYXJzIHRvIHR3byBkaWdpdHMsIFwiaGhoaFwiIHBhZHMgdGhlIGhvdXJzIG91dCB0byBmb3VyIGRpZ2l0c1xyXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieSBkIHNcIikgLy89PiBcIjEgNiAyXCJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9Gb3JtYXQoXCJ5eSBkZCBzc3NcIikgLy89PiBcIjAxIDA2IDAwMlwiXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICB2YXIgZm10T3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRHVyYXRpb24ncyB2YWx1ZXMuXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YWx1ZXMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5jb252ZXJzaW9uQWNjdXJhY3kgPSB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAzLCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1AzWVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDUgfSkudG9JU08oKSAvLz0+ICdQNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbnV0ZXM6IDUgfSkudG9JU08oKSAvLz0+ICdQVDVNJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIHZhciBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5kYXlzICE9PSAwIHx8IHRoaXMud2Vla3MgIT09IDApIHMgKz0gdGhpcy5kYXlzICsgdGhpcy53ZWVrcyAqIDcgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApIHMgKz0gdGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwICsgXCJTXCI7XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBtaWxsaXNlY29uZHMgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoXCJtaWxsaXNlY29uZHNcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pXTtcblxuICAgICAgaWYgKGR1ci52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykgfHwgdGhpcy52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gZHVyLmdldChrKSArIHRoaXMuZ2V0KGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkueWVhcnMgLy89PiAyXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5tb250aHMgLy89PiAwXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5kYXlzIC8vPT4gM1xyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiBtaXhlZFxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5yZWNvbmZpZ3VyZSA9IGZ1bmN0aW9uIHJlY29uZmlndXJlKF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjb252ZXJzaW9uQWNjdXJhY3kgPSBfcmVmLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtXG4gICAgfSksXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICBsb2M6IGxvY1xuICAgIH07XG5cbiAgICBpZiAoY29udmVyc2lvbkFjY3VyYWN5KSB7XG4gICAgICBvcHRzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlcycgb3IgJ2RheXMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe2hvdXJzOiA2MH0pLmFzKCdkYXlzJykgLy89PiAyLjVcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8uYXMgPSBmdW5jdGlvbiBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2hpZnRUbyA9IGZ1bmN0aW9uIHNoaWZ0VG8oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHVuaXRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuICAgIHZhciBidWlsdCA9IHt9LFxuICAgICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgICB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIHZhciBsYXN0VW5pdDtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3JkZXJlZFVuaXRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pMl07XG5cbiAgICAgIGlmICh1bml0cy5pbmRleE9mKGspID49IDApIHtcbiAgICAgICAgbGFzdFVuaXQgPSBrO1xuICAgICAgICB2YXIgb3duID0gMDsgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG5cbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gcGx1cyBhbnl0aGluZyB0aGF0J3MgYWxyZWFkeSBpbiB0aGlzIHVuaXRcblxuXG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSBvd24gLSBpOyAvLyB3ZSdkIGxpa2UgdG8gYWJzb3JiIHRoZXNlIGZyYWN0aW9ucyBpbiBhbm90aGVyIHVuaXRcbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG5cbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG5cbiAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSB2YWxzW2tdO1xuICAgICAgfVxuICAgIH0gLy8gYW55dGhpbmcgbGVmdG92ZXIgYmVjb21lcyB0aGUgZGVjaW1hbCBmb3IgdGhlIGxhc3QgdW5pdFxuXG5cbiAgICBpZiAobGFzdFVuaXQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlZFtrZXldICE9PSAwKSB7XG4gICAgICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz0ga2V5ID09PSBsYXN0VW5pdCA/IGFjY3VtdWxhdGVkW2tleV0gOiBhY2N1bXVsYXRlZFtrZXldIC8gdGhpcy5tYXRyaXhbbGFzdFVuaXRdW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogYnVpbHRcbiAgICB9LCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBuZWdhdGl2ZSBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG5lZ2F0ZWQgPSB7fTtcblxuICAgIHZhciBfYXJyID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuXG4gICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgX2Fyci5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgayA9IF9hcnJbX2kzXTtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbmVnYXRlZFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHllYXJzLlxyXG4gICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlci5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgdSA9IG9yZGVyZWRVbml0c1tfaTRdO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZXNbdV0gIT09IG90aGVyLnZhbHVlc1t1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKER1cmF0aW9uLCBbe1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIER1cmF0aW9uLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIER1cmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwieWVhcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlcnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJxdWFydGVyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aHMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWtzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXlzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGhvdXJzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91cnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlcy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZWNvbmRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaWxsaXNlY29uZHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcclxuICAgICAqIG9uIGludmFsaWQgRGF0ZVRpbWVzIG9yIEludGVydmFscy5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHVyYXRpb247XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uaXNoKSB7XG4gIGlmIChpc051bWJlcihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSBpZiAoRHVyYXRpb24uaXNEdXJhdGlvbihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gZHVyYXRpb25pc2g7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uaXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoZHVyYXRpb25pc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZHVyYXRpb24gYXJndW1lbnQgXCIgKyBkdXJhdGlvbmlzaCArIFwiIG9mIHR5cGUgXCIgKyB0eXBlb2YgZHVyYXRpb25pc2gpO1xuICB9XG59XG5cbnZhciBJTlZBTElEJDEgPSBcIkludmFsaWQgSW50ZXJ2YWxcIjsgLy8gY2hlY2tzIGlmIHRoZSBzdGFydCBpcyBlcXVhbCB0byBvciBiZWZvcmUgdGhlIGVuZFxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBzdGFydFwiKTtcbiAgfSBlbHNlIGlmICghZW5kIHx8ICFlbmQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBlbmRcIik7XG4gIH0gZWxzZSBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICByZXR1cm4gbmV3IEludmFsaWQoXCJlbmQgYmVmb3JlIHN0YXJ0XCIsIFwiVGhlIGVuZCBvZiBhbiBpbnRlcnZhbCBtdXN0IGJlIGFmdGVyIGl0cyBzdGFydCwgYnV0IHlvdSBoYWQgc3RhcnQ9XCIgKyBzdGFydC50b0lTTygpICsgXCIgYW5kIGVuZD1cIiArIGVuZC50b0lTTygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXHJcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBJbnRlcnZhbDpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGFuIEludGVydmFsLCB1c2Uge0BsaW5rIGZyb21EYXRlVGltZXN9LCB7QGxpbmsgYWZ0ZXJ9LCB7QGxpbmsgYmVmb3JlfSwgb3Ige0BsaW5rIGZyb21JU099LlxyXG4gKiAqICoqQWNjZXNzb3JzKiogVXNlIHtAbGluayBzdGFydH0gYW5kIHtAbGluayBlbmR9IHRvIGdldCB0aGUgc3RhcnQgYW5kIGVuZC5cclxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBjb3VudH0sIHtAbGluayBsZW5ndGh9LCB7QGxpbmsgaGFzU2FtZX0sIHtAbGluayBjb250YWluc30sIHtAbGluayBpc0FmdGVyfSwgb3Ige0BsaW5rIGlzQmVmb3JlfS5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG90aGVyIEludGVydmFscyBvdXQgb2YgdGhpcyBvbmUsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHNwbGl0QXR9LCB7QGxpbmsgc3BsaXRCeX0sIHtAbGluayBkaXZpZGVFcXVhbGx5fSwge0BsaW5rIG1lcmdlfSwge0BsaW5rIHhvcn0sIHtAbGluayB1bmlvbn0sIHtAbGluayBpbnRlcnNlY3Rpb259LCBvciB7QGxpbmsgZGlmZmVyZW5jZX0uXHJcbiAqICogKipDb21wYXJpc29uKiogVG8gY29tcGFyZSB0aGlzIEludGVydmFsIHRvIGFub3RoZXIgb25lLCB1c2Uge0BsaW5rIGVxdWFsc30sIHtAbGluayBvdmVybGFwc30sIHtAbGluayBhYnV0c1N0YXJ0fSwge0BsaW5rIGFidXRzRW5kfSwge0BsaW5rIGVuZ3VsZnN9XHJcbiAqICogKipPdXRwdXQqKiogVG8gY29udmVydCB0aGUgSW50ZXJ2YWwgaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LlxyXG4gKi9cblxuXG52YXIgSW50ZXJ2YWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnZhbChjb25maWcpIHtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5zID0gY29uZmlnLnN0YXJ0O1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuZSA9IGNvbmZpZy5lbmQ7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25JbnRlcnZhbCA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICBpZiAoZXhwbGFuYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgZXhwbGFuYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSW50ZXJ2YWxFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIGludmFsaWQ6IGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyA9IGZ1bmN0aW9uIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIHZhciBidWlsdFN0YXJ0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCksXG4gICAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZDogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZClcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5hZnRlciA9IGZ1bmN0aW9uIGFmdGVyKHN0YXJ0LCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdCwgZHQucGx1cyhkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxyXG4gICAqIEFjY2VwdHMgYDxzdGFydD4vPGVuZD5gLCBgPHN0YXJ0Pi88ZHVyYXRpb24+YCwgYW5kIGA8ZHVyYXRpb24+LzxlbmQ+YCBmb3JtYXRzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZS5mcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT31cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0LCBvcHRzKSB7XG4gICAgdmFyIF9zcGxpdCA9ICh0ZXh0IHx8IFwiXCIpLnNwbGl0KFwiL1wiLCAyKSxcbiAgICAgICAgcyA9IF9zcGxpdFswXSxcbiAgICAgICAgZSA9IF9zcGxpdFsxXTtcblxuICAgIGlmIChzICYmIGUpIHtcbiAgICAgIHZhciBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksXG4gICAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcblxuICAgICAgaWYgKHN0YXJ0LmlzVmFsaWQgJiYgZW5kLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydC5pc1ZhbGlkKSB7XG4gICAgICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuXG4gICAgICAgIGlmIChkdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5hZnRlcihzdGFydCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbmQuaXNWYWxpZCkge1xuICAgICAgICB2YXIgX2R1ciA9IER1cmF0aW9uLmZyb21JU08ocywgb3B0cyk7XG5cbiAgICAgICAgaWYgKF9kdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5iZWZvcmUoZW5kLCBfZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBcInRoZSBpbnB1dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIGNhbid0IGJlIHBhcnNlZCBhc0lTTyA4NjAxXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5pc0ludGVydmFsID0gZnVuY3Rpb24gaXNJbnRlcnZhbChvKSB7XG4gICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBJbnRlcnZhbCB8fCBvLmlzTHV4b25JbnRlcnZhbDtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEludGVydmFsLnByb3RvdHlwZTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byByZXR1cm4gdGhlIGxlbmd0aCBpbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG4gIF9wcm90by5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxyXG4gICAqIFVubGlrZSB7QGxpbmsgbGVuZ3RofSB0aGlzIGNvdW50cyBzZWN0aW9ucyBvZiB0aGUgY2FsZW5kYXIsIG5vdCBwZXJpb2RzIG9mIHRpbWUsIGUuZy4gc3BlY2lmeWluZyAnZGF5J1xyXG4gICAqIGFza3MgJ3doYXQgZGF0ZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgaW50ZXJ2YWw/Jywgbm90ICdob3cgbWFueSBkYXlzIGxvbmcgaXMgdGhpcyBpbnRlcnZhbD8nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmNvdW50ID0gZnVuY3Rpb24gY291bnQodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gTmFOO1xuICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQuc3RhcnRPZih1bml0KSxcbiAgICAgICAgZW5kID0gdGhpcy5lbmQuc3RhcnRPZih1bml0KTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpKSArIDE7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnMudmFsdWVPZigpID09PSB0aGlzLmUudmFsdWVPZigpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPiBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldHNcIiB0aGUgc3RhcnQgYW5kL29yIGVuZCBkYXRlcy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5lbmQgLSB0aGUgZW5kaW5nIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc29ydGVkID0gZGF0ZVRpbWVzLm1hcChmcmllbmRseURhdGVUaW1lKS5zb3J0KCksXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgaSA9IDA7XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgdmFyIGFkZGVkID0gc29ydGVkW2ldIHx8IHRoaXMuZSxcbiAgICAgICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoXCJtaWxsaXNlY29uZHNcIikgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgYWRkZWQsXG4gICAgICAgIG5leHQ7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mUGFydHMgLSBUaGUgbnVtYmVyIG9mIEludGVydmFscyB0byBkaXZpZGUgdGhlIEludGVydmFsIGludG8uXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaXZpZGVFcXVhbGx5ID0gZnVuY3Rpb24gZGl2aWRlRXF1YWxseShudW1iZXJPZlBhcnRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEJ5KHRoaXMubGVuZ3RoKCkgLyBudW1iZXJPZlBhcnRzKS5zbGljZSgwLCBudW1iZXJPZlBhcnRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8ub3ZlcmxhcHMgPSBmdW5jdGlvbiBvdmVybGFwcyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmUgPiBvdGhlci5zICYmIHRoaXMucyA8IG90aGVyLmU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uYWJ1dHNFbmQgPSBmdW5jdGlvbiBhYnV0c0VuZChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICtvdGhlci5lID09PSArdGhpcy5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uZW5ndWxmcyA9IGZ1bmN0aW9uIGVuZ3VsZnMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gb3RoZXIucyAmJiB0aGlzLmUgPj0gb3RoZXIuZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHJlc3VsdGluZyBJbnRlcnZhbCBoYXMgdGhlIG1heGltdW0gc3RhcnQgdGltZSBhbmQgdGhlIG1pbmltdW0gZW5kIHRpbWUgb2YgdGhlIHR3byBJbnRlcnZhbHMuXHJcbiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHksIGkuZS4sIHRoZSBpbnRlcnZhbHMgZG9uJ3QgaW50ZXJzZWN0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBzID0gdGhpcy5zID4gb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID4gZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtaW5pbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtYXhpbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW5pb24gPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA8IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdLFxuICAgICAgICBlbmRzID0gaW50ZXJ2YWxzLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHRpbWU6IGkucyxcbiAgICAgICAgdHlwZTogXCJzXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdGltZTogaS5lLFxuICAgICAgICB0eXBlOiBcImVcIlxuICAgICAgfV07XG4gICAgfSksXG4gICAgICAgIGZsYXR0ZW5lZCA9IChfQXJyYXkkcHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlKS5jb25jYXQuYXBwbHkoX0FycmF5JHByb3RvdHlwZSwgZW5kcyksXG4gICAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaSA9IF9yZWYzO1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGludGVydmFsc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC54b3IoW3RoaXNdLmNvbmNhdChpbnRlcnZhbHMpKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBfdGhpcy5pbnRlcnNlY3Rpb24oaSk7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaSAmJiAhaS5pc0VtcHR5KCk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiBcIltcIiArIHRoaXMucy50b0lTTygpICsgXCIgXFx1MjAxMyBcIiArIHRoaXMuZS50b0lTTygpICsgXCIpXCI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgXCIvXCIgKyB0aGlzLmUudG9JU08ob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQsIF90ZW1wMikge1xuICAgIHZhciBfcmVmNCA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDIsXG4gICAgICAgIF9yZWY0JHNlcGFyYXRvciA9IF9yZWY0LnNlcGFyYXRvcixcbiAgICAgICAgc2VwYXJhdG9yID0gX3JlZjQkc2VwYXJhdG9yID09PSB2b2lkIDAgPyBcIiDigJMgXCIgOiBfcmVmNCRzZXBhcmF0b3I7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJcIiArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGEgRHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNwYW5uZWQgYnkgdGhpcyBpbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA4ODQ4OTI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNC44MjA5NSB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LCBzZWNvbmRzOiA0OS4yNTcgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRHVyYXRpb24gPSBmdW5jdGlvbiB0b0R1cmF0aW9uKHVuaXQsIG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJ2YWwsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBlbmQgb2YgdGhlIEludGVydmFsXHJcbiAgICAgKiBAdHlwZSB7RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYXQgbGVhc3QgaXRzIHN0YXJ0LCBpLmUuIHRoYXQgdGhlIEludGVydmFsIGlzbid0ICdiYWNrd2FyZHMnLlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW50ZXJ2YWw7XG59KCk7XG5cbi8qKlxyXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gKi9cblxudmFyIEluZm8gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge31cblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgY29udGFpbnMgYSBEU1QuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIEluZm8uaGFzRFNUID0gZnVuY3Rpb24gaGFzRFNUKHpvbmUpIHtcbiAgICBpZiAoem9uZSA9PT0gdm9pZCAwKSB7XG4gICAgICB6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7XG4gICAgICBtb250aDogMTJcbiAgICB9KTtcbiAgICByZXR1cm4gIXpvbmUudW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHtcbiAgICAgIG1vbnRoOiA2XG4gICAgfSkub2Zmc2V0O1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgaXMgYSB2YWxpZCBJQU5BIHNwZWNpZmllci5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW5mby5pc1ZhbGlkSUFOQVpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiAhIUlBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoem9uZSkgJiYgSUFOQVpvbmUuaXNWYWxpZFpvbmUoem9uZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXHJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnKVswXSAvLz0+ICcxJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9mhJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdsb25nJywgeyBvdXRwdXRDYWxlbmRhcjogJ2lzbGFtaWMnIH0pWzBdIC8vPT4gJ1JhYmnKuyBJJ1xyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby5tb250aHMgPSBmdW5jdGlvbiBtb250aHMobGVuZ3RoLCBfdGVtcCkge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdm9pZCAwID8gXCJncmVnb3J5XCIgOiBfcmVmJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCBtb250aCBuYW1lcy5cclxuICAgKiBGb3JtYXQgbW9udGhzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgbW9udGhzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byB0aGUgZGF5IG9mIHRoZSBtb250aC4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayBtb250aHN9XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzRm9ybWF0ID0gZnVuY3Rpb24gbW9udGhzRm9ybWF0KGxlbmd0aCwgX3RlbXAyKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmMiRsb2NhbGUgPSBfcmVmMi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYyJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJGxvY2FsZSxcbiAgICAgICAgX3JlZjIkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYyJG91dHB1dENhbGVuZGFyID0gX3JlZjIub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjIkb3V0cHV0Q2FsZW5kYXIgPT09IHZvaWQgMCA/IFwiZ3JlZ29yeVwiIDogX3JlZjIkb3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpLm1vbnRocyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9KVswXSAvLz0+ICdsdW4uJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2KfZhNin2KvZhtmK2YYnXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMobGVuZ3RoLCBfdGVtcDMpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmMyA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDMsXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXHJcbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQobGVuZ3RoLCBfdGVtcDQpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmNCA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQsXG4gICAgICAgIF9yZWY0JGxvY2FsZSA9IF9yZWY0LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjQkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjQkbG9jYWxlLFxuICAgICAgICBfcmVmNCRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNC5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWVyaWRpZW1zLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoKSAvLz0+IFsgJ0FNJywgJ1BNJyBdXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdteScgfSkgLy89PiBbICfhgJThgLbhgJThgIDhgLonLCAn4YCK4YCU4YCxJyBdXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyhfdGVtcDUpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDUgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA1LFxuICAgICAgICBfcmVmNSRsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY1JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY1JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSkubWVyaWRpZW1zKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdzaG9ydCddIC0gdGhlIGxlbmd0aCBvZiB0aGUgZXJhIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwic2hvcnRcIiBvciBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygpIC8vPT4gWyAnQkMnLCAnQUQnIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnIF1cclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMobGVuZ3RoLCBfdGVtcDYpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwic2hvcnRcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjYgPSBfdGVtcDYgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA2LFxuICAgICAgICBfcmVmNiRsb2NhbGUgPSBfcmVmNi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY2JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY2JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVsbCwgXCJncmVnb3J5XCIpLmVyYXMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXHJcbiAgICogU29tZSBmZWF0dXJlcyBvZiBMdXhvbiBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgb24gb2xkZXIgYnJvd3NlcnMsIHRpbWV6b25lIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiB0aGF0J3MgdGhlIGNhc2UuXHJcbiAgICogS2V5czpcclxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xyXG4gICAqICogYGludGxUb2tlbnNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6ZWQgdG9rZW4tYmFzZWQgZm9ybWF0dGluZy9wYXJzaW5nXHJcbiAgICogKiBgaW50bGA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBnZW5lcmFsIGludGVybmF0aW9uYWxpemF0aW9uXHJcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIEluZm8uZmVhdHVyZXMgPSBmdW5jdGlvbiBmZWF0dXJlcygpIHtcbiAgICB2YXIgaW50bCA9IGZhbHNlLFxuICAgICAgICBpbnRsVG9rZW5zID0gZmFsc2UsXG4gICAgICAgIHpvbmVzID0gZmFsc2U7XG5cbiAgICBpZiAoaGFzSW50bCgpKSB7XG4gICAgICBpbnRsID0gdHJ1ZTtcbiAgICAgIGludGxUb2tlbnMgPSBoYXNGb3JtYXRUb1BhcnRzKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHpvbmVzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgICAgdGltZVpvbmU6IFwiQW1lcmljYS9OZXdfWW9ya1wiXG4gICAgICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lID09PSBcIkFtZXJpY2EvTmV3X1lvcmtcIjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW50bDogaW50bCxcbiAgICAgIGludGxUb2tlbnM6IGludGxUb2tlbnMsXG4gICAgICB6b25lczogem9uZXNcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBJbmZvO1xufSgpO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIHZhciB1dGNEYXlTdGFydCA9IGZ1bmN0aW9uIHV0Y0RheVN0YXJ0KGR0KSB7XG4gICAgcmV0dXJuIGR0LnRvVVRDKDAsIHtcbiAgICAgIGtlZXBMb2NhbFRpbWU6IHRydWVcbiAgICB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKTtcbiAgfSxcbiAgICAgIG1zID0gdXRjRGF5U3RhcnQobGF0ZXIpIC0gdXRjRGF5U3RhcnQoZWFybGllcik7XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoXCJkYXlzXCIpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgdmFyIGRpZmZlcnMgPSBbW1wieWVhcnNcIiwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi55ZWFyIC0gYS55ZWFyO1xuICB9XSwgW1wibW9udGhzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFtcIndlZWtzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGRheXMgPSBkYXlEaWZmKGEsIGIpO1xuICAgIHJldHVybiAoZGF5cyAtIGRheXMgJSA3KSAvIDc7XG4gIH1dLCBbXCJkYXlzXCIsIGRheURpZmZdXTtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIGxvd2VzdE9yZGVyLCBoaWdoV2F0ZXI7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpZmZlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9kaWZmZXJzJF9pID0gZGlmZmVyc1tfaV0sXG4gICAgICAgIHVuaXQgPSBfZGlmZmVycyRfaVswXSxcbiAgICAgICAgZGlmZmVyID0gX2RpZmZlcnMkX2lbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG4gICAgICB2YXIgZGVsdGEgPSBkaWZmZXIoY3Vyc29yLCBsYXRlcik7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzID0ge30sIF9jdXJzb3IkcGx1c1t1bml0XSA9IGRlbHRhLCBfY3Vyc29yJHBsdXMpKTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIHZhciBfaGlnaFdhdGVyJG1pbnVzO1xuXG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlci5taW51cygoX2hpZ2hXYXRlciRtaW51cyA9IHt9LCBfaGlnaFdhdGVyJG1pbnVzW3VuaXRdID0gMSwgX2hpZ2hXYXRlciRtaW51cykpO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcbiAgdmFyIGxvd2VyT3JkZXJVbml0cyA9IHVuaXRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgIHJldHVybiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSBcIm1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaW50VW5pdChyZWdleCwgcG9zdCkge1xuICBpZiAocG9zdCA9PT0gdm9pZCAwKSB7XG4gICAgcG9zdCA9IGZ1bmN0aW9uIHBvc3QoaSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmKSB7XG4gICAgICB2YXIgcyA9IF9yZWZbMF07XG4gICAgICByZXR1cm4gcG9zdChwYXJzZUludChzKSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaXhMaXN0UmVnZXgocykge1xuICAvLyBtYWtlIGRvdHMgb3B0aW9uYWwgYW5kIGFsc28gbWFrZSB0aGVtIGxpdGVyYWxcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcXFxcLj9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbihcInxcIikpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYyKSB7XG4gICAgICAgIHZhciBzID0gX3JlZjJbMF07XG4gICAgICAgIHJldHVybiBzdHJpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSk7XG4gICAgICAgIH0pICsgc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldChyZWdleCwgZ3JvdXBzKSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sXG4gICAgZ3JvdXBzOiBncm91cHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHQudmFsKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNSkge1xuICAgICAgICB2YXIgcyA9IF9yZWY1WzBdO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH0sXG4gICAgICBsaXRlcmFsOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgICAgIHVuaXRhdGUgPSBmdW5jdGlvbiB1bml0YXRlKHQpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0LnZhbCkge1xuICAgICAgLy8gZXJhXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJzaG9ydFwiLCBmYWxzZSksIDApO1xuXG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKFwibG9uZ1wiLCBmYWxzZSksIDApO1xuICAgICAgLy8geWVhcnNcblxuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG5cbiAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcblxuICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcblxuICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezZ9Lyk7XG4gICAgICAvLyBtb250aHNcblxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIGRhdGVzXG5cbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyBvcmRpbmFsc1xuXG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcblxuICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG5cbiAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInNzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuXG4gICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcblxuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvXFxkezEsOX0vKTtcbiAgICAgIC8vIG1lcmlkaWVtXG5cbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG5cbiAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuXG4gICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG4gICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuXG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgLy8gd2Vla2RheXNcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG5cbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIG9mZnNldC96b25lXG5cbiAgICAgIGNhc2UgXCJaXCI6XG4gICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgcmV0dXJuIG9mZnNldCgvKFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPy8sIDIpO1xuXG4gICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKFxcZHsyfSk/LywgMik7XG4gICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSB3YXkgdG8gZmlndXJlIG91dCB3aGF0IHRoZXkgYXJlXG5cbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8pPy9pKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB1bml0ID0gdW5pdGF0ZSh0b2tlbikgfHwge1xuICAgIGludmFsaWRSZWFzb246IE1JU1NJTkdfRlRQXG4gIH07XG4gIHVuaXQudG9rZW4gPSB0b2tlbjtcbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgXCIoXCIgKyByLnNvdXJjZSArIFwiKVwiO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFtcIl5cIiArIHJlICsgXCIkXCIsIHVuaXRzXTtcbn1cblxuZnVuY3Rpb24gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycykge1xuICB2YXIgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKHJlZ2V4KTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIHZhciBhbGwgPSB7fTtcbiAgICB2YXIgbWF0Y2hJbmRleCA9IDE7XG5cbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcblxuICAgICAgICBpZiAoIWgubGl0ZXJhbCAmJiBoLnRva2VuKSB7XG4gICAgICAgICAgYWxsW2gudG9rZW4udmFsWzBdXSA9IGguZGVzZXIobWF0Y2hlcy5zbGljZShtYXRjaEluZGV4LCBtYXRjaEluZGV4ICsgZ3JvdXBzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcblxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla051bWJlclwiO1xuXG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmU7XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLlopKSB7XG4gICAgem9uZSA9IG5ldyBGaXhlZE9mZnNldFpvbmUobWF0Y2hlcy5aKTtcbiAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy56KSkge1xuICAgIHpvbmUgPSBuZXcgSUFOQVpvbmUobWF0Y2hlcy56KTtcbiAgfSBlbHNlIHtcbiAgICB6b25lID0gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICB2YXIgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZShmdW5jdGlvbiAociwgaykge1xuICAgIHZhciBmID0gdG9GaWVsZChrKTtcblxuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuICByZXR1cm4gW3ZhbHMsIHpvbmVdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvblxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9idWlsZFJlZ2V4ID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICAgIHJlZ2V4U3RyaW5nID0gX2J1aWxkUmVnZXhbMF0sXG4gICAgICAgIGhhbmRsZXJzID0gX2J1aWxkUmVnZXhbMV0sXG4gICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCBcImlcIiksXG4gICAgICAgIF9tYXRjaCA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgICByYXdNYXRjaGVzID0gX21hdGNoWzBdLFxuICAgICAgICBtYXRjaGVzID0gX21hdGNoWzFdLFxuICAgICAgICBfcmVmNiA9IG1hdGNoZXMgPyBkYXRlVGltZUZyb21NYXRjaGVzKG1hdGNoZXMpIDogW251bGwsIG51bGxdLFxuICAgICAgICByZXN1bHQgPSBfcmVmNlswXSxcbiAgICAgICAgem9uZSA9IF9yZWY2WzFdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgcmF3TWF0Y2hlczogcmF3TWF0Y2hlcyxcbiAgICAgIG1hdGNoZXM6IG1hdGNoZXMsXG4gICAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHpvbmU6IHpvbmVcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZUZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSB7XG4gIHZhciBfZXhwbGFpbkZyb21Ub2tlbnMgPSBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpLFxuICAgICAgcmVzdWx0ID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnJlc3VsdCxcbiAgICAgIHpvbmUgPSBfZXhwbGFpbkZyb21Ub2tlbnMuem9uZSxcbiAgICAgIGludmFsaWRSZWFzb24gPSBfZXhwbGFpbkZyb21Ub2tlbnMuaW52YWxpZFJlYXNvbjtcblxuICByZXR1cm4gW3Jlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbl07XG59XG5cbnZhciBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgICBsZWFwTGFkZGVyID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XTtcblxuZnVuY3Rpb24gdW5pdE91dE9mUmFuZ2UodW5pdCwgdmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5pdCBvdXQgb2YgcmFuZ2VcIiwgXCJ5b3Ugc3BlY2lmaWVkIFwiICsgdmFsdWUgKyBcIiAob2YgdHlwZSBcIiArIHR5cGVvZiB2YWx1ZSArIFwiKSBhcyBhIFwiICsgdW5pdCArIFwiLCB3aGljaCBpcyBpbnZhbGlkXCIpO1xufVxuXG5mdW5jdGlvbiBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSkge1xuICB2YXIganMgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSkpLmdldFVUQ0RheSgpO1xuICByZXR1cm4ganMgPT09IDAgPyA3IDoganM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgcmV0dXJuIGRheSArIChpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIpW21vbnRoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCkge1xuICB2YXIgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgICBtb250aDAgPSB0YWJsZS5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaSA8IG9yZGluYWw7XG4gIH0pLFxuICAgICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7XG4gICAgbW9udGg6IG1vbnRoMCArIDEsXG4gICAgZGF5OiBkYXlcbiAgfTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvV2VlayhncmVnT2JqKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ09iai55ZWFyLFxuICAgICAgbW9udGggPSBncmVnT2JqLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ09iai5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSksXG4gICAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuICB2YXIgd2Vla051bWJlciA9IE1hdGguZmxvb3IoKG9yZGluYWwgLSB3ZWVrZGF5ICsgMTApIC8gNyksXG4gICAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB3ZWVrWWVhcjogd2Vla1llYXIsXG4gICAgd2Vla051bWJlcjogd2Vla051bWJlcixcbiAgICB3ZWVrZGF5OiB3ZWVrZGF5XG4gIH0sIHRpbWVPYmplY3QoZ3JlZ09iaikpO1xufVxuZnVuY3Rpb24gd2Vla1RvR3JlZ29yaWFuKHdlZWtEYXRhKSB7XG4gIHZhciB3ZWVrWWVhciA9IHdlZWtEYXRhLndlZWtZZWFyLFxuICAgICAgd2Vla051bWJlciA9IHdlZWtEYXRhLndlZWtOdW1iZXIsXG4gICAgICB3ZWVrZGF5ID0gd2Vla0RhdGEud2Vla2RheSxcbiAgICAgIHdlZWtkYXlPZkphbjQgPSBkYXlPZldlZWsod2Vla1llYXIsIDEsIDQpLFxuICAgICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhcjtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIHtcbiAgICB5ZWFyID0gd2Vla1llYXI7XG4gIH1cblxuICB2YXIgX3VuY29tcHV0ZU9yZGluYWwgPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpLFxuICAgICAgbW9udGggPSBfdW5jb21wdXRlT3JkaW5hbC5tb250aCxcbiAgICAgIGRheSA9IF91bmNvbXB1dGVPcmRpbmFsLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdCh3ZWVrRGF0YSkpO1xufVxuZnVuY3Rpb24gZ3JlZ29yaWFuVG9PcmRpbmFsKGdyZWdEYXRhKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ0RhdGEueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ0RhdGEubW9udGgsXG4gICAgICBkYXkgPSBncmVnRGF0YS5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB5ZWFyOiB5ZWFyLFxuICAgIG9yZGluYWw6IG9yZGluYWxcbiAgfSwgdGltZU9iamVjdChncmVnRGF0YSkpO1xufVxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLndlZWtZZWFyKSxcbiAgICAgIHZhbGlkV2VlayA9IG51bWJlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICAgIHZhbGlkV2Vla2RheSA9IG51bWJlckJldHdlZW4ob2JqLndlZWtkYXksIDEsIDcpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1llYXJcIiwgb2JqLndlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1wiLCBvYmoud2Vlayk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vla2RheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtkYXlcIiwgb2JqLndlZWtkYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoueWVhciksXG4gICAgICB2YWxpZE1vbnRoID0gbnVtYmVyQmV0d2VlbihvYmoubW9udGgsIDEsIDEyKSxcbiAgICAgIHZhbGlkRGF5ID0gbnVtYmVyQmV0d2VlbihvYmouZGF5LCAxLCBkYXlzSW5Nb250aChvYmoueWVhciwgb2JqLm1vbnRoKSk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ5ZWFyXCIsIG9iai55ZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNb250aCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1vbnRoXCIsIG9iai5tb250aCk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkRGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiZGF5XCIsIG9iai5kYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFRpbWVEYXRhKG9iaikge1xuICB2YXIgdmFsaWRIb3VyID0gbnVtYmVyQmV0d2VlbihvYmouaG91ciwgMCwgMjMpLFxuICAgICAgdmFsaWRNaW51dGUgPSBudW1iZXJCZXR3ZWVuKG9iai5taW51dGUsIDAsIDU5KSxcbiAgICAgIHZhbGlkU2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmouc2Vjb25kLCAwLCA1OSksXG4gICAgICB2YWxpZE1pbGxpc2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmoubWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIG9iai5ob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgb2JqLm1pbnV0ZSk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkU2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwic2Vjb25kXCIsIG9iai5zZWNvbik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWlsbGlzZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaWxsaXNlY29uZFwiLCBvYmoubWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gXCJJbnZhbGlkIERhdGVUaW1lXCI7XG5cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkWm9uZSh6b25lKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuc3VwcG9ydGVkIHpvbmVcIiwgXCJ0aGUgem9uZSBcXFwiXCIgKyB6b25lLm5hbWUgKyBcIlxcXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbn0gLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcblxuXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG5cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufSAvLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5cblxuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZDogaW5zdC5pbnZhbGlkXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywge1xuICAgIG9sZDogY3VycmVudFxuICB9KSk7XG59IC8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcblxuXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwOyAvLyBUZXN0IHdoZXRoZXIgdGhlIHpvbmUgbWF0Y2hlcyB0aGUgb2Zmc2V0IGZvciB0aGlzIHRzXG5cbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTsgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG5cbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH0gLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcblxuXG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwOyAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcblxuICB2YXIgbzMgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIGlmIChvMiA9PT0gbzMpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvMl07XG4gIH0gLy8gSWYgaXQncyBkaWZmZXJlbnQsIHdlJ3JlIGluIGEgaG9sZSB0aW1lLiBUaGUgb2Zmc2V0IGhhcyBjaGFuZ2VkLCBidXQgdGhlIHdlIGRvbid0IGFkanVzdCB0aGUgdGltZVxuXG5cbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59IC8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5cblxuZnVuY3Rpb24gdHNUb09iaih0cywgb2Zmc2V0KSB7XG4gIHRzICs9IG9mZnNldCAqIDYwICogMTAwMDtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0cyk7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufSAvLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuXG5cbmZ1bmN0aW9uIG9ialRvTG9jYWxUUyhvYmopIHtcbiAgdmFyIGQgPSBEYXRlLlVUQyhvYmoueWVhciwgb2JqLm1vbnRoIC0gMSwgb2JqLmRheSwgb2JqLmhvdXIsIG9iai5taW51dGUsIG9iai5zZWNvbmQsIG9iai5taWxsaXNlY29uZCk7IC8vIGZvciBsZWdhY3kgcmVhc29ucywgeWVhcnMgYmV0d2VlbiAwIGFuZCA5OSBhcmUgaW50ZXJwcmV0ZWQgYXMgMTlYWDsgcmV2ZXJ0IHRoYXRcblxuICBpZiAob2JqLnllYXIgPCAxMDAgJiYgb2JqLnllYXIgPj0gMCkge1xuICAgIGQgPSBuZXcgRGF0ZShkKTtcbiAgICBkLnNldFVUQ0Z1bGxZZWFyKG9iai55ZWFyKTtcbiAgfVxuXG4gIHJldHVybiArZDtcbn0gLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIG9ialRvVFMob2JqLCBvZmZzZXQsIHpvbmUpIHtcbiAgcmV0dXJuIGZpeE9mZnNldChvYmpUb0xvY2FsVFMob2JqKSwgb2Zmc2V0LCB6b25lKTtcbn0gLy8gY3JlYXRlIGEgbmV3IERUIGluc3RhbmNlIGJ5IGFkZGluZyBhIGR1cmF0aW9uLCBhZGp1c3RpbmcgZm9yIERTVHNcblxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICB2YXIgb1ByZSA9IGluc3QubyxcbiAgICAgIHllYXIgPSBpbnN0LmMueWVhciArIGR1ci55ZWFycyxcbiAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgZHVyLm1vbnRocyArIGR1ci5xdWFydGVycyAqIDMsXG4gICAgICBjID0gT2JqZWN0LmFzc2lnbih7fSwgaW5zdC5jLCB7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgZHVyLmRheXMgKyBkdXIud2Vla3MgKiA3XG4gIH0pLFxuICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICBob3VyczogZHVyLmhvdXJzLFxuICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgIHNlY29uZHM6IGR1ci5zZWNvbmRzLFxuICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kc1xuICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICAgIGxvY2FsVFMgPSBvYmpUb0xvY2FsVFMoYyk7XG5cbiAgdmFyIF9maXhPZmZzZXQgPSBmaXhPZmZzZXQobG9jYWxUUywgb1ByZSwgaW5zdC56b25lKSxcbiAgICAgIHRzID0gX2ZpeE9mZnNldFswXSxcbiAgICAgIG8gPSBfZml4T2Zmc2V0WzFdO1xuXG4gIGlmIChtaWxsaXNUb0FkZCAhPT0gMCkge1xuICAgIHRzICs9IG1pbGxpc1RvQWRkOyAvLyB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgb2Zmc2V0IGJ5IGdvaW5nIG92ZXIgYSBEU1QsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhlIHRzIHRoZSBzYW1lXG5cbiAgICBvID0gaW5zdC56b25lLm9mZnNldCh0cyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRzOiB0cyxcbiAgICBvOiBvXG4gIH07XG59IC8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuXG5cbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzLCBmb3JtYXQsIHRleHQpIHtcbiAgdmFyIHNldFpvbmUgPSBvcHRzLnNldFpvbmUsXG4gICAgICB6b25lID0gb3B0cy56b25lO1xuXG4gIGlmIChwYXJzZWQgJiYgT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggIT09IDApIHtcbiAgICB2YXIgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgICBpbnN0ID0gRGF0ZVRpbWUuZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cywge1xuICAgICAgem9uZTogaW50ZXJwcmV0YXRpb25ab25lXG4gICAgfSkpO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgXCIgKyBmb3JtYXQpKTtcbiAgfVxufSAvLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuXG5cbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0KSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn0gLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcblxuXG5mdW5jdGlvbiB0b1RlY2hUaW1lRm9ybWF0KGR0LCBfcmVmKSB7XG4gIHZhciBfcmVmJHN1cHByZXNzU2Vjb25kcyA9IF9yZWYuc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZiRzdXBwcmVzc1NlY29uZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc1NlY29uZHMsXG4gICAgICBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPSBfcmVmLnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc01pbGxpc2VjLFxuICAgICAgX3JlZiRpbmNsdWRlT2Zmc2V0ID0gX3JlZi5pbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZU9mZnNldCA9IF9yZWYkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkaW5jbHVkZU9mZnNldCxcbiAgICAgIF9yZWYkaW5jbHVkZVpvbmUgPSBfcmVmLmluY2x1ZGVab25lLFxuICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmJGluY2x1ZGVab25lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaW5jbHVkZVpvbmUsXG4gICAgICBfcmVmJHNwYWNlWm9uZSA9IF9yZWYuc3BhY2Vab25lLFxuICAgICAgc3BhY2Vab25lID0gX3JlZiRzcGFjZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzcGFjZVpvbmU7XG4gIHZhciBmbXQgPSBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IFwiOnNzXCI7XG5cbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKChpbmNsdWRlWm9uZSB8fCBpbmNsdWRlT2Zmc2V0KSAmJiBzcGFjZVpvbmUpIHtcbiAgICBmbXQgKz0gXCIgXCI7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gXCJ6XCI7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSBcIlpaXCI7XG4gIH1cblxuICByZXR1cm4gdG9UZWNoRm9ybWF0KGR0LCBmbXQpO1xufSAvLyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQgdW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnNcblxuXG52YXIgZGVmYXVsdFVuaXRWYWx1ZXMgPSB7XG4gIG1vbnRoOiAxLFxuICBkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gIHdlZWtOdW1iZXI6IDEsXG4gIHdlZWtkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gIG9yZGluYWw6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufTsgLy8gVW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnMsIHNvcnRlZCBieSBiaWduZXNzXG5cbnZhciBvcmRlcmVkVW5pdHMkMSA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gW1wid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla2RheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gW1wieWVhclwiLCBcIm9yZGluYWxcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl07IC8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuXG5mdW5jdGlvbiBub3JtYWxpemVVbml0KHVuaXQsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZFwiLFxuICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZFwiLFxuICAgIHdlZWtkYXk6IFwid2Vla2RheVwiLFxuICAgIHdlZWtkYXlzOiBcIndlZWtkYXlcIixcbiAgICB3ZWVrbnVtYmVyOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVrc251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla251bWJlcnM6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWt5ZWFyOiBcIndlZWtZZWFyXCIsXG4gICAgd2Vla3llYXJzOiBcIndlZWtZZWFyXCIsXG4gICAgb3JkaW5hbDogXCJvcmRpbmFsXCJcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG4gIHJldHVybiBub3JtYWxpemVkO1xufSAvLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5cblxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3JkZXJlZFVuaXRzJDEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHUgPSBvcmRlcmVkVW5pdHMkMVtfaV07XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWQgPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuXG4gIGlmIChpbnZhbGlkKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gIH1cblxuICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KSxcbiAgICAgIF9vYmpUb1RTID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSksXG4gICAgICB0cyA9IF9vYmpUb1RTWzBdLFxuICAgICAgbyA9IF9vYmpUb1RTWzFdO1xuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG4vKipcclxuICogQSBEYXRlVGltZSBpcyBhbiBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSBhbmQgYWNjb21wYW55aW5nIG1ldGhvZHMuIEl0IGNvbnRhaW5zIGNsYXNzIGFuZCBpbnN0YW5jZSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLlxyXG4gKlxyXG4gKiBBIERhdGVUaW1lIGNvbXByaXNlcyBvZjpcclxuICogKiBBIHRpbWVzdGFtcC4gRWFjaCBEYXRlVGltZSBpbnN0YW5jZSByZWZlcnMgdG8gYSBzcGVjaWZpYyBtaWxsaXNlY29uZCBvZiB0aGUgVW5peCBlcG9jaC5cclxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXHJcbiAqICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRoYXQgZWZmZWN0IGhvdyBvdXRwdXQgc3RyaW5ncyBhcmUgZm9ybWF0dGVkLCBzdWNoIGFzIGBsb2NhbGVgLCBgbnVtYmVyaW5nU3lzdGVtYCwgYW5kIGBvdXRwdXRDYWxlbmRhcmAuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqOiBUbyBjcmVhdGUgYSBEYXRlVGltZSBmcm9tIGl0cyBjb21wb25lbnRzLCB1c2Ugb25lIG9mIGl0cyBmYWN0b3J5IGNsYXNzIG1ldGhvZHM6IHtAbGluayBsb2NhbH0sIHtAbGluayB1dGN9LCBhbmQgKG1vc3QgZmxleGlibHkpIHtAbGluayBmcm9tT2JqZWN0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgc3RhbmRhcmQgc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tSVNPfSwge0BsaW5rIGZyb21IVFRQfSwgYW5kIHtAbGluayBmcm9tUkZDMjgyMn0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIGN1c3RvbSBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21Gb3JtYXR9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBuYXRpdmUgSlMgZGF0ZSwgdXNlIHtAbGluayBmcm9tSlNEYXRlfS5cclxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIHRvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIHllYXJ9LCB7QGxpbmsgbW9udGh9LFxyXG4gKiB7QGxpbmsgZGF5fSwge0BsaW5rIGhvdXJ9LCB7QGxpbmsgbWludXRlfSwge0BsaW5rIHNlY29uZH0sIHtAbGluayBtaWxsaXNlY29uZH0gYWNjZXNzb3JzLlxyXG4gKiAqICoqV2VlayBjYWxlbmRhcioqOiBGb3IgSVNPIHdlZWsgY2FsZW5kYXIgYXR0cmlidXRlcywgc2VlIHRoZSB7QGxpbmsgd2Vla1llYXJ9LCB7QGxpbmsgd2Vla051bWJlcn0sIGFuZCB7QGxpbmsgd2Vla2RheX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIGxvY2FsZX0gYW5kIHtAbGluayBudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKio6IFRvIHRyYW5zZm9ybSB0aGUgRGF0ZVRpbWUgaW50byBvdGhlciBEYXRlVGltZXMsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHJlY29uZmlndXJlfSwge0BsaW5rIHNldFpvbmV9LCB7QGxpbmsgc2V0TG9jYWxlfSwge0BsaW5rIHBsdXN9LCB7QGxpbmsgbWludXN9LCB7QGxpbmsgZW5kT2Z9LCB7QGxpbmsgc3RhcnRPZn0sIHtAbGluayB0b1VUQ30sIGFuZCB7QGxpbmsgdG9Mb2NhbH0uXHJcbiAqICogKipPdXRwdXQqKjogVG8gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCB1c2UgdGhlIHtAbGluayB0b0pTT059LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9IVFRQfSwge0BsaW5rIHRvT2JqZWN0fSwge0BsaW5rIHRvUkZDMjgyMn0sIHtAbGluayB0b1N0cmluZ30sIHtAbGluayB0b0xvY2FsZVN0cmluZ30sIHtAbGluayB0b0Zvcm1hdH0sIHtAbGluayB0b01pbGxpc30gYW5kIHtAbGluayB0b0pTRGF0ZX0uXHJcbiAqXHJcbiAqIFRoZXJlJ3MgcGxlbnR5IG90aGVycyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiwgdGltZSB6b25lcywgYWx0ZXJuYXRpdmUgY2FsZW5kYXJzLCB2YWxpZGl0eSwgYW5kIHNvIG9uLCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEYXRlVGltZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBEYXRlVGltZShjb25maWcpIHtcbiAgICB2YXIgem9uZSA9IGNvbmZpZy56b25lIHx8IFNldHRpbmdzLmRlZmF1bHRab25lLFxuICAgICAgICBpbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgKE51bWJlci5pc05hTihjb25maWcudHMpID8gbmV3IEludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuICAgIHZhciBjID0gbnVsbCxcbiAgICAgICAgbyA9IG51bGw7XG5cbiAgICBpZiAoIWludmFsaWQpIHtcbiAgICAgIHZhciB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcbiAgICAgIGMgPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLmMgOiB0c1RvT2JqKHRoaXMudHMsIHpvbmUub2Zmc2V0KHRoaXMudHMpKTtcbiAgICAgIG8gPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLm8gOiB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubyA9IG87XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9IC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVpY2tEVCh7XG4gICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgZGF5OiBkYXksXG4gICAgICAgIGhvdXI6IGhvdXIsXG4gICAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kXG4gICAgICB9LCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcclxuICAgKiBAcGFyYW0ge251bWJlcn0geWVhciAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUudXRjID0gZnVuY3Rpb24gdXRjKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgem9uZTogRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTixcbiAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoaS5lLiBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogbWlsbGlzZWNvbmRzLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TZWNvbmRzID0gZnVuY3Rpb24gZnJvbVNlY29uZHMoc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhciAtIGEgeWVhciwgc3VjaCBhcyAxOTg3XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoub3JkaW5hbCAtIGRheSBvZiB0aGUgeWVhciwgMS0zNjUgb3IgMzY2XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla2RheSAtIGFuIElTTyB3ZWVrZGF5LCAxLTcsIHdoZXJlIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmQgLSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgMC01OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvYmouem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyLCBtb250aDogNSwgZGF5OiAyNX0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMVQwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9KSAvL34+IHRvZGF5IGF0IDEwOjI2OjA2XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICd1dGMnIH0pLFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnbG9jYWwnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB3ZWVrWWVhcjogMjAxNiwgd2Vla051bWJlcjogMiwgd2Vla2RheTogMyB9KS50b0lTT0RhdGUoKSAvLz0+ICcyMDE2LTAxLTEzJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgdmFyIHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob2JqLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcblxuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZVRvVXNlLm9mZnNldCh0c05vdyksXG4gICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0LCB0cnVlKSxcbiAgICAgICAgY29udGFpbnNPcmRpbmFsID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yID0gY29udGFpbnNHcmVnb3JZZWFyIHx8IGNvbnRhaW5zR3JlZ29yTUQsXG4gICAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvYmopOyAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjsgLy8gY29uZmlndXJlIG91cnNlbHZlcyB0byBkZWFsIHdpdGggZ3JlZ29yaWFuIGRhdGVzIG9yIHdlZWsgc3R1ZmZcblxuICAgIHZhciB1bml0cyxcbiAgICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgb2JqTm93ID0gdHNUb09iaih0c05vdywgb2Zmc2V0UHJvdmlzKTtcblxuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfSAvLyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3Npbmcgc3R1ZmZcblxuXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHVuaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kyID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMjtcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pMisrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pMiA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYyO1xuICAgICAgdmFyIHYgPSBub3JtYWxpemVkW3VdO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9IC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG5cblxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkKTtcbiAgICB9IC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG5cblxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pOyAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcblxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcIm1pc21hdGNoZWQgd2Vla2RheVwiLCBcInlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggYSB3ZWVrZGF5IG9mIFwiICsgbm9ybWFsaXplZC53ZWVrZGF5ICsgXCIgYW5kIGEgZGF0ZSBvZiBcIiArIGluc3QudG9JU08oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnLCB7c2V0Wm9uZTogdHJ1ZX0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08odGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlSVNPRGF0ZSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUlTT0RhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VJU09EYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJJU08gODYwMVwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignMjUgTm92IDIwMTYgMTM6MjM6MTIgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignVHVlLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVJGQzI4MjIgPSBmdW5jdGlvbiBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJSRkMgMjgyMlwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VIVFRQRGF0ZSA9IHBhcnNlSFRUUERhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VIVFRQRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZUhUVFBEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJIVFRQXCIsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQodGV4dCkgfHwgaXNVbmRlZmluZWQoZm10KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICAgIF9vcHRzJGxvY2FsZSA9IF9vcHRzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdHMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdHMkbG9jYWxlLFxuICAgICAgICBfb3B0cyRudW1iZXJpbmdTeXN0ZW0gPSBfb3B0cy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRzJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZCA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiZm9ybWF0IFwiICsgZm10LCB0ZXh0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nKHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXHJcbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzA5OjEyOjM0LjM0MicpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU1FMID0gZnVuY3Rpb24gZnJvbVNRTCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VTUUwgPSBwYXJzZVNRTCh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZVNRTFswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVNRTFsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiU1FMXCIsIHRleHQpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEYXRlVGltZS4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmlzRGF0ZVRpbWUgPSBmdW5jdGlvbiBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gby5pc0x1eG9uRGF0ZVRpbWU7XG4gIH07IC8vIElORk9cblxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IERhdGVUaW1lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1t1bml0XTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBmcm9tIGludmFsaWQgY2FsZW5kYXIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIDEzdGggbW9udGggb3IgRmVicnVhcnkgMzBcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cclxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBmb3JtYXR0aW5nIG1ldGhvZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG4gIF9wcm90by5yZXNvbHZlZExvY2FsZU9wdHMgPSBmdW5jdGlvbiByZXNvbHZlZExvY2FsZU9wdHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX0Zvcm1hdHRlciRjcmVhdGUkcmVzID0gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykucmVzb2x2ZWRPcHRpb25zKHRoaXMpLFxuICAgICAgICBsb2NhbGUgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5jYWxlbmRhcjtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyXG4gICAgfTtcbiAgfTsgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqXHJcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgc2V0Wm9uZX0oJ3V0YycpXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz17fV0gLSBvcHRpb25zIHRvIHBhc3MgdG8gYHNldFpvbmUoKWBcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1VUQyA9IGZ1bmN0aW9uIHRvVVRDKG9mZnNldCwgb3B0cykge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8gYHNldFpvbmUoJ2xvY2FsJylgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbCA9IGZ1bmN0aW9uIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShuZXcgTG9jYWxab25lKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lLCBfdGVtcCkge1xuICAgIHZhciBfcmVmMyA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMyRrZWVwTG9jYWxUaW1lID0gX3JlZjMua2VlcExvY2FsVGltZSxcbiAgICAgICAga2VlcExvY2FsVGltZSA9IF9yZWYzJGtlZXBMb2NhbFRpbWUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMka2VlcExvY2FsVGltZSxcbiAgICAgICAgX3JlZjMka2VlcENhbGVuZGFyVGltID0gX3JlZjMua2VlcENhbGVuZGFyVGltZSxcbiAgICAgICAga2VlcENhbGVuZGFyVGltZSA9IF9yZWYzJGtlZXBDYWxlbmRhclRpbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRrZWVwQ2FsZW5kYXJUaW07XG5cbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoem9uZS5lcXVhbHModGhpcy56b25lKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmICghem9uZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHtcbiAgICAgICAgdHM6IG5ld1RTLFxuICAgICAgICB6b25lOiB6b25lXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gdGhlIHByb3BlcnRpZXMgdG8gc2V0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcDIpIHtcbiAgICB2YXIgX3JlZjQgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmNC5vdXRwdXRDYWxlbmRhcjtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IG91dHB1dENhbGVuZGFyXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgbG9jOiBsb2NcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogSnVzdCBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIHJlY29uZmlndXJlKHsgbG9jYWxlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldExvY2FsZSA9IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBzZXR0aW5nV2Vla1N0dWZmID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla1llYXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtOdW1iZXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtkYXkpO1xuICAgIHZhciBtaXhlZDtcblxuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSkge1xuICAgICAgbWl4ZWQgPSBvcmRpbmFsVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy50b09iamVjdCgpLCBub3JtYWxpemVkKTsgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcblxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICB0czogdHMsXG4gICAgICBvOiBvXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXHJcbiAgICpcclxuICAgKiBBZGRpbmcgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG9yIG1pbGxpc2Vjb25kcyBpbmNyZWFzZXMgdGhlIHRpbWVzdGFtcCBieSB0aGUgcmlnaHQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gQWRkaW5nIGRheXMsIG1vbnRocywgb3IgeWVhcnMgc2hpZnRzIHRoZSBjYWxlbmRhciwgYWNjb3VudGluZyBmb3IgRFNUcyBhbmQgbGVhcCB5ZWFycyBhbG9uZyB0aGUgd2F5LiBUaHVzLCBgZHQucGx1cyh7IGhvdXJzOiAyNCB9KWAgbWF5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0aW1lIHRoYW4gYGR0LnBsdXMoeyBkYXlzOiAxIH0pYCBpZiB0aGVyZSdzIGEgRFNUIHNoaWZ0IGluIGJldHdlZW4uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cygxMjMpIC8vfj4gaW4gMTIzIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAtMSB9KSAvL34+IHRoaXMgdGltZSB5ZXN0ZXJkYXlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIF9wcm90by5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHVuaXQgb2YgdGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCdtb250aCcpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3llYXInKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMS0wMSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignaG91cicpLnRvSVNPVGltZSgpOyAvLz0+ICcwNTowMDowMC4wMDAtMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc3RhcnRPZiA9IGZ1bmN0aW9uIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbyA9IHt9LFxuICAgICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlIFwieWVhcnNcIjpcbiAgICAgICAgby5tb250aCA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJxdWFydGVyc1wiOlxuICAgICAgY2FzZSBcIm1vbnRoc1wiOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcImhvdXJzXCI6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcIm1pbnV0ZXNcIjpcbiAgICAgICAgby5zZWNvbmQgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJtaWxsaXNlY29uZHNcIjpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJ3ZWVrc1wiKSB7XG4gICAgICBvLndlZWtkYXkgPSAxO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJxdWFydGVyc1wiKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKGkuZS4gdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVuZE9mID0gZnVuY3Rpb24gZW5kT2YodW5pdCkge1xuICAgIHZhciBfdGhpcyRzdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF90aGlzJHN0YXJ0T2YkcGx1cyA9IHt9LCBfdGhpcyRzdGFydE9mJHBsdXNbdW5pdF0gPSAxLCBfdGhpcyRzdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07IC8vIE9VVFBVVFxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uL2RvY3MvbWFudWFsL2Zvcm1hdHRpbmcuaHRtbCN0YWJsZS1vZi10b2tlbnMpLlxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS5cclxuICAgKiBAc2VlIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcsIHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiAnMjAxNyBhdnIuIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBkYXRlLiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgdGhlIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3IgYW5kIGFueSBwcmVzZXRzIGRlZmluZWQgYnkgTHV4b24sIHN1Y2ggYXMgYERhdGVUaW1lLkRBVEVfRlVMTGAgb3IgYERhdGVUaW1lLlRJTUVfU0lNUExFYC5cclxuICAgKiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGluIGdlbmVyYWwgaXQgd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24uXHJcbiAgICogb2YgdGhlIERhdGVUaW1lIGluIHRoZSBhc3NpZ25lZCBsb2NhbGUuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHsgbG9jYWxlOiBcImVuLWdiXCIgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX0ZVTEwpOyAvLz0+ICdBcHJpbCAyMCwgMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7d2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0J30pOyAvLz0+ICdUaHUsIEFwciAyMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwLCAxMToyNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHtob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJzExOjMyJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0gREFURV9TSE9SVDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZm9ybWF0IFwicGFydHNcIiwgaS5lLiBpbmRpdmlkdWFsIHRva2VucyBhbG9uZyB3aXRoIG1ldGFkYXRhLiBUaGlzIGlzIGFsbG93cyBjYWxsZXJzIHRvIHBvc3QtcHJvY2VzcyBpbmRpdmlkdWFsIHNlY3Rpb25zIG9mIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxyXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zLCBzYW1lIGFzIGB0b0xvY2FsZVN0cmluZ2AuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IFtcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdkYXknLCB2YWx1ZTogJzI1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbW9udGgnLCB2YWx1ZTogJzA1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAneWVhcicsIHZhbHVlOiAnMTk4MicgfVxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiBdXHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbGVQYXJ0cyA9IGZ1bmN0aW9uIHRvTG9jYWxlUGFydHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTygpIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1LTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTyhvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArIFwiVFwiICsgdGhpcy50b0lTT1RpbWUob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwieXl5eS1NTS1kZFwiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSgpIC8vPT4gJzA3OjM0OjE5LjM2MVonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcwNzozNFonXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPVGltZSA9IGZ1bmN0aW9uIHRvSVNPVGltZShfdGVtcDMpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPSBfcmVmNS5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkc3VwcHJlc3NNaWxsaXNlLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc1NlY29uZHMgPSBfcmVmNS5zdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWY1JHN1cHByZXNzU2Vjb25kcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRzdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIF9yZWY1JGluY2x1ZGVPZmZzZXQgPSBfcmVmNS5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjUkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY1JGluY2x1ZGVPZmZzZXQ7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBzdXBwcmVzc1NlY29uZHM6IHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXRcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lLCBhbHdheXMgaW4gVVRDXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwICswMDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1JGQzI4MjIgPSBmdW5jdGlvbiB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9IVFRQID0gZnVuY3Rpb24gdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTERhdGUgPSBmdW5jdGlvbiB0b1NRTERhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcInl5eXktTU0tZGRcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcmlkZXMgaW5jbHVkZU9mZnNldC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTFRpbWUgPSBmdW5jdGlvbiB0b1NRTFRpbWUoX3RlbXA0KSB7XG4gICAgdmFyIF9yZWY2ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZVpvbmUgPSBfcmVmNi5pbmNsdWRlWm9uZSxcbiAgICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmNiRpbmNsdWRlWm9uZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRpbmNsdWRlWm9uZTtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlWm9uZTogaW5jbHVkZVpvbmUsXG4gICAgICBzcGFjZVpvbmU6IHRydWVcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcnJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIC0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogdHJ1ZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTCA9IGZ1bmN0aW9uIHRvU1FMKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgXCIgXCIgKyB0aGlzLnRvU1FMVGltZShvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIHRvTWlsbGlzfVxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by52YWx1ZU9mID0gZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9NaWxsaXMgPSBmdW5jdGlvbiB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NlY29uZHMgPSBmdW5jdGlvbiB0b1NlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgLyAxMDAwIDogTmFOO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIERhdGVUaW1lJ3MgeWVhciwgbW9udGgsIGRheSwgYW5kIHNvIG9uLlxyXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7RGF0ZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTRGF0ZSA9IGZ1bmN0aW9uIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfTsgLy8gQ09NUEFSRVxuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciBhcnJheSBvZiB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcclxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XHJcbiAgICogaTIuZGlmZihpMSkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA0MzgwNzUwMDAwMCB9XHJcbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJywgJ2hvdXJzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LCBob3VyczogMC43NSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZiA9IGZ1bmN0aW9uIGRpZmYob3RoZXJEYXRlVGltZSwgdW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWQgfHwgb3RoZXJEYXRlVGltZS5pbnZhbGlkKTtcblxuICAgIHZhciB1bml0cyA9IG1heWJlQXJyYXkodW5pdCkubWFwKER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICAgIGxhdGVyID0gb3RoZXJJc0xhdGVyID8gb3RoZXJEYXRlVGltZSA6IHRoaXMsXG4gICAgICAgIGRpZmZlZCA9IF9kaWZmKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cyk7XG5cbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3codW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLmxvY2FsKCksIHVuaXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW50aWwgPSBmdW5jdGlvbiB1bnRpbChvdGhlckRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEludGVydmFsLmZyb21EYXRlVGltZXModGhpcywgb3RoZXJEYXRlVGltZSkgOiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodW5pdCA9PT0gXCJtaWxsaXNlY29uZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5lbmRPZih1bml0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEVxdWFsaXR5IGNoZWNrXHJcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXHJcbiAgICogVG8gY29tcGFyZSBqdXN0IHRoZSBtaWxsaXNlY29uZCB2YWx1ZXMsIHVzZSBgK2R0MSA9PT0gfmR0MmAuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXIgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgJiYgb3RoZXIuaXNWYWxpZCAmJiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmIHRoaXMuem9uZS5lcXVhbHMob3RoZXIuem9uZSkgJiYgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpLnZhbHVlT2YoKTtcbiAgICB9LCBNYXRoLm1pbik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWF4IG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5tYXggPSBmdW5jdGlvbiBtYXgoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTsgLy8gTUlTQ1xuXG4gIC8qKlxyXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgZGVzY3JpcHRpb24pXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluID0gZnVuY3Rpb24gZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICAgIF9vcHRpb25zJGxvY2FsZSA9IF9vcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRpb25zJG51bWJlcmluZ1N5cyA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5cyxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9O1xuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH07IC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXHJcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXHJcbiAgICogQHR5cGUge09iamVjdH1cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZFJlYXNvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5yZWFzb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkRXhwbGFuYXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9jYWxlIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2VuLUdCJy4gVGhlIGxvY2FsZSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdXRwdXRDYWxlbmRhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm91dHB1dENhbGVuZGFyIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgem9uZS5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm5hbWUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgeWVhclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ5ZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInF1YXJ0ZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkubW9udGggLy89PiA1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggKDEtMzBpc2gpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLmRheSAvLz0+IDI1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91ciBvZiB0aGUgZGF5ICgwLTIzKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCkubWludXRlIC8vPT4gMzBcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyKS5zZWNvbmQgLy89PiA1MlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQgKDAtOTk5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbGxpc2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2VlayB5ZWFyXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgd2VlayB5ZWFyICgxLTUyaXNoKS5cclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLndlZWtOdW1iZXIgLy89PiAyMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla051bWJlclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgd2Vlay5cclxuICAgICAqIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtkYXkgLy89PiA0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgb3JkaW5hbCAoaS5lLiB0aGUgZGF5IG9mIHRoZSB5ZWFyKVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9yZGluYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0Jy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aFNob3J0IC8vPT4gT2N0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJzaG9ydFwiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoTG9uZyAvLz0+IE9jdG9iZXJcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoTG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwibG9uZ1wiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlTaG9ydCAvLz0+IE1vblxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcInNob3J0XCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyB3ZWVrZGF5LCBzdWNoIGFzICdNb25kYXknLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlMb25nIC8vPT4gTW9uZGF5XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5TG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJsb25nXCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkub2Zmc2V0IC8vPT4gLTI0MFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0TmFtZVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldE5hbWVMb25nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcImxvbmdcIixcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgdGhpcyB6b25lJ3Mgb2Zmc2V0IGV2ZXIgY2hhbmdlcywgYXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNPZmZzZXRGaXhlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS51bml2ZXJzYWwgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc0luRFNUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHtcbiAgICAgICAgICBtb250aDogMVxuICAgICAgICB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7XG4gICAgICAgICAgbW9udGg6IDVcbiAgICAgICAgfSkub2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkxlYXBZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c0luTW9udGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlzSW5ZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtzSW5XZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJEQVRFX1NIT1JUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX01FRFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfTUVEO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX0ZVTExcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnVHVlc2RheSwgT2N0b2JlciAxNCwgMTk4MydcclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfSFVHRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9TSU1QTEVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1NJTVBMRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9TSE9SVF9PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX0xPTkdfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1NJTVBMRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfU0lNUExFO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfU0hPUlRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRUQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfRlVMTFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGF0ZVRpbWU7XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseURhdGVUaW1lKGRhdGVUaW1laXNoKSB7XG4gIGlmIChEYXRlVGltZS5pc0RhdGVUaW1lKGRhdGVUaW1laXNoKSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiBkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgdHlwZW9mIGRhdGVUaW1laXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21PYmplY3QoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6IFwiICsgZGF0ZVRpbWVpc2ggKyBcIiwgb2YgdHlwZSBcIiArIHR5cGVvZiBkYXRlVGltZWlzaCk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iXX0=