@chocbite/ts-lib-form 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ import { IPAddress, IPVersion, get_cursor_position, set_cursor_end, set_cursor_p
4
4
  import { err, none, ok, some } from "@chocbite/ts-lib-result";
5
5
  import { BLUE, GREEN, GREY, ORANGE, RED, YELLOW } from "@chocbite/ts-lib-colors";
6
6
  import { ANIMATION_LEVEL, ANIMATION_SPEED, AnimationLevels, theme_init_variable_root } from "@chocbite/ts-lib-theme";
7
- import { material_action_calendar_month_rounded, material_action_schedule_rounded, material_content_add_rounded, material_content_remove_rounded, material_editor_drag_handle_rounded, material_navigation_close_rounded, material_navigation_unfold_less_rounded, material_navigation_unfold_more_rounded } from "@chocbite/ts-lib-icons";
7
+ import { material_add_rounded, material_calendar_month_rounded, material_close_rounded, material_drag_handle_rounded, material_remove_rounded, material_schedule_rounded, material_unfold_less_rounded, material_unfold_more_rounded } from "@chocbite/ts-lib-icons";
8
8
  import { ListField } from "@chocbite/ts-lib-list";
9
9
  import { number_step_start_decimal } from "@chocbite/ts-lib-math";
10
10
  import state from "@chocbite/ts-lib-state";
@@ -643,8 +643,8 @@ var FormGroup = class extends FormValue {
643
643
  this.#collapse_button = document.createElement("span");
644
644
  this.#collapse_button.tabIndex = 0;
645
645
  this.#collapse_button.appendChild(document.createElement("span"));
646
- this.#collapse_button.appendChild(material_navigation_unfold_less_rounded());
647
- this.#collapse_button.appendChild(material_navigation_unfold_more_rounded());
646
+ this.#collapse_button.appendChild(material_unfold_less_rounded());
647
+ this.#collapse_button.appendChild(material_unfold_more_rounded());
648
648
  this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
649
649
  this.#collapse_button.onkeydown = (e) => {
650
650
  if (e.key === "Enter" || e.key === " ") {
@@ -1000,12 +1000,12 @@ var FormSlider = class extends FormNumberWrite {
1000
1000
  #step = 0;
1001
1001
  #start = 0;
1002
1002
  #live = false;
1003
- #icon_dec = this.#stepper_func(this.appendChild(material_content_remove_rounded()), false);
1003
+ #icon_dec = this.#stepper_func(this.appendChild(material_remove_rounded()), false);
1004
1004
  #slide = this.appendChild(document.createElement("div"));
1005
1005
  #legend = this.appendChild(document.createElement("span"));
1006
1006
  #left_legend = this.#legend.appendChild(document.createElement("span"));
1007
1007
  #right_legend = this.#legend.appendChild(document.createElement("span"));
1008
- #icon_inc = this.#stepper_func(this.appendChild(material_content_add_rounded()), true);
1008
+ #icon_inc = this.#stepper_func(this.appendChild(material_add_rounded()), true);
1009
1009
  #slider = this.#slide.appendChild(document.createElement("div"));
1010
1010
  #value_box = this.#slider.appendChild(document.createElement("span"));
1011
1011
  #unit_box = this.#slider.appendChild(document.createElement("span"));
@@ -1142,10 +1142,10 @@ var FormSlider = class extends FormNumberWrite {
1142
1142
  this.#live = live || false;
1143
1143
  }
1144
1144
  set icon_decrease(icon) {
1145
- this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_content_remove_rounded(), false));
1145
+ this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_remove_rounded(), false));
1146
1146
  }
1147
1147
  set icon_increase(icon) {
1148
- this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_content_add_rounded(), true));
1148
+ this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_add_rounded(), true));
1149
1149
  }
1150
1150
  new_value(value) {
1151
1151
  this.#move_value(value);
@@ -1266,9 +1266,9 @@ var FormStepper = class extends FormNumberWrite {
1266
1266
  #step = 0;
1267
1267
  #start = 0;
1268
1268
  #live = false;
1269
- #icon_dec = this.#stepper_func(this.appendChild(material_content_remove_rounded()), false);
1269
+ #icon_dec = this.#stepper_func(this.appendChild(material_remove_rounded()), false);
1270
1270
  #text = this.appendChild(document.createElement("span"));
1271
- #icon_inc = this.#stepper_func(this.appendChild(material_content_add_rounded()), true);
1271
+ #icon_inc = this.#stepper_func(this.appendChild(material_add_rounded()), true);
1272
1272
  #value_box = this.#text.appendChild(document.createElement("span"));
1273
1273
  #unit_box = this.#text.appendChild(document.createElement("span"));
1274
1274
  #legend = this.#text.appendChild(document.createElement("span"));
@@ -1399,10 +1399,10 @@ var FormStepper = class extends FormNumberWrite {
1399
1399
  this.#live = live || false;
1400
1400
  }
1401
1401
  set icon_decrease(icon) {
1402
- this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_content_remove_rounded(), false));
1402
+ this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_remove_rounded(), false));
1403
1403
  }
1404
1404
  set icon_increase(icon) {
1405
- this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_content_add_rounded(), true));
1405
+ this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_add_rounded(), true));
1406
1406
  }
1407
1407
  new_value(value) {
1408
1408
  this.#move_value(value);
@@ -1528,7 +1528,7 @@ var FormDropdown = class extends FormSelectorBase {
1528
1528
  #selected = -1;
1529
1529
  #icon;
1530
1530
  #text = this.appendChild(document.createElement("div"));
1531
- #open = this.appendChild(material_navigation_unfold_more_rounded());
1531
+ #open = this.appendChild(material_unfold_more_rounded());
1532
1532
  #default = document.createTextNode("Select something");
1533
1533
  #default_icon;
1534
1534
  is_open = false;
@@ -1592,10 +1592,10 @@ var FormDropdown = class extends FormSelectorBase {
1592
1592
  }
1593
1593
  set open(open) {
1594
1594
  if (open && !this.is_open) {
1595
- this.#open.replaceChildren(material_navigation_unfold_less_rounded());
1595
+ this.#open.replaceChildren(material_unfold_less_rounded());
1596
1596
  box.open_menu(this.#map, this, this.buffer);
1597
1597
  } else if (!open && this.is_open) {
1598
- this.#open.replaceChildren(material_navigation_unfold_more_rounded());
1598
+ this.#open.replaceChildren(material_unfold_more_rounded());
1599
1599
  box.close_menu();
1600
1600
  }
1601
1601
  this.is_open = open;
@@ -1691,7 +1691,7 @@ var DropDownBox = class extends Base {
1691
1691
  e.stopPropagation();
1692
1692
  e.preventDefault();
1693
1693
  };
1694
- this.#closer.appendChild(document.createElement("div")).appendChild(material_navigation_close_rounded());
1694
+ this.#closer.appendChild(document.createElement("div")).appendChild(material_close_rounded());
1695
1695
  this.#closer.appendChild(document.createElement("div")).innerHTML = "Close";
1696
1696
  this.#closer.tabIndex = 0;
1697
1697
  this.#closer.onclick = (e) => {
@@ -1977,8 +1977,8 @@ var FormDateTimeInput = class extends FormValueWrite {
1977
1977
  this.warn_input.lang = "da-DK";
1978
1978
  this.warn_input.step = "0.1";
1979
1979
  this.appendChild(this.warn_input);
1980
- this.appendChild(material_action_calendar_month_rounded()).onclick = () => this.warn_input.showPicker();
1981
- this.appendChild(material_action_schedule_rounded()).onclick = () => this.warn_input.showPicker();
1980
+ this.appendChild(material_calendar_month_rounded()).onclick = () => this.warn_input.showPicker();
1981
+ this.appendChild(material_schedule_rounded()).onclick = () => this.warn_input.showPicker();
1982
1982
  this.warn_input.onchange = () => {
1983
1983
  if (this.warn_input.value) {
1984
1984
  if (this.#mode === DateTimeMode.DATE) this.set_value_check(new Date(this.warn_input.valueAsNumber));
@@ -2337,7 +2337,7 @@ var FormTextMultiline = class extends FormValueWrite {
2337
2337
  constructor(id) {
2338
2338
  super(id);
2339
2339
  this.appendChild(this.warn_input);
2340
- this.#resizer.appendChild(material_editor_drag_handle_rounded());
2340
+ this.#resizer.appendChild(material_drag_handle_rounded());
2341
2341
  this.#resizer.onpointerdown = (e) => {
2342
2342
  e.preventDefault();
2343
2343
  const height = this.#value_box.getBoundingClientRect().height;
@@ -2516,4 +2516,4 @@ const form = {
2516
2516
  //#endregion
2517
2517
  export { FormColors, FormDateTimeType, form as default, form };
2518
2518
 
2519
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiN2YWx1ZV9lbGVtZW50cyIsIiNjb2xsYXBzaWJsZSIsIiNjb2xsYXBzZV9idXR0b24iLCIjY29sbGFwc2VkIiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cC50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJJbnB1dC9udW1iZXJfaW5wdXQudHMiLCIuLi9zcmMvbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzLnRzIiwiLi4vc3JjL251bWJlci9zbGlkZXIvc2xpZGVyLnRzIiwiLi4vc3JjL251bWJlci9zdGVwcGVyL3N0ZXBwZXIudHMiLCIuLi9zcmMvc2VsZWN0b3JzL3NlbGVjdG9yX2Jhc2UudHMiLCIuLi9zcmMvc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd24udHMiLCIuLi9zcmMvc2VsZWN0b3JzL3RvZ2dsZV9idXR0b24vdG9nZ2xlX2J1dHRvbi50cyIsIi4uL3NyYy9zcGFjaW5nL3NwYWNlci50cyIsIi4uL3NyYy9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2lwL2lwX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXQudHMiLCIuLi9zcmMvdGV4dC9pbnB1dC90ZXh0X2lucHV0LnRzIiwiLi4vc3JjL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZS50cyIsIi4uL3NyYy90ZXh0L3RleHQvdGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCTFVFLFxuICBHUkVFTixcbiAgR1JFWSxcbiAgT1JBTkdFLFxuICBSRUQsXG4gIFlFTExPVyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29sb3JzXCI7XG5pbXBvcnQgeyB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuXG5jb25zdCB0aGVtZV9yb290ID0gdGhlbWVfaW5pdF92YXJpYWJsZV9yb290KFxuICBcImZvcm1cIixcbiAgXCJVSSBGb3JtIEVsZW1lbnRzXCIsXG4gIFwiVGhlbWUgdmFyaWFibGVzIGZvciBVSSBmb3JtIEVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX18gICAgIF9fX18gIF8gICBfIF8gIF9fICAgICBfX1xuLy8gICAgIHwgIF9fIFxcfCAgX19fX3wgICAvXFwgICB8ICBfXyBcXCAgIC8gX18gXFx8IFxcIHwgfCB8IFxcIFxcICAgLyAvXG4vLyAgICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHwgfCB8ICB8IHwgIFxcfCB8IHwgIFxcIFxcXy8gL1xuLy8gICAgIHwgIF8gIC98ICBfX3wgICAvIC9cXCBcXCB8IHwgIHwgfCB8IHwgIHwgfCAuIGAgfCB8ICAgXFwgICAvXG4vLyAgICAgfCB8IFxcIFxcfCB8X19fXyAvIF9fX18gXFx8IHxfX3wgfCB8IHxfX3wgfCB8XFwgIHwgfF9fX198IHxcbi8vICAgICB8X3wgIFxcX1xcX19fX19fL18vICAgIFxcX1xcX19fX18vICAgXFxfX19fL3xffCBcXF98X19fX19ffF98XG5jb25zdCByZWFkX29ubHkgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInJlYWRcIixcbiAgXCJSZWFkIE9ubHlcIixcbiAgXCJTZXR0aW5ncyBmb3IgZm9ybSBlbGVtZW50cyBpbiByZWFkIG9ubHkgbW9kZVwiLFxuKTtcbnJlYWRfb25seS5tYWtlX3ZhcmlhYmxlKFxuICBcImZpbHRlclwiLFxuICBcIlJlYWQgT25seSBGaWx0ZXJcIixcbiAgXCJGaWx0ZXIgYXBwbGllZCB0byBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwiRmlsdGVyXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJjb2xvcnNcIixcbiAgXCJDb2xvcnNcIixcbiAgXCJDb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgICAgIHwgfCAgfCAgX198ICAgPiA8ICAgIHwgfCAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc190ZXh0ID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcInRleHRcIixcbiAgXCJUZXh0IENvbG9yc1wiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcImxhYmVsXCIsXG4gIFwiTGFiZWwgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnRzIGxhYmVsc1wiLFxuICBHUkVZW1wiNzAwXCJdLFxuICBHUkVZW1wiMzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlVuc2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI2MDBcIl0sXG4gIEdSRVlbXCI0MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgX19fXyAgXyAgICAgICAgICAgICAgIF9fX19fIF8gIF9fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgfCAgXyBcXHwgfCAgICAgICAgL1xcICAgLyBfX19ffCB8LyAvXG4vLyAgICAgICAgfCB8ICB8IHxfXyAgIFxcIFYgLyAgIHwgfCAgICB8IHxfKSB8IHwgICAgICAgLyAgXFwgfCB8ICAgIHwgJyAvXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgIF8gPHwgfCAgICAgIC8gL1xcIFxcfCB8ICAgIHwgIDxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF8pIHwgfF9fX18gLyBfX19fIFxcIHxfX19ffCAuIFxcXG4vLyAgICAgICAgfF98ICB8X19fX19fL18vIFxcX1xcICB8X3wgICAgfF9fX18vfF9fX19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxcbi8vXG4vL1xuY29uc3QgY29sb3JzX3RleHRfYmxhY2sgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dEJsYWNrXCIsXG4gIFwiVGV4dCBDb2xvcnMgQmxhY2sgQmFja2dyb3VuZFwiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgZm9yIGJsYWNrIGJhY2tncm91bmQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiMjAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNTBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHRfYmxhY2subWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fIF9fX19fIF9fX18gIF8gICBfICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF8gICBfLyBfX19fLyBfXyBcXHwgXFwgfCB8ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAgXFx8IHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAuIGAgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgX3wgfHwgfF9fX3wgfF9ffCB8IHxcXCAgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX19fXFxfX19fX1xcX19fXy98X3wgXFxffCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19pY29uID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImljb25cIixcbiAgXCJJY29uIENvbG9yc1wiLFxuICBcIkljb24gY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2YgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjkwMFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgX19fX18gXyAgX19fX19fXyBfX19fXyAgIF9fX18gIF8gICAgXyBfICAgXyBfX19fXyAgICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8ICBfIFxcICAgL1xcICAgLyBfX19ffCB8LyAvIF9fX198ICBfXyBcXCAvIF9fIFxcfCB8ICB8IHwgXFwgfCB8ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IC8gIFxcIHwgfCAgICB8ICcgLyB8ICBfX3wgfF9fKSB8IHwgIHwgfCB8ICB8IHwgIFxcfCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8ICBfIDwgLyAvXFwgXFx8IHwgICAgfCAgPHwgfCB8XyB8ICBfICAvfCB8ICB8IHwgfCAgfCB8IC4gYCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSAvIF9fX18gXFwgfF9fX198IC4gXFwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X198IHwgfFxcICB8IHxfX3wgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX18vXy8gICAgXFxfXFxfX19fX3xffFxcX1xcX19fX198X3wgIFxcX1xcXFxfX19fLyBcXF9fX18vfF98IFxcX3xfX19fXy8gICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JhY2tncm91bmQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcIkJhY2tncm91bmQgQ29sb3JzXCIsXG4gIFwiQmFja2dyb3VuZCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJob3ZlclwiLFxuICBcIkhvdmVyIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHMgd2hlbiBob3ZlcmluZ1wiLFxuICBHUkVZW1wiNDAwXCJdLFxuICBHUkVZW1wiNzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kc1wiLFxuICBHUkVZW1wiMzAwXCJdLFxuICBHUkVZW1wiODAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgIF9fX18gIF9fX19fICBfX19fXyAgX19fX19fIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgLyBfXyBcXHwgIF9fIFxcfCAgX18gXFx8ICBfX19ffCAgX18gXFwgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCB8ICB8IHwgfF9fKSB8IHwgIHwgfCB8X18gIHwgfF9fKSB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPHwgfCAgfCB8ICBfICAvfCB8ICB8IHwgIF9ffCB8ICBfICAvICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSB8IHxfX3wgfCB8IFxcIFxcfCB8X198IHwgfF9fX198IHwgXFwgXFwgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy8gXFxfX19fL3xffCAgXFxfXFxfX19fXy98X19fX19ffF98ICBcXF9cXCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19ib3JkZXIgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYm9yZGVyXCIsXG4gIFwiQm9yZGVyIENvbG9yc1wiLFxuICBcIkJvcmRlciBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQm9yZGVyIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygbm9ybWFsIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX18gX19fXyAgIF9fX19fIF8gICAgXyAgX19fX19cbi8vICAgICB8ICBfX19fLyBfXyBcXCAvIF9fX198IHwgIHwgfC8gX19fX3xcbi8vICAgICB8IHxfXyB8IHwgIHwgfCB8ICAgIHwgfCAgfCB8IChfX19cbi8vICAgICB8ICBfX3x8IHwgIHwgfCB8ICAgIHwgfCAgfCB8XFxfX18gXFxcbi8vICAgICB8IHwgICB8IHxfX3wgfCB8X19fX3wgfF9ffCB8X19fXykgfFxuLy8gICAgIHxffCAgICBcXF9fX18vIFxcX19fX198XFxfX19fL3xfX19fXy9cbmNvbnN0IGNvbG9yc19mb2N1cyA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb2N1c1wiLFxuICBcIkZvY3VzIENvbG9yc1wiLFxuICBcIkZvY3VzIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2ZvY3VzLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiRm9jdXMgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb2N1c3NlZCBmb3JtIGVsZW1lbnRcIixcbiAgT1JBTkdFW1wiNjAwXCJdLFxuICBPUkFOR0VbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAgLyBfX19ffF8gICBfLyBfX19ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgIHwgKF9fXyAgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXCAgXFxfX18gXFwgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCBfX19fKSB8X3wgfHwgfF9fX18gIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19fL3xfX19fX1xcX19fX198ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2Jhc2ljID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImJhc2ljXCIsXG4gIFwiQmFzaWMgQ29sb3JzXCIsXG4gIFwiQmFzaWMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJncmVlblwiLFxuICBcIkJhc2ljIEdyZWVuIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCBncmVlbiBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRUVOW1wiMzAwXCJdLFxuICBHUkVFTltcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwicmVkXCIsXG4gIFwiQmFzaWMgUmVkIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCByZWQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBSRURbXCIzMDBcIl0sXG4gIFJFRFtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwiYmx1ZVwiLFxuICBcIkJhc2ljIEJsdWUgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGJsdWUgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBCTFVFW1wiMzAwXCJdLFxuICBCTFVFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJ5ZWxsb3dcIixcbiAgXCJCYXNpYyBZZWxsb3cgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHllbGxvdyBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFlFTExPV1tcIjMwMFwiXSxcbiAgT1JBTkdFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fXyBfX19fX19fX19fX18gIF9fX19fXG4vLyAgICAgIC8gX19fX3xfICAgX3xfX18gIC8gIF9fX198LyBfX19ffFxuLy8gICAgIHwgKF9fXyAgIHwgfCAgICAvIC98IHxfXyAgfCAoX19fXG4vLyAgICAgIFxcX19fIFxcICB8IHwgICAvIC8gfCAgX198ICBcXF9fXyBcXFxuLy8gICAgICBfX19fKSB8X3wgfF8gLyAvX198IHxfX19fIF9fX18pIHxcbi8vICAgICB8X19fX18vfF9fX19fL19fX19ffF9fX19fX3xfX19fXy9cbmNvbnN0IHNpemVzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJzaXplXCIsXG4gIFwiU2l6ZVwiLFxuICBcIlNpemVzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwiaGVpZ2h0XCIsXG4gIFwiSGVpZ2h0XCIsXG4gIFwiRGVmYXVsdCBoZWlnaHQgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjEuNnJlbVwiLFxuICBcIjEuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG5zaXplcy5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoSGVpZ2h0XCIsXG4gIFwiVG91Y2ggSGVpZ2h0XCIsXG4gIFwiTWluaW11bSBoZWlnaHQgZm9yIHRvdWNoIGRldmljZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjIuNnJlbVwiLFxuICBcIjIuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8gICAgICBfX19fX18gX19fXyAgXyAgIF8gX19fX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcfCBcXCB8IHxfXyAgIF9ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8ICBcXHwgfCAgfCB8XG4vLyAgICAgfCAgX198fCB8ICB8IHwgLiBgIHwgIHwgfFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxcXCAgfCAgfCB8XG4vLyAgICAgfF98ICAgIFxcX19fXy98X3wgXFxffCAgfF98XG5jb25zdCBmb250ID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb250XCIsXG4gIFwiRm9udFwiLFxuICBcIkZvbnQgc2V0dGluZ3MgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInNpemVcIixcbiAgXCJGb250IFNpemVcIixcbiAgXCJEZWZhdWx0IGZvbnQgc2l6ZSB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMXJlbVwiLFxuICBcIjFyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG4vKipDb2xvcnMgZm9yIGZvcm0gZWxlbWVudHMgdGhhdCBoYXZlIHNlbGVjdGFibGUgY29sb3JzKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29sb3JzID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgQmxhY2s6IFwiYmxhY2tcIixcbiAgR3JlZW46IFwiZ3JlZW5cIixcbiAgUmVkOiBcInJlZFwiLFxuICBCbHVlOiBcImJsdWVcIixcbiAgWWVsbG93OiBcInllbGxvd1wiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Db2xvcnMgPSAodHlwZW9mIEZvcm1Db2xvcnMpW2tleW9mIHR5cGVvZiBGb3JtQ29sb3JzXTtcblxuLyoqU2hhcmVkIGNvbXBvbmVudCBjbGFzcyBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBpbmhlcml0IGZyb20qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1FbGVtZW50IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gICBfX19fXyAgX19fX19fICAgICAgICAgIF9fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcXG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHxcbi8vICAgICAgIFxcIFxcLyAvIC9cXCBcXCB8IHwgICB8IHwgIHwgfCAgX198ICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8XG4vLyAgICAgICAgIFxcL18vICAgIFxcX1xcX19fX19fXFxfX19fL3xfX19fX198IHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy9cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsdWVPcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvKipJRCBmb3JtIGZvcm0gZWxlbWVudCAqL1xuICBpZD86IElEO1xuICAvKipWYWx1ZSBmb3IgZm9ybSBlbGVtZW50ICovXG4gIHZhbHVlPzogUlQ7XG4gIHZhbHVlX2J5X3N0YXRlPzogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPjtcbiAgLyoqTG9uZ2VyIGRlc2NyaXB0aW9uIHdoYXQgZm9ybSBlbGVtZW50IGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKkNoYW5nZSBsaXN0ZW5lciBmdW5jdGlvbiovXG4gIGNoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xufVxuXG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtVmFsdWU8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSBlbGVtZW50LmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICBpZiAob3B0aW9ucy52YWx1ZV9ieV9zdGF0ZSkgZWxlbWVudC52YWx1ZV9ieV9zdGF0ZSA9IG9wdGlvbnMudmFsdWVfYnlfc3RhdGU7XG4gICAgZWxzZSBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1faWQ6IElEO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybV9pZCA9IGlkIGFzIElEO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqU2V0cyB0aGUgY3VycmVudCBsYWJlbCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCBkZXNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1ZmZlcj86IFJUO1xuICBnZXQgYnVmZmVyKCk6IFJUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0ZT86IFN0YXRlPFJULCBPcHRpb248e30+LCBSVD47XG4gICNmdW5jPzogU3RhdGVTdWI8UmVzdWx0PFJULCBzdHJpbmc+PjtcbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlX2J5X3N0YXRlKHN0YXRlOiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI2Z1bmMpIHRoaXMuZGV0YWNoX3N0YXRlKHRoaXMuI2Z1bmMpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGUoc3RhdGUsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbC5vaykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWwudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuI2Vycm9yKSB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgdGhpcy5lcnJvciA9IHZhbC5lcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHN0YXRlLnJlbGF0ZWQoKTtcbiAgICAgIGlmIChyZWxhdGVkLnNvbWUpIHRoaXMuc3RhdGVfcmVsYXRlZChyZWxhdGVkLnZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5zdGF0ZV9yZWxhdGVkKHt9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVxuICAgICAgPyBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIilcbiAgICAgIDogdHlwZW9mIHRoaXMuX2J1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IGVycihcIk5vIHZhbHVlIHlldFwiKVxuICAgICAgICA6IG9rKHRoaXMuX2J1ZmZlcik7XG4gIH1cblxuICAjZXJyb3IgPSBmYWxzZTtcbiAgc2V0IGVycm9yKGVycjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5uZXdfZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuI2Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2Vycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gICAgICB0aGlzLiNlcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKkNsZWFycyB0aGUgdmFsdWUgYW5kIGVycm9yIG9mIHRoZSBjb21wb25lbnQgaWYgbm90IHN0YXRlIGJhc2VkKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSByZXR1cm47XG4gICAgdGhpcy5fYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBzZXQgYnkgdmFsdWUgc2V0dGVyIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZDtcblxuICAvKipDbGVhcnMgZm9ybSBlbGVtZW50IGdyYXBoaWNhbGx5Ki9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsZWFyX3ZhbHVlKCk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgc2V0IGJ5IGVycm9yIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld19lcnJvcih2YWw6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgY2xlYXJlZCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl9lcnJvcigpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIHN0YXRlIGhhcyByZWxhdGVkIGluZm9ybWF0aW9uICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IHt9KTogdm9pZDtcbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gIF9fICAgICAgICAgIF9fX19fX18gIF9fX19fIF9fX19fX18gX19fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgXFwgXFwgICAgICAgIC8gLyAgX18gXFx8XyAgIF98X18gICBfX3wgIF9fX198XG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgIFxcIFxcICAvXFwgIC8gL3wgfF9fKSB8IHwgfCAgICB8IHwgIHwgfF9fXG4vLyAgICAgICBcXCBcXC8gLyAvXFwgXFwgfCB8ICAgfCB8ICB8IHwgIF9ffCAgICAgXFwgXFwvICBcXC8gLyB8ICBfICAvICB8IHwgICAgfCB8ICB8ICBfX3xcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gICAgIFxcICAvXFwgIC8gIHwgfCBcXCBcXCBffCB8XyAgIHwgfCAgfCB8X19fX1xuLy8gICAgICAgICBcXC9fLyAgICBcXF9cXF9fX19fX1xcX19fXy98X19fX19ffCAgICAgXFwvICBcXC8gICB8X3wgIFxcX1xcX19fX198ICB8X3wgIHxfX19fX198XG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWVXcml0ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2Fybl9pbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgI3dhcm5fdGltZW91dD86IG51bWJlcjtcbiAgI2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm5hbWUgPSBcInZhbFwiO1xuICB9XG5cbiAgc2V0IGNoYW5nZShmdW5jOiAodmFsOiBSVCkgPT4gdm9pZCkge1xuICAgIHRoaXMuI2NoYW5nZSA9IGZ1bmM7XG4gIH1cbiAgZ2V0IGNoYW5nZSgpOiAoKHZhbDogUlQpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdCBoYXMgY2hhbmdlZCovXG4gIGdldCBjaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjaGFuZ2VkO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuI3dhcm5fdGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuI3dhcm5fdGltZW91dCk7XG4gICAgdGhpcy4jd2Fybl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICB0aGlzLndhcm5faW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGxpbWl0IHZhbHVlIGVudGVyZWQgKi9cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogUlQpOiBQcm9taXNlTGlrZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS53cml0YWJsZSkgcmV0dXJuIHRoaXMuX3N0YXRlLmxpbWl0KHZhbCk7XG4gICAgICBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUoZXJyKFwiTm90IHdyaXRhYmxlXCIpKTtcbiAgICB9IGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShvayh2YWwpKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlICovXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5jaGVjayh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byB1cGRhdGUgdmFsdWUqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2V0X3ZhbHVlX2xpbWl0KHZhbDogUlQpOiBQcm9taXNlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbWl0ZWQgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbCk7XG4gICAgaWYgKGxpbWl0ZWQuZXJyKSB7XG4gICAgICB0aGlzLndhcm4obGltaXRlZC5lcnJvcik7XG4gICAgICByZXR1cm4gbGltaXRlZDtcbiAgICB9XG4gICAgdGhpcy4jc2V0X3ZhbHVlKGxpbWl0ZWQudmFsdWUpO1xuICAgIHJldHVybiBsaW1pdGVkO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9jaGVjayh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjaGVja2VkID0gYXdhaXQgdGhpcy5jaGVja192YWx1ZSh2YWwpO1xuICAgIGlmIChjaGVja2VkLmVycikge1xuICAgICAgdGhpcy53YXJuKGNoZWNrZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShjaGVja2VkLnZhbHVlKTtcbiAgICByZXR1cm4gY2hlY2tlZDtcbiAgfVxuXG4gICNzZXRfdmFsdWUodmFsOiBSVCkge1xuICAgIGlmICh0aGlzLl9idWZmZXIgPT09IHZhbCkgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICBpZiAodGhpcy4jY2hhbmdlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlKHZhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgdXBkYXRpbmcgY2hhbmdlIGxpc3RlbmVyXCIsIGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmZlcjtcbiAgICAgIHRoaXMuX3N0YXRlLndyaXRlISh2YWwpLnRoZW4oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycikge1xuICAgICAgICAgIGlmIChidWZmICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKGJ1ZmYpO1xuICAgICAgICAgIHRoaXMud2FybihlcnIuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHZhbDtcbiAgICAgIHRoaXMuI2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtQ29sb3JzLFxuICBGb3JtVmFsdWUsXG4gIEZvcm1WYWx1ZVdyaXRlLFxuICB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIEZvcm1CdXR0b25PcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPGJvb2xlYW4sIElEPiB7XG4gIC8qKkJ1dHRvbnMgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBidXR0b24gKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrICovXG4gIG9uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgLyoqU2V0IHRydWUgdG8gbWFrZSBidXR0b24gdG9nZ2xlIG9uIGNsaWNrIGluc3RlYWQgb2Ygbm9ybWFsICovXG4gIHRvZ2dsZT86IGJvb2xlYW47XG4gIC8qKkNoYW5nZXMgdGhlIGJ1dHRvbnMgY29sb3IgKi9cbiAgY29sb3I/OiBGb3JtQ29sb3JzO1xufVxuXG5jbGFzcyBGb3JtQnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0ZXh0OiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI29uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgI3RvZ2dsZT86IGJvb2xlYW47XG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICB9O1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiICYmIGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgIHRoaXMub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldi5wb2ludGVySWQpO1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9udG91Y2hzdGFydCA9IChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgdGhpcy5vbnRvdWNoZW5kID0gKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXYudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgIHRoaXMub250b3VjaGVuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jb25fY2xpY2spIHRoaXMuI29uX2NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25rZXl1cCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGJ1dHRvbiovXG4gIHNldCB0ZXh0KGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0ZXh0LnRleHRDb250ZW50ID0gbGFiZWw7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3RleHQpO1xuICAgIGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrKi9cbiAgc2V0IG9uX2NsaWNrKGZ1bmM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI29uX2NsaWNrID0gZnVuYztcbiAgfVxuICBnZXQgb25fY2xpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uX2NsaWNrO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgY29sb3Igb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBjb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5ld192YWx1ZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE9cIiwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG5cbiAgLyoqQ2hhbmdlcyB3aGV0aGVyIHRoZSBidXR0b24gaXMgbWFpbnRhaW5lZCBvciBtb21lbnRhcnkqL1xuICBzZXQgdG9nZ2xlKHRvZ2dsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3RvZ2dsZSA9IEJvb2xlYW4odG9nZ2xlKTtcbiAgfVxuICBnZXQgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2dnbGU7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1CdXR0b24pO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fYnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1CdXR0b25PcHRpb25zPElEPixcbik6IEZvcm1CdXR0b248SUQ+IHtcbiAgY29uc3QgYnV0dCA9IG5ldyBGb3JtQnV0dG9uPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgYnV0dC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGJ1dHQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jbGljaykgYnV0dC5vbl9jbGljayA9IG9wdGlvbnMub25fY2xpY2s7XG4gICAgaWYgKG9wdGlvbnMudG9nZ2xlKSBidXR0LnRvZ2dsZSA9IG9wdGlvbnMudG9nZ2xlO1xuICAgIGlmIChvcHRpb25zLmNvbG9yKSBidXR0LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhidXR0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gYnV0dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCB0eXBlIEZvcm1Db2xvcnMsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xhbXAuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYW1wT3B0aW9uczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgbGFtcCBjb2xvcnMgKi9cbiAgY29sb3JzOiBDO1xuICAvKipMYW1wIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgbGFtcCAqL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIgfCBib29sZWFuKSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLiNjb2xvcnNbTnVtYmVyKHZhbHVlKV07XG4gICAgaWYgKGNvbG9yKSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgICBlbHNlIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUxhbXApO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZnVuY3Rpb24gZnJvbTxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8XG4gICAgbnVtYmVyLFxuICAgIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLFxuICAgIElEXG4gID4sXG4pOiBGb3JtTGFtcDxudW1iZXIsIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLCBJRD47XG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxib29sZWFuLCBbRm9ybUNvbG9ycywgRm9ybUNvbG9yc10sIElEPixcbik6IEZvcm1MYW1wPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+O1xuZnVuY3Rpb24gZnJvbTxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPFQsIEMsIElEPik6IEZvcm1MYW1wPFQsIEMsIElEPiB7XG4gIGNvbnN0IGxhbXAgPSBuZXcgRm9ybUxhbXA8VCwgQywgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsYW1wLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIGlmIChvcHRpb25zLnRleHQpIGxhbXAudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBsYW1wLmljb24gPSBvcHRpb25zLmljb247XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcywgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgb2ssIHR5cGUgT3B0aW9uLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHtcbiAgQU5JTUFUSU9OX0xFVkVMLFxuICBBTklNQVRJT05fU1BFRUQsXG4gIEFuaW1hdGlvbkxldmVscyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItdGhlbWVcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50LCBGb3JtVmFsdWUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2dyb3VwLnNjc3NcIjtcblxuLyoqRGlmZmVyZW50IGJvcmRlciBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQgZ3JvdXAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cEJvcmRlclN0eWxlID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgSW5zZXQ6IFwiaW5zZXRcIixcbiAgT3V0c2V0OiBcIm91dHNldFwiLFxuICBMaW5lOiBcImxpbmVcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBGb3JtR3JvdXBCb3JkZXJTdHlsZSA9XG4gICh0eXBlb2YgRm9ybUdyb3VwQm9yZGVyU3R5bGUpW2tleW9mIHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZV07XG5cbnR5cGUgRXh0cmFjdEI8QXJyIGV4dGVuZHMgYW55W10+ID0gQXJyIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBpbmZlciBJRD5cbiAgICA/IFtGb3JtVmFsdWU8VCwgSUQ+LCAuLi5FeHRyYWN0QjxUYWlsPl1cbiAgICA6IFsuLi5FeHRyYWN0QjxUYWlsPl1cbiAgOiBbXTtcblxudHlwZSBUb0tleVZhbDxBcnIgZXh0ZW5kcyBGb3JtVmFsdWU8YW55LCBhbnk+W10+ID0ge1xuICBbSyBpbiBBcnJbbnVtYmVyXSBhcyBLW1wiZm9ybV9pZFwiXV06IEsgZXh0ZW5kcyBGb3JtVmFsdWU8aW5mZXIgVCwgYW55PlxuICAgID8gVFxuICAgIDogbmV2ZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cE9wdGlvbnM8XG4gIEwgZXh0ZW5kcyBGb3JtRWxlbWVudFtdLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgVCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFQsIElEPiB7XG4gIC8qKkVsZW1lbnRzIHRvIGFkZCB0byB0aGUgZ3JvdXAqL1xuICBlbGVtZW50cz86IFsuLi5MXTtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzaWJsZSwgbWVhbmluZyBpdCBoYXMgYSBidXR0b24gdG8gY29sbGFwc2UgYW5kIGV4cGFuZCBhbGwgY29udGVudCB0byB0aGUgc2l6ZSBvZiB0aGF0IGJ1dHRvbiovXG4gIGNvbGxhcHNpYmxlPzogYm9vbGVhbjtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzZWQgaW5pdGlhbGx5Ki9cbiAgY29sbGFwc2VkPzogYm9vbGVhbjtcbiAgLyoqVGV4dCB0byBzaG93IG9uIHRoZSBjb2xsYXBzZSBidXR0b24qL1xuICBjb2xsYXBzZV90ZXh0Pzogc3RyaW5nO1xuICAvKipCb3JkZXIgc3R5bGUgZm9yIGdyb3VwKi9cbiAgYm9yZGVyPzogRm9ybUdyb3VwQm9yZGVyU3R5bGU7XG4gIC8qKlJlbW92ZXMgcGFkZGluZyB3aGVuIHRydWUgYWxsb3dzIGZvciBwdXR0aW5nIGdyb3VwcyBpbiBncm91cHMgd2l0aG91dCBwYWRkaW5nIGJ1aWxkaW5nIHVwICovXG4gIGVtYmVkPzogYm9vbGVhbjtcbiAgLyoqR3JvdXAgbWF4IGhlaWdodCBpbiByZW0sIHVuZGVmaW5lZCBtZWFucyBubyBsaW1pdCovXG4gIG1heF9oZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBncm91cCBjbGFzcyB3aGljaCBhbGxvd3MgdG8gYWRkIGVsZW1lbnRzIGFuZCBjb250cm9scyB0aGUgZmxvdyBvZiB0aGUgZWxlbWVudHMqL1xuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cDxcbiAgUlQgZXh0ZW5kcyBvYmplY3QsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY29sbGFwc2libGU/OiBIVE1MRGl2RWxlbWVudDtcbiAgI2NvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAjY29sbGFwc2VfYnV0dG9uPzogSFRNTFNwYW5FbGVtZW50O1xuICAjdmFsdWVfZWxlbWVudHM6IE1hcDxzdHJpbmcsIEZvcm1WYWx1ZTxhbnksIGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHNldCBlbGVtZW50cyhlbGVtZW50czogRm9ybUVsZW1lbnRbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIEZvcm1WYWx1ZSAmJiBjb21wLmZvcm1faWQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3ZhbHVlX2VsZW1lbnRzLmhhcyhjb21wLmZvcm1faWQgYXMgc3RyaW5nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkZvcm0gZWxlbWVudCB3aXRoIGZvcm0gaWQgXCIgK1xuICAgICAgICAgICAgICBjb21wLmZvcm1faWQgK1xuICAgICAgICAgICAgICBcIiBhbHJlYWR5IGV4aXN0cyBpbiBncm91cFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdmFsdWVfZWxlbWVudHMuc2V0KGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcsIGNvbXApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB0aGlzLiNjb2xsYXBzaWJsZS5hcHBlbmRDaGlsZChjb21wKTtcbiAgICAgIGVsc2UgdGhpcy5hcHBlbmRDaGlsZChjb21wKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWxlbWVudHMoKTogRm9ybUVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiN2YWx1ZV9lbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipUaGlzIHBsYWNlcyB0aGUgZ3JvdXAgYXQgYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gb25lIG9mIHRoZSBjb3JuZXJzIG9mIHRoZSBjb250YWluZXIqL1xuICBzZXQgYm9yZGVyKGJvcmRlcjogRm9ybUdyb3VwQm9yZGVyU3R5bGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBGb3JtR3JvdXBCb3JkZXJTdHlsZS5JbnNldCxcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLk91dHNldCxcbiAgICApO1xuICAgIGlmIChib3JkZXIgJiYgYm9yZGVyICE9PSBGb3JtR3JvdXBCb3JkZXJTdHlsZS5Ob25lKVxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKGJvcmRlcik7XG4gIH1cblxuICBzZXQgY29sbGFwc2libGUoY29sbGFwc2libGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoY29sbGFwc2libGUgJiYgIXRoaXMuI2NvbGxhcHNpYmxlKSB7XG4gICAgICB0aGlzLiNjb2xsYXBzaWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKVxuICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5yZXBsYWNlQ2hpbGRyZW4oLi4udGhpcy5jaGlsZHJlbik7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuI2NvbGxhcHNpYmxlKTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNpYmxlXCIpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChcbiAgICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uIHx8XG4gICAgICAgICAgKHRoaXMuY29sbGFwc2VfdGV4dCA9IFwiXCIpIHx8XG4gICAgICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uISxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbGxhcHNlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghY29sbGFwc2libGUgJiYgdGhpcy4jY29sbGFwc2libGUpIHtcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbiguLi50aGlzLiNjb2xsYXBzaWJsZS5jaGlsZHJlbik7XG4gICAgICB0aGlzLiNjb2xsYXBzaWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNvbGxhcHNpYmxlXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgY29sbGFwc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNpYmxlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXQgY29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkge1xuICAgICAgaWYgKGNvbGxhcHNlZCAmJiAhdGhpcy4jY29sbGFwc2VkKSB7XG4gICAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2NvbGxhcHNpYmxlLmFuaW1hdGUoXG4gICAgICAgICAgICBbeyBoZWlnaHQ6IGZ1bGxfaGVpZ2h0IH0sIHsgaGVpZ2h0OiBcIjBcIiB9XSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgICAgZWFzaW5nOiBcImVhc2UtaW5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgICAgICBpZiAodGhpcy4jY29sbGFwc2libGUpIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiXCI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWNvbGxhcHNlZCAmJiB0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY29sbGFwc2VkXCIpO1xuICAgICAgICAvLyMgQW5pbWF0aW9uXG4gICAgICAgIGlmIChBTklNQVRJT05fTEVWRUwuZ2V0KCkudmFsdWUgPT09IEFuaW1hdGlvbkxldmVscy5BbGwpIHtcbiAgICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICAgIGNvbnN0IGZ1bGxfaGVpZ2h0ID1cbiAgICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLiNjb2xsYXBzaWJsZS5hbmltYXRlKFxuICAgICAgICAgICAgW3sgaGVpZ2h0OiBcIjBcIiB9LCB7IGhlaWdodDogZnVsbF9oZWlnaHQgfV0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBBTklNQVRJT05fU1BFRUQuZ2V0KCkudmFsdWUsXG4gICAgICAgICAgICAgIGVhc2luZzogXCJlYXNlLW91dFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiNjb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgfVxuICB9XG4gIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZV90ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy4jY29sbGFwc2VfYnV0dG9uKSB7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi50YWJJbmRleCA9IDA7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmFwcGVuZENoaWxkKFxuICAgICAgICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoXG4gICAgICAgIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmNsaWNrID0gKCkgPT4gKHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiB8fCBlLmtleSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5maXJzdENoaWxkIS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBzZXQgbWF4X2hlaWdodChoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoXCItLW1heF9oZWlnaHRcIiwgaGVpZ2h0ID8gaGVpZ2h0ICsgXCJyZW1cIiA6IFwibm9uZVwiKTtcbiAgICBpZiAoaGVpZ2h0KSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJtYXhfaGVpZ2h0XCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwibWF4X2hlaWdodFwiKTtcbiAgfVxuXG4gIHNldCBlbWJlZChlbWJlZDogYm9vbGVhbikge1xuICAgIGlmIChlbWJlZCkgdGhpcy5jbGFzc0xpc3QuYWRkKFwiZW1iZWRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJlbWJlZFwiKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgc3VwZXIudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHJldHVybiBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIik7XG4gICAgY29uc3QgcmVzdWx0OiBSVCA9IHt9IGFzIFJUO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29tcF0gb2YgdGhpcy4jdmFsdWVfZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbXAudmFsdWU7XG4gICAgICBpZiAodmFsLmVycikgcmV0dXJuIGVycihcIkNvbXBvbmVudCB3aXRoIGlkIFwiICsga2V5ICsgXCIgaGFzIG5vIHZhbHVlXCIpO1xuICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBSVF0gPSB2YWwudmFsdWUgYXMgUlRba2V5b2YgUlRdO1xuICAgIH1cbiAgICByZXR1cm4gb2socmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBSVCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbClcbiAgICAgIGlmICh0aGlzLiN2YWx1ZV9lbGVtZW50cy5oYXMoa2V5KSlcbiAgICAgICAgdGhpcy4jdmFsdWVfZWxlbWVudHMuZ2V0KGtleSkhLnZhbHVlID0gdmFsW2tleSBhcyBrZXlvZiBSVF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb21wIG9mIHRoaXMuI3ZhbHVlX2VsZW1lbnRzLnZhbHVlcygpKSBjb21wLmNsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgb25fYWNjZXNzKGFjY2VzczogQWNjZXNzVHlwZXMpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5SZWFkOiB7XG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSAoKSA9PiB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQWNjZXNzVHlwZXMuV3JpdGU6IHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiKTtcbiAgICAgICAgdGhpcy5vbmZvY3VzID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtR3JvdXApO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9ncm91cDxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBUIGV4dGVuZHMgb2JqZWN0ID0gUHJldHRpZnk8UGFydGlhbDxUb0tleVZhbDxFeHRyYWN0QjxMPj4+Pixcbj4ob3B0aW9ucz86IEZvcm1Hcm91cE9wdGlvbnM8TCwgSUQsIFQ+KTogRm9ybUdyb3VwPFQsIElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1Hcm91cDxULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmJvcmRlcikgc2xpZGUuYm9yZGVyID0gb3B0aW9ucy5ib3JkZXI7XG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudHMpIHNsaWRlLmVsZW1lbnRzID0gb3B0aW9ucy5lbGVtZW50cztcbiAgICBpZiAob3B0aW9ucy5jb2xsYXBzZV90ZXh0KSBzbGlkZS5jb2xsYXBzZV90ZXh0ID0gb3B0aW9ucy5jb2xsYXBzZV90ZXh0O1xuICAgIGlmIChvcHRpb25zLmNvbGxhcHNpYmxlKSBzbGlkZS5jb2xsYXBzaWJsZSA9IG9wdGlvbnMuY29sbGFwc2libGU7XG4gICAgaWYgKG9wdGlvbnMuY29sbGFwc2VkKSBzbGlkZS5jb2xsYXBzZWQgPSBvcHRpb25zLmNvbGxhcHNlZDtcbiAgICBpZiAob3B0aW9ucy5tYXhfaGVpZ2h0KSBzbGlkZS5tYXhfaGVpZ2h0ID0gb3B0aW9ucy5tYXhfaGVpZ2h0O1xuICAgIGlmIChvcHRpb25zLmVtYmVkKSBzbGlkZS5lbWJlZCA9IG9wdGlvbnMuZW1iZWQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgTGlzdEZpZWxkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbGlzdFwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9saXN0X2ZpZWxkLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIExpc3RGb3JtRmllbGQ8VCBleHRlbmRzIEZvcm1FbGVtZW50PiBleHRlbmRzIExpc3RGaWVsZCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGlzdGZpZWxkXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHNldCBlbGVtZW50KGNvbXBvbmVudDogVCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXQgZWxlbWVudCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBUO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChMaXN0Rm9ybUZpZWxkKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbGlzdF9maWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+KGVsZW1lbnQ6IFQpIHtcbiAgY29uc3QgZmllbGQgPSBuZXcgTGlzdEZvcm1GaWVsZDxUPigpO1xuICBmaWVsZC5lbGVtZW50ID0gZWxlbWVudDtcbiAgcmV0dXJuIGZpZWxkO1xufVxuIiwiaW1wb3J0IHsgbm9uZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTdGF0ZU51bWJlclJlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2Jhc2Uuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OdW1iZXJPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqTG93ZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqVXBwZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1heD86IG51bWJlcjtcbiAgLyoqQW1vdW50IG9mIGRlY2ltYWxzIHRvIHNob3cqL1xuICBkZWNpbWFscz86IG51bWJlcjtcbiAgLyoqVW5pdCB0byB1c2UgZm9yIHNsaWRlciovXG4gIHVuaXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlcldyaXRlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJPcHRpb25zPElELCBSVD4ge1xuICAvKipTdGVwIHNpemUsIHVzZSAwIGZvciBhdXRvbWF0aWMgc3RlcCBzaXplKi9cbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqU3RhcnQgZm9yIHN0ZXAsIHVzZSAwIGZvciBhdXRvbWF0aWMgKi9cbiAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKndldGhlciB0aGUgZXZlbnRzIGFyZSBsaXZlIGFzIHRoZSBzbGlkZXIgaXMgbW92ZWQgb3Igb25seSB3aGVuIG1vdmluZyBzdG9wcyAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGRlY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2RlY3JlYXNlPzogU1ZHRnVuYztcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGluY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2luY3JlYXNlPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1OdW1iZXJXcml0ZTxJRCwgUlQ+LFxuICAgIG9wdGlvbnM6IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMudW5pdCkgZWxlbWVudC51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIGlmIChvcHRpb25zLmRlY2ltYWxzKSBlbGVtZW50LmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBpZiAob3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCkgZWxlbWVudC5taW4gPSBvcHRpb25zLm1pbjtcbiAgICBpZiAob3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCkgZWxlbWVudC5tYXggPSBvcHRpb25zLm1heDtcbiAgICBpZiAob3B0aW9ucy5zdGVwKSBlbGVtZW50LnN0ZXAgPSBvcHRpb25zLnN0ZXA7XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQpIGVsZW1lbnQuc3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBzaXplIG9mIG51bWJlciBjaGFuZ2Ugc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHN0YXJ0IG9mZnNldCBmb3IgbnVtYmVyIHN0ZXBzKi9cbiAgYWJzdHJhY3Qgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgYWJzdHJhY3Qgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgYWJzdHJhY3Qgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RlcClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGVwXCIsIHJlbGF0ZWQuc3RlcCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0ZXBcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RhcnQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwic3RhcnRcIiwgcmVsYXRlZC5zdGFydCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0YXJ0XCIpO1xuICAgIGlmIChyZWxhdGVkLmRlY2ltYWxzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcImRlY2ltYWxzXCIsIHJlbGF0ZWQuZGVjaW1hbHMsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJkZWNpbWFsc1wiKTtcbiAgICBpZiAocmVsYXRlZC51bml0KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInVuaXRcIiwgcmVsYXRlZC51bml0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwidW5pdFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBnZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHN5bmNfcmVzb2x2ZSxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2lucHV0LnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmNsYXNzIE51bWJlcklucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIm51bWJlcmlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAjdW5pdDogc3RyaW5nID0gXCJcIjtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuXG4gICN2YWx1ZV9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXRfYm94ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbWF4X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtaW5fbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcy4jdmFsdWVfYm94KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIH0gZWxzZSB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkKSByZXR1cm47XG4gICAgICBzZXRfc2VsZWN0aW9uX2FsbCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3NldChmYWxzZSk7XG4gICAgICB9LCAwKTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiNzZXQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiKSB0aGlzLiNzdGVwX3ZhbHVlKHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHRoaXMuI3N0ZXBfdmFsdWUoZmFsc2UpO1xuICAgICAgZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZWxzZSBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbWluID49IDAgJiYgLy0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldChjdXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzZWwgPSBnZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChcbiAgICAgIGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApXG4gICAgKVxuICAgICAgLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IE1hdGgubWF4KE1hdGgubWluKDAsIHRoaXMuI21heCksIHRoaXMuI21pbikpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKCkgPT4ge1xuICAgICAgICBpZiAoIWN1cikgcmV0dXJuO1xuICAgICAgICBzZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCwgc2VsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWluOiBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWF4OiBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KE51bWJlcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbnVtYmVyX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQ+LFxuKTogTnVtYmVySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgTnVtYmVySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBGb3JtTnVtYmVyT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9wcm9ncmVzcy5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtUHJvZ3Jlc3M8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlPFxuICBudW1iZXIsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwcm9ncmVzc1wiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWluOiBudW1iZXIgPSAwO1xuICAjbWF4OiBudW1iZXIgPSAxMDA7XG4gICNzcGFuOiBudW1iZXIgPSAxMDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI2JhcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjdmFsOiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtaW4obWluOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtYXgobWF4OiBudW1iZXIpIHtcbiAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gTWF0aC5tYXgoZGVjID8/IDAsIDApO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQudGV4dENvbnRlbnQgPSB1bml0ID8/IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPVxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgoKCh2YWx1ZSAtIHRoaXMuI21pbikgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCkgK1xuICAgICAgXCIlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jYmFyLnN0eWxlLndpZHRoID0gXCIwJVwiO1xuICAgIHRoaXMuI3ZhbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUHJvZ3Jlc3MpO1xuXG4vKipDcmVhdGVzIGEgcHJvZ3Jlc3MgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTnVtYmVyT3B0aW9uczxJRD4sXG4pOiBGb3JtUHJvZ3Jlc3M8SUQ+IHtcbiAgY29uc3QgcHJvZyA9IG5ldyBGb3JtUHJvZ3Jlc3M8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluICE9PSBcInVuZGVmaW5lZFwiKSBwcm9nLm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXggIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgcHJvZy5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgcHJvZy51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHByb2csIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2NvbnRlbnRfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybVN0ZXBwZXJCYXNlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9zbGlkZXIuc2Nzc1wiO1xuXG4vKipTbGlkZSBTZWxlY3RvciwgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBzbGlkZXIqL1xuZXhwb3J0IGNsYXNzIEZvcm1TbGlkZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzbGlkZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3VuaXQ6IHN0cmluZyA9IFwiXCI7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3NwYW46IG51bWJlciA9IEluZmluaXR5O1xuICAjc3RlcDogbnVtYmVyID0gMDtcbiAgI3N0YXJ0OiBudW1iZXIgPSAwO1xuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAjaWNvbl9kZWMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9jb250ZW50X3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjc2xpZGUgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWZ0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNyaWdodF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9jb250ZW50X2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9tYXgoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgI3VwZGF0ZV9tYXhfbGVnZW5kKCkge1xuICAgIHRoaXMuI3JpZ2h0X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQgKyBcIiA6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICAgICAgaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfY29udGVudF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy4jbW92ZV9zbGlkZShcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KCgoLXRoaXMuI21pbiArIHZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gIGFzeW5jICNtb3ZlX2Fic29sdXRlKHg6IG51bWJlciwgbGFzdD86IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoeCk7XG4gICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICAgIGlmICh2YWx1ZS5vaykge1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUoKCgtdGhpcy4jbWluICsgdmFsdWUudmFsdWUpIC8gdGhpcy4jc3BhbikgKiAxMDApO1xuICAgICAgICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjeF90b19wZXJjKHg6IG51bWJlcikge1xuICAgIGNvbnN0IGJveCA9IHRoaXMuI3NsaWRlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICgoeCAtIGJveC54KSAvIGJveC53aWR0aCkgKiAxMDApKTtcbiAgfVxuXG4gICNwZXJjX3RvX3ZhbHVlKHBlcmM6IG51bWJlcikge1xuICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiB0aGlzLiNzcGFuICsgdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqQXR0YWNoZXMgY2xpY2sgYWN0aW9uIHRvIG92ZXIgdGltZSBpbmNyZWFzZSBzcGVlZCBvZiBzdGVwcGluZyB3aGVuIGhvbGRpbmcgc3RlcCBidXR0b25zICovXG4gICNzdGVwcGVyX2Z1bmMoaWNvbjogU1ZHU1ZHRWxlbWVudCwgZGlyOiBib29sZWFuKSB7XG4gICAgaWNvbi5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsZXQgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyX2ludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlciA9IDI1MDtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNjYWxlcl9pbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGljb24ub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIGljb24ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIGljb24uc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgc2NhbGVyX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlciA+IDIwKSBzY2FsZXIgLz0gMS4xO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IDApIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cblxuICAjbW92ZV9zbGlkZShwZXJjOiBudW1iZXIpIHtcbiAgICB0aGlzLiNzbGlkZXIuc3R5bGUubGVmdCA9IHBlcmMgKyBcIiVcIjtcbiAgfVxuICAjbW92ZV92YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TbGlkZXIpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9zbGlkZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU2xpZGVyPElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1TbGlkZXI8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBzbGlkZS5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIGlmIChvcHRpb25zLmljb25fZGVjcmVhc2UpIHNsaWRlLmljb25fZGVjcmVhc2UgPSBvcHRpb25zLmljb25fZGVjcmVhc2U7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9pbmNyZWFzZSkgc2xpZGUuaWNvbl9pbmNyZWFzZSA9IG9wdGlvbnMuaWNvbl9pbmNyZWFzZTtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzbGVlcCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9jb250ZW50X2FkZF9yb3VuZGVkLFxuICBtYXRlcmlhbF9jb250ZW50X3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICN0ZXh0ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NvbnRlbnRfYWRkX3JvdW5kZWQoKSksXG4gICAgdHJ1ZSxcbiAgKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLiN0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZ2VuZCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbWF4X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtaW5fbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMuI3ZhbHVlX2JveC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBsZXQgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uZm9jdXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBkcmFnX2Jsb2NrZXIgPSB0cnVlO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmx1ciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IGZhbHNlO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhcbiAgICAgICAgcGFyc2VGbG9hdCh0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LnJlcGxhY2UoXCIsXCIsIFwiLlwiKSB8fCBcIlwiKSB8fCAwLFxuICAgICAgKTtcbiAgICB9O1xuICAgIGxldCByZXNldCA9ICgpID0+IHt9O1xuICAgIHRoaXMuI3RleHQub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDAgJiYgKGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3ggfHwgIWRyYWdfYmxvY2tlcikpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbF92YWwgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICBsZXQgbW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3RleHQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGUuY2xpZW50WCAtIGV2LmNsaWVudFgpID4gNSkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIG1vdmluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXNldCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgdGhpcy4jdGV4dC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIGlmICghbW92aW5nICYmIGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih0aGlzLiN2YWx1ZV9ib3guZmlyc3RDaGlsZCEpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5vd25lckRvY3VtZW50Py5kZWZhdWx0Vmlldz8uZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG1vdmluZykge1xuICAgICAgICAgICAgdGhpcy4jbW92ZV9kaWZmKFxuICAgICAgICAgICAgICBpbml0aWFsX3ZhbCArICgoZXYuY2xpZW50WCAtIGUuY2xpZW50WCkgLyAxMCkgKiAodGhpcy4jc3RlcCB8fCAxKSxcbiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgfHwgZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGUua2V5ID09PSBcIkFycm93UmlnaHRcIik7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHJlc2V0KSByZXNldCgpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy4jdmFsdWVfYm94ICYmXG4gICAgICAgICAgL1tcXGQsLi1dL2cudGVzdChlLmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy4jdmFsdWVfYm94LmJsdXIoKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIilcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGUuZGF0YSkge1xuICAgICAgICBpZiAoIS9bXFxkLC4tXS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICgvWywuXS9nLnRlc3QoZS5kYXRhKSAmJiB0aGlzLiNkZWNpbWFscyA9PT0gMClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICh0aGlzLiNtaW4gPj0gMCAmJiAvLS9nLnRlc3QoZS5kYXRhKSkgfHxcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LmluY2x1ZGVzKFwiLVwiKVxuICAgICAgICApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBkZWMgfHwgMDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21pbiA9IG1pbiA/PyAtSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbWluX2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtaW4gPT09IC1JbmZpbml0eVxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiBcIk1pbjogXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0O1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21heF9sZW5nZW5kKCkge1xuICAgIHRoaXMuI21heF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eVxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiBcIk1heDogXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0O1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICAgICAgaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfY29udGVudF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHZhbHVlIHRvIGEgcG9zaXRpb24gYnkgdGhlIG1vdXNlIHggY29vcmRpbmF0ZXMqL1xuICBhc3luYyAjbW92ZV9kaWZmKHZhbHVlOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAobGFzdCkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobGltLm9rKSB0aGlzLiNtb3ZlX3ZhbHVlKGxpbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHNsaWRlciB0byB0aGUgZ2l2ZW4gcGVyY2VudCBwb3NpdGlvbiovXG4gICNtb3ZlX3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3RlcHBlcik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU3RlcHBlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU3RlcHBlcjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxpdmUpIHNsaWRlLmxpdmUgPSBvcHRpb25zLmxpdmU7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9kZWNyZWFzZSkgc2xpZGUuaWNvbl9kZWNyZWFzZSA9IG9wdGlvbnMuaWNvbl9kZWNyZWFzZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2luY3JlYXNlKSBzbGlkZS5pY29uX2luY3JlYXNlID0gb3B0aW9ucy5pY29uX2luY3JlYXNlO1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBzb21lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgc3RhdGUsIHsgdHlwZSBTdGF0ZUVudW1SZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yT3B0aW9uPFJUPiB7XG4gIC8qKlZhbHVlIHRvIHNldCB3aGVuIG9wdGlvbiBpcyBzZWxlY3RlZCAqL1xuICB2YWx1ZTogUlQ7XG4gIC8qKlRleHQgZm9yIHNlbGVjdGlvbiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKkljb24gdG8gZGlzcGxheSBmb3Igb3B0aW9uKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8XG4gIFQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqT3B0aW9ucyBmb3Igc2VsZWN0b3IqL1xuICBzZWxlY3Rpb25zPzogRm9ybVNlbGVjdG9yT3B0aW9uPFQ+W107XG59XG5cbi8qKkJhc2UgZm9yIG51bWJlciBlbGVtZW50cyBlbGVtZW50cyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVNlbGVjdG9yQmFzZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICAvKipTZXRzIHRoZSBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHNlbGVjdG9yICovXG4gIGFic3RyYWN0IHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCk7XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4sXG4gICAgb3B0aW9uczogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9ucykgZWxlbWVudC5zZWxlY3Rpb25zID0gb3B0aW9ucy5zZWxlY3Rpb25zO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlRW51bVJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubGlzdCkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcF9tYXAoXG4gICAgICAgIFwic2VsZWN0aW9uc1wiLFxuICAgICAgICByZWxhdGVkLmxpc3QsXG4gICAgICAgICgpID0+IHNvbWUoW10pLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNvbWUoXG4gICAgICAgICAgICBzdGF0ZS5lLm1hcCh2YWwsIChrZXksIHZhbCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbC5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXkgYXMgUlQsXG4gICAgICAgICAgICAgICAgaWNvbjogdmFsLmljb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2UsIGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfbmF2aWdhdGlvbl9jbG9zZV9yb3VuZGVkLFxuICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybVNlbGVjdG9yQmFzZSxcbiAgdHlwZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9ucyxcbiAgdHlwZSBGb3JtU2VsZWN0b3JPcHRpb24sXG59IGZyb20gXCIuLi9zZWxlY3Rvcl9iYXNlXCI7XG5pbXBvcnQgXCIuL2Ryb3BfZG93bi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRHJvcERvd25PcHRpb25zPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICAvKipEZWZhdWx0IGljb24gZGlzcGxheWVkKi9cbiAgZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbn1cblxuLyoqRHJvcGRvd24gYm94IGZvciBzZWxlY3RpbmcgYmV0d2VlbiBtdWx0aXBsZSBjaG9pY2VzIGluIGEgc21hbGwgc3BhY2UqL1xuZXhwb3J0IGNsYXNzIEZvcm1Ecm9wZG93bjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI21hcDogTWFwPFJULCBTZWxPcHRpb25zPiA9IG5ldyBNYXAoKTtcbiAgI3ZhbHVlczogUlRbXSA9IFtdO1xuICAjc2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xuXG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcbiAgI3RleHQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI29wZW46IFNWR1NWR0VsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICApO1xuICAjZGVmYXVsdDogVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU2VsZWN0IHNvbWV0aGluZ1wiKTtcbiAgI2RlZmF1bHRfaWNvbj86IFNWR0Z1bmM7XG4gIHByaXZhdGUgaXNfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy4jdGV4dC5hcHBlbmQodGhpcy4jZGVmYXVsdCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+ICh0aGlzLm9wZW4gPSB0cnVlKTtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09IFwibW91c2VcIikge1xuICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0X2FkamFjZW50KGUua2V5ID09PSBcIkFycm93RG93blwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqR2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIGdldCBkZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSB8fCBcIlwiO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIHNldCBkZWZhdWx0KGRlZjogc3RyaW5nKSB7XG4gICAgdGhpcy4jZGVmYXVsdC5ub2RlVmFsdWUgPSBkZWY7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHRfaWNvbihkZWY6IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWZhdWx0X2ljb24gPSBkZWY7XG4gICAgaWYgKGRlZiAmJiB0aGlzLiNzZWxlY3RlZCA9PT0gLTEpIHRoaXMuI3NldF9pY29uID0gZGVmO1xuICB9XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCB0ZXh0LCBpY29uIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgeyB0ZXh0LCBpY29uIH0pO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICB9XG5cbiAgc2V0IG9wZW4ob3BlbjogYm9vbGVhbikge1xuICAgIGlmIChvcGVuICYmICF0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpKTtcbiAgICAgIGJveC5jbG9zZV9tZW51KCk7XG4gICAgfVxuICAgIHRoaXMuaXNfb3BlbiA9IG9wZW47XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgI3NldF9pY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikge1xuICAgICAgY29uc3QgaSA9IGljb24oKTtcbiAgICAgIGlmICh0aGlzLiNpY29uKSB0aGlzLnJlcGxhY2VDaGlsZChpLCB0aGlzLiNpY29uKTtcbiAgICAgIGVsc2UgdGhpcy5pbnNlcnRCZWZvcmUoaSwgdGhpcy4jdGV4dCk7XG4gICAgICB0aGlzLiNpY29uID0gaTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlNlbGVjdHMgdGhlIHByZXZpb3VzIG9yIG5leHQgc2VsZWN0aW9uIGluIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBkaXIgZmFsc2UgaXMgbmV4dCB0cnVlIGlzIHByZXZpb3VzKi9cbiAgI3NlbGVjdF9hZGphY2VudChkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oXG4gICAgICB0aGlzLiN2YWx1ZXMubGVuZ3RoIC0gMSxcbiAgICAgIE1hdGgubWF4KDAsIGRpciA/IHRoaXMuI3NlbGVjdGVkICsgMSA6IHRoaXMuI3NlbGVjdGVkIC0gMSksXG4gICAgKTtcbiAgICBpZiAoeSAhPT0gdGhpcy4jc2VsZWN0ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMuI3ZhbHVlc1t5XSk7XG4gIH1cblxuICAjY2xlYXIoKSB7XG4gICAgdGhpcy5kZWZhdWx0X2ljb24gPSB0aGlzLiNkZWZhdWx0X2ljb25cbiAgICAgID8gKHRoaXMuI3NldF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uKVxuICAgICAgOiAodGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQpO1xuICAgIHRoaXMuI3RleHQucmVwbGFjZUNoaWxkcmVuKHRoaXMuI2RlZmF1bHQpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gVmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCkge1xuICAgIGlmICghdGhpcy4jbWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuI2NsZWFyKCk7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgdGhpcy4jdGV4dC5pbm5lclRleHQgPSBvcHQudGV4dDtcbiAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAob3B0Lmljb24pIHRoaXMuI3NldF9pY29uID0gb3B0Lmljb247XG4gICAgZWxzZSB0aGlzLiNzZXRfaWNvbiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNjbGVhcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3VwZXIud2FybihtZXNzYWdlKTtcbiAgICB9LCAwKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybURyb3Bkb3duKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZHJvcGRvd248UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Ecm9wRG93bk9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ecm9wZG93bjxSVCwgSUQ+IHtcbiAgY29uc3QgZHJvcCA9IG5ldyBGb3JtRHJvcGRvd248UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdCkgZHJvcC5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRfaWNvbikgZHJvcC5kZWZhdWx0X2ljb24gPSBvcHRpb25zLmRlZmF1bHRfaWNvbjtcbiAgICBGb3JtU2VsZWN0b3JCYXNlLmFwcGx5X29wdGlvbnMoZHJvcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGRyb3A7XG59XG5cbi8vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5jbGFzcyBEcm9wRG93bkJveCBleHRlbmRzIEJhc2Uge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRyb3Bkb3duYm94XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNjbG9zZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgI2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjc2Nyb2xsOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI2NvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjdGFibGU6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy4jc2Nyb2xsLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICk7XG4gICNkcm9wZG93bjogRm9ybURyb3Bkb3duPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcbiAgI2ZvY3VzX291dF9oYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpXG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgfTtcbiAgI3dpbmRvd19yZXNpemVfaGFuZGxlciA9ICgpID0+IHRoaXMuY2xvc2VfbWVudSgpO1xuICAjaXNfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY29udGFpbmVyLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLiNjb250YWluZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgKGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09IFwiVGFiXCIpKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAgICAgOiAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIgfHwgZS5rZXkgPT09IFwiVGFiXCIpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9XG4gICAgICAgICAgZS50YXJnZXQgPT09IHRoaXMuI2NvbnRhaW5lclxuICAgICAgICAgICAgPyB0aGlzLiN0YWJsZS5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICAgICAgOiAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKGVsZW0pIChlbGVtIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgdGhpcy4jY2xvc2VyXG4gICAgICAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSlcbiAgICAgIC5hcHBlbmRDaGlsZChtYXRlcmlhbF9uYXZpZ2F0aW9uX2Nsb3NlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY2xvc2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTCA9IFwiQ2xvc2VcIjtcbiAgICB0aGlzLiNjbG9zZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2Nsb3Nlci5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICB9O1xuICAgIHRoaXMuI2Nsb3Nlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzX291dF9oYW5kbGVyLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgI3NldF92YWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIC8vQHRzLWV4cGVjdC1lcnJvciBDYWxsIHByaXZhdGUgbWV0aG9kIGZyb20gc2lzdGVyIGNsYXNzXG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5zZXRfdmFsdWVfY2hlY2sodmFsdWUpO1xuICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9XG5cbiAgb3Blbl9tZW51KFxuICAgIG1hcDogTWFwPGFueSwgU2VsT3B0aW9ucz4sXG4gICAgcGFyZW50OiBGb3JtRHJvcGRvd248YW55LCBhbnk+LFxuICAgIHZhbHVlOiBhbnksXG4gICkge1xuICAgIGNvbnN0IGlubmVyX2hlaWdodCA9IHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uaW5uZXJIZWlnaHQgfHwgMDtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC8gMiA8IGlubmVyX2hlaWdodCAvIDIpIHtcbiAgICAgIGNvbnN0IHRvcCA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuYm90dG9tID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSB0b3AgLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm90dG9tID0gaW5uZXJfaGVpZ2h0IC0gYm91bmRzLnk7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUudG9wID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBib3R0b20gKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gaW5uZXJfaGVpZ2h0IC0gYm90dG9tIC0gMTAgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IFwiY29sdW1uLXJldmVyc2VcIjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmxlZnQgPSBib3VuZHMueCArIFwicHhcIjtcbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUud2lkdGggPSBib3VuZHMud2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy4jZHJvcGRvd24gPSBwYXJlbnQ7XG5cbiAgICBpZiAodGhpcy4jc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHRoaXMuI3Njcm9sbC5jbGllbnRIZWlnaHQpXG4gICAgICB0aGlzLiNzY3JvbGwuY2xhc3NMaXN0LmFkZChcInNjcm9sbFwiKTtcbiAgICBlbHNlIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QucmVtb3ZlKFwic2Nyb2xsXCIpO1xuXG4gICAgbGV0IGZvY3VzOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi5BcnJheS5mcm9tKG1hcCkubWFwKChbdmFsLCBvcHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb25zdCBpY29uID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgaWYgKG9wdC5pY29uKSBpY29uLmFwcGVuZENoaWxkKG9wdC5pY29uKCkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IG9wdC50ZXh0O1xuICAgICAgICBsaW5lLm9ucG9pbnRlcnVwID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiKSB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGluZS5vbmNsaWNrID0gKCkgPT4gdGhpcy4jc2V0X3ZhbHVlKHZhbCk7XG4gICAgICAgIGxpbmUudGFiSW5kZXggPSAwO1xuICAgICAgICBsaW5lLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh2YWwgPT09IHZhbHVlKSBmb2N1cyA9IGxpbmU7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vU2hvdyBjbG9zZXIgb3Igbm90XG4gICAgY29uc3QgYm94ID0gdGhpcy4jc2Nyb2xsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGJveF9hcmVhID0gYm94LndpZHRoICogYm94LmhlaWdodDtcbiAgICBjb25zdCBodG1sID0gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBodG1sX2FyZWEgPSBodG1sLmNsaWVudFdpZHRoICogaHRtbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKGJveF9hcmVhID4gaHRtbF9hcmVhICogMC41KSB7XG4gICAgICB0aGlzLiN0YWJsZS5wcmVwZW5kKHRoaXMuI2Nsb3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgZm9jdXMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgIH0gZWxzZSB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcblxuICAgIHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwicmVzaXplXCIsXG4gICAgICB0aGlzLiN3aW5kb3dfcmVzaXplX2hhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfSxcbiAgICApO1xuICAgIHRoaXMuI2lzX29wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VfbWVudSgpIHtcbiAgICBpZiAoIXRoaXMuI2lzX29wZW4pIHJldHVybjtcbiAgICB0aGlzLiNpc19vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwib3BlblwiKTtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmZvY3VzKCk7XG4gICAgICAvL0B0cy1leHBlY3QtZXJyb3IgT3ZlcndyaXRlIHByaXZhdGUgcHJvcGVydHkgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmlzX29wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChEcm9wRG93bkJveCk7XG5jb25zdCBib3ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IERyb3BEb3duQm94KCkpO1xuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vdG9nZ2xlX2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdG9wOiBIVE1MRGl2RWxlbWVudDtcbiAgYm90OiBIVE1MRGl2RWxlbWVudDtcbn1cblxuLyoqVG9nZ2xlIGJ1dHRvbnMsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgbXVsdGkgdG9nZ2xlciovXG5leHBvcnQgY2xhc3MgRm9ybVRvZ2dsZUJ1dHRvbjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIC8qKlJldHVybnMgdGhlIG5hbWUgdXNlZCB0byBkZWZpbmUgdGhlIGVsZW1lbnQqL1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRvZ2dsZWJ1dHRvblwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHRoaXMuI2FkZF9zZWxlY3Rpb24oc2VsZWN0aW9uc1tpXSkpO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2goc2VsZWN0aW9uc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICAjYWRkX3NlbGVjdGlvbihzZWxlY3Rpb246IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD4pIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHRvcC50YWJJbmRleCA9IDA7XG4gICAgY29uc3QgYm90ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoc2VsZWN0aW9uLmljb24pIHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZChzZWxlY3Rpb24uaWNvbigpKTtcbiAgICAgIGJvdC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIH0gZWxzZSB0b3AudGV4dENvbnRlbnQgPSBzZWxlY3Rpb24udGV4dDtcbiAgICBjb25zdCBjbGljayA9ICgpID0+IHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soc2VsZWN0aW9uLnZhbHVlKTtcbiAgICB9O1xuICAgIHRvcC5vbmNsaWNrID0gY2xpY2s7XG4gICAgYm90Lm9uY2xpY2sgPSBjbGljaztcbiAgICB0b3Aub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCIgXCIgfHwgZS5rZXkgPT09IFwiRW50ZXJcIikgY2xpY2soKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3NlbGVjdF9hZGphY2VudChmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4geyB0b3AsIGJvdCB9O1xuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHNlbCkgc2VsLnRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIG9wdC50b3AuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgb3B0LmJvdC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG9wdC50b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRvZ2dsZUJ1dHRvbik7XG5cbi8qKkNyZWF0ZXMgYSB0b2dnbGUgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdG9nZ2xlX2J1dHRvbjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ub2dnbGVCdXR0b248UlQsIElEPiB7XG4gIGNvbnN0IHRvZ2cgPSBuZXcgRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyh0b2dnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRvZ2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4uL3NoYXJlZFwiO1xuaW1wb3J0IFwiLi9zcGFjZXIuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVNwYWNlck9wdGlvbnMge1xuICAvKipTcGFjaW5nIGFtb3VudCAgKi9cbiAgc3BhY2U/OiBudW1iZXI7XG59XG5cbmNsYXNzIEZvcm1TcGFjZXIgZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3BhY2VyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2Ygc3BhY2UsIGluIHJlbSAqL1xuICBzZXQgc3BhY2Uoc3BhY2U6IG51bWJlcikge1xuICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gYCR7c3BhY2V9cmVtYDtcbiAgfVxuICBnZXQgc3BhY2UoKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5zdHlsZS5oZWlnaHQpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3BhY2VyKTtcblxuLyoqQ3JlYXRlcyBhIHNwYWNlciBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3NwYWNlcihvcHRpb25zPzogRm9ybVNwYWNlck9wdGlvbnMpOiBGb3JtU3BhY2VyIHtcbiAgY29uc3Qgc3BhY2VyID0gbmV3IEZvcm1TcGFjZXIoKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zcGFjZSkgc3BhY2VyLnNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgfVxuICByZXR1cm4gc3BhY2VyO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2NvbG9yX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29sb3JJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipXaGV0aGVyIHRoZSBjb2xvciBpbnB1dCBzaG91bGQgdXBkYXRlIGxpdmUqL1xuICBsaXZlPzogYm9vbGVhbjtcbn1cblxuY2xhc3MgRm9ybUNvbG9ySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImNvbG9yaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiY29sb3JcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBzZXQgbGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNsaXZlID0gdmFsO1xuICB9XG4gIGdldCBsaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsaXZlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIiMwMDAwMDBcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQ29sb3JJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2NvbG9yX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Db2xvcklucHV0T3B0aW9uczxJRCwgc3RyaW5nPixcbik6IEZvcm1Db2xvcklucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1Db2xvcklucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgaW5wdXQubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2FjdGlvbl9jYWxlbmRhcl9tb250aF9yb3VuZGVkLFxuICBtYXRlcmlhbF9hY3Rpb25fc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfYWN0aW9uX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfYWN0aW9uX3NjaGVkdWxlX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLndhcm5faW5wdXQudmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5EQVRFKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKG5ldyBEYXRlKHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyKSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5TVFJJTkcpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlIGFzIFJUKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLk5VTUJFUilcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlciBhcyBSVCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIHNldCB0eXBlKHR5cGU6IEZvcm1EYXRlVGltZVR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5EQVRFKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLlRJTUUpIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0aW1lXCI7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURVRJTUUpXG4gICAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgZ2V0IHN0ZXAoKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLndhcm5faW5wdXQuc3RlcCk7XG4gIH1cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgc3RlcChzdGVwOiBudW1iZXIpIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFN0cmluZyhzdGVwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNtb2RlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLk5VTUJFUjtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5TVFJJTkc7XG4gICAgICBlbHNlIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuREFURTtcbiAgICB9XG4gICAgbGV0IHRpbWU6IG51bWJlcjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB0aW1lID0gdmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aW1lID0gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKTtcbiAgICBlbHNlIHRpbWUgPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgPSB0aW1lO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1EYXRlVGltZUlucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZGF0ZV90aW1lX2lucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRGF0ZVRpbWVJbnB1dE9wdGlvbnM8UlQsIElEPik6IEZvcm1EYXRlVGltZUlucHV0PFJULCBJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy50eXBlKSBpbnB1dC50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgZ2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgSVBBZGRyZXNzLFxuICBJUFZlcnNpb24sXG4gIHNldF9jdXJzb3JfZW5kLFxuICBzZXRfc2VsZWN0aW9uX2FsbCxcbiAgc2xlZXAsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9pcF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXBJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8SVBBZGRyZXNzLCBJRD4ge1xuICAvKipJcCBhZGRyZXNzIHR5cGUsIHRoaXMgaXMgb3ZlcndyaXR0ZW4gaWYgc3VwcGxpZWQgd2l0aCBhbiBpcGFkZHJlc3Mgd2l0aCBhIGRpZmZlcmVudCB0eXBlKi9cbiAgdHlwZTogSVBWZXJzaW9uO1xufVxuXG5jbGFzcyBGb3JtSXBJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgSVBBZGRyZXNzLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiaXBpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdHlwZTogSVBWZXJzaW9uO1xuICAjcGFydHM6IEhUTUxEaXZFbGVtZW50W10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA4IH0sIChfLCBpKSA9PiB7XG4gICAgY29uc3QgaW5wID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoaSA8IDcpIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAgIGlucC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBpbnAub25iZWZvcmVpbnB1dCA9IGFzeW5jIChldikgPT4ge1xuICAgICAgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vQmFja3NwYWNlXG4gICAgICBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIpIHtcbiAgICAgICAgaWYgKGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDAgJiYgaSA+IDApIHtcbiAgICAgICAgICBzZXRfY3Vyc29yX2VuZChpbnAucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlXG4gICAgICB9IGVsc2UgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPCBsZW5ndGggLSAxKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICAgICAgKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2LmRhdGEpIHtcbiAgICAgICAgLy9DaGVjayBmb3IgLiBvciA6XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXYuZGF0YSA9PT0gXCIuXCIgfHwgZXYuZGF0YSA9PT0gXCI6XCIgfHwgZXYuZGF0YSA9PT0gXCIsXCIpICYmXG4gICAgICAgICAgaSA8IGxlbmd0aCAtIDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvL0NoZWNrIGZvciB2YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICFldi5kYXRhLm1hdGNoKFxuICAgICAgICAgICAgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gL15bXFxkXSokLyA6IC9eW1xcZEEtRmEtZl0qJC8sXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy9QcmV2ZW50IHRvbyBsb25nIHZhbHVlc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID49ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogNClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvL1ByZXZlbnQgdG9vIGJpZyB2YWx1ZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwb3MgPSBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCk7XG4gICAgICAgICAgY29uc3QgcG90ZW50aWFsID1cbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgIGV2LmRhdGEgK1xuICAgICAgICAgICAgaW5wLnRleHRDb250ZW50LnNsaWNlKHBvcyk7XG4gICAgICAgICAgY29uc3QgbnVtID1cbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNFxuICAgICAgICAgICAgICA/IHBhcnNlSW50KHBvdGVudGlhbCwgMTApXG4gICAgICAgICAgICAgIDogcGFyc2VJbnQocG90ZW50aWFsLCAxNik7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCAmJiBudW0gPiAyNTUpIHx8XG4gICAgICAgICAgICAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY2ICYmIG51bSA+IDY1NTM1KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGVsc2UgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpICYmXG4gICAgICAgIGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gaW5wLnRleHRDb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICBpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaW5wLm9ua2V5ZG93biA9IGFzeW5jIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiKSB7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93TGVmdFwiICYmIGkgPiAwKSB7XG4gICAgICAgIGlmIChnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IDAgfHwgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICBzZXRfY3Vyc29yX2VuZChpbnAucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgJiYgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gaW5wLnRleHRDb250ZW50Lmxlbmd0aCB8fFxuICAgICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDBcbiAgICAgICAgKVxuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICB9IGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiBpbnA7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IElQVmVyc2lvbiwgaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNwYXJ0cy5pbmNsdWRlcyhlLnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiNwYXJ0c1t0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogN10pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmRibGNsaWNrID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcykgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0X3NlbGVjdGlvbl9hbGwodGhpcy4jcGFydHNbMF0pO1xuICAgIH07XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIHRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLnZhbHVlX2FzX2lwKTtcbiAgICB9KTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uY29weSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLmNsaXBib2FyZERhdGE/LnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRoaXMudmFsdWVfYXNfaXAudG9fc3RyaW5nKCkpO1xuICAgIH07XG4gICAgdGhpcy5vbnBhc3RlID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhc3RlID0gZS5jbGlwYm9hcmREYXRhPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKSB8fCBcIlwiO1xuICAgICAgY29uc3QgbmV3X2lwID0gbmV3IElQQWRkcmVzcyhwYXN0ZSk7XG4gICAgICBpZiAobmV3X2lwLnZlcnNpb24gIT09IHRoaXMuI3R5cGUpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKG5ld19pcCk7XG4gICAgfTtcbiAgfVxuXG4gIGdldCB2YWx1ZV9hc19pcCgpOiBJUEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgSVBBZGRyZXNzKFxuICAgICAgdGhpcy4jcGFydHNcbiAgICAgICAgLnNsaWNlKDAsIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAucmVkdWNlKChhY2MsIHBhcnQsIGkpID0+IHtcbiAgICAgICAgICBhY2MgKz0gcGFydC5pbm5lclRleHQ7XG4gICAgICAgICAgaWYgKGkgPCAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMSlcbiAgICAgICAgICAgIGFjYyArPSB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFwiXCIpLFxuICAgICk7XG4gIH1cblxuICBzZXQgdHlwZSh2YWw6IElQVmVyc2lvbikge1xuICAgIGlmICh0aGlzLiN0eXBlID09PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLiN0eXBlID0gdmFsO1xuICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZShcImlwdjRcIiwgdmFsID09PSBJUFZlcnNpb24uVjQpO1xuICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZShcImlwdjZcIiwgdmFsID09PSBJUFZlcnNpb24uVjYpO1xuICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgLi4udGhpcy4jcGFydHNcbiAgICAgICAgLnNsaWNlKDAsIHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpXG4gICAgICAgIC5mbGF0TWFwKCh2LCBpKSA9PlxuICAgICAgICAgIGkgPCAodmFsID09PSBJUFZlcnNpb24uVjQgPyA0IDogOCkgLSAxXG4gICAgICAgICAgICA/IFt2LCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWwgPT09IElQVmVyc2lvbi5WNCA/IFwiLlwiIDogXCI6XCIpXVxuICAgICAgICAgICAgOiBbdl0sXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBJUEFkZHJlc3MpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGUgPSB2YWwudmVyc2lvbjtcbiAgICB2YWwuYXNfYXJyYXkuZm9yRWFjaCgocGFydCwgaSkgPT4ge1xuICAgICAgdGhpcy4jcGFydHNbaV0udGV4dENvbnRlbnQgPVxuICAgICAgICB2YWwudmVyc2lvbiA9PT0gSVBWZXJzaW9uLlY0ID8gcGFydC50b1N0cmluZygpIDogcGFydC50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jcGFydHMuZm9yRWFjaCgocGFydCkgPT4ge1xuICAgICAgcGFydC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUlwSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgY29sb3IgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9pcF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM6IElwSW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1JcElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1JcElucHV0PElEPihvcHRpb25zLnR5cGUsIG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUsIEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9wYXNzd29yZF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVBhc3N3b3JkSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPHN0cmluZywgSUQ+IHtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgcGFzc3dvcmQgaW5wdXQgKi9cbiAgZmlsdGVyPzogUmVnRXhwO1xufVxuXG5jbGFzcyBGb3JtUGFzc3dvcmRJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwicGFzc3dvcmRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJwYXNzd29yZFwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25iZWZvcmVpbnB1dCA9IChldikgPT4ge1xuICAgICAgaWYgKGV2LmRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZXYuZGF0YSkpIHtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUGFzc3dvcmRJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Bhc3N3b3JkX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtUGFzc3dvcmRJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtUGFzc3dvcmRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2V0X2N1cnNvcl9lbmQsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBub25lLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVN0cmluZ1JlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHsgc3RyaW5nX2J5dGVfbGVuZ3RoLCBzdHJpbmdfYnl0ZV9saW1pdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0cmluZ1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidGV4dGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG4gICNtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAjbWF4X2J5dGVzPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4gdGhpcy4jc2V0KCk7XG4gICAgdGhpcy5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLndhcm5faW5wdXQudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLndhcm5faW5wdXQudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53YXJuX2lucHV0LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMud2Fybl9pbnB1dC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0SW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgc2luZ2xlIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtVGV4dElucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyKSBpbnB1dC5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IG1hdGVyaWFsX2VkaXRvcl9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2VkaXRvcl9kcmFnX2hhbmRsZV9yb3VuZGVkKCkpO1xuICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiN2YWx1ZV9ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3Qgc3RhcnRfeSA9IGUuY2xpZW50WTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGR5ID0gZXYuY2xpZW50WSAtIHN0YXJ0X3k7XG4gICAgICAgIHRoaXMuI3ZhbHVlX2JveC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHQgKyBkeX1weGA7XG4gICAgICB9O1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJ1cCA9IChfZXYpID0+IHtcbiAgICAgICAgdGhpcy4jcmVzaXplci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy4jdmFsdWVfYm94LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmIGUuY3RybEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuI3NldCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVfYm94LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0TXVsdGlsaW5lKTtcblxuLyoqQ3JlYXRlcyBhIG11bHRpIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfbXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0TXVsdGlsaW5lPElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0TXVsdGlsaW5lPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHQuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVRleHRPcHRpb25zIHtcbiAgLyoqQnV0dG9ucyB0ZXh0ICovXG4gIHRleHQ/OiBzdHJpbmc7XG4gIC8qKlRleHQgc2l6ZSAqL1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipDb21wb25lbnQgZm9yIHNpbXBsZSB0ZXh0ICovXG5jbGFzcyBGb3JtVGV4dCBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLnNpemUpIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB0ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cmVtYDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHQpO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dChvcHRpb25zOiBGb3JtVGV4dE9wdGlvbnMpOiBGb3JtVGV4dCB7XG4gIHJldHVybiBuZXcgRm9ybVRleHQob3B0aW9ucyk7XG59XG4iLCJpbXBvcnQgeyBGb3JtQ29sb3JzIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgZm9ybV9idXR0b24gfSBmcm9tIFwiLi9ib29sZWFuL2J1dHRvbi9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fbGFtcCB9IGZyb20gXCIuL2Jvb2xlYW4vbGFtcC9sYW1wXCI7XG5pbXBvcnQgeyBmb3JtX3N3aXRjaCB9IGZyb20gXCIuL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaFwiO1xuaW1wb3J0IHsgZm9ybV9ncm91cCB9IGZyb20gXCIuL2dyb3VwL2dyb3VwXCI7XG5pbXBvcnQgeyBmb3JtX2xpc3RfZmllbGQgfSBmcm9tIFwiLi9saXN0L2xpc3RfZmllbGRcIjtcbmltcG9ydCB7IGZvcm1fbnVtYmVyX2lucHV0IH0gZnJvbSBcIi4vbnVtYmVyL251bWJlcklucHV0L251bWJlcl9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wcm9ncmVzcyB9IGZyb20gXCIuL251bWJlci9wcm9ncmVzcy9wcm9ncmVzc1wiO1xuaW1wb3J0IHsgZm9ybV9zbGlkZXIgfSBmcm9tIFwiLi9udW1iZXIvc2xpZGVyL3NsaWRlclwiO1xuaW1wb3J0IHsgZm9ybV9zdGVwcGVyIH0gZnJvbSBcIi4vbnVtYmVyL3N0ZXBwZXIvc3RlcHBlclwiO1xuaW1wb3J0IHsgZm9ybV9kcm9wZG93biB9IGZyb20gXCIuL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duXCI7XG5pbXBvcnQgeyBmb3JtX3RvZ2dsZV9idXR0b24gfSBmcm9tIFwiLi9zZWxlY3RvcnMvdG9nZ2xlX2J1dHRvbi90b2dnbGVfYnV0dG9uXCI7XG5pbXBvcnQgeyBmb3JtX3NwYWNlciB9IGZyb20gXCIuL3NwYWNpbmcvc3BhY2VyXCI7XG5pbXBvcnQgeyBmb3JtX2NvbG9yX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dFwiO1xuaW1wb3J0IHtcbiAgZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG59IGZyb20gXCIuL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9pcF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvaXAvaXBfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fcGFzc3dvcmRfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3RleHRfaW5wdXQgfSBmcm9tIFwiLi90ZXh0L2lucHV0L3RleHRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9tdWx0aWxpbmUgfSBmcm9tIFwiLi90ZXh0L211bHRpTGluZS90ZXh0X211bHRpX2xpbmVcIjtcbmltcG9ydCB7IGZvcm1fdGV4dCB9IGZyb20gXCIuL3RleHQvdGV4dC90ZXh0XCI7XG5cbi8qKkZvcm0gZWxlbWVudHMgd2l0aCBsYWJlbCAqL1xuZXhwb3J0IGNvbnN0IGZvcm0gPSB7XG4gIEZvcm1Db2xvcnMsXG5cbiAgLy9Cb29sZWFuXG4gIGJ1dHRvbjogZm9ybV9idXR0b24sXG4gIHN3aXRjaDogZm9ybV9zd2l0Y2gsXG4gIGxhbXA6IGZvcm1fbGFtcCxcbiAgLy9Hcm91cFxuICBncm91cDogZm9ybV9ncm91cCxcblxuICAvL1NwZWNpYWxcbiAgY29sb3JfaW5wdXQ6IGZvcm1fY29sb3JfaW5wdXQsXG4gIGRhdGVfdGltZV9pbnB1dDogZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG4gIGlwX2lucHV0OiBmb3JtX2lwX2lucHV0LFxuICBwYXNzd29yZF9pbnB1dDogZm9ybV9wYXNzd29yZF9pbnB1dCxcblxuICAvL051bWJlclxuICBwcm9ncmVzczogZm9ybV9wcm9ncmVzcyxcbiAgaW5wdXRfbnVtYmVyOiBmb3JtX251bWJlcl9pbnB1dCxcbiAgc2xpZGVyOiBmb3JtX3NsaWRlcixcbiAgc3RlcHBlcjogZm9ybV9zdGVwcGVyLFxuXG4gIC8vU2VsZWN0b3JzXG4gIGRyb3Bkb3duOiBmb3JtX2Ryb3Bkb3duLFxuICB0b2dnbGVfYnV0dG9uOiBmb3JtX3RvZ2dsZV9idXR0b24sXG5cbiAgLy9TcGFjaW5nXG4gIHNwYWNlcjogZm9ybV9zcGFjZXIsXG5cbiAgLy9UZXh0XG4gIHRleHQ6IGZvcm1fdGV4dCxcbiAgaW5wdXRfdGV4dDogZm9ybV90ZXh0X2lucHV0LFxuICBtdWx0aWxpbmVfdGV4dDogZm9ybV90ZXh0X211bHRpbGluZSxcblxuICAvL0xpc3RcbiAgbGlzdF9maWVsZDogZm9ybV9saXN0X2ZpZWxkLFxufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm07XG5cbmV4cG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgeyBGb3JtRGF0ZVRpbWVUeXBlIH0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVVBLE1BQU0sYUFBYSx5QkFDakIsUUFDQSxvQkFDQSx1Q0FDRDtBQVFpQixXQUFXLGVBQzNCLFFBQ0EsYUFDQSwrQ0FDRCxDQUNTLGNBQ1IsVUFDQSxvQkFDQSxxREFDQSxnQkFDQSxnQkFDQSxVQUNBLEtBQUEsRUFDRDtBQVVELE1BQU0sU0FBUyxXQUFXLGVBQ3hCLFVBQ0EsVUFDQSxtQ0FDRDtBQVFELE1BQU0s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
2519
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiN2YWx1ZV9lbGVtZW50cyIsIiNjb2xsYXBzaWJsZSIsIiNjb2xsYXBzZV9idXR0b24iLCIjY29sbGFwc2VkIiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cC50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJJbnB1dC9udW1iZXJfaW5wdXQudHMiLCIuLi9zcmMvbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzLnRzIiwiLi4vc3JjL251bWJlci9zbGlkZXIvc2xpZGVyLnRzIiwiLi4vc3JjL251bWJlci9zdGVwcGVyL3N0ZXBwZXIudHMiLCIuLi9zcmMvc2VsZWN0b3JzL3NlbGVjdG9yX2Jhc2UudHMiLCIuLi9zcmMvc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd24udHMiLCIuLi9zcmMvc2VsZWN0b3JzL3RvZ2dsZV9idXR0b24vdG9nZ2xlX2J1dHRvbi50cyIsIi4uL3NyYy9zcGFjaW5nL3NwYWNlci50cyIsIi4uL3NyYy9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2lwL2lwX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXQudHMiLCIuLi9zcmMvdGV4dC9pbnB1dC90ZXh0X2lucHV0LnRzIiwiLi4vc3JjL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZS50cyIsIi4uL3NyYy90ZXh0L3RleHQvdGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCTFVFLFxuICBHUkVFTixcbiAgR1JFWSxcbiAgT1JBTkdFLFxuICBSRUQsXG4gIFlFTExPVyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29sb3JzXCI7XG5pbXBvcnQgeyB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuXG5jb25zdCB0aGVtZV9yb290ID0gdGhlbWVfaW5pdF92YXJpYWJsZV9yb290KFxuICBcImZvcm1cIixcbiAgXCJVSSBGb3JtIEVsZW1lbnRzXCIsXG4gIFwiVGhlbWUgdmFyaWFibGVzIGZvciBVSSBmb3JtIEVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX18gICAgIF9fX18gIF8gICBfIF8gIF9fICAgICBfX1xuLy8gICAgIHwgIF9fIFxcfCAgX19fX3wgICAvXFwgICB8ICBfXyBcXCAgIC8gX18gXFx8IFxcIHwgfCB8IFxcIFxcICAgLyAvXG4vLyAgICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHwgfCB8ICB8IHwgIFxcfCB8IHwgIFxcIFxcXy8gL1xuLy8gICAgIHwgIF8gIC98ICBfX3wgICAvIC9cXCBcXCB8IHwgIHwgfCB8IHwgIHwgfCAuIGAgfCB8ICAgXFwgICAvXG4vLyAgICAgfCB8IFxcIFxcfCB8X19fXyAvIF9fX18gXFx8IHxfX3wgfCB8IHxfX3wgfCB8XFwgIHwgfF9fX198IHxcbi8vICAgICB8X3wgIFxcX1xcX19fX19fL18vICAgIFxcX1xcX19fX18vICAgXFxfX19fL3xffCBcXF98X19fX19ffF98XG5jb25zdCByZWFkX29ubHkgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInJlYWRcIixcbiAgXCJSZWFkIE9ubHlcIixcbiAgXCJTZXR0aW5ncyBmb3IgZm9ybSBlbGVtZW50cyBpbiByZWFkIG9ubHkgbW9kZVwiLFxuKTtcbnJlYWRfb25seS5tYWtlX3ZhcmlhYmxlKFxuICBcImZpbHRlclwiLFxuICBcIlJlYWQgT25seSBGaWx0ZXJcIixcbiAgXCJGaWx0ZXIgYXBwbGllZCB0byBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwiRmlsdGVyXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJjb2xvcnNcIixcbiAgXCJDb2xvcnNcIixcbiAgXCJDb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgICAgIHwgfCAgfCAgX198ICAgPiA8ICAgIHwgfCAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc190ZXh0ID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcInRleHRcIixcbiAgXCJUZXh0IENvbG9yc1wiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcImxhYmVsXCIsXG4gIFwiTGFiZWwgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnRzIGxhYmVsc1wiLFxuICBHUkVZW1wiNzAwXCJdLFxuICBHUkVZW1wiMzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlVuc2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI2MDBcIl0sXG4gIEdSRVlbXCI0MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgX19fXyAgXyAgICAgICAgICAgICAgIF9fX19fIF8gIF9fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgfCAgXyBcXHwgfCAgICAgICAgL1xcICAgLyBfX19ffCB8LyAvXG4vLyAgICAgICAgfCB8ICB8IHxfXyAgIFxcIFYgLyAgIHwgfCAgICB8IHxfKSB8IHwgICAgICAgLyAgXFwgfCB8ICAgIHwgJyAvXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgIF8gPHwgfCAgICAgIC8gL1xcIFxcfCB8ICAgIHwgIDxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF8pIHwgfF9fX18gLyBfX19fIFxcIHxfX19ffCAuIFxcXG4vLyAgICAgICAgfF98ICB8X19fX19fL18vIFxcX1xcICB8X3wgICAgfF9fX18vfF9fX19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxcbi8vXG4vL1xuY29uc3QgY29sb3JzX3RleHRfYmxhY2sgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dEJsYWNrXCIsXG4gIFwiVGV4dCBDb2xvcnMgQmxhY2sgQmFja2dyb3VuZFwiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgZm9yIGJsYWNrIGJhY2tncm91bmQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiMjAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNTBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHRfYmxhY2subWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fIF9fX19fIF9fX18gIF8gICBfICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF8gICBfLyBfX19fLyBfXyBcXHwgXFwgfCB8ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAgXFx8IHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAuIGAgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgX3wgfHwgfF9fX3wgfF9ffCB8IHxcXCAgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX19fXFxfX19fX1xcX19fXy98X3wgXFxffCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19pY29uID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImljb25cIixcbiAgXCJJY29uIENvbG9yc1wiLFxuICBcIkljb24gY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2YgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjkwMFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgX19fX18gXyAgX19fX19fXyBfX19fXyAgIF9fX18gIF8gICAgXyBfICAgXyBfX19fXyAgICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8ICBfIFxcICAgL1xcICAgLyBfX19ffCB8LyAvIF9fX198ICBfXyBcXCAvIF9fIFxcfCB8ICB8IHwgXFwgfCB8ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IC8gIFxcIHwgfCAgICB8ICcgLyB8ICBfX3wgfF9fKSB8IHwgIHwgfCB8ICB8IHwgIFxcfCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8ICBfIDwgLyAvXFwgXFx8IHwgICAgfCAgPHwgfCB8XyB8ICBfICAvfCB8ICB8IHwgfCAgfCB8IC4gYCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSAvIF9fX18gXFwgfF9fX198IC4gXFwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X198IHwgfFxcICB8IHxfX3wgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX18vXy8gICAgXFxfXFxfX19fX3xffFxcX1xcX19fX198X3wgIFxcX1xcXFxfX19fLyBcXF9fX18vfF98IFxcX3xfX19fXy8gICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JhY2tncm91bmQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcIkJhY2tncm91bmQgQ29sb3JzXCIsXG4gIFwiQmFja2dyb3VuZCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJob3ZlclwiLFxuICBcIkhvdmVyIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHMgd2hlbiBob3ZlcmluZ1wiLFxuICBHUkVZW1wiNDAwXCJdLFxuICBHUkVZW1wiNzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kc1wiLFxuICBHUkVZW1wiMzAwXCJdLFxuICBHUkVZW1wiODAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgIF9fX18gIF9fX19fICBfX19fXyAgX19fX19fIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgLyBfXyBcXHwgIF9fIFxcfCAgX18gXFx8ICBfX19ffCAgX18gXFwgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCB8ICB8IHwgfF9fKSB8IHwgIHwgfCB8X18gIHwgfF9fKSB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPHwgfCAgfCB8ICBfICAvfCB8ICB8IHwgIF9ffCB8ICBfICAvICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSB8IHxfX3wgfCB8IFxcIFxcfCB8X198IHwgfF9fX198IHwgXFwgXFwgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy8gXFxfX19fL3xffCAgXFxfXFxfX19fXy98X19fX19ffF98ICBcXF9cXCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19ib3JkZXIgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYm9yZGVyXCIsXG4gIFwiQm9yZGVyIENvbG9yc1wiLFxuICBcIkJvcmRlciBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQm9yZGVyIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygbm9ybWFsIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX18gX19fXyAgIF9fX19fIF8gICAgXyAgX19fX19cbi8vICAgICB8ICBfX19fLyBfXyBcXCAvIF9fX198IHwgIHwgfC8gX19fX3xcbi8vICAgICB8IHxfXyB8IHwgIHwgfCB8ICAgIHwgfCAgfCB8IChfX19cbi8vICAgICB8ICBfX3x8IHwgIHwgfCB8ICAgIHwgfCAgfCB8XFxfX18gXFxcbi8vICAgICB8IHwgICB8IHxfX3wgfCB8X19fX3wgfF9ffCB8X19fXykgfFxuLy8gICAgIHxffCAgICBcXF9fX18vIFxcX19fX198XFxfX19fL3xfX19fXy9cbmNvbnN0IGNvbG9yc19mb2N1cyA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb2N1c1wiLFxuICBcIkZvY3VzIENvbG9yc1wiLFxuICBcIkZvY3VzIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2ZvY3VzLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiRm9jdXMgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb2N1c3NlZCBmb3JtIGVsZW1lbnRcIixcbiAgT1JBTkdFW1wiNjAwXCJdLFxuICBPUkFOR0VbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAgLyBfX19ffF8gICBfLyBfX19ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgIHwgKF9fXyAgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXCAgXFxfX18gXFwgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCBfX19fKSB8X3wgfHwgfF9fX18gIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19fL3xfX19fX1xcX19fX198ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2Jhc2ljID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImJhc2ljXCIsXG4gIFwiQmFzaWMgQ29sb3JzXCIsXG4gIFwiQmFzaWMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJncmVlblwiLFxuICBcIkJhc2ljIEdyZWVuIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCBncmVlbiBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRUVOW1wiMzAwXCJdLFxuICBHUkVFTltcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwicmVkXCIsXG4gIFwiQmFzaWMgUmVkIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCByZWQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBSRURbXCIzMDBcIl0sXG4gIFJFRFtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwiYmx1ZVwiLFxuICBcIkJhc2ljIEJsdWUgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGJsdWUgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBCTFVFW1wiMzAwXCJdLFxuICBCTFVFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJ5ZWxsb3dcIixcbiAgXCJCYXNpYyBZZWxsb3cgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHllbGxvdyBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFlFTExPV1tcIjMwMFwiXSxcbiAgT1JBTkdFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fXyBfX19fX19fX19fX18gIF9fX19fXG4vLyAgICAgIC8gX19fX3xfICAgX3xfX18gIC8gIF9fX198LyBfX19ffFxuLy8gICAgIHwgKF9fXyAgIHwgfCAgICAvIC98IHxfXyAgfCAoX19fXG4vLyAgICAgIFxcX19fIFxcICB8IHwgICAvIC8gfCAgX198ICBcXF9fXyBcXFxuLy8gICAgICBfX19fKSB8X3wgfF8gLyAvX198IHxfX19fIF9fX18pIHxcbi8vICAgICB8X19fX18vfF9fX19fL19fX19ffF9fX19fX3xfX19fXy9cbmNvbnN0IHNpemVzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJzaXplXCIsXG4gIFwiU2l6ZVwiLFxuICBcIlNpemVzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwiaGVpZ2h0XCIsXG4gIFwiSGVpZ2h0XCIsXG4gIFwiRGVmYXVsdCBoZWlnaHQgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjEuNnJlbVwiLFxuICBcIjEuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG5zaXplcy5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoSGVpZ2h0XCIsXG4gIFwiVG91Y2ggSGVpZ2h0XCIsXG4gIFwiTWluaW11bSBoZWlnaHQgZm9yIHRvdWNoIGRldmljZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjIuNnJlbVwiLFxuICBcIjIuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8gICAgICBfX19fX18gX19fXyAgXyAgIF8gX19fX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcfCBcXCB8IHxfXyAgIF9ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8ICBcXHwgfCAgfCB8XG4vLyAgICAgfCAgX198fCB8ICB8IHwgLiBgIHwgIHwgfFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxcXCAgfCAgfCB8XG4vLyAgICAgfF98ICAgIFxcX19fXy98X3wgXFxffCAgfF98XG5jb25zdCBmb250ID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb250XCIsXG4gIFwiRm9udFwiLFxuICBcIkZvbnQgc2V0dGluZ3MgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInNpemVcIixcbiAgXCJGb250IFNpemVcIixcbiAgXCJEZWZhdWx0IGZvbnQgc2l6ZSB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMXJlbVwiLFxuICBcIjFyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG4vKipDb2xvcnMgZm9yIGZvcm0gZWxlbWVudHMgdGhhdCBoYXZlIHNlbGVjdGFibGUgY29sb3JzKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29sb3JzID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgQmxhY2s6IFwiYmxhY2tcIixcbiAgR3JlZW46IFwiZ3JlZW5cIixcbiAgUmVkOiBcInJlZFwiLFxuICBCbHVlOiBcImJsdWVcIixcbiAgWWVsbG93OiBcInllbGxvd1wiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Db2xvcnMgPSAodHlwZW9mIEZvcm1Db2xvcnMpW2tleW9mIHR5cGVvZiBGb3JtQ29sb3JzXTtcblxuLyoqU2hhcmVkIGNvbXBvbmVudCBjbGFzcyBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBpbmhlcml0IGZyb20qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1FbGVtZW50IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gICBfX19fXyAgX19fX19fICAgICAgICAgIF9fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcXG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHxcbi8vICAgICAgIFxcIFxcLyAvIC9cXCBcXCB8IHwgICB8IHwgIHwgfCAgX198ICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8XG4vLyAgICAgICAgIFxcL18vICAgIFxcX1xcX19fX19fXFxfX19fL3xfX19fX198IHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy9cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsdWVPcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvKipJRCBmb3JtIGZvcm0gZWxlbWVudCAqL1xuICBpZD86IElEO1xuICAvKipWYWx1ZSBmb3IgZm9ybSBlbGVtZW50ICovXG4gIHZhbHVlPzogUlQ7XG4gIHZhbHVlX2J5X3N0YXRlPzogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPjtcbiAgLyoqTG9uZ2VyIGRlc2NyaXB0aW9uIHdoYXQgZm9ybSBlbGVtZW50IGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKkNoYW5nZSBsaXN0ZW5lciBmdW5jdGlvbiovXG4gIGNoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xufVxuXG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtVmFsdWU8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSBlbGVtZW50LmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICBpZiAob3B0aW9ucy52YWx1ZV9ieV9zdGF0ZSkgZWxlbWVudC52YWx1ZV9ieV9zdGF0ZSA9IG9wdGlvbnMudmFsdWVfYnlfc3RhdGU7XG4gICAgZWxzZSBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1faWQ6IElEO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybV9pZCA9IGlkIGFzIElEO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqU2V0cyB0aGUgY3VycmVudCBsYWJlbCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCBkZXNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1ZmZlcj86IFJUO1xuICBnZXQgYnVmZmVyKCk6IFJUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0ZT86IFN0YXRlPFJULCBPcHRpb248e30+LCBSVD47XG4gICNmdW5jPzogU3RhdGVTdWI8UmVzdWx0PFJULCBzdHJpbmc+PjtcbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlX2J5X3N0YXRlKHN0YXRlOiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI2Z1bmMpIHRoaXMuZGV0YWNoX3N0YXRlKHRoaXMuI2Z1bmMpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGUoc3RhdGUsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbC5vaykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWwudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuI2Vycm9yKSB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgdGhpcy5lcnJvciA9IHZhbC5lcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHN0YXRlLnJlbGF0ZWQoKTtcbiAgICAgIGlmIChyZWxhdGVkLnNvbWUpIHRoaXMuc3RhdGVfcmVsYXRlZChyZWxhdGVkLnZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5zdGF0ZV9yZWxhdGVkKHt9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVxuICAgICAgPyBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIilcbiAgICAgIDogdHlwZW9mIHRoaXMuX2J1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IGVycihcIk5vIHZhbHVlIHlldFwiKVxuICAgICAgICA6IG9rKHRoaXMuX2J1ZmZlcik7XG4gIH1cblxuICAjZXJyb3IgPSBmYWxzZTtcbiAgc2V0IGVycm9yKGVycjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5uZXdfZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuI2Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2Vycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gICAgICB0aGlzLiNlcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKkNsZWFycyB0aGUgdmFsdWUgYW5kIGVycm9yIG9mIHRoZSBjb21wb25lbnQgaWYgbm90IHN0YXRlIGJhc2VkKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSByZXR1cm47XG4gICAgdGhpcy5fYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBzZXQgYnkgdmFsdWUgc2V0dGVyIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZDtcblxuICAvKipDbGVhcnMgZm9ybSBlbGVtZW50IGdyYXBoaWNhbGx5Ki9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsZWFyX3ZhbHVlKCk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgc2V0IGJ5IGVycm9yIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld19lcnJvcih2YWw6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgY2xlYXJlZCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl9lcnJvcigpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIHN0YXRlIGhhcyByZWxhdGVkIGluZm9ybWF0aW9uICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IHt9KTogdm9pZDtcbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gIF9fICAgICAgICAgIF9fX19fX18gIF9fX19fIF9fX19fX18gX19fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgXFwgXFwgICAgICAgIC8gLyAgX18gXFx8XyAgIF98X18gICBfX3wgIF9fX198XG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgIFxcIFxcICAvXFwgIC8gL3wgfF9fKSB8IHwgfCAgICB8IHwgIHwgfF9fXG4vLyAgICAgICBcXCBcXC8gLyAvXFwgXFwgfCB8ICAgfCB8ICB8IHwgIF9ffCAgICAgXFwgXFwvICBcXC8gLyB8ICBfICAvICB8IHwgICAgfCB8ICB8ICBfX3xcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gICAgIFxcICAvXFwgIC8gIHwgfCBcXCBcXCBffCB8XyAgIHwgfCAgfCB8X19fX1xuLy8gICAgICAgICBcXC9fLyAgICBcXF9cXF9fX19fX1xcX19fXy98X19fX19ffCAgICAgXFwvICBcXC8gICB8X3wgIFxcX1xcX19fX198ICB8X3wgIHxfX19fX198XG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWVXcml0ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2Fybl9pbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgI3dhcm5fdGltZW91dD86IG51bWJlcjtcbiAgI2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm5hbWUgPSBcInZhbFwiO1xuICB9XG5cbiAgc2V0IGNoYW5nZShmdW5jOiAodmFsOiBSVCkgPT4gdm9pZCkge1xuICAgIHRoaXMuI2NoYW5nZSA9IGZ1bmM7XG4gIH1cbiAgZ2V0IGNoYW5nZSgpOiAoKHZhbDogUlQpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdCBoYXMgY2hhbmdlZCovXG4gIGdldCBjaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjaGFuZ2VkO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuI3dhcm5fdGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuI3dhcm5fdGltZW91dCk7XG4gICAgdGhpcy4jd2Fybl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICB0aGlzLndhcm5faW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGxpbWl0IHZhbHVlIGVudGVyZWQgKi9cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogUlQpOiBQcm9taXNlTGlrZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS53cml0YWJsZSkgcmV0dXJuIHRoaXMuX3N0YXRlLmxpbWl0KHZhbCk7XG4gICAgICBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUoZXJyKFwiTm90IHdyaXRhYmxlXCIpKTtcbiAgICB9IGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShvayh2YWwpKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlICovXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5jaGVjayh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byB1cGRhdGUgdmFsdWUqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2V0X3ZhbHVlX2xpbWl0KHZhbDogUlQpOiBQcm9taXNlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbWl0ZWQgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbCk7XG4gICAgaWYgKGxpbWl0ZWQuZXJyKSB7XG4gICAgICB0aGlzLndhcm4obGltaXRlZC5lcnJvcik7XG4gICAgICByZXR1cm4gbGltaXRlZDtcbiAgICB9XG4gICAgdGhpcy4jc2V0X3ZhbHVlKGxpbWl0ZWQudmFsdWUpO1xuICAgIHJldHVybiBsaW1pdGVkO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9jaGVjayh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjaGVja2VkID0gYXdhaXQgdGhpcy5jaGVja192YWx1ZSh2YWwpO1xuICAgIGlmIChjaGVja2VkLmVycikge1xuICAgICAgdGhpcy53YXJuKGNoZWNrZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShjaGVja2VkLnZhbHVlKTtcbiAgICByZXR1cm4gY2hlY2tlZDtcbiAgfVxuXG4gICNzZXRfdmFsdWUodmFsOiBSVCkge1xuICAgIGlmICh0aGlzLl9idWZmZXIgPT09IHZhbCkgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICBpZiAodGhpcy4jY2hhbmdlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlKHZhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgdXBkYXRpbmcgY2hhbmdlIGxpc3RlbmVyXCIsIGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmZlcjtcbiAgICAgIHRoaXMuX3N0YXRlLndyaXRlISh2YWwpLnRoZW4oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycikge1xuICAgICAgICAgIGlmIChidWZmICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKGJ1ZmYpO1xuICAgICAgICAgIHRoaXMud2FybihlcnIuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHZhbDtcbiAgICAgIHRoaXMuI2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtQ29sb3JzLFxuICBGb3JtVmFsdWUsXG4gIEZvcm1WYWx1ZVdyaXRlLFxuICB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIEZvcm1CdXR0b25PcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPGJvb2xlYW4sIElEPiB7XG4gIC8qKkJ1dHRvbnMgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBidXR0b24gKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrICovXG4gIG9uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgLyoqU2V0IHRydWUgdG8gbWFrZSBidXR0b24gdG9nZ2xlIG9uIGNsaWNrIGluc3RlYWQgb2Ygbm9ybWFsICovXG4gIHRvZ2dsZT86IGJvb2xlYW47XG4gIC8qKkNoYW5nZXMgdGhlIGJ1dHRvbnMgY29sb3IgKi9cbiAgY29sb3I/OiBGb3JtQ29sb3JzO1xufVxuXG5jbGFzcyBGb3JtQnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0ZXh0OiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI29uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgI3RvZ2dsZT86IGJvb2xlYW47XG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICB9O1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiICYmIGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgIHRoaXMub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldi5wb2ludGVySWQpO1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9udG91Y2hzdGFydCA9IChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgdGhpcy5vbnRvdWNoZW5kID0gKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXYudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgIHRoaXMub250b3VjaGVuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jb25fY2xpY2spIHRoaXMuI29uX2NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25rZXl1cCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGJ1dHRvbiovXG4gIHNldCB0ZXh0KGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0ZXh0LnRleHRDb250ZW50ID0gbGFiZWw7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3RleHQpO1xuICAgIGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrKi9cbiAgc2V0IG9uX2NsaWNrKGZ1bmM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI29uX2NsaWNrID0gZnVuYztcbiAgfVxuICBnZXQgb25fY2xpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uX2NsaWNrO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgY29sb3Igb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBjb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5ld192YWx1ZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE9cIiwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG5cbiAgLyoqQ2hhbmdlcyB3aGV0aGVyIHRoZSBidXR0b24gaXMgbWFpbnRhaW5lZCBvciBtb21lbnRhcnkqL1xuICBzZXQgdG9nZ2xlKHRvZ2dsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3RvZ2dsZSA9IEJvb2xlYW4odG9nZ2xlKTtcbiAgfVxuICBnZXQgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2dnbGU7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1CdXR0b24pO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fYnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1CdXR0b25PcHRpb25zPElEPixcbik6IEZvcm1CdXR0b248SUQ+IHtcbiAgY29uc3QgYnV0dCA9IG5ldyBGb3JtQnV0dG9uPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgYnV0dC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGJ1dHQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jbGljaykgYnV0dC5vbl9jbGljayA9IG9wdGlvbnMub25fY2xpY2s7XG4gICAgaWYgKG9wdGlvbnMudG9nZ2xlKSBidXR0LnRvZ2dsZSA9IG9wdGlvbnMudG9nZ2xlO1xuICAgIGlmIChvcHRpb25zLmNvbG9yKSBidXR0LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhidXR0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gYnV0dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCB0eXBlIEZvcm1Db2xvcnMsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xhbXAuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYW1wT3B0aW9uczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgbGFtcCBjb2xvcnMgKi9cbiAgY29sb3JzOiBDO1xuICAvKipMYW1wIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgbGFtcCAqL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIgfCBib29sZWFuKSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLiNjb2xvcnNbTnVtYmVyKHZhbHVlKV07XG4gICAgaWYgKGNvbG9yKSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgICBlbHNlIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUxhbXApO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZnVuY3Rpb24gZnJvbTxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8XG4gICAgbnVtYmVyLFxuICAgIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLFxuICAgIElEXG4gID4sXG4pOiBGb3JtTGFtcDxudW1iZXIsIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLCBJRD47XG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxib29sZWFuLCBbRm9ybUNvbG9ycywgRm9ybUNvbG9yc10sIElEPixcbik6IEZvcm1MYW1wPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+O1xuZnVuY3Rpb24gZnJvbTxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPFQsIEMsIElEPik6IEZvcm1MYW1wPFQsIEMsIElEPiB7XG4gIGNvbnN0IGxhbXAgPSBuZXcgRm9ybUxhbXA8VCwgQywgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsYW1wLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIGlmIChvcHRpb25zLnRleHQpIGxhbXAudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBsYW1wLmljb24gPSBvcHRpb25zLmljb247XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcywgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF91bmZvbGRfbGVzc19yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTEVWRUwsXG4gIEFOSU1BVElPTl9TUEVFRCxcbiAgQW5pbWF0aW9uTGV2ZWxzLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuXG4vKipEaWZmZXJlbnQgYm9yZGVyIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudCBncm91cCovXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwQm9yZGVyU3R5bGUgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBJbnNldDogXCJpbnNldFwiLFxuICBPdXRzZXQ6IFwib3V0c2V0XCIsXG4gIExpbmU6IFwibGluZVwiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Hcm91cEJvcmRlclN0eWxlID1cbiAgKHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZSlba2V5b2YgdHlwZW9mIEZvcm1Hcm91cEJvcmRlclN0eWxlXTtcblxudHlwZSBFeHRyYWN0QjxBcnIgZXh0ZW5kcyBhbnlbXT4gPSBBcnIgZXh0ZW5kcyBbaW5mZXIgSGVhZCwgLi4uaW5mZXIgVGFpbF1cbiAgPyBIZWFkIGV4dGVuZHMgRm9ybVZhbHVlPGluZmVyIFQsIGluZmVyIElEPlxuICAgID8gW0Zvcm1WYWx1ZTxULCBJRD4sIC4uLkV4dHJhY3RCPFRhaWw+XVxuICAgIDogWy4uLkV4dHJhY3RCPFRhaWw+XVxuICA6IFtdO1xuXG50eXBlIFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwT3B0aW9uczxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBULFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqRWxlbWVudHMgdG8gYWRkIHRvIHRoZSBncm91cCovXG4gIGVsZW1lbnRzPzogWy4uLkxdO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNpYmxlLCBtZWFuaW5nIGl0IGhhcyBhIGJ1dHRvbiB0byBjb2xsYXBzZSBhbmQgZXhwYW5kIGFsbCBjb250ZW50IHRvIHRoZSBzaXplIG9mIHRoYXQgYnV0dG9uKi9cbiAgY29sbGFwc2libGU/OiBib29sZWFuO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNlZCBpbml0aWFsbHkqL1xuICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlIGJ1dHRvbiovXG4gIGNvbGxhcHNlX3RleHQ/OiBzdHJpbmc7XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImdyb3VwXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNjb2xsYXBzaWJsZT86IEhUTUxEaXZFbGVtZW50O1xuICAjY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjb2xsYXBzZV9idXR0b24/OiBIVE1MU3BhbkVsZW1lbnQ7XG4gICN2YWx1ZV9lbGVtZW50czogTWFwPHN0cmluZywgRm9ybVZhbHVlPGFueSwgYW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgc2V0IGVsZW1lbnRzKGVsZW1lbnRzOiBGb3JtRWxlbWVudFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgRm9ybVZhbHVlICYmIGNvbXAuZm9ybV9pZCkge1xuICAgICAgICBpZiAodGhpcy4jdmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5zZXQoY29tcC5mb3JtX2lkIGFzIHN0cmluZywgY29tcCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy4jY29sbGFwc2libGUpIHRoaXMuI2NvbGxhcHNpYmxlLmFwcGVuZENoaWxkKGNvbXApO1xuICAgICAgZWxzZSB0aGlzLmFwcGVuZENoaWxkKGNvbXApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbGVtZW50cygpOiBGb3JtRWxlbWVudFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI3ZhbHVlX2VsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlRoaXMgcGxhY2VzIHRoZSBncm91cCBhdCBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBvbmUgb2YgdGhlIGNvcm5lcnMgb2YgdGhlIGNvbnRhaW5lciovXG4gIHNldCBib3JkZXIoYm9yZGVyOiBGb3JtR3JvdXBCb3JkZXJTdHlsZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLkluc2V0LFxuICAgICAgRm9ybUdyb3VwQm9yZGVyU3R5bGUuT3V0c2V0LFxuICAgICk7XG4gICAgaWYgKGJvcmRlciAmJiBib3JkZXIgIT09IEZvcm1Hcm91cEJvcmRlclN0eWxlLk5vbmUpXG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoYm9yZGVyKTtcbiAgfVxuXG4gIHNldCBjb2xsYXBzaWJsZShjb2xsYXBzaWJsZTogYm9vbGVhbikge1xuICAgIGlmIChjb2xsYXBzaWJsZSAmJiAhdGhpcy4jY29sbGFwc2libGUpIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpXG4gICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnJlcGxhY2VDaGlsZHJlbiguLi50aGlzLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4jY29sbGFwc2libGUpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2libGVcIik7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKFxuICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gfHxcbiAgICAgICAgICAodGhpcy5jb2xsYXBzZV90ZXh0ID0gXCJcIikgfHxcbiAgICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24hLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFjb2xsYXBzaWJsZSAmJiB0aGlzLiNjb2xsYXBzaWJsZSkge1xuICAgICAgdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKC4uLnRoaXMuI2NvbGxhcHNpYmxlLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY29sbGFwc2libGVcIik7XG4gICAgfVxuICB9XG4gIGdldCBjb2xsYXBzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2libGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZWQoY29sbGFwc2VkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB7XG4gICAgICBpZiAoY29sbGFwc2VkICYmICF0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgICAgLy8jIEFuaW1hdGlvblxuICAgICAgICBpZiAoQU5JTUFUSU9OX0xFVkVMLmdldCgpLnZhbHVlID09PSBBbmltYXRpb25MZXZlbHMuQWxsKSB7XG4gICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICBjb25zdCBmdWxsX2hlaWdodCA9XG4gICAgICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy4jY29sbGFwc2libGUuYW5pbWF0ZShcbiAgICAgICAgICAgIFt7IGhlaWdodDogZnVsbF9oZWlnaHQgfSwgeyBoZWlnaHQ6IFwiMFwiIH1dLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogQU5JTUFUSU9OX1NQRUVELmdldCgpLnZhbHVlLFxuICAgICAgICAgICAgICBlYXNpbmc6IFwiZWFzZS1pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghY29sbGFwc2VkICYmIHRoaXMuI2NvbGxhcHNlZCkge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2NvbGxhcHNpYmxlLmFuaW1hdGUoXG4gICAgICAgICAgICBbeyBoZWlnaHQ6IFwiMFwiIH0sIHsgaGVpZ2h0OiBmdWxsX2hlaWdodCB9XSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgICAgZWFzaW5nOiBcImVhc2Utb3V0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB0aGlzLiNjb2xsYXBzaWJsZS5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2VkO1xuICB9XG5cbiAgc2V0IGNvbGxhcHNlX3RleHQodGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLiNjb2xsYXBzZV9idXR0b24pIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCkpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiIHx8IGUua2V5ID09PSBcIiBcIikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmZpcnN0Q2hpbGQhLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxuXG4gIHNldCBtYXhfaGVpZ2h0KGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbWF4X2hlaWdodFwiLCBoZWlnaHQgPyBoZWlnaHQgKyBcInJlbVwiIDogXCJub25lXCIpO1xuICAgIGlmIChoZWlnaHQpIHRoaXMuY2xhc3NMaXN0LmFkZChcIm1heF9oZWlnaHRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXhfaGVpZ2h0XCIpO1xuICB9XG5cbiAgc2V0IGVtYmVkKGVtYmVkOiBib29sZWFuKSB7XG4gICAgaWYgKGVtYmVkKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJlbWJlZFwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImVtYmVkXCIpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICBzdXBlci52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuIGVycihcIlN0YXRlIGJhc2VkIGNvbXBvbmVudFwiKTtcbiAgICBjb25zdCByZXN1bHQ6IFJUID0ge30gYXMgUlQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb21wXSBvZiB0aGlzLiN2YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMuI3ZhbHVlX2VsZW1lbnRzLmhhcyhrZXkpKVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5nZXQoa2V5KSEudmFsdWUgPSB2YWxba2V5IGFzIGtleW9mIFJUXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgdGhpcy4jdmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQgZXh0ZW5kcyBvYmplY3QgPSBQcmV0dGlmeTxQYXJ0aWFsPFRvS2V5VmFsPEV4dHJhY3RCPEw+Pj4+LFxuPihvcHRpb25zPzogRm9ybUdyb3VwT3B0aW9uczxMLCBJRCwgVD4pOiBGb3JtR3JvdXA8VCwgSUQ+IHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybUdyb3VwPFQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuYm9yZGVyKSBzbGlkZS5ib3JkZXIgPSBvcHRpb25zLmJvcmRlcjtcbiAgICBpZiAob3B0aW9ucy5lbGVtZW50cykgc2xpZGUuZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzO1xuICAgIGlmIChvcHRpb25zLmNvbGxhcHNlX3RleHQpIHNsaWRlLmNvbGxhcHNlX3RleHQgPSBvcHRpb25zLmNvbGxhcHNlX3RleHQ7XG4gICAgaWYgKG9wdGlvbnMuY29sbGFwc2libGUpIHNsaWRlLmNvbGxhcHNpYmxlID0gb3B0aW9ucy5jb2xsYXBzaWJsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHNsaWRlLmNvbGxhcHNlZCA9IG9wdGlvbnMuY29sbGFwc2VkO1xuICAgIGlmIChvcHRpb25zLm1heF9oZWlnaHQpIHNsaWRlLm1heF9oZWlnaHQgPSBvcHRpb25zLm1heF9oZWlnaHQ7XG4gICAgaWYgKG9wdGlvbnMuZW1iZWQpIHNsaWRlLmVtYmVkID0gb3B0aW9ucy5lbWJlZDtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBMaXN0RmllbGQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1saXN0XCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xpc3RfZmllbGQuc2Nzc1wiO1xuXG5leHBvcnQgY2xhc3MgTGlzdEZvcm1GaWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+IGV4dGVuZHMgTGlzdEZpZWxkIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJsaXN0ZmllbGRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgc2V0IGVsZW1lbnQoY29tcG9uZW50OiBUKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGRyZW4oY29tcG9uZW50KTtcbiAgfVxuXG4gIGdldCBlbGVtZW50KCk6IFQge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFQ7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KExpc3RGb3JtRmllbGQpO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9saXN0X2ZpZWxkPFQgZXh0ZW5kcyBGb3JtRWxlbWVudD4oZWxlbWVudDogVCkge1xuICBjb25zdCBmaWVsZCA9IG5ldyBMaXN0Rm9ybUZpZWxkPFQ+KCk7XG4gIGZpZWxkLmVsZW1lbnQgPSBlbGVtZW50O1xuICByZXR1cm4gZmllbGQ7XG59XG4iLCJpbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfYmFzZS5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlck9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipMb3dlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKipVcHBlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKipBbW91bnQgb2YgZGVjaW1hbHMgdG8gc2hvdyovXG4gIGRlY2ltYWxzPzogbnVtYmVyO1xuICAvKipVbml0IHRvIHVzZSBmb3Igc2xpZGVyKi9cbiAgdW5pdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlck9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKlN0ZXAgc2l6ZSwgdXNlIDAgZm9yIGF1dG9tYXRpYyBzdGVwIHNpemUqL1xuICBzdGVwPzogbnVtYmVyO1xuICAvKipTdGFydCBmb3Igc3RlcCwgdXNlIDAgZm9yIGF1dG9tYXRpYyAqL1xuICBzdGFydD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU3RlcHBlckJhc2VPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+IHtcbiAgLyoqd2V0aGVyIHRoZSBldmVudHMgYXJlIGxpdmUgYXMgdGhlIHNsaWRlciBpcyBtb3ZlZCBvciBvbmx5IHdoZW4gbW92aW5nIHN0b3BzICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipJY29uIHRvIHVzZSBmb3IgZGVjcmVhc2luZyB2YWx1ZSovXG4gIGljb25fZGVjcmVhc2U/OiBTVkdGdW5jO1xuICAvKipJY29uIHRvIHVzZSBmb3IgaW5jcmVhc2luZyB2YWx1ZSovXG4gIGljb25faW5jcmVhc2U/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybU51bWJlcldyaXRlPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8UlQsIElEPiB7XG4gIHN0YXRpYyBhcHBseV9vcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgZWxlbWVudDogRm9ybU51bWJlcldyaXRlPElELCBSVD4sXG4gICAgb3B0aW9uczogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+LFxuICApIHtcbiAgICBpZiAob3B0aW9ucy51bml0KSBlbGVtZW50LnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgaWYgKG9wdGlvbnMuZGVjaW1hbHMpIGVsZW1lbnQuZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgIGlmIChvcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmIChvcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1heCA9IG9wdGlvbnMubWF4O1xuICAgIGlmIChvcHRpb25zLnN0ZXApIGVsZW1lbnQuc3RlcCA9IG9wdGlvbnMuc3RlcDtcbiAgICBpZiAob3B0aW9ucy5zdGFydCkgZWxlbWVudC5zdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gICAgc3VwZXIuYXBwbHlfb3B0aW9ucyhlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHNpemUgb2YgbnVtYmVyIGNoYW5nZSBzdGVwcyovXG4gIGFic3RyYWN0IHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgc3RhcnQgb2Zmc2V0IGZvciBudW1iZXIgc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2YgZGVjaW1hbHMgdGhlIGVsZW1lbnQgY2FuIGhhdmUqL1xuICBhYnN0cmFjdCBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHVuaXQgb2YgdGhlIGVsZW1lbnQqL1xuICBhYnN0cmFjdCBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGVwKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInN0ZXBcIiwgcmVsYXRlZC5zdGVwLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RlcFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGFydClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGFydFwiLCByZWxhdGVkLnN0YXJ0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RhcnRcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIHNldF9jdXJzb3JfZW5kLFxuICBzZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfc2VsZWN0aW9uX2FsbCxcbiAgc3luY19yZXNvbHZlLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1tYXRoXCI7XG5pbXBvcnQgeyBlcnIsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybU51bWJlcldyaXRlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfaW5wdXQuc2Nzc1wiO1xuXG4vKipTbGlkZSBTZWxlY3RvciwgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBzbGlkZXIqL1xuY2xhc3MgTnVtYmVySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibnVtYmVyaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gICNtYXg6IG51bWJlciA9IEluZmluaXR5O1xuICAjc3RlcDogbnVtYmVyID0gMDtcbiAgI3N0YXJ0OiBudW1iZXIgPSAwO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG5cbiAgI3ZhbHVlX2JveCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZ2VuZCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3gpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSBlbHNlIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy4jc2VsZWN0ZWQpIHJldHVybjtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jc2V0KGZhbHNlKTtcbiAgICAgIH0sIDApO1xuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuI3NldCh0cnVlKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlbHNlIGlmIChlLmRhdGEpIHtcbiAgICAgICAgaWYgKCEvW1xcZCwuLV0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoL1ssLl0vZy50ZXN0KGUuZGF0YSkgJiYgdGhpcy4jZGVjaW1hbHMgPT09IDApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtaW4gPj0gMCAmJiAvLS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KGN1cjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IGdldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94KTtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKFxuICAgICAgYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2soXG4gICAgICAgIHBhcnNlRmxvYXQodGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50Py5yZXBsYWNlKFwiLFwiLCBcIi5cIikgfHwgXCJcIikgfHwgMCxcbiAgICAgIClcbiAgICApXG4gICAgICAubWFwX2VycigoKSA9PiB7XG4gICAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgTWF0aC5tYXgoTWF0aC5taW4oMCwgdGhpcy4jbWF4KSwgdGhpcy4jbWluKSk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghY3VyKSByZXR1cm47XG4gICAgICAgIHNldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94LCBzZWwpO1xuICAgICAgfSk7XG4gIH1cblxuICBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdCA9IHVuaXQgfHwgXCJcIjtcbiAgICB0aGlzLiN1bml0X2JveC50ZXh0Q29udGVudCA9IHRoaXMuI3VuaXQ7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI21pbl9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpIHtcbiAgICB0aGlzLiNtYXhfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNYXg6IFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgI3N0ZXBfdmFsdWUoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3RlcCA9XG4gICAgICB0aGlzLiNzdGVwIHx8XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgdGhpcy4jZGVjaW1hbHMgPyAxIC8gdGhpcy4jZGVjaW1hbHMgOiAxLFxuICAgICAgICBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuYnVmZmVyIHx8IDApIC8gMTUwKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCh0aGlzLmJ1ZmZlciB8fCAwKSArIChkaXIgPyBzdGVwIDogLXN0ZXApKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTnVtYmVySW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9udW1iZXJfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRD4sXG4pOiBOdW1iZXJJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBOdW1iZXJJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgeyB0eXBlIEZvcm1OdW1iZXJPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3Byb2dyZXNzLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWU8XG4gIG51bWJlcixcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInByb2dyZXNzXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtaW46IG51bWJlciA9IDA7XG4gICNtYXg6IG51bWJlciA9IDEwMDtcbiAgI3NwYW46IG51bWJlciA9IDEwMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjYmFyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWw6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1pbihtaW46IG51bWJlcikge1xuICAgIHRoaXMuI21pbiA9IG1pbjtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1heChtYXg6IG51bWJlcikge1xuICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBNYXRoLm1heChkZWMgPz8gMCwgMCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdC50ZXh0Q29udGVudCA9IHVuaXQgPz8gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI2Jhci5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKHZhbHVlIC0gdGhpcy4jbWluKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSArXG4gICAgICBcIiVcIjtcbiAgICB0aGlzLiN2YWwudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPSBcIjAlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Qcm9ncmVzcyk7XG5cbi8qKkNyZWF0ZXMgYSBwcm9ncmVzcyBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Byb2dyZXNzPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJPcHRpb25zPElEPixcbik6IEZvcm1Qcm9ncmVzczxJRD4ge1xuICBjb25zdCBwcm9nID0gbmV3IEZvcm1Qcm9ncmVzczxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5taW4gIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gXCJ1bmRlZmluZWRcIikgcHJvZy5tYXggPSBvcHRpb25zLm1heDtcbiAgICBwcm9nLmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBwcm9nLnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMocHJvZywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc2xpZGVyLnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtU2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQsXG4gIG51bWJlclxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic2xpZGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzcGFuOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2ljb25fZGVjID0gdGhpcy4jc3RlcHBlcl9mdW5jKFxuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICNzbGlkZSA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZnRfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3JpZ2h0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9tYXgoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgI3VwZGF0ZV9tYXhfbGVnZW5kKCkge1xuICAgIHRoaXMuI3JpZ2h0X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQgKyBcIiA6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKC10aGlzLiNtaW4gKyB2YWx1ZSkgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICBhc3luYyAjbW92ZV9hYnNvbHV0ZSh4OiBudW1iZXIsIGxhc3Q/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKHgpO1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgICAgICBpZiAodmFsdWUub2spIHtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKCgoLXRoaXMuI21pbiArIHZhbHVlLnZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwKTtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRfdmFsdWVfbGltaXQodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3hfdG9fcGVyYyh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoKHggLSBib3gueCkgLyBib3gud2lkdGgpICogMTAwKSk7XG4gIH1cblxuICAjcGVyY190b192YWx1ZShwZXJjOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHBlcmMgLyAxMDApICogdGhpcy4jc3BhbiArIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG5cbiAgI21vdmVfc2xpZGUocGVyYzogbnVtYmVyKSB7XG4gICAgdGhpcy4jc2xpZGVyLnN0eWxlLmxlZnQgPSBwZXJjICsgXCIlXCI7XG4gIH1cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU2xpZGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVNsaWRlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU2xpZGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2xlZXAsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjdGV4dCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjdmFsdWVfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuXG4gICAgdGhpcy4jdmFsdWVfYm94LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGxldCBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25mb2N1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApO1xuICAgIH07XG4gICAgbGV0IHJlc2V0ID0gKCkgPT4ge307XG4gICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCB8fCAhZHJhZ19ibG9ja2VyKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBpbml0aWFsX3ZhbCA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGxldCBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdGV4dC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZXYuY2xpZW50WCkgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICB0aGlzLiN0ZXh0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCFtb3ZpbmcgJiYgZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRoaXMuI3ZhbHVlX2JveC5maXJzdENoaWxkISk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3Py5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocmVzZXQpIHJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiN2YWx1ZV9ib3ggJiZcbiAgICAgICAgICAvW1xcZCwuLV0vZy50ZXN0KGUua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiN2YWx1ZV9ib3guYmx1cigpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSB8fFxuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8uaW5jbHVkZXMoXCItXCIpXG4gICAgICAgIClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWluOiBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWF4OiBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgLyoqU2V0IHdldGhlciB0aGUgc2xpZGVyIGlzIGluIGxpdmUgbW9kZSovXG4gIHNldCBsaXZlKGxpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNsaXZlID0gbGl2ZSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldCBpY29uX2RlY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25fZGVjLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCgpLCBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHNldCBpY29uX2luY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25faW5jLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHZhbHVlIHRvIGEgcG9zaXRpb24gYnkgdGhlIG1vdXNlIHggY29vcmRpbmF0ZXMqL1xuICBhc3luYyAjbW92ZV9kaWZmKHZhbHVlOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAobGFzdCkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobGltLm9rKSB0aGlzLiNtb3ZlX3ZhbHVlKGxpbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHNsaWRlciB0byB0aGUgZ2l2ZW4gcGVyY2VudCBwb3NpdGlvbiovXG4gICNtb3ZlX3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3RlcHBlcik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU3RlcHBlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU3RlcHBlcjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxpdmUpIHNsaWRlLmxpdmUgPSBvcHRpb25zLmxpdmU7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9kZWNyZWFzZSkgc2xpZGUuaWNvbl9kZWNyZWFzZSA9IG9wdGlvbnMuaWNvbl9kZWNyZWFzZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2luY3JlYXNlKSBzbGlkZS5pY29uX2luY3JlYXNlID0gb3B0aW9ucy5pY29uX2luY3JlYXNlO1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBzb21lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgc3RhdGUsIHsgdHlwZSBTdGF0ZUVudW1SZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yT3B0aW9uPFJUPiB7XG4gIC8qKlZhbHVlIHRvIHNldCB3aGVuIG9wdGlvbiBpcyBzZWxlY3RlZCAqL1xuICB2YWx1ZTogUlQ7XG4gIC8qKlRleHQgZm9yIHNlbGVjdGlvbiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKkljb24gdG8gZGlzcGxheSBmb3Igb3B0aW9uKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8XG4gIFQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqT3B0aW9ucyBmb3Igc2VsZWN0b3IqL1xuICBzZWxlY3Rpb25zPzogRm9ybVNlbGVjdG9yT3B0aW9uPFQ+W107XG59XG5cbi8qKkJhc2UgZm9yIG51bWJlciBlbGVtZW50cyBlbGVtZW50cyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVNlbGVjdG9yQmFzZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICAvKipTZXRzIHRoZSBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHNlbGVjdG9yICovXG4gIGFic3RyYWN0IHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCk7XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4sXG4gICAgb3B0aW9uczogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9ucykgZWxlbWVudC5zZWxlY3Rpb25zID0gb3B0aW9ucy5zZWxlY3Rpb25zO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlRW51bVJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubGlzdCkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcF9tYXAoXG4gICAgICAgIFwic2VsZWN0aW9uc1wiLFxuICAgICAgICByZWxhdGVkLmxpc3QsXG4gICAgICAgICgpID0+IHNvbWUoW10pLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNvbWUoXG4gICAgICAgICAgICBzdGF0ZS5lLm1hcCh2YWwsIChrZXksIHZhbCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbC5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXkgYXMgUlQsXG4gICAgICAgICAgICAgICAgaWNvbjogdmFsLmljb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2UsIGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybVNlbGVjdG9yQmFzZSxcbiAgdHlwZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9ucyxcbiAgdHlwZSBGb3JtU2VsZWN0b3JPcHRpb24sXG59IGZyb20gXCIuLi9zZWxlY3Rvcl9iYXNlXCI7XG5pbXBvcnQgXCIuL2Ryb3BfZG93bi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRHJvcERvd25PcHRpb25zPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICAvKipEZWZhdWx0IGljb24gZGlzcGxheWVkKi9cbiAgZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbn1cblxuLyoqRHJvcGRvd24gYm94IGZvciBzZWxlY3RpbmcgYmV0d2VlbiBtdWx0aXBsZSBjaG9pY2VzIGluIGEgc21hbGwgc3BhY2UqL1xuZXhwb3J0IGNsYXNzIEZvcm1Ecm9wZG93bjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI21hcDogTWFwPFJULCBTZWxPcHRpb25zPiA9IG5ldyBNYXAoKTtcbiAgI3ZhbHVlczogUlRbXSA9IFtdO1xuICAjc2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xuXG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcbiAgI3RleHQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI29wZW46IFNWR1NWR0VsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICNkZWZhdWx0OiBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJTZWxlY3Qgc29tZXRoaW5nXCIpO1xuICAjZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbiAgcHJpdmF0ZSBpc19vcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiN0ZXh0LmFwcGVuZCh0aGlzLiNkZWZhdWx0KTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4gKHRoaXMub3BlbiA9IHRydWUpO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLiNzZWxlY3RfYWRqYWNlbnQoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipHZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgZ2V0IGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlZmF1bHQubm9kZVZhbHVlIHx8IFwiXCI7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHQoZGVmOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSA9IGRlZjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBzZXQgZGVmYXVsdF9pY29uKGRlZjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlZmF1bHRfaWNvbiA9IGRlZjtcbiAgICBpZiAoZGVmICYmIHRoaXMuI3NlbGVjdGVkID09PSAtMSkgdGhpcy4jc2V0X2ljb24gPSBkZWY7XG4gIH1cblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IHNlbGVjdGlvbnMgJiYgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIHRleHQsIGljb24gfSA9IHNlbGVjdGlvbnNbaV07XG4gICAgICB0aGlzLiNtYXAuc2V0KHZhbHVlLCB7IHRleHQsIGljb24gfSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICBzZXQgb3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKG9wZW4gJiYgIXRoaXMuaXNfb3Blbikge1xuICAgICAgdGhpcy4jb3Blbi5yZXBsYWNlQ2hpbGRyZW4obWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICAgICBib3guY2xvc2VfbWVudSgpO1xuICAgIH1cbiAgICB0aGlzLmlzX29wZW4gPSBvcGVuO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0ICNzZXRfaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHtcbiAgICAgIGNvbnN0IGkgPSBpY29uKCk7XG4gICAgICBpZiAodGhpcy4jaWNvbikgdGhpcy5yZXBsYWNlQ2hpbGQoaSwgdGhpcy4jaWNvbik7XG4gICAgICBlbHNlIHRoaXMuaW5zZXJ0QmVmb3JlKGksIHRoaXMuI3RleHQpO1xuICAgICAgdGhpcy4jaWNvbiA9IGk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpY29uKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuI2ljb24pO1xuICAgICAgdGhpcy4jaWNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgI2NsZWFyKCkge1xuICAgIHRoaXMuZGVmYXVsdF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uXG4gICAgICA/ICh0aGlzLiNzZXRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvbilcbiAgICAgIDogKHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkKTtcbiAgICB0aGlzLiN0ZXh0LnJlcGxhY2VDaGlsZHJlbih0aGlzLiNkZWZhdWx0KTtcbiAgfVxuXG4gIC8qKkNhbGxlZCB3aGVuIFZhbHVlIGlzIGNoYW5nZWQgKi9cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpIHtcbiAgICBpZiAoIXRoaXMuI21hcC5oYXModmFsdWUpKSB7XG4gICAgICB0aGlzLiNjbGVhcigpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIHRoaXMuI3RleHQuaW5uZXJUZXh0ID0gb3B0LnRleHQ7XG4gICAgdGhpcy4jc2VsZWN0ZWQgPSB0aGlzLiN2YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKG9wdC5pY29uKSB0aGlzLiNzZXRfaWNvbiA9IG9wdC5pY29uO1xuICAgIGVsc2UgdGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN1cGVyLndhcm4obWVzc2FnZSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Ecm9wZG93bik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2Ryb3Bkb3duPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtRHJvcERvd25PcHRpb25zPFJULCBJRD4sXG4pOiBGb3JtRHJvcGRvd248UlQsIElEPiB7XG4gIGNvbnN0IGRyb3AgPSBuZXcgRm9ybURyb3Bkb3duPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHQpIGRyb3AuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0X2ljb24pIGRyb3AuZGVmYXVsdF9pY29uID0gb3B0aW9ucy5kZWZhdWx0X2ljb247XG4gICAgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKGRyb3AsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBkcm9wO1xufVxuXG4vLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuY2xhc3MgRHJvcERvd25Cb3ggZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93bmJveFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY2xvc2VyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICNjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3Njcm9sbDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNjb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI3RhYmxlOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI3Njcm9sbC5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjZHJvcGRvd246IEZvcm1Ecm9wZG93bjxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICNmb2N1c19vdXRfaGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCFlLnJlbGF0ZWRUYXJnZXQgfHwgIXRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH07XG4gICN3aW5kb3dfcmVzaXplX2hhbmRsZXIgPSAoKSA9PiB0aGlzLmNsb3NlX21lbnUoKTtcbiAgI2lzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2NvbnRhaW5lci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY29udGFpbmVyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiIHx8IChlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSBcIlRhYlwiKSkge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmxhc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiIHx8IGUua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIHRoaXMuI2Nsb3NlclxuICAgICAgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpXG4gICAgICAuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCgpKTtcbiAgICB0aGlzLiNjbG9zZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuaW5uZXJIVE1MID0gXCJDbG9zZVwiO1xuICAgIHRoaXMuI2Nsb3Nlci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY2xvc2VyLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgIH07XG4gICAgdGhpcy4jY2xvc2VyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNfb3V0X2hhbmRsZXIsIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgLy9AdHMtZXhwZWN0LWVycm9yIENhbGwgcHJpdmF0ZSBtZXRob2QgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHRoaXMuI2Ryb3Bkb3duLnNldF92YWx1ZV9jaGVjayh2YWx1ZSk7XG4gICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH1cblxuICBvcGVuX21lbnUoXG4gICAgbWFwOiBNYXA8YW55LCBTZWxPcHRpb25zPixcbiAgICBwYXJlbnQ6IEZvcm1Ecm9wZG93bjxhbnksIGFueT4sXG4gICAgdmFsdWU6IGFueSxcbiAgKSB7XG4gICAgY29uc3QgaW5uZXJfaGVpZ2h0ID0gdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5pbm5lckhlaWdodCB8fCAwO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgY29uc3QgYm91bmRzID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyIDwgaW5uZXJfaGVpZ2h0IC8gMikge1xuICAgICAgY29uc3QgdG9wID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IGlubmVyX2hlaWdodCAtIHRvcCAtIDEwICsgXCJweFwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBcImNvbHVtblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3R0b20gPSBpbm5lcl9oZWlnaHQgLSBib3VuZHMueTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGJvdHRvbSArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSBib3R0b20gLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW4tcmV2ZXJzZVwiO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubGVmdCA9IGJvdW5kcy54ICsgXCJweFwiO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IGJvdW5kcy53aWR0aCArIFwicHhcIjtcbiAgICB0aGlzLiNkcm9wZG93biA9IHBhcmVudDtcblxuICAgIGlmICh0aGlzLiNzY3JvbGwuc2Nyb2xsSGVpZ2h0ID4gdGhpcy4jc2Nyb2xsLmNsaWVudEhlaWdodClcbiAgICAgIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QuYWRkKFwic2Nyb2xsXCIpO1xuICAgIGVsc2UgdGhpcy4jc2Nyb2xsLmNsYXNzTGlzdC5yZW1vdmUoXCJzY3JvbGxcIik7XG5cbiAgICBsZXQgZm9jdXM6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkIGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLkFycmF5LmZyb20obWFwKS5tYXAoKFt2YWwsIG9wdF0pID0+IHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnN0IGljb24gPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICBpZiAob3B0Lmljb24pIGljb24uYXBwZW5kQ2hpbGQob3B0Lmljb24oKSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gb3B0LnRleHQ7XG4gICAgICAgIGxpbmUub25wb2ludGVydXAgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIpIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBsaW5lLm9uY2xpY2sgPSAoKSA9PiB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgbGluZS50YWJJbmRleCA9IDA7XG4gICAgICAgIGxpbmUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdmFsdWUpIGZvY3VzID0gbGluZTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9TaG93IGNsb3NlciBvciBub3RcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYm94X2FyZWEgPSBib3gud2lkdGggKiBib3guaGVpZ2h0O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGh0bWxfYXJlYSA9IGh0bWwuY2xpZW50V2lkdGggKiBodG1sLmNsaWVudEhlaWdodDtcbiAgICBpZiAoYm94X2FyZWEgPiBodG1sX2FyZWEgKiAwLjUpIHtcbiAgICAgIHRoaXMuI3RhYmxlLnByZXBlbmQodGhpcy4jY2xvc2VyKTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGZvY3VzLmZvY3VzKCk7XG4gICAgICBmb2N1cy5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgfSBlbHNlIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuXG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgdGhpcy4jaXNfb3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZV9tZW51KCkge1xuICAgIGlmICghdGhpcy4jaXNfb3BlbikgcmV0dXJuO1xuICAgIHRoaXMuI2lzX29wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICh0aGlzLiNkcm9wZG93bikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciBPdmVyd3JpdGUgcHJpdmF0ZSBwcm9wZXJ0eSBmcm9tIHNpc3RlciBjbGFzc1xuICAgICAgdGhpcy4jZHJvcGRvd24uaXNfb3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInJlc2l6ZVwiLFxuICAgICAgdGhpcy4jd2luZG93X3Jlc2l6ZV9oYW5kbGVyLFxuICAgICk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KERyb3BEb3duQm94KTtcbmNvbnN0IGJveCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChuZXcgRHJvcERvd25Cb3goKSk7XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIEZvcm1TZWxlY3RvckJhc2UsXG4gIHR5cGUgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnMsXG4gIHR5cGUgRm9ybVNlbGVjdG9yT3B0aW9uLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JfYmFzZVwiO1xuaW1wb3J0IFwiLi90b2dnbGVfYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0b3A6IEhUTUxEaXZFbGVtZW50O1xuICBib3Q6IEhUTUxEaXZFbGVtZW50O1xufVxuXG4vKipUb2dnbGUgYnV0dG9ucywgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBtdWx0aSB0b2dnbGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtVG9nZ2xlQnV0dG9uPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgLyoqUmV0dXJucyB0aGUgbmFtZSB1c2VkIHRvIGRlZmluZSB0aGUgZWxlbWVudCovXG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidG9nZ2xlYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtYXA6IE1hcDxSVCwgU2VsT3B0aW9ucz4gPSBuZXcgTWFwKCk7XG4gICN2YWx1ZXM6IFJUW10gPSBbXTtcbiAgI3NlbGVjdGVkOiBudW1iZXIgPSAtMTtcblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgdGhpcy4jYWRkX3NlbGVjdGlvbihzZWxlY3Rpb25zW2ldKSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaChzZWxlY3Rpb25zW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gICNhZGRfc2VsZWN0aW9uKHNlbGVjdGlvbjogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPikge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgdG9wLnRhYkluZGV4ID0gMDtcbiAgICBjb25zdCBib3QgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChzZWxlY3Rpb24uaWNvbikge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHNlbGVjdGlvbi5pY29uKCkpO1xuICAgICAgYm90LnRleHRDb250ZW50ID0gc2VsZWN0aW9uLnRleHQ7XG4gICAgfSBlbHNlIHRvcC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIGNvbnN0IGNsaWNrID0gKCkgPT4ge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhzZWxlY3Rpb24udmFsdWUpO1xuICAgIH07XG4gICAgdG9wLm9uY2xpY2sgPSBjbGljaztcbiAgICBib3Qub25jbGljayA9IGNsaWNrO1xuICAgIHRvcC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSBjbGljaygpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzZWxlY3RfYWRqYWNlbnQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiB7IHRvcCwgYm90IH07XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAoc2VsKSBzZWwudG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgaWYgKG9wdCkge1xuICAgICAgb3B0LnRvcC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICBvcHQuYm90LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgb3B0LnRvcC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVG9nZ2xlQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIHRvZ2dsZSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90b2dnbGVfYnV0dG9uPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+IHtcbiAgY29uc3QgdG9nZyA9IG5ldyBGb3JtVG9nZ2xlQnV0dG9uPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKHRvZ2csIG9wdGlvbnMpO1xuICByZXR1cm4gdG9nZztcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL3NwYWNlci5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3BhY2VyT3B0aW9ucyB7XG4gIC8qKlNwYWNpbmcgYW1vdW50ICAqL1xuICBzcGFjZT86IG51bWJlcjtcbn1cblxuY2xhc3MgRm9ybVNwYWNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzcGFjZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBzcGFjZSwgaW4gcmVtICovXG4gIHNldCBzcGFjZShzcGFjZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBgJHtzcGFjZX1yZW1gO1xuICB9XG4gIGdldCBzcGFjZSgpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnN0eWxlLmhlaWdodCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TcGFjZXIpO1xuXG4vKipDcmVhdGVzIGEgc3BhY2VyIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3BhY2VyKG9wdGlvbnM/OiBGb3JtU3BhY2VyT3B0aW9ucyk6IEZvcm1TcGFjZXIge1xuICBjb25zdCBzcGFjZXIgPSBuZXcgRm9ybVNwYWNlcigpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNwYWNlKSBzcGFjZXIuc3BhY2UgPSBvcHRpb25zLnNwYWNlO1xuICB9XG4gIHJldHVybiBzcGFjZXI7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vY29sb3JfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db2xvcklucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKldoZXRoZXIgdGhlIGNvbG9yIGlucHV0IHNob3VsZCB1cGRhdGUgbGl2ZSovXG4gIGxpdmU/OiBib29sZWFuO1xufVxuXG5jbGFzcyBGb3JtQ29sb3JJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiY29sb3JpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJjb2xvclwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCBsaXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuI2xpdmUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2xpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiIzAwMDAwMFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Db2xvcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fY29sb3JfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUNvbG9ySW5wdXRPcHRpb25zPElELCBzdHJpbmc+LFxuKTogRm9ybUNvbG9ySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUNvbG9ySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBpbnB1dC5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCxcbiAgbWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9zY2hlZHVsZV9yb3VuZGVkKCkpLm9uY2xpY2sgPSAoKSA9PlxuICAgICAgdGhpcy53YXJuX2lucHV0LnNob3dQaWNrZXIoKTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53YXJuX2lucHV0LnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuREFURSlcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXcgRGF0ZSh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlcikgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuU1RSSU5HKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5OVU1CRVIpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgYXMgUlQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgdHlwZSh0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5USU1FKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGltZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FKVxuICAgICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy53YXJuX2lucHV0LnN0ZXApO1xuICB9XG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBTdHJpbmcoc3RlcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jbW9kZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5OVU1CRVI7XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuU1RSSU5HO1xuICAgICAgZWxzZSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG4gICAgfVxuICAgIGxldCB0aW1lOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGltZSA9IHZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGltZSA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgZWxzZSB0aW1lID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyID0gdGltZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRGF0ZVRpbWVJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2RhdGVfdGltZV9pbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ob3B0aW9ucz86IERhdGVUaW1lSW5wdXRPcHRpb25zPFJULCBJRD4pOiBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHlwZSkgaW5wdXQudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIElQQWRkcmVzcyxcbiAgSVBWZXJzaW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHNsZWVwLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vaXBfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElwSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPElQQWRkcmVzcywgSUQ+IHtcbiAgLyoqSXAgYWRkcmVzcyB0eXBlLCB0aGlzIGlzIG92ZXJ3cml0dGVuIGlmIHN1cHBsaWVkIHdpdGggYW4gaXBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgdHlwZSovXG4gIHR5cGU6IElQVmVyc2lvbjtcbn1cblxuY2xhc3MgRm9ybUlwSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIElQQWRkcmVzcyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImlwaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IElQVmVyc2lvbjtcbiAgI3BhcnRzOiBIVE1MRGl2RWxlbWVudFtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogOCB9LCAoXywgaSkgPT4ge1xuICAgIGNvbnN0IGlucCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgaWYgKGkgPCA3KSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgICBpbnAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaW5wLm9uYmVmb3JlaW5wdXQgPSBhc3luYyAoZXYpID0+IHtcbiAgICAgIGlmIChldi5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvL0JhY2tzcGFjZVxuICAgICAgZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPiAwKSB7XG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZVxuICAgICAgfSBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpIDwgbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldi5kYXRhKSB7XG4gICAgICAgIC8vQ2hlY2sgZm9yIC4gb3IgOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV2LmRhdGEgPT09IFwiLlwiIHx8IGV2LmRhdGEgPT09IFwiOlwiIHx8IGV2LmRhdGEgPT09IFwiLFwiKSAmJlxuICAgICAgICAgIGkgPCBsZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAhZXYuZGF0YS5tYXRjaChcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IC9eW1xcZF0qJC8gOiAvXltcXGRBLUZhLWZdKiQvLFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vUHJldmVudCB0b28gbG9uZyB2YWx1ZXNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA+PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgLy9QcmV2ZW50IHRvbyBiaWcgdmFsdWVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcG9zID0gZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApO1xuICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9XG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICBldi5kYXRhICtcbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZShwb3MpO1xuICAgICAgICAgIGNvbnN0IG51bSA9XG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjRcbiAgICAgICAgICAgICAgPyBwYXJzZUludChwb3RlbnRpYWwsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlSW50KHBvdGVudGlhbCwgMTYpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgJiYgbnVtID4gMjU1KSB8fFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNiAmJiBudW0gPiA2NTUzNSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KSAmJlxuICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggJiZcbiAgICAgICAgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmtleWRvd24gPSBhc3luYyAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIiAmJiBpID4gMCkge1xuICAgICAgICBpZiAoZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSAwIHx8IGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApXG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiICYmIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggfHxcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwXG4gICAgICAgIClcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5wO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBJUFZlcnNpb24sIGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmICghdGhpcy4jcGFydHMuaW5jbHVkZXMoZS50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jcGFydHNbdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDddKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25kYmxjbGljayA9IChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3BhcnRzWzBdKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiB0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmNvcHkgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5jbGlwYm9hcmREYXRhPy5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0aGlzLnZhbHVlX2FzX2lwLnRvX3N0cmluZygpKTtcbiAgICB9O1xuICAgIHRoaXMub25wYXN0ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXN0ZSA9IGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgXCJcIjtcbiAgICAgIGNvbnN0IG5ld19pcCA9IG5ldyBJUEFkZHJlc3MocGFzdGUpO1xuICAgICAgaWYgKG5ld19pcC52ZXJzaW9uICE9PSB0aGlzLiN0eXBlKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXdfaXApO1xuICAgIH07XG4gIH1cblxuICBnZXQgdmFsdWVfYXNfaXAoKTogSVBBZGRyZXNzIHtcbiAgICByZXR1cm4gbmV3IElQQWRkcmVzcyhcbiAgICAgIHRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgYWNjICs9IHBhcnQuaW5uZXJUZXh0O1xuICAgICAgICAgIGlmIChpIDwgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDEpXG4gICAgICAgICAgICBhY2MgKz0gdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIjtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBcIlwiKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IHR5cGUodmFsOiBJUFZlcnNpb24pIHtcbiAgICBpZiAodGhpcy4jdHlwZSA9PT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy4jdHlwZSA9IHZhbDtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY0XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY0KTtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY2XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY2KTtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLnRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAuZmxhdE1hcCgodiwgaSkgPT5cbiAgICAgICAgICBpIDwgKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMVxuICAgICAgICAgICAgPyBbdiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiKV1cbiAgICAgICAgICAgIDogW3ZdLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogSVBBZGRyZXNzKTogdm9pZCB7XG4gICAgdGhpcy50eXBlID0gdmFsLnZlcnNpb247XG4gICAgdmFsLmFzX2FycmF5LmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgIHRoaXMuI3BhcnRzW2ldLnRleHRDb250ZW50ID1cbiAgICAgICAgdmFsLnZlcnNpb24gPT09IElQVmVyc2lvbi5WNCA/IHBhcnQudG9TdHJpbmcoKSA6IHBhcnQudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3BhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1JcElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1faXBfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBJcElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtSXBJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtSXBJbnB1dDxJRD4ob3B0aW9ucy50eXBlLCBvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vcGFzc3dvcmRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxzdHJpbmcsIElEPiB7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHBhc3N3b3JkIGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVBhc3N3b3JkSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInBhc3N3b3JkaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uYmVmb3JlaW5wdXQgPSAoZXYpID0+IHtcbiAgICAgIGlmIChldi5kYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGV2LmRhdGEpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVBhc3N3b3JkSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wYXNzd29yZF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0SW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuICAjbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgI21heF9ieXRlcz86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy53YXJuX2lucHV0LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy53YXJuX2lucHV0LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldCgpIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSB8fCBcIlwiKSkubWFwX2VycigoKSA9PiB7XG4gICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IFwiXCIpO1xuICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy53YXJuX2lucHV0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNmaWx0ZXI7XG4gIH1cblxuICBzZXQgcGxhY2Vob2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHNldCBtYXhfbGVuZ3RoKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2xlbmd0aCA9IHZhbDtcbiAgICB0aGlzLndhcm5faW5wdXQubWF4TGVuZ3RoID0gdmFsID8/IC0xO1xuICB9XG4gIGdldCBtYXhfbGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9sZW5ndGg7XG4gIH1cblxuICBzZXQgbWF4X2J5dGVzKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2J5dGVzID0gdmFsO1xuICB9XG4gIGdldCBtYXhfYnl0ZXMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2J5dGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICB2YWwgPSB2YWwuc2xpY2UoMCwgdGhpcy4jbWF4X2xlbmd0aCk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcykgdmFsID0gc3RyaW5nX2J5dGVfbGltaXQodmFsLCB0aGlzLiNtYXhfYnl0ZXMpO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcyAmJiBzdHJpbmdfYnl0ZV9sZW5ndGgodmFsKSA+IHRoaXMuI21heF9ieXRlcylcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZVN0cmluZ1JlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfbGVuZ3RoXCIsIHJlbGF0ZWQubWF4X2xlbmd0aCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9sZW5ndGhcIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfYnl0ZXNcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzLCAoKSA9PlxuICAgICAgICBub25lKCksXG4gICAgICApO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2J5dGVzXCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIHNpbmdsZSBsaW5lIHRleHQgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0X2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0SW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2RyYWdfaGFuZGxlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuI3ZhbHVlX2JveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBjb25zdCBzdGFydF95ID0gZS5jbGllbnRZO1xuICAgICAgdGhpcy4jcmVzaXplci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgY29uc3QgZHkgPSBldi5jbGllbnRZIC0gc3RhcnRfeTtcbiAgICAgICAgdGhpcy4jdmFsdWVfYm94LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodCArIGR5fXB4YDtcbiAgICAgIH07XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gKF9ldikgPT4ge1xuICAgICAgICB0aGlzLiNyZXNpemVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLiN2YWx1ZV9ib3gudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgZS5jdHJsS2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy4jc2V0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZV9ib3gudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZV9ib3gucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRNdWx0aWxpbmUpO1xuXG4vKipDcmVhdGVzIGEgbXVsdGkgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9tdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRNdWx0aWxpbmU8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRNdWx0aWxpbmU8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtVGV4dE9wdGlvbnMge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqVGV4dCBzaXplICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBmb3Igc2ltcGxlIHRleHQgKi9cbmNsYXNzIEZvcm1UZXh0IGV4dGVuZHMgRm9ybUVsZW1lbnQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRm9ybVRleHRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAob3B0aW9ucy50ZXh0KSB0aGlzLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1yZW1gO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0KG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucyk6IEZvcm1UZXh0IHtcbiAgcmV0dXJuIG5ldyBGb3JtVGV4dChvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBmb3JtX2J1dHRvbiB9IGZyb20gXCIuL2Jvb2xlYW4vYnV0dG9uL2J1dHRvblwiO1xuaW1wb3J0IHsgZm9ybV9sYW1wIH0gZnJvbSBcIi4vYm9vbGVhbi9sYW1wL2xhbXBcIjtcbmltcG9ydCB7IGZvcm1fc3dpdGNoIH0gZnJvbSBcIi4vYm9vbGVhbi9zd2l0Y2gvc3dpdGNoXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwIH0gZnJvbSBcIi4vZ3JvdXAvZ3JvdXBcIjtcbmltcG9ydCB7IGZvcm1fbGlzdF9maWVsZCB9IGZyb20gXCIuL2xpc3QvbGlzdF9maWVsZFwiO1xuaW1wb3J0IHsgZm9ybV9udW1iZXJfaW5wdXQgfSBmcm9tIFwiLi9udW1iZXIvbnVtYmVySW5wdXQvbnVtYmVyX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3Byb2dyZXNzIH0gZnJvbSBcIi4vbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzXCI7XG5pbXBvcnQgeyBmb3JtX3NsaWRlciB9IGZyb20gXCIuL251bWJlci9zbGlkZXIvc2xpZGVyXCI7XG5pbXBvcnQgeyBmb3JtX3N0ZXBwZXIgfSBmcm9tIFwiLi9udW1iZXIvc3RlcHBlci9zdGVwcGVyXCI7XG5pbXBvcnQgeyBmb3JtX2Ryb3Bkb3duIH0gZnJvbSBcIi4vc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd25cIjtcbmltcG9ydCB7IGZvcm1fdG9nZ2xlX2J1dHRvbiB9IGZyb20gXCIuL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fc3BhY2VyIH0gZnJvbSBcIi4vc3BhY2luZy9zcGFjZXJcIjtcbmltcG9ydCB7IGZvcm1fY29sb3JfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0XCI7XG5pbXBvcnQge1xuICBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbn0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX2lwX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9pcC9pcF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wYXNzd29yZF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9pbnB1dCB9IGZyb20gXCIuL3RleHQvaW5wdXQvdGV4dF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0X211bHRpbGluZSB9IGZyb20gXCIuL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZVwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0IH0gZnJvbSBcIi4vdGV4dC90ZXh0L3RleHRcIjtcblxuLyoqRm9ybSBlbGVtZW50cyB3aXRoIGxhYmVsICovXG5leHBvcnQgY29uc3QgZm9ybSA9IHtcbiAgRm9ybUNvbG9ycyxcblxuICAvL0Jvb2xlYW5cbiAgYnV0dG9uOiBmb3JtX2J1dHRvbixcbiAgc3dpdGNoOiBmb3JtX3N3aXRjaCxcbiAgbGFtcDogZm9ybV9sYW1wLFxuICAvL0dyb3VwXG4gIGdyb3VwOiBmb3JtX2dyb3VwLFxuXG4gIC8vU3BlY2lhbFxuICBjb2xvcl9pbnB1dDogZm9ybV9jb2xvcl9pbnB1dCxcbiAgZGF0ZV90aW1lX2lucHV0OiBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbiAgaXBfaW5wdXQ6IGZvcm1faXBfaW5wdXQsXG4gIHBhc3N3b3JkX2lucHV0OiBmb3JtX3Bhc3N3b3JkX2lucHV0LFxuXG4gIC8vTnVtYmVyXG4gIHByb2dyZXNzOiBmb3JtX3Byb2dyZXNzLFxuICBpbnB1dF9udW1iZXI6IGZvcm1fbnVtYmVyX2lucHV0LFxuICBzbGlkZXI6IGZvcm1fc2xpZGVyLFxuICBzdGVwcGVyOiBmb3JtX3N0ZXBwZXIsXG5cbiAgLy9TZWxlY3RvcnNcbiAgZHJvcGRvd246IGZvcm1fZHJvcGRvd24sXG4gIHRvZ2dsZV9idXR0b246IGZvcm1fdG9nZ2xlX2J1dHRvbixcblxuICAvL1NwYWNpbmdcbiAgc3BhY2VyOiBmb3JtX3NwYWNlcixcblxuICAvL1RleHRcbiAgdGV4dDogZm9ybV90ZXh0LFxuICBpbnB1dF90ZXh0OiBmb3JtX3RleHRfaW5wdXQsXG4gIG11bHRpbGluZV90ZXh0OiBmb3JtX3RleHRfbXVsdGlsaW5lLFxuXG4gIC8vTGlzdFxuICBsaXN0X2ZpZWxkOiBmb3JtX2xpc3RfZmllbGQsXG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybTtcblxuZXhwb3J0IHsgRm9ybUNvbG9ycyB9IGZyb20gXCIuL2Jhc2VcIjtcbmV4cG9ydCB7IEZvcm1EYXRlVGltZVR5cGUgfSBmcm9tIFwiLi9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXRcIjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBVUEsTUFBTSxhQUFhLHlCQUNqQixRQUNBLG9CQUNBLHVDQUNEO0FBUWlCLFdBQVcsZUFDM0IsUUFDQSxhQUNBLCtDQUVPLENBQUMsY0FDUixVQUNBLG9CQUNBLHFEQUNBLGdCQUNBLGdCQUNBLFVBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxTQUFTLFdBQVcsZUFDeEIsVUFDQSxVQUNBLG1DQUNEO0FBUUQsTUFBTSxjQUFjLE9BQU8sZUFDekIsUUFDQSxlQUNBLHdDQUNEO0FBQ0QsWUFBWSxjQUNWLFNBQ0EsZUFDQSxpQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBQ0QsWUFBWSxjQUNWLFVBQ0EscUJBQ0Esc0NBQ0EsS0FBSyxRQUNMLEtBQUssUUFDTCxTQUNBLEtBQUEsRUFDRDtBQUNELFlBQVksY0FDVixZQUNBLHVCQUNBLHdDQUNBLEtBQUssUUFDTCxLQUFLLE9BQ0wsU0FDQSxLQUFBLEVBQ0Q7QUFDRCxZQUFZLGNBQ1YsY0FDQSx5QkFDQSwwQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxvQkFBb0IsT0FBTyxlQUMvQixhQUNBLGdDQUNBLDZEQUNEO0FBQ0Qsa0JBQWtCLGNBQ2hCLFVB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