Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active October 27, 2020 00:37
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/098a1bf77caf2fd0267e3116f128ad13 to your computer and use it in GitHub Desktop.
Save timelyportfolio/098a1bf77caf2fd0267e3116f128ad13 to your computer and use it in GitHub Desktop.
R leaflet tooltips with plotly htmlwidget
license: mit

forked from timelyportfolio's block: R leaflet tooltips with sparkline htmlwidget


See DT issue

helper functions

# Step 1 convert htmlwidget to character representation of HTML components
as.character.htmlwidget <- function(x, ...) {
  htmltools::HTML(
    htmltools:::as.character.shiny.tag.list(
      htmlwidgets:::as.tags.htmlwidget(
        x
      ),
      ...
    )
  )
}

add_deps <- function(dtbl, name, pkg = name) {
  tagList(
    dtbl,
    htmlwidgets::getDependency(name, pkg)
  )
}

make tooltips


library(leaflet) # needs leaflet > 1 timelyportfolio/leaflet@v1.0
library(htmlwidgets)
library(htmltools)
library(plotly)

df <- read.csv(textConnection(
  "Name,Lat,Long
  Samurai Noodle,47.597131,-122.327298
  Kukai Ramen,47.6154,-122.327157
  Tsukushinbo,47.59987,-122.326726"
))


leaflet(df) %>% addTiles() %>%
  addMarkers(
    ~Long, ~Lat,
    popup = lapply(
      seq_along(df),
      function(x) {
        plot_ly(x=~1:20, y=~runif(20)) %>%
          add_markers() %>%
          as.tags() %>%
          {tags$div(style="width:300px;", .)} %>%
          as.character()
      }
    )
  ) %>%
  onRender(
"
function(el,x) {
  this.on('popupopen', function() {HTMLWidgets.staticRender();})
}
") %>%
  add_deps("plotly") %>%
  htmltools::attachDependencies(plotly:::plotlyMainBundle(), append = TRUE) %>%
  htmltools::attachDependencies(crosstalk::crosstalkLibs(), append = TRUE) %>%
  browsable()

This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovDQohZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZD1hLmRvY3VtZW50LGU9Yy5zbGljZSxmPWMuY29uY2F0LGc9Yy5wdXNoLGg9Yy5pbmRleE9mLGk9e30saj1pLnRvU3RyaW5nLGs9aS5oYXNPd25Qcm9wZXJ0eSxsPXt9LG09IjEuMTIuNCIsbj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbi5mbi5pbml0KGEsYil9LG89L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHA9L14tbXMtLyxxPS8tKFtcZGEtel0pL2dpLHI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTtuLmZuPW4ucHJvdG90eXBlPXtqcXVlcnk6bSxjb25zdHJ1Y3RvcjpuLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTplLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1uLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBuLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoMD5hP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmI+Yz9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6Zyxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobi5pc1BsYWluT2JqZWN0KGMpfHwoYj1uLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm4uaXNBcnJheShhKT9hOltdKTpmPWEmJm4uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bi5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW4udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7dmFyIGI9YSYmYS50b1N0cmluZygpO3JldHVybiFuLmlzQXJyYXkoYSkmJmItcGFyc2VGbG9hdChiKSsxPj0wfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2ZvcihiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoIWF8fCJvYmplY3QiIT09bi50eXBlKGEpfHxhLm5vZGVUeXBlfHxuLmlzV2luZG93KGEpKXJldHVybiExO3RyeXtpZihhLmNvbnN0cnVjdG9yJiYhay5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFrLmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX1pZighbC5vd25GaXJzdClmb3IoYiBpbiBhKXJldHVybiBrLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ay5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2lbai5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbi50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHAsIm1zLSIpLnJlcGxhY2UocSxyKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wO2lmKHMoYSkpe2ZvcihjPWEubGVuZ3RoO2M+ZDtkKyspaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrfWVsc2UgZm9yKGQgaW4gYSlpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocyhPYmplY3QoYSkpP24ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmcuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihoKXJldHVybiBoLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnPTAsaD1bXTtpZihzKGEpKWZvcihkPWEubGVuZ3RoO2Q+ZztnKyspZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7ZWxzZSBmb3IoZyBpbiBhKWU9YihhW2ddLGcsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO3JldHVybiBmLmFwcGx5KFtdLGgpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG4uaXNGdW5jdGlvbihhKT8oYz1lLmNhbGwoYXJndW1lbnRzLDIpLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGUuY2FsbChhcmd1bWVudHMpKSl9LGQuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxuLmd1aWQrKyxkKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDpsfSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKG4uZm5bU3ltYm9sLml0ZXJhdG9yXT1jW1N5bWJvbC5pdGVyYXRvcl0pLG4uZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtpWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9ISFhJiYibGVuZ3RoImluIGEmJmEubGVuZ3RoLGM9bi50eXBlKGEpO3JldHVybiJmdW5jdGlvbiI9PT1jfHxuLmlzV2luZG93KGEpPyExOiJhcnJheSI9PT1jfHwwPT09Ynx8Im51bWJlciI9PXR5cGVvZiBiJiZiPjAmJmItMSBpbiBhfXZhciB0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU9InNpenpsZSIrMSpuZXcgRGF0ZSx2PWEuZG9jdW1lbnQsdz0wLHg9MCx5PWdhKCksej1nYSgpLEE9Z2EoKSxCPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYobD0hMCksMH0sQz0xPDwzMSxEPXt9Lmhhc093blByb3BlcnR5LEU9W10sRj1FLnBvcCxHPUUucHVzaCxIPUUucHVzaCxJPUUuc2xpY2UsSj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSz0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEw9IltcXHgyMFxcdFxcclxcblxcZl0iLE09Iig/OlxcXFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIixOPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTSsiKSl8KSIrTCsiKlxcXSIsTz0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK04rIikqKXwuKilcXCl8KSIsUD1uZXcgUmVnRXhwKEwrIisiLCJnIiksUT1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFI9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxTPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVD1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxVPW5ldyBSZWdFeHAoTyksVj1uZXcgUmVnRXhwKCJeIitNKyIkIiksVz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00rInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitOKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitMKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitMKyIqKD86KFsrLV18KSIrTCsiKihcXGQrKXwpKSIrTCsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0wrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTCsiKigoPzotXFxkKT9cXGQqKSIrTCsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksWj0vXltee10rXHtccypcW25hdGl2ZSBcdy8sJD0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLF89L1srfl0vLGFhPS8nfFxcL2csYmE9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxkYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZWEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGZhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdz1iJiZiLm93bmVyRG9jdW1lbnQseD1iP2Iubm9kZVR5cGU6OTtpZihkPWR8fFtdLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT14JiY5IT09eCYmMTEhPT14KXJldHVybiBkO2lmKCFlJiYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4scCkpe2lmKDExIT09eCYmKG89JC5leGVjKGEpKSlpZihmPW9bMV0pe2lmKDk9PT14KXtpZighKGo9Yi5nZXRFbGVtZW50QnlJZChmKSkpcmV0dXJuIGQ7aWYoai5pZD09PWYpcmV0dXJuIGQucHVzaChqKSxkfWVsc2UgaWYodyYmKGo9dy5nZXRFbGVtZW50QnlJZChmKSkmJnQoYixqKSYmai5pZD09PWYpcmV0dXJuIGQucHVzaChqKSxkfWVsc2V7aWYob1syXSlyZXR1cm4gSC5hcHBseShkLGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkpLGQ7aWYoKGY9b1szXSkmJmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGYpKSxkfWlmKGMucXNhJiYhQVthKyIgIl0mJighcXx8IXEudGVzdChhKSkpe2lmKDEhPT14KXc9YixzPWE7ZWxzZSBpZigib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7KGs9Yi5nZXRBdHRyaWJ1dGUoImlkIikpP2s9ay5yZXBsYWNlKGFhLCJcXCQmIik6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLHI9ZyhhKSxoPXIubGVuZ3RoLGw9Vi50ZXN0KGspPyIjIitrOiJbaWQ9JyIraysiJ10iO3doaWxlKGgtLSlyW2hdPWwrIiAiK3FhKHJbaF0pO3M9ci5qb2luKCIsIiksdz1fLnRlc3QoYSkmJm9hKGIucGFyZW50Tm9kZSl8fGJ9aWYocyl0cnl7cmV0dXJuIEguYXBwbHkoZCx3LnF1ZXJ5U2VsZWN0b3JBbGwocykpLGR9Y2F0Y2goeSl7fWZpbmFsbHl7az09PXUmJmIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFEsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGdhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBoYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGlhKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gamEoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGxhKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gaGEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaGEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9ZmEuc3VwcG9ydD17fSxmPWZhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWZhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1uLmRvY3VtZW50RWxlbWVudCxwPSFmKG4pLChlPW4uZGVmYXVsdFZpZXcpJiZlLnRvcCE9PWUmJihlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGRhLCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZGEpKSxjLmF0dHJpYnV0ZXM9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChuLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1aLnRlc3Qobi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhbi5nZXRFbGVtZW50c0J5TmFtZXx8IW4uZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGM/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGJhLGNhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9Wi50ZXN0KG4ucXVlcnlTZWxlY3RvckFsbCkpJiYoaWEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZxLnB1c2goIlsqXiRdPSIrTCsiKig/OicnfFwiXCIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxxLnB1c2goIlxcWyIrTCsiKig/OnZhbHVlfCIrSysiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK3UrIi1dIikubGVuZ3RofHxxLnB1c2goIn49IiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8cS5wdXNoKCI6Y2hlY2tlZCIpLGEucXVlcnlTZWxlY3RvckFsbCgiYSMiK3UrIisqIikubGVuZ3RofHxxLnB1c2goIi4jLitbK35dIil9KSxpYShmdW5jdGlvbihhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Yi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxhLmFwcGVuZENoaWxkKGIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZxLnB1c2goIm5hbWUiK0wrIipbKl4kfCF+XT89IiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8cS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHEucHVzaCgiLC4qOiIpfSkpLChjLm1hdGNoZXNTZWxlY3Rvcj1aLnRlc3Qocz1vLm1hdGNoZXN8fG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxvLm1vek1hdGNoZXNTZWxlY3Rvcnx8by5vTWF0Y2hlc1NlbGVjdG9yfHxvLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmlhKGZ1bmN0aW9uKGEpe2MuZGlzY29ubmVjdGVkTWF0Y2g9cy5jYWxsKGEsImRpdiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixPKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9Wi50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8Wi50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0ooayxhKS1KKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SihrLGEpLUooayxiKTowO2lmKGU9PT1mKXJldHVybiBrYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/a2EoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGZhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZmEoYSxudWxsLG51bGwsYil9LGZhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShULCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBmYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxmYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGZhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxmYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGZhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1mYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9ZmEuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aGEsbWF0Y2g6VyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGJhLGNhKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShiYSxjYSksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGZhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmZhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBXLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlUudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWZhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUCwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaCx0PSExO2lmKHEpe2lmKGYpe3doaWxlKHApe209Yjt3aGlsZShtPW1bcF0paWYoaD9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1tLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7bT1xLGw9bVt1XXx8KG1bdV09e30pLGs9bFttLnVuaXF1ZUlEXXx8KGxbbS51bmlxdWVJRF09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSx0PW4mJmpbMl0sbT1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobT0rK24mJm0mJm1bcF18fCh0PW49MCl8fG8ucG9wKCkpaWYoMT09PW0ubm9kZVR5cGUmJisrdCYmbT09PWIpe2tbYV09W3csbix0XTticmVha319ZWxzZSBpZihzJiYobT1iLGw9bVt1XXx8KG1bdV09e30pLGs9bFttLnVuaXF1ZUlEXXx8KGxbbS51bmlxdWVJRF09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSx0PW4pLHQ9PT0hMSl3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigoaD9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1tLm5vZGVUeXBlKSYmKyt0JiYocyYmKGw9bVt1XXx8KG1bdV09e30pLGs9bFttLnVuaXF1ZUlEXXx8KGxbbS51bmlxdWVJRF09e30pLGtbYV09W3csdF0pLG09PT1iKSlicmVhaztyZXR1cm4gdC09ZSx0PT09ZHx8dCVkPT09MCYmdC9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8ZmEuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9oYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDpoYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUSwiJDEiKSk7cmV0dXJuIGRbdV0/aGEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczpoYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGZhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aGEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGJhLGNhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzpoYShmdW5jdGlvbihhKXtyZXR1cm4gVi50ZXN0KGF8fCIiKXx8ZmEuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoYmEsY2EpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBYLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om5hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpuYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6bmEoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpuYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpuYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om5hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPWxhKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2Z1bmN0aW9uIHBhKCl7fXBhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcGEsZz1mYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXtjJiYhKGU9Ui5leGVjKGgpKXx8KGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9Uy5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShRLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9V1tnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2ZhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcWEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiByYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqLGs9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihqPWJbdV18fChiW3VdPXt9KSxpPWpbYi51bmlxdWVJRF18fChqW2IudW5pcXVlSURdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBrWzJdPWhbMl07aWYoaVtkXT1rLGtbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiBzYShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB0YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWZhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB1YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXZhKGQpKSxlJiYhZVt1XSYmKGU9dmEoZSxmKSksaGEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dGEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dWEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXVhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj11YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24gd2EoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1yYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9cmEoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bcmEoc2EobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHZhKGk+MSYmc2EobSksaT4xJiZxYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFEsIiQxIiksYyxlPmkmJndhKGEuc2xpY2UoaSxlKSksZj5lJiZ3YShhPWEuc2xpY2UoZSkpLGY+ZSYmcWEoYSkpfW0ucHVzaChjKX1yZXR1cm4gc2EobSl9ZnVuY3Rpb24geGEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109Ri5jYWxsKGkpKTt1PXVhKHUpfUguYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZmYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aGEoZik6Zn1yZXR1cm4gaD1mYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9d2EoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHhhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1mYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGJhLGNhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9Vy5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLF8udGVzdChqWzBdLnR5cGUpJiZvYShiLnBhcmVudE5vZGUpfHxiKSkpe2lmKGouc3BsaWNlKGksMSksYT1mLmxlbmd0aCYmcWEoaiksIWEpcmV0dXJuIEguYXBwbHkoZSxmKSxlO2JyZWFrfX19cmV0dXJuKG58fGgoYSxvKSkoZixiLCFwLGUsIWJ8fF8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8YiksZX0sYy5zb3J0U3RhYmxlPXUuc3BsaXQoIiIpLnNvcnQoQikuam9pbigiIik9PT11LGMuZGV0ZWN0RHVwbGljYXRlcz0hIWwsbSgpLGMuc29ydERldGFjaGVkPWlhKGZ1bmN0aW9uKGEpe3JldHVybiAxJmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24obi5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSxpYShmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxqYSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphLmdldEF0dHJpYnV0ZShiLCJ0eXBlIj09PWIudG9Mb3dlckNhc2UoKT8xOjIpfSksYy5hdHRyaWJ1dGVzJiZpYShmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxpbnB1dC8+IixhLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxqYSgidmFsdWUiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY3x8ImlucHV0IiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT92b2lkIDA6YS5kZWZhdWx0VmFsdWV9KSxpYShmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8amEoSyxmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOmFbYl09PT0hMD9iLnRvTG93ZXJDYXNlKCk6KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZC5zcGVjaWZpZWQ/ZC52YWx1ZTpudWxsfSksZmF9KGEpO24uZmluZD10LG4uZXhwcj10LnNlbGVjdG9ycyxuLmV4cHJbIjoiXT1uLmV4cHIucHNldWRvcyxuLnVuaXF1ZVNvcnQ9bi51bmlxdWU9dC51bmlxdWVTb3J0LG4udGV4dD10LmdldFRleHQsbi5pc1hNTERvYz10LmlzWE1MLG4uY29udGFpbnM9dC5jb250YWluczt2YXIgdT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmbihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHY9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LHc9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx4PS9ePChbXHctXSspXHMqXC8/Pig/OjxcL1wxPnwpJC8seT0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHooYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYoeS50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbi5pbkFycmF5KGEsYik+LTEhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG4uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbi5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bi51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHoodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHoodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXoodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJncudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIEEsQj0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEM9bi5mbi5pbml0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmO2lmKCFhKXJldHVybiB0aGlzO2lmKGM9Y3x8QSwic3RyaW5nIj09dHlwZW9mIGEpe2lmKGU9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkIuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBuP2JbMF06YixuLm1lcmdlKHRoaXMsbi5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSkseC50ZXN0KGVbMV0pJiZuLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYiluLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31pZihmPWQuZ2V0RWxlbWVudEJ5SWQoZVsyXSksZiYmZi5wYXJlbnROb2RlKXtpZihmLmlkIT09ZVsyXSlyZXR1cm4gQS5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1mfXJldHVybiB0aGlzLmNvbnRleHQ9ZCx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm4uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIGMucmVhZHk/Yy5yZWFkeShhKTphKG4pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG4ubWFrZUFycmF5KGEsdGhpcykpfTtDLnByb3RvdHlwZT1uLmZuLEE9bihkKTt2YXIgRD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxFPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O24uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1uKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobi5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXcudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9uLmluQXJyYXkodGhpc1swXSxuKGEpKTpuLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4udW5pcXVlU29ydChuLm1lcmdlKHRoaXMuZ2V0KCksbihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBGKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1uLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBGKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHUoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHYoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB2KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6bi5tZXJnZShbXSxhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9bi5tYXAodGhpcyxiLGMpO3JldHVybiJVbnRpbCIhPT1hLnNsaWNlKC01KSYmKGQ9YyksZCYmInN0cmluZyI9PXR5cGVvZiBkJiYoZT1uLmZpbHRlcihkLGUpKSx0aGlzLmxlbmd0aD4xJiYoRVthXXx8KGU9bi51bmlxdWVTb3J0KGUpKSxELnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEc9L1xTKy9nO2Z1bmN0aW9uIEgoYSl7dmFyIGI9e307cmV0dXJuIG4uZWFjaChhLm1hdGNoKEcpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifW4uQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP0goYSk6bi5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe24uZWFjaChiLGZ1bmN0aW9uKGIsYyl7bi5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PW4udHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9bi5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxoPj1jJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9ITAsY3x8ai5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiBlfHwoYz1jfHxbXSxjPVthLGMuc2xpY2U/Yy5zbGljZSgpOmNdLGcucHVzaChjKSxifHxpKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gai5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWR9fTtyZXR1cm4gan0sbi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPVtbInJlc29sdmUiLCJkb25lIixuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLG4uQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLGM9InBlbmRpbmciLGQ9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBlLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gbi5EZWZlcnJlZChmdW5jdGlvbihjKXtuLmVhY2goYixmdW5jdGlvbihiLGYpe3ZhciBnPW4uaXNGdW5jdGlvbihhW2JdKSYmYVtiXTtlW2ZbMV1dKGZ1bmN0aW9uKCl7dmFyIGE9ZyYmZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YS5wcm9taXNlKCkucHJvZ3Jlc3MoYy5ub3RpZnkpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KTpjW2ZbMF0rIldpdGgiXSh0aGlzPT09ZD9jLnByb21pc2UoKTp0aGlzLGc/W2FdOmFyZ3VtZW50cyl9KX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9uLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLG4uZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlsxXmFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGVbZlswXSsiV2l0aCJdKHRoaXM9PT1lP2Q6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGVbZlswXSsiV2l0aCJdPWcuZmlyZVdpdGh9KSxkLnByb21pc2UoZSksYSYmYS5jYWxsKGUsZSksZX0sd2hlbjpmdW5jdGlvbihhKXt2YXIgYj0wLGM9ZS5jYWxsKGFyZ3VtZW50cyksZD1jLmxlbmd0aCxmPTEhPT1kfHxhJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9kOjAsZz0xPT09Zj9hOm4uRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7YlthXT10aGlzLGNbYV09YXJndW1lbnRzLmxlbmd0aD4xP2UuY2FsbChhcmd1bWVudHMpOmQsYz09PWk/Zy5ub3RpZnlXaXRoKGIsYyk6LS1mfHxnLnJlc29sdmVXaXRoKGIsYyl9fSxpLGosaztpZihkPjEpZm9yKGk9bmV3IEFycmF5KGQpLGo9bmV3IEFycmF5KGQpLGs9bmV3IEFycmF5KGQpO2Q+YjtiKyspY1tiXSYmbi5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkucHJvZ3Jlc3MoaChiLGosaSkpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpOi0tZjtyZXR1cm4gZnx8Zy5yZXNvbHZlV2l0aChrLGMpLGcucHJvbWlzZSgpfX0pO3ZhciBJO24uZm4ucmVhZHk9ZnVuY3Rpb24oYSl7cmV0dXJuIG4ucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sbi5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/bi5yZWFkeVdhaXQrKzpuLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7KGE9PT0hMD8tLW4ucmVhZHlXYWl0Om4uaXNSZWFkeSl8fChuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChJLnJlc29sdmVXaXRoKGQsW25dKSxuLmZuLnRyaWdnZXJIYW5kbGVyJiYobihkKS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxuKGQpLm9mZigicmVhZHkiKSkpKX19KTtmdW5jdGlvbiBKKCl7ZC5hZGRFdmVudExpc3RlbmVyPyhkLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEspLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSykpOihkLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEspLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSykpfWZ1bmN0aW9uIEsoKXsoZC5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1hLmV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGUpJiYoSigpLG4ucmVhZHkoKSl9bi5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFJKWlmKEk9bi5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKWEuc2V0VGltZW91dChuLnJlYWR5KTtlbHNlIGlmKGQuYWRkRXZlbnRMaXN0ZW5lcilkLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEspLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSyk7ZWxzZXtkLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEspLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSyk7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJmQuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGUpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZigpe2lmKCFuLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYil7cmV0dXJuIGEuc2V0VGltZW91dChmLDUwKX1KKCksbi5yZWFkeSgpfX0oKX1yZXR1cm4gSS5wcm9taXNlKGIpfSxuLnJlYWR5LnByb21pc2UoKTt2YXIgTDtmb3IoTCBpbiBuKGwpKWJyZWFrO2wub3duRmlyc3Q9IjAiPT09TCxsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbihmdW5jdGlvbigpe3ZhciBhLGIsYyxlO2M9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZSkpfSksZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuZGVsZXRlRXhwYW5kbz0hMDt0cnl7ZGVsZXRlIGEudGVzdH1jYXRjaChiKXtsLmRlbGV0ZUV4cGFuZG89ITF9YT1udWxsfSgpO3ZhciBNPWZ1bmN0aW9uKGEpe3ZhciBiPW4ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifSxOPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIFAoYSxiLGMpe2lmKHZvaWQgMD09PWMmJjE9PT1hLm5vZGVUeXBlKXt2YXIgZD0iZGF0YS0iK2IucmVwbGFjZShPLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKGM9YS5nZXRBdHRyaWJ1dGUoZCksInN0cmluZyI9PXR5cGVvZiBjKXt0cnl7Yz0idHJ1ZSI9PT1jPyEwOiJmYWxzZSI9PT1jPyExOiJudWxsIj09PWM/bnVsbDorYysiIj09PWM/K2M6Ti50ZXN0KGMpP24ucGFyc2VKU09OKGMpOmN9Y2F0Y2goZSl7fW4uZGF0YShhLGIsYyl9ZWxzZSBjPXZvaWQgMDsNCn1yZXR1cm4gY31mdW5jdGlvbiBRKGEpe3ZhciBiO2ZvcihiIGluIGEpaWYoKCJkYXRhIiE9PWJ8fCFuLmlzRW1wdHlPYmplY3QoYVtiXSkpJiYidG9KU09OIiE9PWIpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUihhLGIsZCxlKXtpZihNKGEpKXt2YXIgZixnLGg9bi5leHBhbmRvLGk9YS5ub2RlVHlwZSxqPWk/bi5jYWNoZTphLGs9aT9hW2hdOmFbaF0mJmg7aWYoayYmaltrXSYmKGV8fGpba10uZGF0YSl8fHZvaWQgMCE9PWR8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4ga3x8KGs9aT9hW2hdPWMucG9wKCl8fG4uZ3VpZCsrOmgpLGpba118fChqW2tdPWk/e306e3RvSlNPTjpuLm5vb3B9KSwib2JqZWN0IiE9dHlwZW9mIGImJiJmdW5jdGlvbiIhPXR5cGVvZiBifHwoZT9qW2tdPW4uZXh0ZW5kKGpba10sYik6altrXS5kYXRhPW4uZXh0ZW5kKGpba10uZGF0YSxiKSksZz1qW2tdLGV8fChnLmRhdGF8fChnLmRhdGE9e30pLGc9Zy5kYXRhKSx2b2lkIDAhPT1kJiYoZ1tuLmNhbWVsQ2FzZShiKV09ZCksInN0cmluZyI9PXR5cGVvZiBiPyhmPWdbYl0sbnVsbD09ZiYmKGY9Z1tuLmNhbWVsQ2FzZShiKV0pKTpmPWcsZn19ZnVuY3Rpb24gUyhhLGIsYyl7aWYoTShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP24uY2FjaGU6YSxoPWY/YVtuLmV4cGFuZG9dOm4uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bi5pc0FycmF5KGIpP2I9Yi5jb25jYXQobi5tYXAoYixuLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1uLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFRKGQpOiFuLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxRKGdbaF0pKSkmJihmP24uY2xlYW5EYXRhKFthXSwhMCk6bC5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPXZvaWQgMCl9fX1uLmV4dGVuZCh7Y2FjaGU6e30sbm9EYXRhOnsiYXBwbGV0ICI6ITAsImVtYmVkICI6ITAsIm9iamVjdCAiOiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAifSxoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBhPWEubm9kZVR5cGU/bi5jYWNoZVthW24uZXhwYW5kb11dOmFbbi5leHBhbmRvXSwhIWEmJiFRKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUihhLGIsYyl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIpfSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMsITApfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe3JldHVybiBTKGEsYiwhMCl9fSksbi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1uLmRhdGEoZiksMT09PWYubm9kZVR5cGUmJiFuLl9kYXRhKGYsInBhcnNlZEF0dHJzIikpKXtjPWcubGVuZ3RoO3doaWxlKGMtLSlnW2NdJiYoZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpKTtuLl9kYXRhKGYsInBhcnNlZEF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe24uZGF0YSh0aGlzLGEpfSk6YXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaChmdW5jdGlvbigpe24uZGF0YSh0aGlzLGEsYil9KTpmP1AoZixhLG4uZGF0YShmLGEpKTp2b2lkIDB9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24ucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYT8oYj0oYnx8ImZ4IikrInF1ZXVlIixkPW4uX2RhdGEoYSxiKSxjJiYoIWR8fG4uaXNBcnJheShjKT9kPW4uX2RhdGEoYSxiLG4ubWFrZUFycmF5KGMpKTpkLnB1c2goYykpLGR8fFtdKTp2b2lkIDB9LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9bi5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1uLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe24uZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBuLl9kYXRhKGEsYyl8fG4uX2RhdGEoYSxjLHtlbXB0eTpuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtuLl9yZW1vdmVEYXRhKGEsYisicXVldWUiKSxuLl9yZW1vdmVEYXRhKGEsYyl9KX0pfX0pLG4uZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9uLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPW4ucXVldWUodGhpcyxhLGIpO24uX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPW4uRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9bi5fZGF0YShmW2ddLGErInF1ZXVlSG9va3MiKSxjJiZjLmVtcHR5JiYoZCsrLGMuZW1wdHkuYWRkKGgpKTtyZXR1cm4gaCgpLGUucHJvbWlzZShiKX19KSxmdW5jdGlvbigpe3ZhciBhO2wuc2hyaW5rV3JhcEJsb2Nrcz1mdW5jdGlvbigpe2lmKG51bGwhPWEpcmV0dXJuIGE7YT0hMTt2YXIgYixjLGU7cmV0dXJuIGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGU/KGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsYi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5zdHlsZS53aWR0aD0iNXB4IixhPTMhPT1iLm9mZnNldFdpZHRoKSxjLnJlbW92ZUNoaWxkKGUpLGEpOnZvaWQgMH19KCk7dmFyIFQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrVCsiKShbYS16JV0qKSQiLCJpIiksVj1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW4uY3NzKGEsImRpc3BsYXkiKXx8IW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfTtmdW5jdGlvbiBYKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBuLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChuLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShuLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmVS5leGVjKG4uY3NzKGEsYikpO2lmKGsmJmtbM10hPT1qKXtqPWp8fGtbM10sYz1jfHxbXSxrPStpfHwxO2RvIGY9Znx8Ii41IixrLz1mLG4uc3R5bGUoYSxiLGsraik7d2hpbGUoZiE9PShmPWgoKS9pKSYmMSE9PWYmJi0tZyl9cmV0dXJuIGMmJihrPStrfHwraXx8MCxlPWNbMV0/aysoY1sxXSsxKSpjWzJdOitjWzJdLGQmJihkLnVuaXQ9aixkLnN0YXJ0PWssZC5lbmQ9ZSkpLGV9dmFyIFk9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9MCxpPWEubGVuZ3RoLGo9bnVsbD09YztpZigib2JqZWN0Ij09PW4udHlwZShjKSl7ZT0hMDtmb3IoaCBpbiBjKVkoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn0sWj0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSwkPS88KFtcdzotXSspLyxfPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxhYT0vXlxzKy8sYmE9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xkaWFsb2d8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFpbnxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cGljdHVyZXxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGVtcGxhdGV8dGltZXx2aWRlbyI7ZnVuY3Rpb24gY2EoYSl7dmFyIGI9YmEuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPWQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2EuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGwubGVhZGluZ1doaXRlc3BhY2U9Mz09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSxsLnRib2R5PSFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxsLmh0bWxTZXJpYWxpemU9ISFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLGwuaHRtbDVDbG9uZT0iPDpuYXY+PC86bmF2PiIhPT1kLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MLGMudHlwZT0iY2hlY2tib3giLGMuY2hlY2tlZD0hMCxiLmFwcGVuZENoaWxkKGMpLGwuYXBwZW5kQ2hlY2tlZD1jLmNoZWNrZWQsYS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGwubm9DbG9uZUNoZWNrZWQ9ISFhLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxiLmFwcGVuZENoaWxkKGEpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGMuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxhLmFwcGVuZENoaWxkKGMpLGwuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxsLm5vQ2xvbmVFdmVudD0hIWEuYWRkRXZlbnRMaXN0ZW5lcixhW24uZXhwYW5kb109MSxsLmF0dHJpYnV0ZXM9IWEuZ2V0QXR0cmlidXRlKG4uZXhwYW5kbyl9KCk7dmFyIGRhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpsLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX07ZGEub3B0Z3JvdXA9ZGEub3B0aW9uLGRhLnRib2R5PWRhLnRmb290PWRhLmNvbGdyb3VwPWRhLmNhcHRpb249ZGEudGhlYWQsZGEudGg9ZGEudGQ7ZnVuY3Rpb24gZWEoYSxiKXt2YXIgYyxkLGU9MCxmPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGw/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bi5ub2RlTmFtZShkLGIpP2YucHVzaChkKTpuLm1lcmdlKGYsZWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm4ubm9kZU5hbWUoYSxiKT9uLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIGZhKGEsYil7Zm9yKHZhciBjLGQ9MDtudWxsIT0oYz1hW2RdKTtkKyspbi5fZGF0YShjLCJnbG9iYWxFdmFsIiwhYnx8bi5fZGF0YShiW2RdLCJnbG9iYWxFdmFsIikpfXZhciBnYT0vPHwmIz9cdys7LyxoYT0vPHRib2R5L2k7ZnVuY3Rpb24gaWEoYSl7Wi50ZXN0KGEudHlwZSkmJihhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZCl9ZnVuY3Rpb24gamEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZyxoLGksaixrLG0sbz1hLmxlbmd0aCxwPWNhKGIpLHE9W10scj0wO28+cjtyKyspaWYoZz1hW3JdLGd8fDA9PT1nKWlmKCJvYmplY3QiPT09bi50eXBlKGcpKW4ubWVyZ2UocSxnLm5vZGVUeXBlP1tnXTpnKTtlbHNlIGlmKGdhLnRlc3QoZykpe2k9aXx8cC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxqPSgkLmV4ZWMoZyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1kYVtqXXx8ZGEuX2RlZmF1bHQsaS5pbm5lckhUTUw9bVsxXStuLmh0bWxQcmVmaWx0ZXIoZykrbVsyXSxmPW1bMF07d2hpbGUoZi0tKWk9aS5sYXN0Q2hpbGQ7aWYoIWwubGVhZGluZ1doaXRlc3BhY2UmJmFhLnRlc3QoZykmJnEucHVzaChiLmNyZWF0ZVRleHROb2RlKGFhLmV4ZWMoZylbMF0pKSwhbC50Ym9keSl7Zz0idGFibGUiIT09anx8aGEudGVzdChnKT8iPHRhYmxlPiIhPT1tWzFdfHxoYS50ZXN0KGcpPzA6aTppLmZpcnN0Q2hpbGQsZj1nJiZnLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGYtLSluLm5vZGVOYW1lKGs9Zy5jaGlsZE5vZGVzW2ZdLCJ0Ym9keSIpJiYhay5jaGlsZE5vZGVzLmxlbmd0aCYmZy5yZW1vdmVDaGlsZChrKX1uLm1lcmdlKHEsaS5jaGlsZE5vZGVzKSxpLnRleHRDb250ZW50PSIiO3doaWxlKGkuZmlyc3RDaGlsZClpLnJlbW92ZUNoaWxkKGkuZmlyc3RDaGlsZCk7aT1wLmxhc3RDaGlsZH1lbHNlIHEucHVzaChiLmNyZWF0ZVRleHROb2RlKGcpKTtpJiZwLnJlbW92ZUNoaWxkKGkpLGwuYXBwZW5kQ2hlY2tlZHx8bi5ncmVwKGVhKHEsImlucHV0IiksaWEpLHI9MDt3aGlsZShnPXFbcisrXSlpZihkJiZuLmluQXJyYXkoZyxkKT4tMSllJiZlLnB1c2goZyk7ZWxzZSBpZihoPW4uY29udGFpbnMoZy5vd25lckRvY3VtZW50LGcpLGk9ZWEocC5hcHBlbmRDaGlsZChnKSwic2NyaXB0IiksaCYmZmEoaSksYyl7Zj0wO3doaWxlKGc9aVtmKytdKV8udGVzdChnLnR5cGV8fCIiKSYmYy5wdXNoKGcpfXJldHVybiBpPW51bGwscH0hZnVuY3Rpb24oKXt2YXIgYixjLGU9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChsW2JdPWMgaW4gYSl8fChlLnNldEF0dHJpYnV0ZShjLCJ0IiksbFtiXT1lLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExKTtlPW51bGx9KCk7dmFyIGthPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxsYT0vXmtleS8sbWE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLG5hPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxvYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gcGEoKXtyZXR1cm4hMH1mdW5jdGlvbiBxYSgpe3JldHVybiExfWZ1bmN0aW9uIHJhKCl7dHJ5e3JldHVybiBkLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1mdW5jdGlvbiBzYShhLGIsYyxkLGUsZil7dmFyIGcsaDtpZigib2JqZWN0Ij09dHlwZW9mIGIpeyJzdHJpbmciIT10eXBlb2YgYyYmKGQ9ZHx8YyxjPXZvaWQgMCk7Zm9yKGggaW4gYilzYShhLGgsYyxkLGJbaF0sZik7cmV0dXJuIGF9aWYobnVsbD09ZCYmbnVsbD09ZT8oZT1jLGQ9Yz12b2lkIDApOm51bGw9PWUmJigic3RyaW5nIj09dHlwZW9mIGM/KGU9ZCxkPXZvaWQgMCk6KGU9ZCxkPWMsYz12b2lkIDApKSxlPT09ITEpZT1xYTtlbHNlIGlmKCFlKXJldHVybiBhO3JldHVybiAxPT09ZiYmKGc9ZSxlPWZ1bmN0aW9uKGEpe3JldHVybiBuKCkub2ZmKGEpLGcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9Zy5ndWlkfHwoZy5ndWlkPW4uZ3VpZCsrKSksYS5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5hZGQodGhpcyxiLGUsZCxjKX0pfW4uZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5fZGF0YShhKTtpZihyKXtjLmhhbmRsZXImJihpPWMsYz1pLmhhbmRsZXIsZT1pLnNlbGVjdG9yKSxjLmd1aWR8fChjLmd1aWQ9bi5ndWlkKyspLChnPXIuZXZlbnRzKXx8KGc9ci5ldmVudHM9e30pLChrPXIuaGFuZGxlKXx8KGs9ci5oYW5kbGU9ZnVuY3Rpb24oYSl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBufHxhJiZuLmV2ZW50LnRyaWdnZXJlZD09PWEudHlwZT92b2lkIDA6bi5ldmVudC5kaXNwYXRjaC5hcHBseShrLmVsZW0sYXJndW1lbnRzKX0say5lbGVtPWEpLGI9KGJ8fCIiKS5tYXRjaChHKXx8WyIiXSxoPWIubGVuZ3RoO3doaWxlKGgtLSlmPW9hLmV4ZWMoYltoXSl8fFtdLG89cT1mWzFdLHA9KGZbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvJiYoaj1uLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGU/ai5kZWxlZ2F0ZVR5cGU6ai5iaW5kVHlwZSl8fG8saj1uLmV2ZW50LnNwZWNpYWxbb118fHt9LGw9bi5leHRlbmQoe3R5cGU6byxvcmlnVHlwZTpxLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmbi5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpwLmpvaW4oIi4iKX0saSksKG09Z1tvXSl8fChtPWdbb109W10sbS5kZWxlZ2F0ZUNvdW50PTAsai5zZXR1cCYmai5zZXR1cC5jYWxsKGEsZCxwLGspIT09ITF8fChhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG8saywhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK28saykpKSxqLmFkZCYmKGouYWRkLmNhbGwoYSxsKSxsLmhhbmRsZXIuZ3VpZHx8KGwuaGFuZGxlci5ndWlkPWMuZ3VpZCkpLGU/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxsKTptLnB1c2gobCksbi5ldmVudC5nbG9iYWxbb109ITApO2E9bnVsbH19LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1uLmhhc0RhdGEoYSkmJm4uX2RhdGEoYSk7aWYociYmKGs9ci5ldmVudHMpKXtiPShifHwiIikubWF0Y2goRyl8fFsiIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paWYoaD1vYS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1uLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbT1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW0ubGVuZ3RoO3doaWxlKGYtLSlnPW1bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChtLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm0uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFtLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG4ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW4uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bi5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG4uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixsLG0sbyxwPVtlfHxkXSxxPWsuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscj1rLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihpPW09ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIW5hLnRlc3QocStuLmV2ZW50LnRyaWdnZXJlZCkmJihxLmluZGV4T2YoIi4iKT4tMSYmKHI9cS5zcGxpdCgiLiIpLHE9ci5zaGlmdCgpLHIuc29ydCgpKSxoPXEuaW5kZXhPZigiOiIpPDAmJiJvbiIrcSxiPWJbbi5leHBhbmRvXT9iOm5ldyBuLkV2ZW50KHEsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1yLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrci5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06bi5tYWtlQXJyYXkoYyxbYl0pLGw9bi5ldmVudC5zcGVjaWFsW3FdfHx7fSxmfHwhbC50cmlnZ2VyfHxsLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFsLm5vQnViYmxlJiYhbi5pc1dpbmRvdyhlKSl7Zm9yKGo9bC5kZWxlZ2F0ZVR5cGV8fHEsbmEudGVzdChqK3EpfHwoaT1pLnBhcmVudE5vZGUpO2k7aT1pLnBhcmVudE5vZGUpcC5wdXNoKGkpLG09aTttPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJnAucHVzaChtLmRlZmF1bHRWaWV3fHxtLnBhcmVudFdpbmRvd3x8YSl9bz0wO3doaWxlKChpPXBbbysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW8+MT9qOmwuYmluZFR5cGV8fHEsZz0obi5fZGF0YShpLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm4uX2RhdGEoaSwiaGFuZGxlIiksZyYmZy5hcHBseShpLGMpLGc9aCYmaVtoXSxnJiZnLmFwcGx5JiZNKGkpJiYoYi5yZXN1bHQ9Zy5hcHBseShpLGMpLGIucmVzdWx0PT09ITEmJmIucHJldmVudERlZmF1bHQoKSk7aWYoYi50eXBlPXEsIWYmJiFiLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIWwuX2RlZmF1bHR8fGwuX2RlZmF1bHQuYXBwbHkocC5wb3AoKSxjKT09PSExKSYmTShlKSYmaCYmZVtxXSYmIW4uaXNXaW5kb3coZSkpe209ZVtoXSxtJiYoZVtoXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1xO3RyeXtlW3FdKCl9Y2F0Y2gocyl7fW4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxtJiYoZVtoXT1tKX1yZXR1cm4gYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZCxmLGcsaD1bXSxpPWUuY2FsbChhcmd1bWVudHMpLGo9KG4uX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sYz0wO3doaWxlKChnPWYuaGFuZGxlcnNbYysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYS5ybmFtZXNwYWNlJiYhYS5ybmFtZXNwYWNlLnRlc3QoZy5uYW1lc3BhY2UpfHwoYS5oYW5kbGVPYmo9ZyxhLmRhdGE9Zy5kYXRhLGQ9KChuLmV2ZW50LnNwZWNpYWxbZy5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGcuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWQmJihhLnJlc3VsdD1kKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJigiY2xpY2siIT09YS50eXBlfHxpc05hTihhLmJ1dHRvbil8fGEuYnV0dG9uPDEpKWZvcig7aSE9dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZigxPT09aS5ub2RlVHlwZSYmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSkpe2ZvcihkPVtdLGM9MDtoPmM7YysrKWY9YltjXSxlPWYuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWRbZV0mJihkW2VdPWYubmVlZHNDb250ZXh0P24oZSx0aGlzKS5pbmRleChpKT4tMTpuLmZpbmQoZSx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGRbZV0mJmQucHVzaChmKTtkLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZH0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGUsZj1hLnR5cGUsZz1hLGg9dGhpcy5maXhIb29rc1tmXTtofHwodGhpcy5maXhIb29rc1tmXT1oPW1hLnRlc3QoZik/dGhpcy5tb3VzZUhvb2tzOmxhLnRlc3QoZik/dGhpcy5rZXlIb29rczp7fSksZT1oLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGgucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbi5FdmVudChnKSxiPWUubGVuZ3RoO3doaWxlKGItLSljPWVbYl0sYVtjXT1nW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWcuc3JjRWxlbWVudHx8ZCksMz09PWEudGFyZ2V0Lm5vZGVUeXBlJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PSEhYS5tZXRhS2V5LGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZz1iLmJ1dHRvbixoPWIuZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWEucGFnZVgmJm51bGwhPWIuY2xpZW50WCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8ZCxmPWUuZG9jdW1lbnRFbGVtZW50LGM9ZS5ib2R5LGEucGFnZVg9Yi5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGMmJmMuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8YyYmYy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWIuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGMmJmMuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGMmJmMuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaCYmKGEucmVsYXRlZFRhcmdldD1oPT09YS50YXJnZXQ/Yi50b0VsZW1lbnQ6aCksYS53aGljaHx8dm9pZCAwPT09Z3x8KGEud2hpY2g9MSZnPzE6MiZnPzM6NCZnPzI6MCksYX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1yYSgpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGEpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PXJhKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiaW5wdXQiKSYmImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljaz8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmYS5vcmlnaW5hbEV2ZW50JiYoYS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWEucmVzdWx0KX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7bi5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKSxkLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxuLnJlbW92ZUV2ZW50PWQucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjKX06ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSJvbiIrYjthLmRldGFjaEV2ZW50JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBhW2RdJiYoYVtkXT1udWxsKSxhLmRldGFjaEV2ZW50KGQsYykpfSxuLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT9wYTpxYSk6dGhpcy50eXBlPWEsYiYmbi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8bi5ub3coKSx2b2lkKHRoaXNbbi5leHBhbmRvXT0hMCkpOm5ldyBuLkV2ZW50KGEsYil9LG4uRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpxYSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpxYSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpxYSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1wYSxhJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXBhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiYoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sbi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihhLGIpe24uZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGMsZD10aGlzLGU9YS5yZWxhdGVkVGFyZ2V0LGY9YS5oYW5kbGVPYmo7cmV0dXJuIGUmJihlPT09ZHx8bi5jb250YWlucyhkLGUpKXx8KGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbC5zdWJtaXR8fChuLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG4uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1uLm5vZGVOYW1lKGIsImlucHV0Iil8fG4ubm9kZU5hbWUoYiwiYnV0dG9uIik/bi5wcm9wKGIsImZvcm0iKTp2b2lkIDA7YyYmIW4uX2RhdGEoYywic3VibWl0IikmJihuLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0QnViYmxlPSEwfSksbi5fZGF0YShjLCJzdWJtaXQiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRCdWJibGUsdGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJm4uZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEpKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGwuY2hhbmdlfHwobi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4ga2EudGVzdCh0aGlzLm5vZGVOYW1lKT8oImNoZWNrYm94IiE9PXRoaXMudHlwZSYmInJhZGlvIiE9PXRoaXMudHlwZXx8KG4uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0Q2hhbmdlZD0hMCl9KSxuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0Q2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdENoYW5nZWQ9ITEpLG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhKX0pKSwhMSk6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtrYS50ZXN0KGIubm9kZU5hbWUpJiYhbi5fZGF0YShiLCJjaGFuZ2UiKSYmKG4uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSl9KSxuLl9kYXRhKGIsImNoYW5nZSIsITApKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7cmV0dXJuIHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8InJhZGlvIiE9PWIudHlwZSYmImNoZWNrYm94IiE9PWIudHlwZT9hLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp2b2lkIDB9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiksIWthLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksbC5mb2N1c2lufHxuLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oYSl7bi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LG4uZXZlbnQuZml4KGEpKX07bi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKTtlfHxkLmFkZEV2ZW50TGlzdGVuZXIoYSxjLCEwKSxuLl9kYXRhKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9bi5fZGF0YShkLGIpLTE7ZT9uLl9kYXRhKGQsYixlKTooZC5yZW1vdmVFdmVudExpc3RlbmVyKGEsYywhMCksbi5fcmVtb3ZlRGF0YShkLGIpKX19fSksbi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQpfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHNhKHRoaXMsYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBkPWEuaGFuZGxlT2JqLG4oYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGQubmFtZXNwYWNlP2Qub3JpZ1R5cGUrIi4iK2QubmFtZXNwYWNlOmQub3JpZ1R5cGUsZC5zZWxlY3RvcixkLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXtmb3IoZSBpbiBhKXRoaXMub2ZmKGUsYixhW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gYiE9PSExJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1xYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTt2YXIgdGE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyx1YT1uZXcgUmVnRXhwKCI8KD86IitiYSsiKVtcXHMvPl0iLCJpIiksdmE9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Oi1dKylbXj5dKilcLz4vZ2ksd2E9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2kseGE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kseWE9L150cnVlXC8oLiopLyx6YT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csQWE9Y2EoZCksQmE9QWEuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7ZnVuY3Rpb24gQ2EoYSxiKXtyZXR1cm4gbi5ub2RlTmFtZShhLCJ0YWJsZSIpJiZuLm5vZGVOYW1lKDExIT09Yi5ub2RlVHlwZT9iOmIuZmlyc3RDaGlsZCwidHIiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIERhKGEpe3JldHVybiBhLnR5cGU9KG51bGwhPT1uLmZpbmQuYXR0cihhLCJ0eXBlIikpKyIvIithLnR5cGUsYX1mdW5jdGlvbiBFYShhKXt2YXIgYj15YS5leGVjKGEudHlwZSk7cmV0dXJuIGI/YS50eXBlPWJbMV06YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIEZhKGEsYil7aWYoMT09PWIubm9kZVR5cGUmJm4uaGFzRGF0YShhKSl7dmFyIGMsZCxlLGY9bi5fZGF0YShhKSxnPW4uX2RhdGEoYixmKSxoPWYuZXZlbnRzO2lmKGgpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoYyBpbiBoKWZvcihkPTAsZT1oW2NdLmxlbmd0aDtlPmQ7ZCsrKW4uZXZlbnQuYWRkKGIsYyxoW2NdW2RdKX1nLmRhdGEmJihnLmRhdGE9bi5leHRlbmQoe30sZy5kYXRhKSl9fWZ1bmN0aW9uIEdhKGEsYil7dmFyIGMsZCxlO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwhbC5ub0Nsb25lRXZlbnQmJmJbbi5leHBhbmRvXSl7ZT1uLl9kYXRhKGIpO2ZvcihkIGluIGUuZXZlbnRzKW4ucmVtb3ZlRXZlbnQoYixkLGUuaGFuZGxlKTtiLnJlbW92ZUF0dHJpYnV0ZShuLmV4cGFuZG8pfSJzY3JpcHQiPT09YyYmYi50ZXh0IT09YS50ZXh0PyhEYShiKS50ZXh0PWEudGV4dCxFYShiKSk6Im9iamVjdCI9PT1jPyhiLnBhcmVudE5vZGUmJihiLm91dGVySFRNTD1hLm91dGVySFRNTCksbC5odG1sNUNsb25lJiZhLmlubmVySFRNTCYmIW4udHJpbShiLmlubmVySFRNTCkmJihiLmlubmVySFRNTD1hLmlubmVySFRNTCkpOiJpbnB1dCI9PT1jJiZaLnRlc3QoYS50eXBlKT8oYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKSk6Im9wdGlvbiI9PT1jP2IuZGVmYXVsdFNlbGVjdGVkPWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ6ImlucHV0IiE9PWMmJiJ0ZXh0YXJlYSIhPT1jfHwoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1mdW5jdGlvbiBIYShhLGIsYyxkKXtiPWYuYXBwbHkoW10sYik7dmFyIGUsZyxoLGksaixrLG09MCxvPWEubGVuZ3RoLHA9by0xLHE9YlswXSxyPW4uaXNGdW5jdGlvbihxKTtpZihyfHxvPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIWwuY2hlY2tDbG9uZSYmeGEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7ciYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEhhKGYsYixjLGQpfSk7aWYobyYmKGs9amEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxlPWsuZmlyc3RDaGlsZCwxPT09ay5jaGlsZE5vZGVzLmxlbmd0aCYmKGs9ZSksZXx8ZCkpe2ZvcihpPW4ubWFwKGVhKGssInNjcmlwdCIpLERhKSxoPWkubGVuZ3RoO28+bTttKyspZz1rLG0hPT1wJiYoZz1uLmNsb25lKGcsITAsITApLGgmJm4ubWVyZ2UoaSxlYShnLCJzY3JpcHQiKSkpLGMuY2FsbChhW21dLGcsbSk7aWYoaClmb3Ioaj1pW2kubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsbi5tYXAoaSxFYSksbT0wO2g+bTttKyspZz1pW21dLF8udGVzdChnLnR5cGV8fCIiKSYmIW4uX2RhdGEoZywiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGosZykmJihnLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGcuc3JjKTpuLmdsb2JhbEV2YWwoKGcudGV4dHx8Zy50ZXh0Q29udGVudHx8Zy5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKHphLCIiKSkpO2s9ZT1udWxsfXJldHVybiBhfWZ1bmN0aW9uIElhKGEsYixjKXtmb3IodmFyIGQsZT1iP24uZmlsdGVyKGIsYSk6YSxmPTA7bnVsbCE9KGQ9ZVtmXSk7ZisrKWN8fDEhPT1kLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShlYShkKSksZC5wYXJlbnROb2RlJiYoYyYmbi5jb250YWlucyhkLm93bmVyRG9jdW1lbnQsZCkmJmZhKGVhKGQsInNjcmlwdCIpKSxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCkpO3JldHVybiBhfW4uZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodmEsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpPW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKGwuaHRtbDVDbG9uZXx8bi5pc1hNTERvYyhhKXx8IXVhLnRlc3QoIjwiK2Eubm9kZU5hbWUrIj4iKT9mPWEuY2xvbmVOb2RlKCEwKTooQmEuaW5uZXJIVE1MPWEub3V0ZXJIVE1MLEJhLnJlbW92ZUNoaWxkKGY9QmEuZmlyc3RDaGlsZCkpLCEobC5ub0Nsb25lRXZlbnQmJmwubm9DbG9uZUNoZWNrZWR8fDEhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGV8fG4uaXNYTUxEb2MoYSkpKWZvcihkPWVhKGYpLGg9ZWEoYSksZz0wO251bGwhPShlPWhbZ10pOysrZylkW2ddJiZHYShlLGRbZ10pO2lmKGIpaWYoYylmb3IoaD1ofHxlYShhKSxkPWR8fGVhKGYpLGc9MDtudWxsIT0oZT1oW2ddKTtnKyspRmEoZSxkW2ddKTtlbHNlIEZhKGEsZik7cmV0dXJuIGQ9ZWEoZiwic2NyaXB0IiksZC5sZW5ndGg+MCYmZmEoZCwhaSYmZWEoYSwic2NyaXB0IikpLGQ9aD1lPW51bGwsZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW4uZXhwYW5kbyxqPW4uY2FjaGUsaz1sLmF0dHJpYnV0ZXMsbT1uLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxNKGQpKSYmKGY9ZFtpXSxnPWYmJmpbZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2ZW50cyltW2VdP24uZXZlbnQucmVtb3ZlKGQsZSk6bi5yZW1vdmVFdmVudChkLGUsZy5oYW5kbGUpO2pbZl0mJihkZWxldGUgaltmXSxrfHwidW5kZWZpbmVkIj09dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlP2RbaV09dm9pZCAwOmQucmVtb3ZlQXR0cmlidXRlKGkpLGMucHVzaChmKSl9fX0pLG4uZm4uZXh0ZW5kKHtkb21NYW5pcDpIYSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSwhMCl9LHJlbW92ZTpmdW5jdGlvbihhKXtyZXR1cm4gSWEodGhpcyxhKX0sdGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP24udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGQpLmNyZWF0ZVRleHROb2RlKGEpKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9Q2EodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKXsxPT09YS5ub2RlVHlwZSYmbi5jbGVhbkRhdGEoZWEoYSwhMSkpO3doaWxlKGEuZmlyc3RDaGlsZClhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5vcHRpb25zJiZuLm5vZGVOYW1lKGEsInNlbGVjdCIpJiYoYS5vcHRpb25zLmxlbmd0aD0wKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1udWxsPT1hPyExOmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBuLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBZKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSlyZXR1cm4gMT09PWIubm9kZVR5cGU/Yi5pbm5lckhUTUwucmVwbGFjZSh0YSwiIik6dm9pZCAwO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIXdhLnRlc3QoYSkmJihsLmh0bWxTZXJpYWxpemV8fCF1YS50ZXN0KGEpKSYmKGwubGVhZGluZ1doaXRlc3BhY2V8fCFhYS50ZXN0KGEpKSYmIWRhWygkLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPW4uaHRtbFByZWZpbHRlcihhKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihuLmNsZWFuRGF0YShlYShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiBIYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihiKXt2YXIgYz10aGlzLnBhcmVudE5vZGU7bi5pbkFycmF5KHRoaXMsYSk8MCYmKG4uY2xlYW5EYXRhKGVhKHRoaXMpKSxjJiZjLnJlcGxhY2VDaGlsZChiLHRoaXMpKX0sYSl9fSksbi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxmPW4oYSksaD1mLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxuKGZbZF0pW2JdKGMpLGcuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEphLEthPXtIVE1MOiJibG9jayIsQk9EWToiYmxvY2sifTtmdW5jdGlvbiBMYShhLGIpe3ZhciBjPW4oYi5jcmVhdGVFbGVtZW50KGEpKS5hcHBlbmRUbyhiLmJvZHkpLGQ9bi5jc3MoY1swXSwiZGlzcGxheSIpO3JldHVybiBjLmRldGFjaCgpLGR9ZnVuY3Rpb24gTWEoYSl7dmFyIGI9ZCxjPUthW2FdO3JldHVybiBjfHwoYz1MYShhLGIpLCJub25lIiE9PWMmJmN8fChKYT0oSmF8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9KEphWzBdLmNvbnRlbnRXaW5kb3d8fEphWzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPUxhKGEsYiksSmEuZGV0YWNoKCkpLEthW2FdPWMpLGN9dmFyIE5hPS9ebWFyZ2luLyxPYT1uZXcgUmVnRXhwKCJeKCIrVCsiKSg/IXB4KVthLXolXSskIiwiaSIpLFBhPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZz17fTtmb3IoZiBpbiBiKWdbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmFwcGx5KGEsZHx8W10pO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1nW2ZdO3JldHVybiBlfSxRYT1kLmRvY3VtZW50RWxlbWVudDshZnVuY3Rpb24oKXt2YXIgYixjLGUsZixnLGgsaT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGo9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihqLnN0eWxlKXtqLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PSIwLjUiPT09ai5zdHlsZS5vcGFjaXR5LGwuY3NzRmxvYXQ9ISFqLnN0eWxlLmNzc0Zsb2F0LGouc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixqLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsbC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWouc3R5bGUuYmFja2dyb3VuZENsaXAsaT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGkuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6OHB4O2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDtwYWRkaW5nOjA7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGUiLGouaW5uZXJIVE1MPSIiLGkuYXBwZW5kQ2hpbGQoaiksbC5ib3hTaXppbmc9IiI9PT1qLnN0eWxlLmJveFNpemluZ3x8IiI9PT1qLnN0eWxlLk1vekJveFNpemluZ3x8IiI9PT1qLnN0eWxlLldlYmtpdEJveFNpemluZyxuLmV4dGVuZChsLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YiYmaygpLGZ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxjfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxifSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxnfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YiYmaygpLGh9fSk7ZnVuY3Rpb24gaygpe3ZhciBrLGwsbT1kLmRvY3VtZW50RWxlbWVudDttLmFwcGVuZENoaWxkKGkpLGouc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixiPWU9aD0hMSxjPWc9ITAsYS5nZXRDb21wdXRlZFN0eWxlJiYobD1hLmdldENvbXB1dGVkU3R5bGUoaiksYj0iMSUiIT09KGx8fHt9KS50b3AsaD0iMnB4Ij09PShsfHx7fSkubWFyZ2luTGVmdCxlPSI0cHgiPT09KGx8fHt3aWR0aDoiNHB4In0pLndpZHRoLGouc3R5bGUubWFyZ2luUmlnaHQ9IjUwJSIsYz0iNHB4Ij09PShsfHx7bWFyZ2luUmlnaHQ6IjRweCJ9KS5tYXJnaW5SaWdodCxrPWouYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSksay5zdHlsZS5jc3NUZXh0PWouc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixrLnN0eWxlLm1hcmdpblJpZ2h0PWsuc3R5bGUud2lkdGg9IjAiLGouc3R5bGUud2lkdGg9IjFweCIsZz0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGspfHx7fSkubWFyZ2luUmlnaHQpLGoucmVtb3ZlQ2hpbGQoaykpLGouc3R5bGUuZGlzcGxheT0ibm9uZSIsZj0wPT09ai5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCxmJiYoai5zdHlsZS5kaXNwbGF5PSIiLGouaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixqLmNoaWxkTm9kZXNbMF0uc3R5bGUuYm9yZGVyQ29sbGFwc2U9InNlcGFyYXRlIixrPWouZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksa1swXS5zdHlsZS5jc3NUZXh0PSJtYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjA7ZGlzcGxheTpub25lIixmPTA9PT1rWzBdLm9mZnNldEhlaWdodCxmJiYoa1swXS5zdHlsZS5kaXNwbGF5PSIiLGtbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQpKSxtLnJlbW92ZUNoaWxkKGkpfX19KCk7dmFyIFJhLFNhLFRhPS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLzthLmdldENvbXB1dGVkU3R5bGU/KFJhPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX0sU2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxSYShhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCwiIiE9PWcmJnZvaWQgMCE9PWd8fG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1uLnN0eWxlKGEsYikpLGMmJiFsLnBpeGVsTWFyZ2luUmlnaHQoKSYmT2EudGVzdChnKSYmTmEudGVzdChiKSYmKGQ9aC53aWR0aCxlPWgubWluV2lkdGgsZj1oLm1heFdpZHRoLGgubWluV2lkdGg9aC5tYXhXaWR0aD1oLndpZHRoPWcsZz1jLndpZHRoLGgud2lkdGg9ZCxoLm1pbldpZHRoPWUsaC5tYXhXaWR0aD1mKSx2b2lkIDA9PT1nP2c6ZysiIn0pOlFhLmN1cnJlbnRTdHlsZSYmKFJhPWZ1bmN0aW9uKGEpe3JldHVybiBhLmN1cnJlbnRTdHlsZX0sU2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxSYShhKSxnPWM/Y1tiXTp2b2lkIDAsbnVsbD09ZyYmaCYmaFtiXSYmKGc9aFtiXSksT2EudGVzdChnKSYmIVRhLnRlc3QoYikmJihkPWgubGVmdCxlPWEucnVudGltZVN0eWxlLGY9ZSYmZS5sZWZ0LGYmJihlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksaC5sZWZ0PSJmb250U2l6ZSI9PT1iPyIxZW0iOmcsZz1oLnBpeGVsTGVmdCsicHgiLGgubGVmdD1kLGYmJihlLmxlZnQ9ZikpLHZvaWQgMD09PWc/ZzpnKyIifHwiYXV0byJ9KTtmdW5jdGlvbiBVYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgVmE9L2FscGhhXChbXildKlwpL2ksV2E9L29wYWNpdHlccyo9XHMqKFteKV0qKS9pLFhhPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxZYT1uZXcgUmVnRXhwKCJeKCIrVCsiKSguKikkIiwiaSIpLFphPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSwkYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sX2E9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxhYj1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlO2Z1bmN0aW9uIGJiKGEpe2lmKGEgaW4gYWIpcmV0dXJuIGE7dmFyIGI9YS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpLGM9X2EubGVuZ3RoO3doaWxlKGMtLSlpZihhPV9hW2NdK2IsYSBpbiBhYilyZXR1cm4gYX1mdW5jdGlvbiBjYihhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1uLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSxjPWQuc3R5bGUuZGlzcGxheSxiPyhmW2ddfHwibm9uZSIhPT1jfHwoZC5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmVyhkKSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IixNYShkLm5vZGVOYW1lKSkpKTooZT1XKGQpLChjJiYibm9uZSIhPT1jfHwhZSkmJm4uX2RhdGEoZCwib2xkZGlzcGxheSIsZT9jOm4uY3NzKGQsImRpc3BsYXkiKSkpKTtmb3IoZz0wO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihiJiYibm9uZSIhPT1kLnN0eWxlLmRpc3BsYXkmJiIiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGF9ZnVuY3Rpb24gZGIoYSxiLGMpe3ZhciBkPVlhLmV4ZWMoYik7cmV0dXJuIGQ/TWF0aC5tYXgoMCxkWzFdLShjfHwwKSkrKGRbMl18fCJweCIpOmJ9ZnVuY3Rpb24gZWIoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yz09PShkPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09Yj8xOjAsZz0wOzQ+ZjtmKz0yKSJtYXJnaW4iPT09YyYmKGcrPW4uY3NzKGEsYytWW2ZdLCEwLGUpKSxkPygiY29udGVudCI9PT1jJiYoZy09bi5jc3MoYSwicGFkZGluZyIrVltmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09bi5jc3MoYSwiYm9yZGVyIitWW2ZdKyJXaWR0aCIsITAsZSkpKTooZys9bi5jc3MoYSwicGFkZGluZyIrVltmXSwhMCxlKSwicGFkZGluZyIhPT1jJiYoZys9bi5jc3MoYSwiYm9yZGVyIitWW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiBmYihhLGIsYyl7dmFyIGQ9ITAsZT0id2lkdGgiPT09Yj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGY9UmEoYSksZz1sLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPVNhKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksT2EudGVzdChlKSlyZXR1cm4gZTtkPWcmJihsLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrZWIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9U2EoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpsLmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGIsYyxkKXtpZihhJiYzIT09YS5ub2RlVHlwZSYmOCE9PWEubm9kZVR5cGUmJmEuc3R5bGUpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpLGk9YS5zdHlsZTtpZihiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVUuZXhlYyhjKSkmJmVbMV0mJihjPVgoYSxiLGUpLGY9Im51bWJlciIpLG51bGwhPWMmJmM9PT1jJiYoIm51bWJlciI9PT1mJiYoYys9ZSYmZVszXXx8KG4uY3NzTnVtYmVyW2hdPyIiOiJweCIpKSxsLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1jfHwwIT09Yi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChpW2JdPSJpbmhlcml0IiksIShnJiYic2V0ImluIGcmJnZvaWQgMD09PShjPWcuc2V0KGEsYyxkKSkpKSl0cnl7aVtiXT1jfWNhdGNoKGope319fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09YmIoaCl8fGgpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPVNhKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluICRhJiYoZj0kYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxpc0Zpbml0ZShlKT9lfHwwOmYpOmZ9fSksbi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/WGEudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9QYShhLFphLGZ1bmN0aW9uKCl7cmV0dXJuIGZiKGEsYixkKX0pOmZiKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmUmEoYSk7cmV0dXJuIGRiKGEsYyxkP2ViKGEsYixkLGwuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT1uLmNzcyhhLCJib3hTaXppbmciLCExLGUpLGUpOjApfX19KSxsLm9wYWNpdHl8fChuLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBXYS50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9bi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IisxMDAqYisiKSI6IiIsZj1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xLChiPj0xfHwiIj09PWIpJiYiIj09PW4udHJpbShmLnJlcGxhY2UoVmEsIiIpKSYmYy5yZW1vdmVBdHRyaWJ1dGUmJihjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksIiI9PT1ifHxkJiYhZC5maWx0ZXIpfHwoYy5maWx0ZXI9VmEudGVzdChmKT9mLnJlcGxhY2UoVmEsZSk6ZisiICIrZSl9fSksbi5jc3NIb29rcy5tYXJnaW5SaWdodD1VYShsLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9QYShhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxTYSxbYSwibWFyZ2luUmlnaHQiXSk6dm9pZCAwfSksbi5jc3NIb29rcy5tYXJnaW5MZWZ0PVVhKGwucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/KHBhcnNlRmxvYXQoU2EoYSwibWFyZ2luTGVmdCIpKXx8KG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpP2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1QYShhLHsNCm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7DQpwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OmIsIiI6Im91dGVyIithfSxmdW5jdGlvbihjLGQpe24uZm5bZF09ZnVuY3Rpb24oZCxlKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoJiYoY3x8ImJvb2xlYW4iIT10eXBlb2YgZCksZz1jfHwoZD09PSEwfHxlPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oYixjLGQpe3ZhciBlO3JldHVybiBuLmlzV2luZG93KGIpP2IuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1iLm5vZGVUeXBlPyhlPWIuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGIuYm9keVsic2Nyb2xsIithXSxlWyJzY3JvbGwiK2FdLGIuYm9keVsib2Zmc2V0IithXSxlWyJvZmZzZXQiK2FdLGVbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1kP24uY3NzKGIsYyxnKTpuLnN0eWxlKGIsYyxkLGcpfSxiLGY/ZDp2b2lkIDAsZixudWxsKX19KX0pLG4uZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxuLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgbmM9YS5qUXVlcnksb2M9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9b2MpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PW5jKSxufSxifHwoYS5qUXVlcnk9YS4kPW4pLG59KTsNCg=="></script>
<link href="data:text/css;charset=utf-8,%0A%2Eleaflet%2Dpane%2C%0A%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%2C%0A%2Eleaflet%2Dtile%2Dcontainer%2C%0A%2Eleaflet%2Dpane%20%3E%20svg%2C%0A%2Eleaflet%2Dpane%20%3E%20canvas%2C%0A%2Eleaflet%2Dzoom%2Dbox%2C%0A%2Eleaflet%2Dimage%2Dlayer%2C%0A%2Eleaflet%2Dlayer%20%7B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20%7B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%20%7B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%2Dwebkit%2Duser%2Ddrag%3A%20none%3B%0A%7D%0A%0A%2Eleaflet%2Dsafari%20%2Eleaflet%2Dtile%20%7B%0Aimage%2Drendering%3A%20%2Dwebkit%2Doptimize%2Dcontrast%3B%0A%7D%0A%0A%2Eleaflet%2Dsafari%20%2Eleaflet%2Dtile%2Dcontainer%20%7B%0Awidth%3A%201600px%3B%0Aheight%3A%201600px%3B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%200%200%3B%0A%7D%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%0A%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Doverlay%2Dpane%20svg%2C%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dmarker%2Dpane%20img%2C%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dshadow%2Dpane%20img%2C%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dtile%2Dpane%20img%2C%0A%2Eleaflet%2Dcontainer%20img%2Eleaflet%2Dimage%2Dlayer%20%7B%0Amax%2Dwidth%3A%20none%20%21important%3B%0A%7D%0A%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Dzoom%20%7B%0A%2Dms%2Dtouch%2Daction%3A%20pan%2Dx%20pan%2Dy%3B%0Atouch%2Daction%3A%20pan%2Dx%20pan%2Dy%3B%0A%7D%0A%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Ddrag%20%7B%0A%2Dms%2Dtouch%2Daction%3A%20pinch%2Dzoom%3B%0A%7D%0A%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Ddrag%2Eleaflet%2Dtouch%2Dzoom%20%7B%0A%2Dms%2Dtouch%2Daction%3A%20none%3B%0Atouch%2Daction%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtile%20%7B%0Afilter%3A%20inherit%3B%0Avisibility%3A%20hidden%3B%0A%7D%0A%2Eleaflet%2Dtile%2Dloaded%20%7B%0Avisibility%3A%20inherit%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Dbox%20%7B%0Awidth%3A%200%3B%0Aheight%3A%200%3B%0A%2Dmoz%2Dbox%2Dsizing%3A%20border%2Dbox%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Az%2Dindex%3A%20800%3B%0A%7D%0A%0A%2Eleaflet%2Doverlay%2Dpane%20svg%20%7B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dpane%20%7B%20z%2Dindex%3A%20400%3B%20%7D%0A%2Eleaflet%2Dtile%2Dpane%20%7B%20z%2Dindex%3A%20200%3B%20%7D%0A%2Eleaflet%2Doverlay%2Dpane%20%7B%20z%2Dindex%3A%20400%3B%20%7D%0A%2Eleaflet%2Dshadow%2Dpane%20%7B%20z%2Dindex%3A%20500%3B%20%7D%0A%2Eleaflet%2Dmarker%2Dpane%20%7B%20z%2Dindex%3A%20600%3B%20%7D%0A%2Eleaflet%2Dtooltip%2Dpane%20%7B%20z%2Dindex%3A%20650%3B%20%7D%0A%2Eleaflet%2Dpopup%2Dpane%20%7B%20z%2Dindex%3A%20700%3B%20%7D%0A%2Eleaflet%2Dmap%2Dpane%20canvas%20%7B%20z%2Dindex%3A%20100%3B%20%7D%0A%2Eleaflet%2Dmap%2Dpane%20svg%20%7B%20z%2Dindex%3A%20200%3B%20%7D%0A%2Eleaflet%2Dvml%2Dshape%20%7B%0Awidth%3A%201px%3B%0Aheight%3A%201px%3B%0A%7D%0A%2Elvml%20%7B%0Abehavior%3A%20url%28%23default%23VML%29%3B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20absolute%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%20%7B%0Aposition%3A%20relative%3B%0Az%2Dindex%3A%20800%3B%0Apointer%2Devents%3A%20visiblePainted%3B%20%0Apointer%2Devents%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Dtop%2C%0A%2Eleaflet%2Dbottom%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtop%20%7B%0Atop%3A%200%3B%0A%7D%0A%2Eleaflet%2Dright%20%7B%0Aright%3A%200%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%7B%0Abottom%3A%200%3B%0A%7D%0A%2Eleaflet%2Dleft%20%7B%0Aleft%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontrol%20%7B%0Afloat%3A%20left%3B%0Aclear%3A%20both%3B%0A%7D%0A%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7B%0Afloat%3A%20right%3B%0A%7D%0A%2Eleaflet%2Dtop%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dtop%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dbottom%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dleft%3A%2010px%3B%0A%7D%0A%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7B%0Amargin%2Dright%3A%2010px%3B%0A%7D%0A%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dtile%20%7B%0Awill%2Dchange%3A%20opacity%3B%0A%7D%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dpopup%20%7B%0Aopacity%3A%200%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%0Atransition%3A%20opacity%200%2E2s%20linear%3B%0A%7D%0A%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dmap%2Dpane%20%2Eleaflet%2Dpopup%20%7B%0Aopacity%3A%201%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danimated%20%7B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%200%200%3B%0A%2Dms%2Dtransform%2Dorigin%3A%200%200%3B%0Atransform%2Dorigin%3A%200%200%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Danimated%20%7B%0Awill%2Dchange%3A%20transform%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Danimated%20%7B%0A%2Dwebkit%2Dtransition%3A%20%2Dwebkit%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%2Dmoz%2Dtransition%3A%20%2Dmoz%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%2Do%2Dtransition%3A%20%2Do%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0Atransition%3A%20transform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dtile%2C%0A%2Eleaflet%2Dpan%2Danim%20%2Eleaflet%2Dtile%20%7B%0A%2Dwebkit%2Dtransition%3A%20none%3B%0A%2Dmoz%2Dtransition%3A%20none%3B%0A%2Do%2Dtransition%3A%20none%3B%0Atransition%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Dhide%20%7B%0Avisibility%3A%20hidden%3B%0A%7D%0A%0A%2Eleaflet%2Dinteractive%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Eleaflet%2Dgrab%20%7B%0Acursor%3A%20%2Dwebkit%2Dgrab%3B%0Acursor%3A%20%2Dmoz%2Dgrab%3B%0A%7D%0A%2Eleaflet%2Dcrosshair%2C%0A%2Eleaflet%2Dcrosshair%20%2Eleaflet%2Dinteractive%20%7B%0Acursor%3A%20crosshair%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dpane%2C%0A%2Eleaflet%2Dcontrol%20%7B%0Acursor%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Ddragging%20%2Eleaflet%2Dgrab%2C%0A%2Eleaflet%2Ddragging%20%2Eleaflet%2Dgrab%20%2Eleaflet%2Dinteractive%2C%0A%2Eleaflet%2Ddragging%20%2Eleaflet%2Dmarker%2Ddraggable%20%7B%0Acursor%3A%20move%3B%0Acursor%3A%20%2Dwebkit%2Dgrabbing%3B%0Acursor%3A%20%2Dmoz%2Dgrabbing%3B%0A%7D%0A%0A%2Eleaflet%2Dmarker%2Dicon%2C%0A%2Eleaflet%2Dmarker%2Dshadow%2C%0A%2Eleaflet%2Dimage%2Dlayer%2C%0A%2Eleaflet%2Dpane%20%3E%20svg%20path%2C%0A%2Eleaflet%2Dtile%2Dcontainer%20%7B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dmarker%2Dicon%2Eleaflet%2Dinteractive%2C%0A%2Eleaflet%2Dimage%2Dlayer%2Eleaflet%2Dinteractive%2C%0A%2Eleaflet%2Dpane%20%3E%20svg%20path%2Eleaflet%2Dinteractive%20%7B%0Apointer%2Devents%3A%20visiblePainted%3B%20%0Apointer%2Devents%3A%20auto%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%7B%0Abackground%3A%20%23ddd%3B%0Aoutline%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%20%7B%0Acolor%3A%20%230078A8%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dactive%20%7B%0Aoutline%3A%202px%20solid%20orange%3B%0A%7D%0A%2Eleaflet%2Dzoom%2Dbox%20%7B%0Aborder%3A%202px%20dotted%20%2338f%3B%0Abackground%3A%20rgba%28255%2C255%2C255%2C0%2E5%29%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%7B%0Afont%3A%2012px%2F1%2E5%20%22Helvetica%20Neue%22%2C%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0A%7D%0A%0A%2Eleaflet%2Dbar%20%7B%0Abox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E65%29%3B%0Aborder%2Dradius%3A%204px%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2C%0A%2Eleaflet%2Dbar%20a%3Ahover%20%7B%0Abackground%2Dcolor%3A%20%23fff%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23ccc%3B%0Awidth%3A%2026px%3B%0Aheight%3A%2026px%3B%0Aline%2Dheight%3A%2026px%3B%0Adisplay%3A%20block%3B%0Atext%2Dalign%3A%20center%3B%0Atext%2Ddecoration%3A%20none%3B%0Acolor%3A%20black%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2C%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dposition%3A%2050%25%2050%25%3B%0Abackground%2Drepeat%3A%20no%2Drepeat%3B%0Adisplay%3A%20block%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Ahover%20%7B%0Abackground%2Dcolor%3A%20%23f4f4f4%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Afirst%2Dchild%20%7B%0Aborder%2Dtop%2Dleft%2Dradius%3A%204px%3B%0Aborder%2Dtop%2Dright%2Dradius%3A%204px%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%2Dleft%2Dradius%3A%204px%3B%0Aborder%2Dbottom%2Dright%2Dradius%3A%204px%3B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dbar%20a%2Eleaflet%2Ddisabled%20%7B%0Acursor%3A%20default%3B%0Abackground%2Dcolor%3A%20%23f4f4f4%3B%0Acolor%3A%20%23bbb%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20a%20%7B%0Awidth%3A%2030px%3B%0Aheight%3A%2030px%3B%0Aline%2Dheight%3A%2030px%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%2Dzoom%2Din%2C%0A%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%3A%20bold%2018px%20%27Lucida%20Console%27%2C%20Monaco%2C%20monospace%3B%0Atext%2Dindent%3A%201px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%2Dsize%3A%2020px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Din%20%7B%0Afont%2Dsize%3A%2022px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7B%0Afont%2Dsize%3A%2024px%3B%0A%7D%0A%0A%2Eleaflet%2Dcontrol%2Dlayers%20%7B%0Abox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%0Abackground%3A%20%23fff%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc%2BqTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6%2Fee%2FXeCQ4D3ykPtL5tHno4n0d%2Fh3%2BxfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi%2FIOB0v7rVC7q45Q3Gr5K6jt%2B3Gl5nCoDD4MtO%2Bj96Wu8atmhGqcNGHObuf8OM%2Fx3AMx38%2B4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp%2BPfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a%2FPG2yutpS%2FVol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6%2FJlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH%2BcmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS%2BTzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay%2BZ%2BZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs%2BW080max1hFCarCfV%2BC1KATwcnvE9gRRuMP2prdbWGowm1KB1y%2BzwMMENkM755cJ2yPDtqhTI6ED1M%2F82yIDtC%2F4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS%2F7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC%29%3B%0Awidth%3A%2036px%3B%0Aheight%3A%2036px%3B%0A%7D%0A%2Eleaflet%2Dretina%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP%2BWOmcuhciVnmHVQcJnp7DFvScowZorad%2F%2BV%2FfVzMdMT2g9Cv9guXGv%2F7pYOrXh2U%2BRRR3dSd9JRx6bIFc%2FekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA%2BCNjT%2FIfff%2B%2FkDk2u%2Fw%2F33%2FIeCMOSaWZ4glosqT3DNnNZQ7Cs58%2F3Ce5HL78iZH%2FvKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z%2FPOLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty%2BvF0%2BY2up9d3wwijfjZbabqm%2F3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm%2FayYjHW5%2Fh7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE%2BXSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm%2BfPu3fo5%2F3v61RMCO9Jx2EEYYhb0rmNQMX%2Fvm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA%2Fdpv%2Bon9Shox52WFnx0KY8onHayrJzm87i5h9xGw%2Ftfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3%2FIR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ%2Brroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao%2F6tWWhuuOM4SAK4EI4QmFHA%2BSEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm%2B0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1%2BTBEpF68d%2BDHR6IOWVv2BECtxo46hOFUBd%2FAPU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo%2FUEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc%2F0PstHHcfEdQ%2BUAAAAASUVORK5CYII%3D%29%3B%0Abackground%2Dsize%3A%2026px%2026px%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Awidth%3A%2044px%3B%0Aheight%3A%2044px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%2C%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7B%0Adisplay%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%20%7B%0Adisplay%3A%20block%3B%0Aposition%3A%20relative%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%7B%0Apadding%3A%206px%2010px%206px%206px%3B%0Acolor%3A%20%23333%3B%0Abackground%3A%20%23fff%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dscrollbar%20%7B%0Aoverflow%2Dy%3A%20scroll%3B%0Apadding%2Dright%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dselector%20%7B%0Amargin%2Dtop%3A%202px%3B%0Aposition%3A%20relative%3B%0Atop%3A%201px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%20label%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dlayers%2Dseparator%20%7B%0Aheight%3A%200%3B%0Aborder%2Dtop%3A%201px%20solid%20%23ddd%3B%0Amargin%3A%205px%20%2D10px%205px%20%2D6px%3B%0A%7D%0A%0A%2Eleaflet%2Ddefault%2Dicon%2Dpath%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq%2FbXZtrp%2FlWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq%2FRBpykd8oZUb%2FkaJutow8r1aP9II0WmLKLIsJyv1w%2Fkqw9Ch2MYdB%2B%2B12Onxee%2FQMwvf4%2FDk%2FLfp%2Fi4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg%2FFm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B%2BOadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7%2FXZKNH%2B9%2BhBLOHYozuKQPxyMPUKkrX%2FK0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz%2BbXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U%2Bw7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue%2FuDivd3fkWRbS6%2FIA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7%2F6U%2BqH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts%2BHEa73u6dT3FNWwflY86eMHPk%2BYu%2Bi6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU%2BuWDD7zg54mz5%2F2BSnizi9T1Dg4QQXLToGNCkb6tb1NU%2BQAlGr1%2B%2BeADrzhn%2Fu8Q2YZhQVlZ5%2BCAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz%2Bgwh%2BoHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi%2B%2BWDL1g%2FeEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2%2F0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX%2BJ0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60%2B0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2%2B%2BDYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL%2BF1%2BwkdZ2TBOW2gIF88PBTzD%2FgpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF%2F2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC%2BadRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk%2F4kggu40ZTvIEm5g24qtU4KjBrx%2FBTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF%2B0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH%2BUUA7%2BnG6mdG%2FPu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP%2B64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR%2FibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ%2BKiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf%2B%2FFrIjweHQS4%2FpduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON%2BdfNbM%2BGgIwYdwAAAAASUVORK5CYII%3D%29%3B%0A%7D%0A%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%20%7B%0Abackground%3A%20%23fff%3B%0Abackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E7%29%3B%0Amargin%3A%200%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7B%0Apadding%3A%200%205px%3B%0Acolor%3A%20%23333%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%20a%20%7B%0Atext%2Ddecoration%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dattribution%20a%3Ahover%20%7B%0Atext%2Ddecoration%3A%20underline%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Afont%2Dsize%3A%2011px%3B%0A%7D%0A%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%2Dscale%20%7B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7B%0Aborder%3A%202px%20solid%20%23777%3B%0Aborder%2Dtop%3A%20none%3B%0Aline%2Dheight%3A%201%2E1%3B%0Apadding%3A%202px%205px%201px%3B%0Afont%2Dsize%3A%2011px%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Aoverflow%3A%20hidden%3B%0A%2Dmoz%2Dbox%2Dsizing%3A%20border%2Dbox%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Abackground%3A%20%23fff%3B%0Abackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E5%29%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%20%7B%0Aborder%2Dtop%3A%202px%20solid%20%23777%3B%0Aborder%2Dbottom%3A%20none%3B%0Amargin%2Dtop%3A%20%2D2px%3B%0A%7D%0A%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%20%7B%0Aborder%2Dbottom%3A%202px%20solid%20%23777%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dattribution%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7B%0Abox%2Dshadow%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7B%0Aborder%3A%202px%20solid%20rgba%280%2C0%2C0%2C0%2E2%29%3B%0Abackground%2Dclip%3A%20padding%2Dbox%3B%0A%7D%0A%0A%2Eleaflet%2Dpopup%20%7B%0Aposition%3A%20absolute%3B%0Atext%2Dalign%3A%20center%3B%0Amargin%2Dbottom%3A%2020px%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7B%0Apadding%3A%201px%3B%0Atext%2Dalign%3A%20left%3B%0Aborder%2Dradius%3A%2012px%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%20%7B%0Amargin%3A%2013px%2019px%3B%0Aline%2Dheight%3A%201%2E4%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%20p%20%7B%0Amargin%3A%2018px%200%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7B%0Awidth%3A%2040px%3B%0Aheight%3A%2020px%3B%0Aposition%3A%20absolute%3B%0Aleft%3A%2050%25%3B%0Amargin%2Dleft%3A%20%2D20px%3B%0Aoverflow%3A%20hidden%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dtip%20%7B%0Awidth%3A%2017px%3B%0Aheight%3A%2017px%3B%0Apadding%3A%201px%3B%0Amargin%3A%20%2D10px%20auto%200%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%2845deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%2845deg%29%3B%0Atransform%3A%20rotate%2845deg%29%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%0A%2Eleaflet%2Dpopup%2Dtip%20%7B%0Abackground%3A%20white%3B%0Acolor%3A%20%23333%3B%0Abox%2Dshadow%3A%200%203px%2014px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aright%3A%200%3B%0Apadding%3A%204px%204px%200%200%3B%0Aborder%3A%20none%3B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%2018px%3B%0Aheight%3A%2014px%3B%0Afont%3A%2016px%2F14px%20Tahoma%2C%20Verdana%2C%20sans%2Dserif%3B%0Acolor%3A%20%23c3c3c3%3B%0Atext%2Ddecoration%3A%20none%3B%0Afont%2Dweight%3A%20bold%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%3Ahover%20%7B%0Acolor%3A%20%23999%3B%0A%7D%0A%2Eleaflet%2Dpopup%2Dscrolled%20%7B%0Aoverflow%3A%20auto%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23ddd%3B%0Aborder%2Dtop%3A%201px%20solid%20%23ddd%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7B%0Azoom%3A%201%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7B%0Awidth%3A%2024px%3B%0Amargin%3A%200%20auto%3B%0A%2Dms%2Dfilter%3A%20%22progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%22%3B%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7B%0Amargin%2Dtop%3A%20%2D1px%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dzoom%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dlayers%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%0A%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7B%0Aborder%3A%201px%20solid%20%23999%3B%0A%7D%0A%0A%2Eleaflet%2Ddiv%2Dicon%20%7B%0Abackground%3A%20%23fff%3B%0Aborder%3A%201px%20solid%20%23666%3B%0A%7D%0A%0A%0A%2Eleaflet%2Dtooltip%20%7B%0Aposition%3A%20absolute%3B%0Apadding%3A%206px%3B%0Abackground%2Dcolor%3A%20%23fff%3B%0Aborder%3A%201px%20solid%20%23fff%3B%0Aborder%2Dradius%3A%203px%3B%0Acolor%3A%20%23222%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0Apointer%2Devents%3A%20none%3B%0Abox%2Dshadow%3A%200%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Eleaflet%2Dclickable%20%7B%0Acursor%3A%20pointer%3B%0Apointer%2Devents%3A%20auto%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dtop%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Dleft%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0Aborder%3A%206px%20solid%20transparent%3B%0Abackground%3A%20transparent%3B%0Acontent%3A%20%22%22%3B%0A%7D%0A%0A%2Eleaflet%2Dtooltip%2Dbottom%20%7B%0Amargin%2Dtop%3A%206px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dtop%20%7B%0Amargin%2Dtop%3A%20%2D6px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Dtop%3Abefore%20%7B%0Aleft%3A%2050%25%3B%0Amargin%2Dleft%3A%20%2D6px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dtop%3Abefore%20%7B%0Abottom%3A%200%3B%0Amargin%2Dbottom%3A%20%2D12px%3B%0Aborder%2Dtop%2Dcolor%3A%20%23fff%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%20%7B%0Atop%3A%200%3B%0Amargin%2Dtop%3A%20%2D12px%3B%0Amargin%2Dleft%3A%20%2D6px%3B%0Aborder%2Dbottom%2Dcolor%3A%20%23fff%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dleft%20%7B%0Amargin%2Dleft%3A%20%2D6px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dright%20%7B%0Amargin%2Dleft%3A%206px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dleft%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7B%0Atop%3A%2050%25%3B%0Amargin%2Dtop%3A%20%2D6px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dleft%3Abefore%20%7B%0Aright%3A%200%3B%0Amargin%2Dright%3A%20%2D12px%3B%0Aborder%2Dleft%2Dcolor%3A%20%23fff%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7B%0Aleft%3A%200%3B%0Amargin%2Dleft%3A%20%2D12px%3B%0Aborder%2Dright%2Dcolor%3A%20%23fff%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoKIExlYWZsZXQgMS4wLjMsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4gaHR0cDovL2xlYWZsZXRqcy5jb20KIChjKSAyMDEwLTIwMTYgVmxhZGltaXIgQWdhZm9ua2luLCAoYykgMjAxMC0yMDExIENsb3VkTWFkZQoqLwohZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXt2YXIgZT10Lkw7by5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuTD1lLHRoaXN9LHQuTD1vfXZhciBvPXt2ZXJzaW9uOiIxLjAuMyJ9OyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPW86ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKG8pLCJ1bmRlZmluZWQiIT10eXBlb2YgdCYmbigpLG8uVXRpbD17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixvO2ZvcihpPTEsbj1hcmd1bWVudHMubGVuZ3RoO2k8bjtpKyspe289YXJndW1lbnRzW2ldO2ZvcihlIGluIG8pdFtlXT1vW2VdfXJldHVybiB0fSxjcmVhdGU6T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGU9ZSxuZXcgdH19KCksYmluZDpmdW5jdGlvbih0LGUpe3ZhciBpPUFycmF5LnByb3RvdHlwZS5zbGljZTtpZih0LmJpbmQpcmV0dXJuIHQuYmluZC5hcHBseSh0LGkuY2FsbChhcmd1bWVudHMsMSkpO3ZhciBuPWkuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxuLmxlbmd0aD9uLmNvbmNhdChpLmNhbGwoYXJndW1lbnRzKSk6YXJndW1lbnRzKX19LHN0YW1wOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9sZWFmbGV0X2lkPXQuX2xlYWZsZXRfaWR8fCsrby5VdGlsLmxhc3RJZCx0Ll9sZWFmbGV0X2lkfSxsYXN0SWQ6MCx0aHJvdHRsZTpmdW5jdGlvbih0LGUsaSl7dmFyIG4sbyxzLHI7cmV0dXJuIHI9ZnVuY3Rpb24oKXtuPSExLG8mJihzLmFwcGx5KGksbyksbz0hMSl9LHM9ZnVuY3Rpb24oKXtuP289YXJndW1lbnRzOih0LmFwcGx5KGksYXJndW1lbnRzKSxzZXRUaW1lb3V0KHIsZSksbj0hMCl9fSx3cmFwTnVtOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lWzFdLG89ZVswXSxzPW4tbztyZXR1cm4gdD09PW4mJmk/dDooKHQtbyklcytzKSVzK299LGZhbHNlRm46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZm9ybWF0TnVtOmZ1bmN0aW9uKHQsZSl7dmFyIGk9TWF0aC5wb3coMTAsZXx8NSk7cmV0dXJuIE1hdGgucm91bmQodCppKS9pfSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9LHNwbGl0V29yZHM6ZnVuY3Rpb24odCl7cmV0dXJuIG8uVXRpbC50cmltKHQpLnNwbGl0KC9ccysvKX0sc2V0T3B0aW9uczpmdW5jdGlvbih0LGUpe3QuaGFzT3duUHJvcGVydHkoIm9wdGlvbnMiKXx8KHQub3B0aW9ucz10Lm9wdGlvbnM/by5VdGlsLmNyZWF0ZSh0Lm9wdGlvbnMpOnt9KTtmb3IodmFyIGkgaW4gZSl0Lm9wdGlvbnNbaV09ZVtpXTtyZXR1cm4gdC5vcHRpb25zfSxnZXRQYXJhbVN0cmluZzpmdW5jdGlvbih0LGUsaSl7dmFyIG49W107Zm9yKHZhciBvIGluIHQpbi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChpP28udG9VcHBlckNhc2UoKTpvKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbb10pKTtyZXR1cm4oZSYmZS5pbmRleE9mKCI/IikhPT0tMT8iJiI6Ij8iKStuLmpvaW4oIiYiKX0sdGVtcGxhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yZXBsYWNlKG8uVXRpbC50ZW1wbGF0ZVJlLGZ1bmN0aW9uKHQsbil7dmFyIG89ZVtuXTtpZihvPT09aSl0aHJvdyBuZXcgRXJyb3IoIk5vIHZhbHVlIHByb3ZpZGVkIGZvciB2YXJpYWJsZSAiK3QpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvJiYobz1vKGUpKSxvfSl9LHRlbXBsYXRlUmU6L1x7ICooW1x3X1wtXSspICpcfS9nLGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0saW5kZXhPZjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybi0xfSxlbXB0eUltYWdlVXJsOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHM9In0sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3JldHVybiB0WyJ3ZWJraXQiK2VdfHx0WyJtb3oiK2VdfHx0WyJtcyIrZV19ZnVuY3Rpb24gaShlKXt2YXIgaT0rbmV3IERhdGUsbz1NYXRoLm1heCgwLDE2LShpLW4pKTtyZXR1cm4gbj1pK28sdC5zZXRUaW1lb3V0KGUsbyl9dmFyIG49MCxzPXQucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxlKCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKXx8aSxyPXQuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fGUoIkNhbmNlbEFuaW1hdGlvbkZyYW1lIil8fGUoIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSIpfHxmdW5jdGlvbihlKXt0LmNsZWFyVGltZW91dChlKX07by5VdGlsLnJlcXVlc3RBbmltRnJhbWU9ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByJiZzPT09aT92b2lkIGUuY2FsbChuKTpzLmNhbGwodCxvLmJpbmQoZSxuKSl9LG8uVXRpbC5jYW5jZWxBbmltRnJhbWU9ZnVuY3Rpb24oZSl7ZSYmci5jYWxsKHQsZSl9fSgpLG8uZXh0ZW5kPW8uVXRpbC5leHRlbmQsby5iaW5kPW8uVXRpbC5iaW5kLG8uc3RhbXA9by5VdGlsLnN0YW1wLG8uc2V0T3B0aW9ucz1vLlV0aWwuc2V0T3B0aW9ucyxvLkNsYXNzPWZ1bmN0aW9uKCl7fSxvLkNsYXNzLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZSYmdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbGxJbml0SG9va3MoKX0saT1lLl9fc3VwZXJfXz10aGlzLnByb3RvdHlwZSxuPW8uVXRpbC5jcmVhdGUoaSk7bi5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlPW47Zm9yKHZhciBzIGluIHRoaXMpdGhpcy5oYXNPd25Qcm9wZXJ0eShzKSYmInByb3RvdHlwZSIhPT1zJiYoZVtzXT10aGlzW3NdKTtyZXR1cm4gdC5zdGF0aWNzJiYoby5leHRlbmQoZSx0LnN0YXRpY3MpLGRlbGV0ZSB0LnN0YXRpY3MpLHQuaW5jbHVkZXMmJihvLlV0aWwuZXh0ZW5kLmFwcGx5KG51bGwsW25dLmNvbmNhdCh0LmluY2x1ZGVzKSksZGVsZXRlIHQuaW5jbHVkZXMpLG4ub3B0aW9ucyYmKHQub3B0aW9ucz1vLlV0aWwuZXh0ZW5kKG8uVXRpbC5jcmVhdGUobi5vcHRpb25zKSx0Lm9wdGlvbnMpKSxvLmV4dGVuZChuLHQpLG4uX2luaXRIb29rcz1bXSxuLmNhbGxJbml0SG9va3M9ZnVuY3Rpb24oKXtpZighdGhpcy5faW5pdEhvb2tzQ2FsbGVkKXtpLmNhbGxJbml0SG9va3MmJmkuY2FsbEluaXRIb29rcy5jYWxsKHRoaXMpLHRoaXMuX2luaXRIb29rc0NhbGxlZD0hMDtmb3IodmFyIHQ9MCxlPW4uX2luaXRIb29rcy5sZW5ndGg7dDxlO3QrKyluLl9pbml0SG9va3NbdF0uY2FsbCh0aGlzKX19LGV9LG8uQ2xhc3MuaW5jbHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gby5leHRlbmQodGhpcy5wcm90b3R5cGUsdCksdGhpc30sby5DbGFzcy5tZXJnZU9wdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uZXh0ZW5kKHRoaXMucHJvdG90eXBlLm9wdGlvbnMsdCksdGhpc30sby5DbGFzcy5hZGRJbml0SG9vaz1mdW5jdGlvbih0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7dGhpc1t0XS5hcHBseSh0aGlzLGUpfTtyZXR1cm4gdGhpcy5wcm90b3R5cGUuX2luaXRIb29rcz10aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzfHxbXSx0aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzLnB1c2goaSksdGhpc30sby5FdmVudGVkPW8uQ2xhc3MuZXh0ZW5kKHtvbjpmdW5jdGlvbih0LGUsaSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KXRoaXMuX29uKG4sdFtuXSxlKTtlbHNle3Q9by5VdGlsLnNwbGl0V29yZHModCk7Zm9yKHZhciBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXRoaXMuX29uKHRbc10sZSxpKX1yZXR1cm4gdGhpc30sb2ZmOmZ1bmN0aW9uKHQsZSxpKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vZmYobix0W25dLGUpO2Vsc2V7dD1vLlV0aWwuc3BsaXRXb3Jkcyh0KTtmb3IodmFyIHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspdGhpcy5fb2ZmKHRbc10sZSxpKX1lbHNlIGRlbGV0ZSB0aGlzLl9ldmVudHM7cmV0dXJuIHRoaXN9LF9vbjpmdW5jdGlvbih0LGUsbil7dGhpcy5fZXZlbnRzPXRoaXMuX2V2ZW50c3x8e307dmFyIG89dGhpcy5fZXZlbnRzW3RdO298fChvPVtdLHRoaXMuX2V2ZW50c1t0XT1vKSxuPT09dGhpcyYmKG49aSk7Zm9yKHZhciBzPXtmbjplLGN0eDpufSxyPW8sYT0wLGg9ci5sZW5ndGg7YTxoO2ErKylpZihyW2FdLmZuPT09ZSYmclthXS5jdHg9PT1uKXJldHVybjtyLnB1c2gocyl9LF9vZmY6ZnVuY3Rpb24odCxlLG4pe3ZhciBzLHIsYTtpZih0aGlzLl9ldmVudHMmJihzPXRoaXMuX2V2ZW50c1t0XSkpe2lmKCFlKXtmb3Iocj0wLGE9cy5sZW5ndGg7cjxhO3IrKylzW3JdLmZuPW8uVXRpbC5mYWxzZUZuO3JldHVybiB2b2lkIGRlbGV0ZSB0aGlzLl9ldmVudHNbdF19aWYobj09PXRoaXMmJihuPWkpLHMpZm9yKHI9MCxhPXMubGVuZ3RoO3I8YTtyKyspe3ZhciBoPXNbcl07aWYoaC5jdHg9PT1uJiZoLmZuPT09ZSlyZXR1cm4gaC5mbj1vLlV0aWwuZmFsc2VGbix0aGlzLl9maXJpbmdDb3VudCYmKHRoaXMuX2V2ZW50c1t0XT1zPXMuc2xpY2UoKSksdm9pZCBzLnNwbGljZShyLDEpfX19LGZpcmU6ZnVuY3Rpb24odCxlLGkpe2lmKCF0aGlzLmxpc3RlbnModCxpKSlyZXR1cm4gdGhpczt2YXIgbj1vLlV0aWwuZXh0ZW5kKHt9LGUse3R5cGU6dCx0YXJnZXQ6dGhpc30pO2lmKHRoaXMuX2V2ZW50cyl7dmFyIHM9dGhpcy5fZXZlbnRzW3RdO2lmKHMpe3RoaXMuX2ZpcmluZ0NvdW50PXRoaXMuX2ZpcmluZ0NvdW50KzF8fDE7Zm9yKHZhciByPTAsYT1zLmxlbmd0aDtyPGE7cisrKXt2YXIgaD1zW3JdO2guZm4uY2FsbChoLmN0eHx8dGhpcyxuKX10aGlzLl9maXJpbmdDb3VudC0tfX1yZXR1cm4gaSYmdGhpcy5fcHJvcGFnYXRlRXZlbnQobiksdGhpc30sbGlzdGVuczpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdO2lmKGkmJmkubGVuZ3RoKXJldHVybiEwO2lmKGUpZm9yKHZhciBuIGluIHRoaXMuX2V2ZW50UGFyZW50cylpZih0aGlzLl9ldmVudFBhcmVudHNbbl0ubGlzdGVucyh0LGUpKXJldHVybiEwO3JldHVybiExfSxvbmNlOmZ1bmN0aW9uKHQsZSxpKXtpZigib2JqZWN0Ij09dHlwZW9mIHQpe2Zvcih2YXIgbiBpbiB0KXRoaXMub25jZShuLHRbbl0sZSk7cmV0dXJuIHRoaXN9dmFyIHM9by5iaW5kKGZ1bmN0aW9uKCl7dGhpcy5vZmYodCxlLGkpLm9mZih0LHMsaSl9LHRoaXMpO3JldHVybiB0aGlzLm9uKHQsZSxpKS5vbih0LHMsaSl9LGFkZEV2ZW50UGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ldmVudFBhcmVudHM9dGhpcy5fZXZlbnRQYXJlbnRzfHx7fSx0aGlzLl9ldmVudFBhcmVudHNbby5zdGFtcCh0KV09dCx0aGlzfSxyZW1vdmVFdmVudFBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRQYXJlbnRzJiZkZWxldGUgdGhpcy5fZXZlbnRQYXJlbnRzW28uc3RhbXAodCldLHRoaXN9LF9wcm9wYWdhdGVFdmVudDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fZXZlbnRQYXJlbnRzKXRoaXMuX2V2ZW50UGFyZW50c1tlXS5maXJlKHQudHlwZSxvLmV4dGVuZCh7bGF5ZXI6dC50YXJnZXR9LHQpLCEwKX19KTt2YXIgcz1vLkV2ZW50ZWQucHJvdG90eXBlO3MuYWRkRXZlbnRMaXN0ZW5lcj1zLm9uLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcj1zLmNsZWFyQWxsRXZlbnRMaXN0ZW5lcnM9cy5vZmYscy5hZGRPbmVUaW1lRXZlbnRMaXN0ZW5lcj1zLm9uY2Uscy5maXJlRXZlbnQ9cy5maXJlLHMuaGFzRXZlbnRMaXN0ZW5lcnM9cy5saXN0ZW5zLG8uTWl4aW49e0V2ZW50czpzfSxmdW5jdGlvbigpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxuPWUuZG9jdW1lbnRFbGVtZW50LHM9IkFjdGl2ZVhPYmplY3QiaW4gdCxyPWkuaW5kZXhPZigid2Via2l0IikhPT0tMSxhPWkuaW5kZXhPZigicGhhbnRvbSIpIT09LTEsaD1pLnNlYXJjaCgiYW5kcm9pZCBbMjNdIikhPT0tMSxsPWkuaW5kZXhPZigiY2hyb21lIikhPT0tMSx1PWkuaW5kZXhPZigiZ2Vja28iKSE9PS0xJiYhciYmIXQub3BlcmEmJiFzLGM9MD09PW5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCJXaW4iKSxkPSJ1bmRlZmluZWQiIT10eXBlb2Ygb3JpZW50YXRpb258fGkuaW5kZXhPZigibW9iaWxlIikhPT0tMSxfPSF0LlBvaW50ZXJFdmVudCYmdC5NU1BvaW50ZXJFdmVudCxtPXQuUG9pbnRlckV2ZW50fHxfLHA9cyYmInRyYW5zaXRpb24iaW4gbi5zdHlsZSxmPSJXZWJLaXRDU1NNYXRyaXgiaW4gdCYmIm0xMSJpbiBuZXcgdC5XZWJLaXRDU1NNYXRyaXgmJiFoLGc9Ik1velBlcnNwZWN0aXZlImluIG4uc3R5bGUsdj0iT1RyYW5zaXRpb24iaW4gbi5zdHlsZSx5PSF0LkxfTk9fVE9VQ0gmJihtfHwib250b3VjaHN0YXJ0ImluIHR8fHQuRG9jdW1lbnRUb3VjaCYmZSBpbnN0YW5jZW9mIHQuRG9jdW1lbnRUb3VjaCk7by5Ccm93c2VyPXtpZTpzLGllbHQ5OnMmJiFlLmFkZEV2ZW50TGlzdGVuZXIsZWRnZToibXNMYXVuY2hVcmkiaW4gbmF2aWdhdG9yJiYhKCJkb2N1bWVudE1vZGUiaW4gZSksd2Via2l0OnIsZ2Vja286dSxhbmRyb2lkOmkuaW5kZXhPZigiYW5kcm9pZCIpIT09LTEsYW5kcm9pZDIzOmgsY2hyb21lOmwsc2FmYXJpOiFsJiZpLmluZGV4T2YoInNhZmFyaSIpIT09LTEsd2luOmMsaWUzZDpwLHdlYmtpdDNkOmYsZ2Vja28zZDpnLG9wZXJhMTI6dixhbnkzZDohdC5MX0RJU0FCTEVfM0QmJihwfHxmfHxnKSYmIXYmJiFhLG1vYmlsZTpkLG1vYmlsZVdlYmtpdDpkJiZyLG1vYmlsZVdlYmtpdDNkOmQmJmYsbW9iaWxlT3BlcmE6ZCYmdC5vcGVyYSxtb2JpbGVHZWNrbzpkJiZ1LHRvdWNoOiEheSxtc1BvaW50ZXI6ISFfLHBvaW50ZXI6ISFtLHJldGluYToodC5kZXZpY2VQaXhlbFJhdGlvfHx0LnNjcmVlbi5kZXZpY2VYRFBJL3Quc2NyZWVuLmxvZ2ljYWxYRFBJKT4xfX0oKSxvLlBvaW50PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLng9aT9NYXRoLnJvdW5kKHQpOnQsdGhpcy55PWk/TWF0aC5yb3VuZChlKTplfSxvLlBvaW50LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uUG9pbnQodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQoby5wb2ludCh0KSl9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LHN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YnRyYWN0KG8ucG9pbnQodCkpfSxfc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LGRpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2RpdmlkZUJ5KHQpfSxfZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0aXBseUJ5KHQpfSxfbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxzY2FsZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5Qb2ludCh0aGlzLngqdC54LHRoaXMueSp0LnkpfSx1bnNjYWxlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLlBvaW50KHRoaXMueC90LngsdGhpcy55L3QueSl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfSxmbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2Zsb29yKCl9LF9mbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc30sY2VpbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2NlaWwoKX0sX2NlaWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3Q9by5wb2ludCh0KTt2YXIgZT10LngtdGhpcy54LGk9dC55LXRoaXMueTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStpKmkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9by5wb2ludCh0KSx0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9by5wb2ludCh0KSxNYXRoLmFicyh0LngpPD1NYXRoLmFicyh0aGlzLngpJiZNYXRoLmFicyh0LnkpPD1NYXRoLmFicyh0aGlzLnkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJQb2ludCgiK28uVXRpbC5mb3JtYXROdW0odGhpcy54KSsiLCAiK28uVXRpbC5mb3JtYXROdW0odGhpcy55KSsiKSJ9fSxvLnBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uUG9pbnQ/dDpvLlV0aWwuaXNBcnJheSh0KT9uZXcgby5Qb2ludCh0WzBdLHRbMV0pOnQ9PT1pfHxudWxsPT09dD90OiJvYmplY3QiPT10eXBlb2YgdCYmIngiaW4gdCYmInkiaW4gdD9uZXcgby5Qb2ludCh0LngsdC55KTpuZXcgby5Qb2ludCh0LGUsbil9LG8uQm91bmRzPWZ1bmN0aW9uKHQsZSl7aWYodClmb3IodmFyIGk9ZT9bdCxlXTp0LG49MCxvPWkubGVuZ3RoO248bztuKyspdGhpcy5leHRlbmQoaVtuXSl9LG8uQm91bmRzLnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8ucG9pbnQodCksdGhpcy5taW58fHRoaXMubWF4Pyh0aGlzLm1pbi54PU1hdGgubWluKHQueCx0aGlzLm1pbi54KSx0aGlzLm1heC54PU1hdGgubWF4KHQueCx0aGlzLm1heC54KSx0aGlzLm1pbi55PU1hdGgubWluKHQueSx0aGlzLm1pbi55KSx0aGlzLm1heC55PU1hdGgubWF4KHQueSx0aGlzLm1heC55KSk6KHRoaXMubWluPXQuY2xvbmUoKSx0aGlzLm1heD10LmNsb25lKCkpLHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uUG9pbnQoKHRoaXMubWluLngrdGhpcy5tYXgueCkvMiwodGhpcy5taW4ueSt0aGlzLm1heC55KS8yLHQpfSxnZXRCb3R0b21MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvLlBvaW50KHRoaXMubWluLngsdGhpcy5tYXgueSl9LGdldFRvcFJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvLlBvaW50KHRoaXMubWF4LngsdGhpcy5taW4ueSl9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXguc3VidHJhY3QodGhpcy5taW4pfSxjb250YWluczpmdW5jdGlvbih0KXt2YXIgZSxpO3JldHVybiB0PSJudW1iZXIiPT10eXBlb2YgdFswXXx8dCBpbnN0YW5jZW9mIG8uUG9pbnQ/by5wb2ludCh0KTpvLmJvdW5kcyh0KSx0IGluc3RhbmNlb2Ygby5Cb3VuZHM/KGU9dC5taW4saT10Lm1heCk6ZT1pPXQsZS54Pj10aGlzLm1pbi54JiZpLng8PXRoaXMubWF4LngmJmUueT49dGhpcy5taW4ueSYmaS55PD10aGlzLm1heC55fSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9by5ib3VuZHModCk7dmFyIGU9dGhpcy5taW4saT10aGlzLm1heCxuPXQubWluLHM9dC5tYXgscj1zLng+PWUueCYmbi54PD1pLngsYT1zLnk+PWUueSYmbi55PD1pLnk7cmV0dXJuIHImJmF9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9by5ib3VuZHModCk7dmFyIGU9dGhpcy5taW4saT10aGlzLm1heCxuPXQubWluLHM9dC5tYXgscj1zLng+ZS54JiZuLng8aS54LGE9cy55PmUueSYmbi55PGkueTtyZXR1cm4gciYmYX0saXNWYWxpZDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMubWlufHwhdGhpcy5tYXgpfX0sby5ib3VuZHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIG8uQm91bmRzP3Q6bmV3IG8uQm91bmRzKHQsZSl9LG8uVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlLGksbil7dGhpcy5fYT10LHRoaXMuX2I9ZSx0aGlzLl9jPWksdGhpcy5fZD1ufSxvLlRyYW5zZm9ybWF0aW9uLnByb3RvdHlwZT17dHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybSh0LmNsb25lKCksZSl9LF90cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lfHwxLHQueD1lKih0aGlzLl9hKnQueCt0aGlzLl9iKSx0Lnk9ZSoodGhpcy5fYyp0LnkrdGhpcy5fZCksdH0sdW50cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lfHwxLG5ldyBvLlBvaW50KCh0LngvZS10aGlzLl9iKS90aGlzLl9hLCh0LnkvZS10aGlzLl9kKS90aGlzLl9jKX19LG8uRG9tVXRpbD17Z2V0OmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lLmdldEVsZW1lbnRCeUlkKHQpOnR9LGdldFN0eWxlOmZ1bmN0aW9uKHQsaSl7dmFyIG49dC5zdHlsZVtpXXx8dC5jdXJyZW50U3R5bGUmJnQuY3VycmVudFN0eWxlW2ldO2lmKCghbnx8ImF1dG8iPT09bikmJmUuZGVmYXVsdFZpZXcpe3ZhciBvPWUuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO249bz9vW2ldOm51bGx9cmV0dXJuImF1dG8iPT09bj9udWxsOm59LGNyZWF0ZTpmdW5jdGlvbih0LGksbil7dmFyIG89ZS5jcmVhdGVFbGVtZW50KHQpO3JldHVybiBvLmNsYXNzTmFtZT1pfHwiIixuJiZuLmFwcGVuZENoaWxkKG8pLG99LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmZS5yZW1vdmVDaGlsZCh0KX0sZW1wdHk6ZnVuY3Rpb24odCl7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX0sdG9Gcm9udDpmdW5jdGlvbih0KXt0LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodCl9LHRvQmFjazpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfSxoYXNDbGFzczpmdW5jdGlvbih0LGUpe2lmKHQuY2xhc3NMaXN0IT09aSlyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSk7dmFyIG49by5Eb21VdGlsLmdldENsYXNzKHQpO3JldHVybiBuLmxlbmd0aD4wJiZuZXcgUmVnRXhwKCIoXnxcXHMpIitlKyIoXFxzfCQpIikudGVzdChuKX0sYWRkQ2xhc3M6ZnVuY3Rpb24odCxlKXtpZih0LmNsYXNzTGlzdCE9PWkpZm9yKHZhciBuPW8uVXRpbC5zcGxpdFdvcmRzKGUpLHM9MCxyPW4ubGVuZ3RoO3M8cjtzKyspdC5jbGFzc0xpc3QuYWRkKG5bc10pO2Vsc2UgaWYoIW8uRG9tVXRpbC5oYXNDbGFzcyh0LGUpKXt2YXIgYT1vLkRvbVV0aWwuZ2V0Q2xhc3ModCk7by5Eb21VdGlsLnNldENsYXNzKHQsKGE/YSsiICI6IiIpK2UpfX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCxlKXt0LmNsYXNzTGlzdCE9PWk/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOm8uRG9tVXRpbC5zZXRDbGFzcyh0LG8uVXRpbC50cmltKCgiICIrby5Eb21VdGlsLmdldENsYXNzKHQpKyIgIikucmVwbGFjZSgiICIrZSsiICIsIiAiKSkpfSxzZXRDbGFzczpmdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lLmJhc2VWYWw9PT1pP3QuY2xhc3NOYW1lPWU6dC5jbGFzc05hbWUuYmFzZVZhbD1lfSxnZXRDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc05hbWUuYmFzZVZhbD09PWk/dC5jbGFzc05hbWU6dC5jbGFzc05hbWUuYmFzZVZhbH0sc2V0T3BhY2l0eTpmdW5jdGlvbih0LGUpeyJvcGFjaXR5ImluIHQuc3R5bGU/dC5zdHlsZS5vcGFjaXR5PWU6ImZpbHRlciJpbiB0LnN0eWxlJiZvLkRvbVV0aWwuX3NldE9wYWNpdHlJRSh0LGUpfSxfc2V0T3BhY2l0eUlFOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ITEsbj0iRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEiO3RyeXtpPXQuZmlsdGVycy5pdGVtKG4pfWNhdGNoKHQpe2lmKDE9PT1lKXJldHVybn1lPU1hdGgucm91bmQoMTAwKmUpLGk/KGkuRW5hYmxlZD0xMDAhPT1lLGkuT3BhY2l0eT1lKTp0LnN0eWxlLmZpbHRlcis9IiBwcm9naWQ6IituKyIob3BhY2l0eT0iK2UrIikifSx0ZXN0UHJvcDpmdW5jdGlvbih0KXtmb3IodmFyIGk9ZS5kb2N1bWVudEVsZW1lbnQuc3R5bGUsbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl1pbiBpKXJldHVybiB0W25dO3JldHVybiExfSxzZXRUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWV8fG5ldyBvLlBvaW50KDAsMCk7dC5zdHlsZVtvLkRvbVV0aWwuVFJBTlNGT1JNXT0oby5Ccm93c2VyLmllM2Q/InRyYW5zbGF0ZSgiK24ueCsicHgsIituLnkrInB4KSI6InRyYW5zbGF0ZTNkKCIrbi54KyJweCwiK24ueSsicHgsMCkiKSsoaT8iIHNjYWxlKCIraSsiKSI6IiIpfSxzZXRQb3NpdGlvbjpmdW5jdGlvbih0LGUpe3QuX2xlYWZsZXRfcG9zPWUsby5Ccm93c2VyLmFueTNkP28uRG9tVXRpbC5zZXRUcmFuc2Zvcm0odCxlKToodC5zdHlsZS5sZWZ0PWUueCsicHgiLHQuc3R5bGUudG9wPWUueSsicHgiKX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQuX2xlYWZsZXRfcG9zfHxuZXcgby5Qb2ludCgwLDApfX0sZnVuY3Rpb24oKXtvLkRvbVV0aWwuVFJBTlNGT1JNPW8uRG9tVXRpbC50ZXN0UHJvcChbInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk9UcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKTt2YXIgaT1vLkRvbVV0aWwuVFJBTlNJVElPTj1vLkRvbVV0aWwudGVzdFByb3AoWyJ3ZWJraXRUcmFuc2l0aW9uIiwidHJhbnNpdGlvbiIsIk9UcmFuc2l0aW9uIiwiTW96VHJhbnNpdGlvbiIsIm1zVHJhbnNpdGlvbiJdKTtpZihvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQ9IndlYmtpdFRyYW5zaXRpb24iPT09aXx8Ik9UcmFuc2l0aW9uIj09PWk/aSsiRW5kIjoidHJhbnNpdGlvbmVuZCIsIm9uc2VsZWN0c3RhcnQiaW4gZSlvLkRvbVV0aWwuZGlzYWJsZVRleHRTZWxlY3Rpb249ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9uKHQsInNlbGVjdHN0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX0sby5Eb21VdGlsLmVuYWJsZVRleHRTZWxlY3Rpb249ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9mZih0LCJzZWxlY3RzdGFydCIsby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCl9O2Vsc2V7dmFyIG49by5Eb21VdGlsLnRlc3RQcm9wKFsidXNlclNlbGVjdCIsIldlYmtpdFVzZXJTZWxlY3QiLCJPVXNlclNlbGVjdCIsIk1velVzZXJTZWxlY3QiLCJtc1VzZXJTZWxlY3QiXSk7by5Eb21VdGlsLmRpc2FibGVUZXh0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYobil7dmFyIHQ9ZS5kb2N1bWVudEVsZW1lbnQuc3R5bGU7dGhpcy5fdXNlclNlbGVjdD10W25dLHRbbl09Im5vbmUifX0sby5Eb21VdGlsLmVuYWJsZVRleHRTZWxlY3Rpb249ZnVuY3Rpb24oKXtuJiYoZS5kb2N1bWVudEVsZW1lbnQuc3R5bGVbbl09dGhpcy5fdXNlclNlbGVjdCxkZWxldGUgdGhpcy5fdXNlclNlbGVjdCl9fW8uRG9tVXRpbC5kaXNhYmxlSW1hZ2VEcmFnPWZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbih0LCJkcmFnc3RhcnQiLG8uRG9tRXZlbnQucHJldmVudERlZmF1bHQpfSxvLkRvbVV0aWwuZW5hYmxlSW1hZ2VEcmFnPWZ1bmN0aW9uKCl7by5Eb21FdmVudC5vZmYodCwiZHJhZ3N0YXJ0IixvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KX0sby5Eb21VdGlsLnByZXZlbnRPdXRsaW5lPWZ1bmN0aW9uKGUpe2Zvcig7ZS50YWJJbmRleD09PS0xOyllPWUucGFyZW50Tm9kZTtlJiZlLnN0eWxlJiYoby5Eb21VdGlsLnJlc3RvcmVPdXRsaW5lKCksdGhpcy5fb3V0bGluZUVsZW1lbnQ9ZSx0aGlzLl9vdXRsaW5lU3R5bGU9ZS5zdHlsZS5vdXRsaW5lLGUuc3R5bGUub3V0bGluZT0ibm9uZSIsby5Eb21FdmVudC5vbih0LCJrZXlkb3duIixvLkRvbVV0aWwucmVzdG9yZU91dGxpbmUsdGhpcykpfSxvLkRvbVV0aWwucmVzdG9yZU91dGxpbmU9ZnVuY3Rpb24oKXt0aGlzLl9vdXRsaW5lRWxlbWVudCYmKHRoaXMuX291dGxpbmVFbGVtZW50LnN0eWxlLm91dGxpbmU9dGhpcy5fb3V0bGluZVN0eWxlLGRlbGV0ZSB0aGlzLl9vdXRsaW5lRWxlbWVudCxkZWxldGUgdGhpcy5fb3V0bGluZVN0eWxlLG8uRG9tRXZlbnQub2ZmKHQsImtleWRvd24iLG8uRG9tVXRpbC5yZXN0b3JlT3V0bGluZSx0aGlzKSl9fSgpLG8uTGF0TG5nPWZ1bmN0aW9uKHQsZSxuKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIExhdExuZyBvYmplY3Q6ICgiK3QrIiwgIitlKyIpIik7dGhpcy5sYXQ9K3QsdGhpcy5sbmc9K2UsbiE9PWkmJih0aGlzLmFsdD0rbil9LG8uTGF0TG5nLnByb3RvdHlwZT17ZXF1YWxzOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuITE7dD1vLmxhdExuZyh0KTt2YXIgbj1NYXRoLm1heChNYXRoLmFicyh0aGlzLmxhdC10LmxhdCksTWF0aC5hYnModGhpcy5sbmctdC5sbmcpKTtyZXR1cm4gbjw9KGU9PT1pPzFlLTk6ZSl9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJMYXRMbmcoIitvLlV0aWwuZm9ybWF0TnVtKHRoaXMubGF0LHQpKyIsICIrby5VdGlsLmZvcm1hdE51bSh0aGlzLmxuZyx0KSsiKSJ9LGRpc3RhbmNlVG86ZnVuY3Rpb24odCl7cmV0dXJuIG8uQ1JTLkVhcnRoLmRpc3RhbmNlKHRoaXMsby5sYXRMbmcodCkpfSx3cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIG8uQ1JTLkVhcnRoLndyYXBMYXRMbmcodGhpcyl9LHRvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlPTE4MCp0LzQwMDc1MDE3LGk9ZS9NYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhdCk7cmV0dXJuIG8ubGF0TG5nQm91bmRzKFt0aGlzLmxhdC1lLHRoaXMubG5nLWldLFt0aGlzLmxhdCtlLHRoaXMubG5nK2ldKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uTGF0TG5nKHRoaXMubGF0LHRoaXMubG5nLHRoaXMuYWx0KX19LG8ubGF0TG5nPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uTGF0TG5nP3Q6by5VdGlsLmlzQXJyYXkodCkmJiJvYmplY3QiIT10eXBlb2YgdFswXT8zPT09dC5sZW5ndGg/bmV3IG8uTGF0TG5nKHRbMF0sdFsxXSx0WzJdKToyPT09dC5sZW5ndGg/bmV3IG8uTGF0TG5nKHRbMF0sdFsxXSk6bnVsbDp0PT09aXx8bnVsbD09PXQ/dDoib2JqZWN0Ij09dHlwZW9mIHQmJiJsYXQiaW4gdD9uZXcgby5MYXRMbmcodC5sYXQsImxuZyJpbiB0P3QubG5nOnQubG9uLHQuYWx0KTplPT09aT9udWxsOm5ldyBvLkxhdExuZyh0LGUsbil9LG8uTGF0TG5nQm91bmRzPWZ1bmN0aW9uKHQsZSl7aWYodClmb3IodmFyIGk9ZT9bdCxlXTp0LG49MCxvPWkubGVuZ3RoO248bztuKyspdGhpcy5leHRlbmQoaVtuXSl9LG8uTGF0TG5nQm91bmRzLnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGksbj10aGlzLl9zb3V0aFdlc3Qscz10aGlzLl9ub3J0aEVhc3Q7aWYodCBpbnN0YW5jZW9mIG8uTGF0TG5nKWU9dCxpPXQ7ZWxzZXtpZighKHQgaW5zdGFuY2VvZiBvLkxhdExuZ0JvdW5kcykpcmV0dXJuIHQ/dGhpcy5leHRlbmQoby5sYXRMbmcodCl8fG8ubGF0TG5nQm91bmRzKHQpKTp0aGlzO2lmKGU9dC5fc291dGhXZXN0LGk9dC5fbm9ydGhFYXN0LCFlfHwhaSlyZXR1cm4gdGhpc31yZXR1cm4gbnx8cz8obi5sYXQ9TWF0aC5taW4oZS5sYXQsbi5sYXQpLG4ubG5nPU1hdGgubWluKGUubG5nLG4ubG5nKSxzLmxhdD1NYXRoLm1heChpLmxhdCxzLmxhdCkscy5sbmc9TWF0aC5tYXgoaS5sbmcscy5sbmcpKToodGhpcy5fc291dGhXZXN0PW5ldyBvLkxhdExuZyhlLmxhdCxlLmxuZyksdGhpcy5fbm9ydGhFYXN0PW5ldyBvLkxhdExuZyhpLmxhdCxpLmxuZykpLHRoaXN9LHBhZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zb3V0aFdlc3QsaT10aGlzLl9ub3J0aEVhc3Qsbj1NYXRoLmFicyhlLmxhdC1pLmxhdCkqdCxzPU1hdGguYWJzKGUubG5nLWkubG5nKSp0O3JldHVybiBuZXcgby5MYXRMbmdCb3VuZHMobmV3IG8uTGF0TG5nKGUubGF0LW4sZS5sbmctcyksbmV3IG8uTGF0TG5nKGkubGF0K24saS5sbmcrcykpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8uTGF0TG5nKCh0aGlzLl9zb3V0aFdlc3QubGF0K3RoaXMuX25vcnRoRWFzdC5sYXQpLzIsKHRoaXMuX3NvdXRoV2VzdC5sbmcrdGhpcy5fbm9ydGhFYXN0LmxuZykvMil9LGdldFNvdXRoV2VzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3V0aFdlc3R9LGdldE5vcnRoRWFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3J0aEVhc3R9LGdldE5vcnRoV2VzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgby5MYXRMbmcodGhpcy5nZXROb3J0aCgpLHRoaXMuZ2V0V2VzdCgpKX0sZ2V0U291dGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvLkxhdExuZyh0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCkpfSxnZXRXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sbmd9LGdldFNvdXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxuZ30sZ2V0Tm9ydGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxhdH0sY29udGFpbnM6ZnVuY3Rpb24odCl7dD0ibnVtYmVyIj09dHlwZW9mIHRbMF18fHQgaW5zdGFuY2VvZiBvLkxhdExuZ3x8ImxhdCJpbiB0P28ubGF0TG5nKHQpOm8ubGF0TG5nQm91bmRzKHQpO3ZhciBlLGksbj10aGlzLl9zb3V0aFdlc3Qscz10aGlzLl9ub3J0aEVhc3Q7cmV0dXJuIHQgaW5zdGFuY2VvZiBvLkxhdExuZ0JvdW5kcz8oZT10LmdldFNvdXRoV2VzdCgpLGk9dC5nZXROb3J0aEVhc3QoKSk6ZT1pPXQsZS5sYXQ+PW4ubGF0JiZpLmxhdDw9cy5sYXQmJmUubG5nPj1uLmxuZyYmaS5sbmc8PXMubG5nfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9by5sYXRMbmdCb3VuZHModCk7dmFyIGU9dGhpcy5fc291dGhXZXN0LGk9dGhpcy5fbm9ydGhFYXN0LG49dC5nZXRTb3V0aFdlc3QoKSxzPXQuZ2V0Tm9ydGhFYXN0KCkscj1zLmxhdD49ZS5sYXQmJm4ubGF0PD1pLmxhdCxhPXMubG5nPj1lLmxuZyYmbi5sbmc8PWkubG5nO3JldHVybiByJiZhfSxvdmVybGFwczpmdW5jdGlvbih0KXt0PW8ubGF0TG5nQm91bmRzKHQpO3ZhciBlPXRoaXMuX3NvdXRoV2VzdCxpPXRoaXMuX25vcnRoRWFzdCxuPXQuZ2V0U291dGhXZXN0KCkscz10LmdldE5vcnRoRWFzdCgpLHI9cy5sYXQ+ZS5sYXQmJm4ubGF0PGkubGF0LGE9cy5sbmc+ZS5sbmcmJm4ubG5nPGkubG5nO3JldHVybiByJiZhfSx0b0JCb3hTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5nZXRXZXN0KCksdGhpcy5nZXRTb3V0aCgpLHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0Tm9ydGgoKV0uam9pbigiLCIpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodD1vLmxhdExuZ0JvdW5kcyh0KSx0aGlzLl9zb3V0aFdlc3QuZXF1YWxzKHQuZ2V0U291dGhXZXN0KCkpJiZ0aGlzLl9ub3J0aEVhc3QuZXF1YWxzKHQuZ2V0Tm9ydGhFYXN0KCkpKX0saXNWYWxpZDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuX3NvdXRoV2VzdHx8IXRoaXMuX25vcnRoRWFzdCl9fSxvLmxhdExuZ0JvdW5kcz1mdW5jdGlvbih0LGUpe3JldHVybiB0IGluc3RhbmNlb2Ygby5MYXRMbmdCb3VuZHM/dDpuZXcgby5MYXRMbmdCb3VuZHModCxlKX0sby5Qcm9qZWN0aW9uPXt9LG8uUHJvamVjdGlvbi5Mb25MYXQ9e3Byb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLlBvaW50KHQubG5nLHQubGF0KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5MYXRMbmcodC55LHQueCl9LGJvdW5kczpvLmJvdW5kcyhbLTE4MCwtOTBdLFsxODAsOTBdKX0sby5Qcm9qZWN0aW9uLlNwaGVyaWNhbE1lcmNhdG9yPXtSOjYzNzgxMzcsTUFYX0xBVElUVURFOjg1LjA1MTEyODc3OTgscHJvamVjdDpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzE4MCxpPXRoaXMuTUFYX0xBVElUVURFLG49TWF0aC5tYXgoTWF0aC5taW4oaSx0LmxhdCksLWkpLHM9TWF0aC5zaW4obiplKTtyZXR1cm4gbmV3IG8uUG9pbnQodGhpcy5SKnQubG5nKmUsdGhpcy5SKk1hdGgubG9nKCgxK3MpLygxLXMpKS8yKX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPTE4MC9NYXRoLlBJO3JldHVybiBuZXcgby5MYXRMbmcoKDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueS90aGlzLlIpKS1NYXRoLlBJLzIpKmUsdC54KmUvdGhpcy5SKX0sYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9NjM3ODEzNypNYXRoLlBJO3JldHVybiBvLmJvdW5kcyhbLXQsLXRdLFt0LHRdKX0oKX0sby5DUlM9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxuPXRoaXMuc2NhbGUoZSk7cmV0dXJuIHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybShpLG4pfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zY2FsZShlKSxuPXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxpKTtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdChuKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdCh0KX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDI1NipNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0LzI1NikvTWF0aC5MTjJ9LGdldFByb2plY3RlZEJvdW5kczpmdW5jdGlvbih0KXtpZih0aGlzLmluZmluaXRlKXJldHVybiBudWxsO3ZhciBlPXRoaXMucHJvamVjdGlvbi5ib3VuZHMsaT10aGlzLnNjYWxlKHQpLG49dGhpcy50cmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oZS5taW4saSkscz10aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShlLm1heCxpKTtyZXR1cm4gby5ib3VuZHMobixzKX0saW5maW5pdGU6ITEsd3JhcExhdExuZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLndyYXBMbmc/by5VdGlsLndyYXBOdW0odC5sbmcsdGhpcy53cmFwTG5nLCEwKTp0LmxuZyxpPXRoaXMud3JhcExhdD9vLlV0aWwud3JhcE51bSh0LmxhdCx0aGlzLndyYXBMYXQsITApOnQubGF0LG49dC5hbHQ7cmV0dXJuIG8ubGF0TG5nKGksZSxuKX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXt2YXIgZT10LmdldENlbnRlcigpLGk9dGhpcy53cmFwTGF0TG5nKGUpLG49ZS5sYXQtaS5sYXQscz1lLmxuZy1pLmxuZztpZigwPT09biYmMD09PXMpcmV0dXJuIHQ7dmFyIHI9dC5nZXRTb3V0aFdlc3QoKSxhPXQuZ2V0Tm9ydGhFYXN0KCksaD1vLmxhdExuZyh7bGF0OnIubGF0LW4sbG5nOnIubG5nLXN9KSxsPW8ubGF0TG5nKHtsYXQ6YS5sYXQtbixsbmc6YS5sbmctc30pO3JldHVybiBuZXcgby5MYXRMbmdCb3VuZHMoaCxsKX19LG8uQ1JTLlNpbXBsZT1vLmV4dGVuZCh7fSxvLkNSUyx7cHJvamVjdGlvbjpvLlByb2plY3Rpb24uTG9uTGF0LHRyYW5zZm9ybWF0aW9uOm5ldyBvLlRyYW5zZm9ybWF0aW9uKDEsMCwtMSwwKSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3coMix0KX0sem9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LGRpc3RhbmNlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5sbmctdC5sbmcsbj1lLmxhdC10LmxhdDtyZXR1cm4gTWF0aC5zcXJ0KGkqaStuKm4pfSxpbmZpbml0ZTohMH0pLG8uQ1JTLkVhcnRoPW8uZXh0ZW5kKHt9LG8uQ1JTLHt3cmFwTG5nOlstMTgwLDE4MF0sUjo2MzcxZTMsZGlzdGFuY2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLlBJLzE4MCxuPXQubGF0Kmksbz1lLmxhdCppLHM9TWF0aC5zaW4obikqTWF0aC5zaW4obykrTWF0aC5jb3MobikqTWF0aC5jb3MobykqTWF0aC5jb3MoKGUubG5nLXQubG5nKSppKTtyZXR1cm4gdGhpcy5SKk1hdGguYWNvcyhNYXRoLm1pbihzLDEpKX19KSxvLkNSUy5FUFNHMzg1Nz1vLmV4dGVuZCh7fSxvLkNSUy5FYXJ0aCx7Y29kZToiRVBTRzozODU3Iixwcm9qZWN0aW9uOm8uUHJvamVjdGlvbi5TcGhlcmljYWxNZXJjYXRvcix0cmFuc2Zvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciB0PS41LyhNYXRoLlBJKm8uUHJvamVjdGlvbi5TcGhlcmljYWxNZXJjYXRvci5SKTtyZXR1cm4gbmV3IG8uVHJhbnNmb3JtYXRpb24odCwuNSwtdCwuNSl9KCl9KSxvLkNSUy5FUFNHOTAwOTEzPW8uZXh0ZW5kKHt9LG8uQ1JTLkVQU0czODU3LHtjb2RlOiJFUFNHOjkwMDkxMyJ9KSxvLkNSUy5FUFNHNDMyNj1vLmV4dGVuZCh7fSxvLkNSUy5FYXJ0aCx7Y29kZToiRVBTRzo0MzI2Iixwcm9qZWN0aW9uOm8uUHJvamVjdGlvbi5Mb25MYXQsdHJhbnNmb3JtYXRpb246bmV3IG8uVHJhbnNmb3JtYXRpb24oMS8xODAsMSwtMS8xODAsLjUpfSksby5NYXA9by5FdmVudGVkLmV4dGVuZCh7b3B0aW9uczp7Y3JzOm8uQ1JTLkVQU0czODU3LGNlbnRlcjppLHpvb206aSxtaW5ab29tOmksbWF4Wm9vbTppLGxheWVyczpbXSxtYXhCb3VuZHM6aSxyZW5kZXJlcjppLHpvb21BbmltYXRpb246ITAsem9vbUFuaW1hdGlvblRocmVzaG9sZDo0LGZhZGVBbmltYXRpb246ITAsbWFya2VyWm9vbUFuaW1hdGlvbjohMCx0cmFuc2Zvcm0zRExpbWl0OjgzODg2MDgsem9vbVNuYXA6MSx6b29tRGVsdGE6MSx0cmFja1Jlc2l6ZTohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2U9by5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5faW5pdENvbnRhaW5lcih0KSx0aGlzLl9pbml0TGF5b3V0KCksdGhpcy5fb25SZXNpemU9by5iaW5kKHRoaXMuX29uUmVzaXplLHRoaXMpLHRoaXMuX2luaXRFdmVudHMoKSxlLm1heEJvdW5kcyYmdGhpcy5zZXRNYXhCb3VuZHMoZS5tYXhCb3VuZHMpLGUuem9vbSE9PWkmJih0aGlzLl96b29tPXRoaXMuX2xpbWl0Wm9vbShlLnpvb20pKSxlLmNlbnRlciYmZS56b29tIT09aSYmdGhpcy5zZXRWaWV3KG8ubGF0TG5nKGUuY2VudGVyKSxlLnpvb20se3Jlc2V0OiEwfSksdGhpcy5faGFuZGxlcnM9W10sdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX3pvb21Cb3VuZExheWVycz17fSx0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLmNhbGxJbml0SG9va3MoKSx0aGlzLl96b29tQW5pbWF0ZWQ9by5Eb21VdGlsLlRSQU5TSVRJT04mJm8uQnJvd3Nlci5hbnkzZCYmIW8uQnJvd3Nlci5tb2JpbGVPcGVyYSYmdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24sdGhpcy5fem9vbUFuaW1hdGVkJiYodGhpcy5fY3JlYXRlQW5pbVByb3h5KCksby5Eb21FdmVudC5vbih0aGlzLl9wcm94eSxvLkRvbVV0aWwuVFJBTlNJVElPTl9FTkQsdGhpcy5fY2F0Y2hUcmFuc2l0aW9uRW5kLHRoaXMpKSx0aGlzLl9hZGRMYXllcnModGhpcy5vcHRpb25zLmxheWVycyl9LHNldFZpZXc6ZnVuY3Rpb24odCxlLG4pe2lmKGU9ZT09PWk/dGhpcy5fem9vbTp0aGlzLl9saW1pdFpvb20oZSksdD10aGlzLl9saW1pdENlbnRlcihvLmxhdExuZyh0KSxlLHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpLG49bnx8e30sdGhpcy5fc3RvcCgpLHRoaXMuX2xvYWRlZCYmIW4ucmVzZXQmJm4hPT0hMCl7bi5hbmltYXRlIT09aSYmKG4uem9vbT1vLmV4dGVuZCh7YW5pbWF0ZTpuLmFuaW1hdGV9LG4uem9vbSksbi5wYW49by5leHRlbmQoe2FuaW1hdGU6bi5hbmltYXRlLGR1cmF0aW9uOm4uZHVyYXRpb259LG4ucGFuKSk7dmFyIHM9dGhpcy5fem9vbSE9PWU/dGhpcy5fdHJ5QW5pbWF0ZWRab29tJiZ0aGlzLl90cnlBbmltYXRlZFpvb20odCxlLG4uem9vbSk6dGhpcy5fdHJ5QW5pbWF0ZWRQYW4odCxuLnBhbik7aWYocylyZXR1cm4gY2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lciksdGhpc31yZXR1cm4gdGhpcy5fcmVzZXRWaWV3KHQsZSksdGhpc30sc2V0Wm9vbTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9sb2FkZWQ/dGhpcy5zZXRWaWV3KHRoaXMuZ2V0Q2VudGVyKCksdCx7em9vbTplfSk6KHRoaXMuX3pvb209dCx0aGlzKX0sem9vbUluOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dHx8KG8uQnJvd3Nlci5hbnkzZD90aGlzLm9wdGlvbnMuem9vbURlbHRhOjEpLHRoaXMuc2V0Wm9vbSh0aGlzLl96b29tK3QsZSl9LHpvb21PdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10fHwoby5Ccm93c2VyLmFueTNkP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20tdCxlKX0sc2V0Wm9vbUFyb3VuZDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoZSkscz10aGlzLmdldFNpemUoKS5kaXZpZGVCeSgyKSxyPXQgaW5zdGFuY2VvZiBvLlBvaW50P3Q6dGhpcy5sYXRMbmdUb0NvbnRhaW5lclBvaW50KHQpLGE9ci5zdWJ0cmFjdChzKS5tdWx0aXBseUJ5KDEtMS9uKSxoPXRoaXMuY29udGFpbmVyUG9pbnRUb0xhdExuZyhzLmFkZChhKSk7cmV0dXJuIHRoaXMuc2V0VmlldyhoLGUse3pvb206aX0pfSxfZ2V0Qm91bmRzQ2VudGVyWm9vbTpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdD10LmdldEJvdW5kcz90LmdldEJvdW5kcygpOm8ubGF0TG5nQm91bmRzKHQpO3ZhciBpPW8ucG9pbnQoZS5wYWRkaW5nVG9wTGVmdHx8ZS5wYWRkaW5nfHxbMCwwXSksbj1vLnBvaW50KGUucGFkZGluZ0JvdHRvbVJpZ2h0fHxlLnBhZGRpbmd8fFswLDBdKSxzPXRoaXMuZ2V0Qm91bmRzWm9vbSh0LCExLGkuYWRkKG4pKTtzPSJudW1iZXIiPT10eXBlb2YgZS5tYXhab29tP01hdGgubWluKGUubWF4Wm9vbSxzKTpzO3ZhciByPW4uc3VidHJhY3QoaSkuZGl2aWRlQnkoMiksYT10aGlzLnByb2plY3QodC5nZXRTb3V0aFdlc3QoKSxzKSxoPXRoaXMucHJvamVjdCh0LmdldE5vcnRoRWFzdCgpLHMpLGw9dGhpcy51bnByb2plY3QoYS5hZGQoaCkuZGl2aWRlQnkoMikuYWRkKHIpLHMpO3JldHVybntjZW50ZXI6bCx6b29tOnN9fSxmaXRCb3VuZHM6ZnVuY3Rpb24odCxlKXtpZih0PW8ubGF0TG5nQm91bmRzKHQpLCF0LmlzVmFsaWQoKSl0aHJvdyBuZXcgRXJyb3IoIkJvdW5kcyBhcmUgbm90IHZhbGlkLiIpO3ZhciBpPXRoaXMuX2dldEJvdW5kc0NlbnRlclpvb20odCxlKTtyZXR1cm4gdGhpcy5zZXRWaWV3KGkuY2VudGVyLGkuem9vbSxlKX0sZml0V29ybGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZml0Qm91bmRzKFtbLTkwLC0xODBdLFs5MCwxODBdXSx0KX0scGFuVG86ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zZXRWaWV3KHQsdGhpcy5fem9vbSx7cGFuOmV9KX0scGFuQnk6ZnVuY3Rpb24odCxlKXtpZih0PW8ucG9pbnQodCkucm91bmQoKSxlPWV8fHt9LCF0LngmJiF0LnkpcmV0dXJuIHRoaXMuZmlyZSgibW92ZWVuZCIpO2lmKGUuYW5pbWF0ZSE9PSEwJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnModCkpcmV0dXJuIHRoaXMuX3Jlc2V0Vmlldyh0aGlzLnVucHJvamVjdCh0aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSkuYWRkKHQpKSx0aGlzLmdldFpvb20oKSksdGhpcztpZih0aGlzLl9wYW5BbmltfHwodGhpcy5fcGFuQW5pbT1uZXcgby5Qb3NBbmltYXRpb24sdGhpcy5fcGFuQW5pbS5vbih7c3RlcDp0aGlzLl9vblBhblRyYW5zaXRpb25TdGVwLGVuZDp0aGlzLl9vblBhblRyYW5zaXRpb25FbmR9LHRoaXMpKSxlLm5vTW92ZVN0YXJ0fHx0aGlzLmZpcmUoIm1vdmVzdGFydCIpLGUuYW5pbWF0ZSE9PSExKXtvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC1wYW4tYW5pbSIpO3ZhciBpPXRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KS5yb3VuZCgpO3RoaXMuX3BhbkFuaW0ucnVuKHRoaXMuX21hcFBhbmUsaSxlLmR1cmF0aW9ufHwuMjUsZS5lYXNlTGluZWFyaXR5KX1lbHNlIHRoaXMuX3Jhd1BhbkJ5KHQpLHRoaXMuZmlyZSgibW92ZSIpLmZpcmUoIm1vdmVlbmQiKTtyZXR1cm4gdGhpc30sZmx5VG86ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIHModCl7dmFyIGU9dD8tMToxLGk9dD92Omcsbj12KnYtZypnK2UqTCpMKnkqeSxvPTIqaSpMKnkscz1uL28scj1NYXRoLnNxcnQocypzKzEpLXMsYT1yPDFlLTk/LTE4Ok1hdGgubG9nKHIpO3JldHVybiBhfWZ1bmN0aW9uIHIodCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBhKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gcih0KS9hKHQpfWZ1bmN0aW9uIGwodCl7cmV0dXJuIGcqKGEoeCkvYSh4K1AqdCkpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIGcqKGEoeCkqaCh4K1AqdCktcih4KSkvTH1mdW5jdGlvbiBjKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCwxLjUpfWZ1bmN0aW9uIGQoKXt2YXIgaT0oRGF0ZS5ub3coKS13KS9ULG49YyhpKSpiO2k8PTE/KHRoaXMuX2ZseVRvRnJhbWU9by5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZCx0aGlzKSx0aGlzLl9tb3ZlKHRoaXMudW5wcm9qZWN0KF8uYWRkKG0uc3VidHJhY3QoXykubXVsdGlwbHlCeSh1KG4pL3kpKSxmKSx0aGlzLmdldFNjYWxlWm9vbShnL2wobiksZikse2ZseVRvOiEwfSkpOnRoaXMuX21vdmUodCxlKS5fbW92ZUVuZCghMCl9aWYobj1ufHx7fSxuLmFuaW1hdGU9PT0hMXx8IW8uQnJvd3Nlci5hbnkzZClyZXR1cm4gdGhpcy5zZXRWaWV3KHQsZSxuKTt0aGlzLl9zdG9wKCk7dmFyIF89dGhpcy5wcm9qZWN0KHRoaXMuZ2V0Q2VudGVyKCkpLG09dGhpcy5wcm9qZWN0KHQpLHA9dGhpcy5nZXRTaXplKCksZj10aGlzLl96b29tO3Q9by5sYXRMbmcodCksZT1lPT09aT9mOmU7dmFyIGc9TWF0aC5tYXgocC54LHAueSksdj1nKnRoaXMuZ2V0Wm9vbVNjYWxlKGYsZSkseT1tLmRpc3RhbmNlVG8oXyl8fDEsUD0xLjQyLEw9UCpQLHg9cygwKSx3PURhdGUubm93KCksYj0ocygxKS14KS9QLFQ9bi5kdXJhdGlvbj8xZTMqbi5kdXJhdGlvbjoxZTMqYiouODtyZXR1cm4gdGhpcy5fbW92ZVN0YXJ0KCEwKSxkLmNhbGwodGhpcyksdGhpc30sZmx5VG9Cb3VuZHM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRCb3VuZHNDZW50ZXJab29tKHQsZSk7cmV0dXJuIHRoaXMuZmx5VG8oaS5jZW50ZXIsaS56b29tLGUpfSxzZXRNYXhCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9by5sYXRMbmdCb3VuZHModCksdC5pc1ZhbGlkKCk/KHRoaXMub3B0aW9ucy5tYXhCb3VuZHMmJnRoaXMub2ZmKCJtb3ZlZW5kIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpLHRoaXMub3B0aW9ucy5tYXhCb3VuZHM9dCx0aGlzLl9sb2FkZWQmJnRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcygpLHRoaXMub24oIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcykpOih0aGlzLm9wdGlvbnMubWF4Qm91bmRzPW51bGwsdGhpcy5vZmYoIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcykpfSxzZXRNaW5ab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMubWluWm9vbT10LHRoaXMuX2xvYWRlZCYmdGhpcy5nZXRab29tKCk8dGhpcy5vcHRpb25zLm1pblpvb20/dGhpcy5zZXRab29tKHQpOnRoaXN9LHNldE1heFpvb206ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tYXhab29tPXQsdGhpcy5fbG9hZGVkJiZ0aGlzLmdldFpvb20oKT50aGlzLm9wdGlvbnMubWF4Wm9vbT90aGlzLnNldFpvb20odCk6dGhpc30scGFuSW5zaWRlQm91bmRzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZW5mb3JjaW5nQm91bmRzPSEwO3ZhciBpPXRoaXMuZ2V0Q2VudGVyKCksbj10aGlzLl9saW1pdENlbnRlcihpLHRoaXMuX3pvb20sby5sYXRMbmdCb3VuZHModCkpO3JldHVybiBpLmVxdWFscyhuKXx8dGhpcy5wYW5UbyhuLGUpLHRoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMSx0aGlzfSxpbnZhbGlkYXRlU2l6ZTpmdW5jdGlvbih0KXtpZighdGhpcy5fbG9hZGVkKXJldHVybiB0aGlzO3Q9by5leHRlbmQoe2FuaW1hdGU6ITEscGFuOiEwfSx0PT09ITA/e2FuaW1hdGU6ITB9OnQpO3ZhciBlPXRoaXMuZ2V0U2l6ZSgpO3RoaXMuX3NpemVDaGFuZ2VkPSEwLHRoaXMuX2xhc3RDZW50ZXI9bnVsbDt2YXIgaT10aGlzLmdldFNpemUoKSxuPWUuZGl2aWRlQnkoMikucm91bmQoKSxzPWkuZGl2aWRlQnkoMikucm91bmQoKSxyPW4uc3VidHJhY3Qocyk7cmV0dXJuIHIueHx8ci55Pyh0LmFuaW1hdGUmJnQucGFuP3RoaXMucGFuQnkocik6KHQucGFuJiZ0aGlzLl9yYXdQYW5CeShyKSx0aGlzLmZpcmUoIm1vdmUiKSx0LmRlYm91bmNlTW92ZWVuZD8oY2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lciksdGhpcy5fc2l6ZVRpbWVyPXNldFRpbWVvdXQoby5iaW5kKHRoaXMuZmlyZSx0aGlzLCJtb3ZlZW5kIiksMjAwKSk6dGhpcy5maXJlKCJtb3ZlZW5kIikpLHRoaXMuZmlyZSgicmVzaXplIix7b2xkU2l6ZTplLG5ld1NpemU6aX0pKTp0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0Wm9vbSh0aGlzLl9saW1pdFpvb20odGhpcy5fem9vbSkpLHRoaXMub3B0aW9ucy56b29tU25hcHx8dGhpcy5maXJlKCJ2aWV3cmVzZXQiKSx0aGlzLl9zdG9wKCl9LGxvY2F0ZTpmdW5jdGlvbih0KXtpZih0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9by5leHRlbmQoe3RpbWVvdXQ6MWU0LHdhdGNoOiExfSx0KSwhKCJnZW9sb2NhdGlvbiJpbiBuYXZpZ2F0b3IpKXJldHVybiB0aGlzLl9oYW5kbGVHZW9sb2NhdGlvbkVycm9yKHtjb2RlOjAsbWVzc2FnZToiR2VvbG9jYXRpb24gbm90IHN1cHBvcnRlZC4ifSksdGhpczt2YXIgZT1vLmJpbmQodGhpcy5faGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZSx0aGlzKSxpPW8uYmluZCh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvbkVycm9yLHRoaXMpO3JldHVybiB0LndhdGNoP3RoaXMuX2xvY2F0aW9uV2F0Y2hJZD1uYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihlLGksdCk6bmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihlLGksdCksdGhpc30sc3RvcExvY2F0ZTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJm5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9sb2NhdGlvbldhdGNoSWQpLHRoaXMuX2xvY2F0ZU9wdGlvbnMmJih0aGlzLl9sb2NhdGVPcHRpb25zLnNldFZpZXc9ITEpLHRoaXN9LF9oYW5kbGVHZW9sb2NhdGlvbkVycm9yOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxpPXQubWVzc2FnZXx8KDE9PT1lPyJwZXJtaXNzaW9uIGRlbmllZCI6Mj09PWU/InBvc2l0aW9uIHVuYXZhaWxhYmxlIjoidGltZW91dCIpO3RoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0VmlldyYmIXRoaXMuX2xvYWRlZCYmdGhpcy5maXRXb3JsZCgpLHRoaXMuZmlyZSgibG9jYXRpb25lcnJvciIse2NvZGU6ZSxtZXNzYWdlOiJHZW9sb2NhdGlvbiBlcnJvcjogIitpKyIuIn0pfSxfaGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZTpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3Jkcy5sYXRpdHVkZSxpPXQuY29vcmRzLmxvbmdpdHVkZSxuPW5ldyBvLkxhdExuZyhlLGkpLHM9bi50b0JvdW5kcyh0LmNvb3Jkcy5hY2N1cmFjeSkscj10aGlzLl9sb2NhdGVPcHRpb25zO2lmKHIuc2V0Vmlldyl7dmFyIGE9dGhpcy5nZXRCb3VuZHNab29tKHMpO3RoaXMuc2V0VmlldyhuLHIubWF4Wm9vbT9NYXRoLm1pbihhLHIubWF4Wm9vbSk6YSl9dmFyIGg9e2xhdGxuZzpuLGJvdW5kczpzLHRpbWVzdGFtcDp0LnRpbWVzdGFtcH07Zm9yKHZhciBsIGluIHQuY29vcmRzKSJudW1iZXIiPT10eXBlb2YgdC5jb29yZHNbbF0mJihoW2xdPXQuY29vcmRzW2xdKTt0aGlzLmZpcmUoImxvY2F0aW9uZm91bmQiLGgpfSxhZGRIYW5kbGVyOmZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJuIHRoaXM7dmFyIGk9dGhpc1t0XT1uZXcgZSh0aGlzKTtyZXR1cm4gdGhpcy5faGFuZGxlcnMucHVzaChpKSx0aGlzLm9wdGlvbnNbdF0mJmkuZW5hYmxlKCksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYodGhpcy5faW5pdEV2ZW50cyghMCksdGhpcy5fY29udGFpbmVySWQhPT10aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIGlzIGJlaW5nIHJldXNlZCBieSBhbm90aGVyIGluc3RhbmNlIik7dHJ5e2RlbGV0ZSB0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQsZGVsZXRlIHRoaXMuX2NvbnRhaW5lcklkfWNhdGNoKHQpe3RoaXMuX2NvbnRhaW5lci5fbGVhZmxldF9pZD1pLHRoaXMuX2NvbnRhaW5lcklkPWl9by5Eb21VdGlsLnJlbW92ZSh0aGlzLl9tYXBQYW5lKSx0aGlzLl9jbGVhckNvbnRyb2xQb3MmJnRoaXMuX2NsZWFyQ29udHJvbFBvcygpLHRoaXMuX2NsZWFySGFuZGxlcnMoKSx0aGlzLl9sb2FkZWQmJnRoaXMuZmlyZSgidW5sb2FkIik7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0ucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LGNyZWF0ZVBhbmU6ZnVuY3Rpb24odCxlKXt2YXIgaT0ibGVhZmxldC1wYW5lIisodD8iIGxlYWZsZXQtIit0LnJlcGxhY2UoIlBhbmUiLCIiKSsiLXBhbmUiOiIiKSxuPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsaSxlfHx0aGlzLl9tYXBQYW5lKTtyZXR1cm4gdCYmKHRoaXMuX3BhbmVzW3RdPW4pLG59LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fbGFzdENlbnRlciYmIXRoaXMuX21vdmVkKCk/dGhpcy5fbGFzdENlbnRlcjp0aGlzLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9nZXRDZW50ZXJMYXllclBvaW50KCkpfSxnZXRab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pvb219LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UGl4ZWxCb3VuZHMoKSxlPXRoaXMudW5wcm9qZWN0KHQuZ2V0Qm90dG9tTGVmdCgpKSxpPXRoaXMudW5wcm9qZWN0KHQuZ2V0VG9wUmlnaHQoKSk7cmV0dXJuIG5ldyBvLkxhdExuZ0JvdW5kcyhlLGkpfSxnZXRNaW5ab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW5ab29tPT09aT90aGlzLl9sYXllcnNNaW5ab29tfHwwOnRoaXMub3B0aW9ucy5taW5ab29tfSxnZXRNYXhab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tYXhab29tPT09aT90aGlzLl9sYXllcnNNYXhab29tPT09aT8xLzA6dGhpcy5fbGF5ZXJzTWF4Wm9vbTp0aGlzLm9wdGlvbnMubWF4Wm9vbX0sZ2V0Qm91bmRzWm9vbTpmdW5jdGlvbih0LGUsaSl7dD1vLmxhdExuZ0JvdW5kcyh0KSxpPW8ucG9pbnQoaXx8WzAsMF0pO3ZhciBuPXRoaXMuZ2V0Wm9vbSgpfHwwLHM9dGhpcy5nZXRNaW5ab29tKCkscj10aGlzLmdldE1heFpvb20oKSxhPXQuZ2V0Tm9ydGhXZXN0KCksaD10LmdldFNvdXRoRWFzdCgpLGw9dGhpcy5nZXRTaXplKCkuc3VidHJhY3QoaSksdT1vLmJvdW5kcyh0aGlzLnByb2plY3QoaCxuKSx0aGlzLnByb2plY3QoYSxuKSkuZ2V0U2l6ZSgpLGM9by5Ccm93c2VyLmFueTNkP3RoaXMub3B0aW9ucy56b29tU25hcDoxLGQ9TWF0aC5taW4obC54L3UueCxsLnkvdS55KTtyZXR1cm4gbj10aGlzLmdldFNjYWxlWm9vbShkLG4pLGMmJihuPU1hdGgucm91bmQobi8oYy8xMDApKSooYy8xMDApLG49ZT9NYXRoLmNlaWwobi9jKSpjOk1hdGguZmxvb3Iobi9jKSpjKSxNYXRoLm1heChzLE1hdGgubWluKHIsbikpfSxnZXRTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemUmJiF0aGlzLl9zaXplQ2hhbmdlZHx8KHRoaXMuX3NpemU9bmV3IG8uUG9pbnQodGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRofHwwLHRoaXMuX2NvbnRhaW5lci5jbGllbnRIZWlnaHR8fDApLHRoaXMuX3NpemVDaGFuZ2VkPSExKSx0aGlzLl9zaXplLmNsb25lKCl9LGdldFBpeGVsQm91bmRzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0VG9wTGVmdFBvaW50KHQsZSk7cmV0dXJuIG5ldyBvLkJvdW5kcyhpLGkuYWRkKHRoaXMuZ2V0U2l6ZSgpKSl9LGdldFBpeGVsT3JpZ2luOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoZWNrSWZMb2FkZWQoKSx0aGlzLl9waXhlbE9yaWdpbn0sZ2V0UGl4ZWxXb3JsZEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy5nZXRQcm9qZWN0ZWRCb3VuZHModD09PWk/dGhpcy5nZXRab29tKCk6dCl9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3RoaXMuX3BhbmVzW3RdOnR9LGdldFBhbmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhbmVzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRab29tU2NhbGU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLm9wdGlvbnMuY3JzO3JldHVybiBlPWU9PT1pP3RoaXMuX3pvb206ZSxuLnNjYWxlKHQpL24uc2NhbGUoZSl9LGdldFNjYWxlWm9vbTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMub3B0aW9ucy5jcnM7ZT1lPT09aT90aGlzLl96b29tOmU7dmFyIG89bi56b29tKHQqbi5zY2FsZShlKSk7cmV0dXJuIGlzTmFOKG8pPzEvMDpvfSxwcm9qZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZT09PWk/dGhpcy5fem9vbTplLHRoaXMub3B0aW9ucy5jcnMubGF0TG5nVG9Qb2ludChvLmxhdExuZyh0KSxlKX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZT09PWk/dGhpcy5fem9vbTplLHRoaXMub3B0aW9ucy5jcnMucG9pbnRUb0xhdExuZyhvLnBvaW50KHQpLGUpfSxsYXllclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9by5wb2ludCh0KS5hZGQodGhpcy5nZXRQaXhlbE9yaWdpbigpKTtyZXR1cm4gdGhpcy51bnByb2plY3QoZSl9LGxhdExuZ1RvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Qoby5sYXRMbmcodCkpLl9yb3VuZCgpO3JldHVybiBlLl9zdWJ0cmFjdCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpfSx3cmFwTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmcoby5sYXRMbmcodCkpfSx3cmFwTGF0TG5nQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmdCb3VuZHMoby5sYXRMbmdCb3VuZHModCkpfSxkaXN0YW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLmRpc3RhbmNlKG8ubGF0TG5nKHQpLG8ubGF0TG5nKGUpKX0sY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ucG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sbGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ucG9pbnQodCkuYWRkKHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LGNvbnRhaW5lclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChvLnBvaW50KHQpKTtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcoZSl9LGxhdExuZ1RvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodGhpcy5sYXRMbmdUb0xheWVyUG9pbnQoby5sYXRMbmcodCkpKX0sbW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8uRG9tRXZlbnQuZ2V0TW91c2VQb3NpdGlvbih0LHRoaXMuX2NvbnRhaW5lcil9LG1vdXNlRXZlbnRUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSl9LG1vdXNlRXZlbnRUb0xhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcodGhpcy5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29udGFpbmVyPW8uRG9tVXRpbC5nZXQodCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIG5vdCBmb3VuZC4iKTtpZihlLl9sZWFmbGV0X2lkKXRocm93IG5ldyBFcnJvcigiTWFwIGNvbnRhaW5lciBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiIpO28uRG9tRXZlbnQuYWRkTGlzdGVuZXIoZSwic2Nyb2xsIix0aGlzLl9vblNjcm9sbCx0aGlzKSx0aGlzLl9jb250YWluZXJJZD1vLlV0aWwuc3RhbXAoZSl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyO3RoaXMuX2ZhZGVBbmltYXRlZD10aGlzLm9wdGlvbnMuZmFkZUFuaW1hdGlvbiYmby5Ccm93c2VyLmFueTNkLG8uRG9tVXRpbC5hZGRDbGFzcyh0LCJsZWFmbGV0LWNvbnRhaW5lciIrKG8uQnJvd3Nlci50b3VjaD8iIGxlYWZsZXQtdG91Y2giOiIiKSsoby5Ccm93c2VyLnJldGluYT8iIGxlYWZsZXQtcmV0aW5hIjoiIikrKG8uQnJvd3Nlci5pZWx0OT8iIGxlYWZsZXQtb2xkaWUiOiIiKSsoby5Ccm93c2VyLnNhZmFyaT8iIGxlYWZsZXQtc2FmYXJpIjoiIikrKHRoaXMuX2ZhZGVBbmltYXRlZD8iIGxlYWZsZXQtZmFkZS1hbmltIjoiIikpOwp2YXIgZT1vLkRvbVV0aWwuZ2V0U3R5bGUodCwicG9zaXRpb24iKTsiYWJzb2x1dGUiIT09ZSYmInJlbGF0aXZlIiE9PWUmJiJmaXhlZCIhPT1lJiYodC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLl9pbml0UGFuZXMoKSx0aGlzLl9pbml0Q29udHJvbFBvcyYmdGhpcy5faW5pdENvbnRyb2xQb3MoKX0sX2luaXRQYW5lczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BhbmVzPXt9O3RoaXMuX3BhbmVSZW5kZXJlcnM9e30sdGhpcy5fbWFwUGFuZT10aGlzLmNyZWF0ZVBhbmUoIm1hcFBhbmUiLHRoaXMuX2NvbnRhaW5lciksby5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX21hcFBhbmUsbmV3IG8uUG9pbnQoMCwwKSksdGhpcy5jcmVhdGVQYW5lKCJ0aWxlUGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgic2hhZG93UGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgib3ZlcmxheVBhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoIm1hcmtlclBhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoInRvb2x0aXBQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJwb3B1cFBhbmUiKSx0aGlzLm9wdGlvbnMubWFya2VyWm9vbUFuaW1hdGlvbnx8KG8uRG9tVXRpbC5hZGRDbGFzcyh0Lm1hcmtlclBhbmUsImxlYWZsZXQtem9vbS1oaWRlIiksby5Eb21VdGlsLmFkZENsYXNzKHQuc2hhZG93UGFuZSwibGVhZmxldC16b29tLWhpZGUiKSl9LF9yZXNldFZpZXc6ZnVuY3Rpb24odCxlKXtvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fbWFwUGFuZSxuZXcgby5Qb2ludCgwLDApKTt2YXIgaT0hdGhpcy5fbG9hZGVkO3RoaXMuX2xvYWRlZD0hMCxlPXRoaXMuX2xpbWl0Wm9vbShlKSx0aGlzLmZpcmUoInZpZXdwcmVyZXNldCIpO3ZhciBuPXRoaXMuX3pvb20hPT1lO3RoaXMuX21vdmVTdGFydChuKS5fbW92ZSh0LGUpLl9tb3ZlRW5kKG4pLHRoaXMuZmlyZSgidmlld3Jlc2V0IiksaSYmdGhpcy5maXJlKCJsb2FkIil9LF9tb3ZlU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuZmlyZSgiem9vbXN0YXJ0IiksdGhpcy5maXJlKCJtb3Zlc3RhcnQiKX0sX21vdmU6ZnVuY3Rpb24odCxlLG4pe2U9PT1pJiYoZT10aGlzLl96b29tKTt2YXIgbz10aGlzLl96b29tIT09ZTtyZXR1cm4gdGhpcy5fem9vbT1lLHRoaXMuX2xhc3RDZW50ZXI9dCx0aGlzLl9waXhlbE9yaWdpbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbih0KSwob3x8biYmbi5waW5jaCkmJnRoaXMuZmlyZSgiem9vbSIsbiksdGhpcy5maXJlKCJtb3ZlIixuKX0sX21vdmVFbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuZmlyZSgiem9vbWVuZCIpLHRoaXMuZmlyZSgibW92ZWVuZCIpfSxfc3RvcDpmdW5jdGlvbigpe3JldHVybiBvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2ZseVRvRnJhbWUpLHRoaXMuX3BhbkFuaW0mJnRoaXMuX3BhbkFuaW0uc3RvcCgpLHRoaXN9LF9yYXdQYW5CeTpmdW5jdGlvbih0KXtvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fbWFwUGFuZSx0aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkpfSxfZ2V0Wm9vbVNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNYXhab29tKCktdGhpcy5nZXRNaW5ab29tKCl9LF9wYW5JbnNpZGVNYXhCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHN8fHRoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKCJTZXQgbWFwIGNlbnRlciBhbmQgem9vbSBmaXJzdC4iKX0sX2luaXRFdmVudHM6ZnVuY3Rpb24oZSl7aWYoby5Eb21FdmVudCl7dGhpcy5fdGFyZ2V0cz17fSx0aGlzLl90YXJnZXRzW28uc3RhbXAodGhpcy5fY29udGFpbmVyKV09dGhpczt2YXIgaT1lPyJvZmYiOiJvbiI7by5Eb21FdmVudFtpXSh0aGlzLl9jb250YWluZXIsImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgY29udGV4dG1lbnUga2V5cHJlc3MiLHRoaXMuX2hhbmRsZURPTUV2ZW50LHRoaXMpLHRoaXMub3B0aW9ucy50cmFja1Jlc2l6ZSYmby5Eb21FdmVudFtpXSh0LCJyZXNpemUiLHRoaXMuX29uUmVzaXplLHRoaXMpLG8uQnJvd3Nlci5hbnkzZCYmdGhpcy5vcHRpb25zLnRyYW5zZm9ybTNETGltaXQmJnRoaXNbaV0oIm1vdmVlbmQiLHRoaXMuX29uTW92ZUVuZCl9fSxfb25SZXNpemU6ZnVuY3Rpb24oKXtvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX3Jlc2l6ZVJlcXVlc3QpLHRoaXMuX3Jlc2l6ZVJlcXVlc3Q9by5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnVuY3Rpb24oKXt0aGlzLmludmFsaWRhdGVTaXplKHtkZWJvdW5jZU1vdmVlbmQ6ITB9KX0sdGhpcyl9LF9vblNjcm9sbDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lci5zY3JvbGxUb3A9MCx0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdD0wfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO01hdGgubWF4KE1hdGguYWJzKHQueCksTWF0aC5hYnModC55KSk+PXRoaXMub3B0aW9ucy50cmFuc2Zvcm0zRExpbWl0JiZ0aGlzLl9yZXNldFZpZXcodGhpcy5nZXRDZW50ZXIoKSx0aGlzLmdldFpvb20oKSl9LF9maW5kRXZlbnRUYXJnZXRzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG49W10scz0ibW91c2VvdXQiPT09ZXx8Im1vdXNlb3ZlciI9PT1lLHI9dC50YXJnZXR8fHQuc3JjRWxlbWVudCxhPSExO3I7KXtpZihpPXRoaXMuX3RhcmdldHNbby5zdGFtcChyKV0saSYmKCJjbGljayI9PT1lfHwicHJlY2xpY2siPT09ZSkmJiF0Ll9zaW11bGF0ZWQmJnRoaXMuX2RyYWdnYWJsZU1vdmVkKGkpKXthPSEwO2JyZWFrfWlmKGkmJmkubGlzdGVucyhlLCEwKSl7aWYocyYmIW8uRG9tRXZlbnQuX2lzRXh0ZXJuYWxUYXJnZXQocix0KSlicmVhaztpZihuLnB1c2goaSkscylicmVha31pZihyPT09dGhpcy5fY29udGFpbmVyKWJyZWFrO3I9ci5wYXJlbnROb2RlfXJldHVybiBuLmxlbmd0aHx8YXx8c3x8IW8uRG9tRXZlbnQuX2lzRXh0ZXJuYWxUYXJnZXQocix0KXx8KG49W3RoaXNdKSxufSxfaGFuZGxlRE9NRXZlbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy5fbG9hZGVkJiYhby5Eb21FdmVudC5fc2tpcHBlZCh0KSl7dmFyIGU9ImtleXByZXNzIj09PXQudHlwZSYmMTM9PT10LmtleUNvZGU/ImNsaWNrIjp0LnR5cGU7Im1vdXNlZG93biI9PT1lJiZvLkRvbVV0aWwucHJldmVudE91dGxpbmUodC50YXJnZXR8fHQuc3JjRWxlbWVudCksdGhpcy5fZmlyZURPTUV2ZW50KHQsZSl9fSxfZmlyZURPTUV2ZW50OmZ1bmN0aW9uKHQsZSxpKXtpZigiY2xpY2siPT09dC50eXBlKXt2YXIgbj1vLlV0aWwuZXh0ZW5kKHt9LHQpO24udHlwZT0icHJlY2xpY2siLHRoaXMuX2ZpcmVET01FdmVudChuLG4udHlwZSxpKX1pZighdC5fc3RvcHBlZCYmKGk9KGl8fFtdKS5jb25jYXQodGhpcy5fZmluZEV2ZW50VGFyZ2V0cyh0LGUpKSxpLmxlbmd0aCkpe3ZhciBzPWlbMF07ImNvbnRleHRtZW51Ij09PWUmJnMubGlzdGVucyhlLCEwKSYmby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KTt2YXIgcj17b3JpZ2luYWxFdmVudDp0fTtpZigia2V5cHJlc3MiIT09dC50eXBlKXt2YXIgYT1zIGluc3RhbmNlb2Ygby5NYXJrZXI7ci5jb250YWluZXJQb2ludD1hP3RoaXMubGF0TG5nVG9Db250YWluZXJQb2ludChzLmdldExhdExuZygpKTp0aGlzLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpLHIubGF5ZXJQb2ludD10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHIuY29udGFpbmVyUG9pbnQpLHIubGF0bG5nPWE/cy5nZXRMYXRMbmcoKTp0aGlzLmxheWVyUG9pbnRUb0xhdExuZyhyLmxheWVyUG9pbnQpfWZvcih2YXIgaD0wO2g8aS5sZW5ndGg7aCsrKWlmKGlbaF0uZmlyZShlLHIsITApLHIub3JpZ2luYWxFdmVudC5fc3RvcHBlZHx8aVtoXS5vcHRpb25zLm5vbkJ1YmJsaW5nRXZlbnRzJiZvLlV0aWwuaW5kZXhPZihpW2hdLm9wdGlvbnMubm9uQnViYmxpbmdFdmVudHMsZSkhPT0tMSlyZXR1cm59fSxfZHJhZ2dhYmxlTW92ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5kcmFnZ2luZyYmdC5kcmFnZ2luZy5lbmFibGVkKCk/dDp0aGlzLHQuZHJhZ2dpbmcmJnQuZHJhZ2dpbmcubW92ZWQoKXx8dGhpcy5ib3hab29tJiZ0aGlzLmJveFpvb20ubW92ZWQoKX0sX2NsZWFySGFuZGxlcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMuX2hhbmRsZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuX2hhbmRsZXJzW3RdLmRpc2FibGUoKX0sd2hlblJlYWR5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90LmNhbGwoZXx8dGhpcyx7dGFyZ2V0OnRoaXN9KTp0aGlzLm9uKCJsb2FkIix0LGUpLHRoaXN9LF9nZXRNYXBQYW5lUG9zOmZ1bmN0aW9uKCl7cmV0dXJuIG8uRG9tVXRpbC5nZXRQb3NpdGlvbih0aGlzLl9tYXBQYW5lKXx8bmV3IG8uUG9pbnQoMCwwKX0sX21vdmVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO3JldHVybiB0JiYhdC5lcXVhbHMoWzAsMF0pfSxfZ2V0VG9wTGVmdFBvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49dCYmZSE9PWk/dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4odCxlKTp0aGlzLmdldFBpeGVsT3JpZ2luKCk7cmV0dXJuIG4uc3VidHJhY3QodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sX2dldE5ld1BpeGVsT3JpZ2luOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3QoaSkuX2FkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpLl9yb3VuZCgpfSxfbGF0TG5nVG9OZXdMYXllclBvaW50OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihpLGUpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3Qobil9LF9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihpLGUpO3JldHVybiBvLmJvdW5kcyhbdGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksZSkuX3N1YnRyYWN0KG4pLHRoaXMucHJvamVjdCh0LmdldE5vcnRoV2VzdCgpLGUpLl9zdWJ0cmFjdChuKSx0aGlzLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSxlKS5fc3VidHJhY3QobiksdGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksZSkuX3N1YnRyYWN0KG4pXSl9LF9nZXRDZW50ZXJMYXllclBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpKX0sX2dldENlbnRlck9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpKX0sX2xpbWl0Q2VudGVyOmZ1bmN0aW9uKHQsZSxpKXtpZighaSlyZXR1cm4gdDt2YXIgbj10aGlzLnByb2plY3QodCxlKSxzPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLHI9bmV3IG8uQm91bmRzKG4uc3VidHJhY3Qocyksbi5hZGQocykpLGE9dGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KHIsaSxlKTtyZXR1cm4gYS5yb3VuZCgpLmVxdWFscyhbMCwwXSk/dDp0aGlzLnVucHJvamVjdChuLmFkZChhKSxlKX0sX2xpbWl0T2Zmc2V0OmZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9dGhpcy5nZXRQaXhlbEJvdW5kcygpLG49bmV3IG8uQm91bmRzKGkubWluLmFkZCh0KSxpLm1heC5hZGQodCkpO3JldHVybiB0LmFkZCh0aGlzLl9nZXRCb3VuZHNPZmZzZXQobixlKSl9LF9nZXRCb3VuZHNPZmZzZXQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPW8uYm91bmRzKHRoaXMucHJvamVjdChlLmdldE5vcnRoRWFzdCgpLGkpLHRoaXMucHJvamVjdChlLmdldFNvdXRoV2VzdCgpLGkpKSxzPW4ubWluLnN1YnRyYWN0KHQubWluKSxyPW4ubWF4LnN1YnRyYWN0KHQubWF4KSxhPXRoaXMuX3JlYm91bmQocy54LC1yLngpLGg9dGhpcy5fcmVib3VuZChzLnksLXIueSk7cmV0dXJuIG5ldyBvLlBvaW50KGEsaCl9LF9yZWJvdW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZT4wP01hdGgucm91bmQodC1lKS8yOk1hdGgubWF4KDAsTWF0aC5jZWlsKHQpKS1NYXRoLm1heCgwLE1hdGguZmxvb3IoZSkpfSxfbGltaXRab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TWluWm9vbSgpLGk9dGhpcy5nZXRNYXhab29tKCksbj1vLkJyb3dzZXIuYW55M2Q/dGhpcy5vcHRpb25zLnpvb21TbmFwOjE7cmV0dXJuIG4mJih0PU1hdGgucm91bmQodC9uKSpuKSxNYXRoLm1heChlLE1hdGgubWluKGksdCkpfSxfb25QYW5UcmFuc2l0aW9uU3RlcDpmdW5jdGlvbigpe3RoaXMuZmlyZSgibW92ZSIpfSxfb25QYW5UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7by5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX21hcFBhbmUsImxlYWZsZXQtcGFuLWFuaW0iKSx0aGlzLmZpcmUoIm1vdmVlbmQiKX0sX3RyeUFuaW1hdGVkUGFuOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0Q2VudGVyT2Zmc2V0KHQpLl9mbG9vcigpO3JldHVybiEoKGUmJmUuYW5pbWF0ZSkhPT0hMCYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKGkpKSYmKHRoaXMucGFuQnkoaSxlKSwhMCl9LF9jcmVhdGVBbmltUHJveHk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wcm94eT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LXByb3h5IGxlYWZsZXQtem9vbS1hbmltYXRlZCIpO3RoaXMuX3BhbmVzLm1hcFBhbmUuYXBwZW5kQ2hpbGQodCksdGhpcy5vbigiem9vbWFuaW0iLGZ1bmN0aW9uKGUpe3ZhciBpPW8uRG9tVXRpbC5UUkFOU0ZPUk0sbj10LnN0eWxlW2ldO28uRG9tVXRpbC5zZXRUcmFuc2Zvcm0odCx0aGlzLnByb2plY3QoZS5jZW50ZXIsZS56b29tKSx0aGlzLmdldFpvb21TY2FsZShlLnpvb20sMSkpLG49PT10LnN0eWxlW2ldJiZ0aGlzLl9hbmltYXRpbmdab29tJiZ0aGlzLl9vblpvb21UcmFuc2l0aW9uRW5kKCl9LHRoaXMpLHRoaXMub24oImxvYWQgbW92ZWVuZCIsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENlbnRlcigpLGk9dGhpcy5nZXRab29tKCk7by5Eb21VdGlsLnNldFRyYW5zZm9ybSh0LHRoaXMucHJvamVjdChlLGkpLHRoaXMuZ2V0Wm9vbVNjYWxlKGksMSkpfSx0aGlzKX0sX2NhdGNoVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0aGlzLl9hbmltYXRpbmdab29tJiZ0LnByb3BlcnR5TmFtZS5pbmRleE9mKCJ0cmFuc2Zvcm0iKT49MCYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSxfbm90aGluZ1RvQW5pbWF0ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGVhZmxldC16b29tLWFuaW1hdGVkIikubGVuZ3RofSxfdHJ5QW5pbWF0ZWRab29tOmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLl9hbmltYXRpbmdab29tKXJldHVybiEwO2lmKGk9aXx8e30sIXRoaXMuX3pvb21BbmltYXRlZHx8aS5hbmltYXRlPT09ITF8fHRoaXMuX25vdGhpbmdUb0FuaW1hdGUoKXx8TWF0aC5hYnMoZS10aGlzLl96b29tKT50aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvblRocmVzaG9sZClyZXR1cm4hMTt2YXIgbj10aGlzLmdldFpvb21TY2FsZShlKSxzPXRoaXMuX2dldENlbnRlck9mZnNldCh0KS5fZGl2aWRlQnkoMS0xL24pO3JldHVybiEoaS5hbmltYXRlIT09ITAmJiF0aGlzLmdldFNpemUoKS5jb250YWlucyhzKSkmJihvLlV0aWwucmVxdWVzdEFuaW1GcmFtZShmdW5jdGlvbigpe3RoaXMuX21vdmVTdGFydCghMCkuX2FuaW1hdGVab29tKHQsZSwhMCl9LHRoaXMpLCEwKX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQsZSxpLG4pe2kmJih0aGlzLl9hbmltYXRpbmdab29tPSEwLHRoaXMuX2FuaW1hdGVUb0NlbnRlcj10LHRoaXMuX2FuaW1hdGVUb1pvb209ZSxvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC16b29tLWFuaW0iKSksdGhpcy5maXJlKCJ6b29tYW5pbSIse2NlbnRlcjp0LHpvb206ZSxub1VwZGF0ZTpufSksc2V0VGltZW91dChvLmJpbmQodGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCx0aGlzKSwyNTApfSxfb25ab29tVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZ1pvb20mJihvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fbWFwUGFuZSwibGVhZmxldC16b29tLWFuaW0iKSx0aGlzLl9hbmltYXRpbmdab29tPSExLHRoaXMuX21vdmUodGhpcy5fYW5pbWF0ZVRvQ2VudGVyLHRoaXMuX2FuaW1hdGVUb1pvb20pLG8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZ1bmN0aW9uKCl7dGhpcy5fbW92ZUVuZCghMCl9LHRoaXMpKX19KSxvLm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5NYXAodCxlKX0sby5MYXllcj1vLkV2ZW50ZWQuZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJvdmVybGF5UGFuZSIsbm9uQnViYmxpbmdFdmVudHM6W10sYXR0cmlidXRpb246bnVsbH0sYWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWRkTGF5ZXIodGhpcyksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlRnJvbSh0aGlzLl9tYXB8fHRoaXMuX21hcFRvQWRkKX0scmVtb3ZlRnJvbTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5yZW1vdmVMYXllcih0aGlzKSx0aGlzfSxnZXRQYW5lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXAuZ2V0UGFuZSh0P3RoaXMub3B0aW9uc1t0XXx8dDp0aGlzLm9wdGlvbnMucGFuZSl9LGFkZEludGVyYWN0aXZlVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXAuX3RhcmdldHNbby5zdGFtcCh0KV09dGhpcyx0aGlzfSxyZW1vdmVJbnRlcmFjdGl2ZVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRoaXMuX21hcC5fdGFyZ2V0c1tvLnN0YW1wKHQpXSx0aGlzfSxnZXRBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb259LF9sYXllckFkZDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtpZihlLmhhc0xheWVyKHRoaXMpKXtpZih0aGlzLl9tYXA9ZSx0aGlzLl96b29tQW5pbWF0ZWQ9ZS5fem9vbUFuaW1hdGVkLHRoaXMuZ2V0RXZlbnRzKXt2YXIgaT10aGlzLmdldEV2ZW50cygpO2Uub24oaSx0aGlzKSx0aGlzLm9uY2UoInJlbW92ZSIsZnVuY3Rpb24oKXtlLm9mZihpLHRoaXMpfSx0aGlzKX10aGlzLm9uQWRkKGUpLHRoaXMuZ2V0QXR0cmlidXRpb24mJmUuYXR0cmlidXRpb25Db250cm9sJiZlLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpLHRoaXMuZmlyZSgiYWRkIiksZS5maXJlKCJsYXllcmFkZCIse2xheWVyOnRoaXN9KX19fSksby5NYXAuaW5jbHVkZSh7YWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9by5zdGFtcCh0KTtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdP3RoaXM6KHRoaXMuX2xheWVyc1tlXT10LHQuX21hcFRvQWRkPXRoaXMsdC5iZWZvcmVBZGQmJnQuYmVmb3JlQWRkKHRoaXMpLHRoaXMud2hlblJlYWR5KHQuX2xheWVyQWRkLHQpLHRoaXMpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgZT1vLnN0YW1wKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV0/KHRoaXMuX2xvYWRlZCYmdC5vblJlbW92ZSh0aGlzKSx0LmdldEF0dHJpYnV0aW9uJiZ0aGlzLmF0dHJpYnV0aW9uQ29udHJvbCYmdGhpcy5hdHRyaWJ1dGlvbkNvbnRyb2wucmVtb3ZlQXR0cmlidXRpb24odC5nZXRBdHRyaWJ1dGlvbigpKSxkZWxldGUgdGhpcy5fbGF5ZXJzW2VdLHRoaXMuX2xvYWRlZCYmKHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjp0fSksdC5maXJlKCJyZW1vdmUiKSksdC5fbWFwPXQuX21hcFRvQWRkPW51bGwsdGhpcyk6dGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiZvLnN0YW1wKHQpaW4gdGhpcy5fbGF5ZXJzfSxlYWNoTGF5ZXI6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXQuY2FsbChlLHRoaXMuX2xheWVyc1tpXSk7cmV0dXJuIHRoaXN9LF9hZGRMYXllcnM6ZnVuY3Rpb24odCl7dD10P28uVXRpbC5pc0FycmF5KHQpP3Q6W3RdOltdO2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl0aGlzLmFkZExheWVyKHRbZV0pfSxfYWRkWm9vbUxpbWl0OmZ1bmN0aW9uKHQpeyFpc05hTih0Lm9wdGlvbnMubWF4Wm9vbSkmJmlzTmFOKHQub3B0aW9ucy5taW5ab29tKXx8KHRoaXMuX3pvb21Cb3VuZExheWVyc1tvLnN0YW1wKHQpXT10LHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF9yZW1vdmVab29tTGltaXQ6ZnVuY3Rpb24odCl7dmFyIGU9by5zdGFtcCh0KTt0aGlzLl96b29tQm91bmRMYXllcnNbZV0mJihkZWxldGUgdGhpcy5fem9vbUJvdW5kTGF5ZXJzW2VdLHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF91cGRhdGVab29tTGV2ZWxzOmZ1bmN0aW9uKCl7dmFyIHQ9MS8wLGU9LSgxLzApLG49dGhpcy5fZ2V0Wm9vbVNwYW4oKTtmb3IodmFyIG8gaW4gdGhpcy5fem9vbUJvdW5kTGF5ZXJzKXt2YXIgcz10aGlzLl96b29tQm91bmRMYXllcnNbb10ub3B0aW9uczt0PXMubWluWm9vbT09PWk/dDpNYXRoLm1pbih0LHMubWluWm9vbSksZT1zLm1heFpvb209PT1pP2U6TWF0aC5tYXgoZSxzLm1heFpvb20pfXRoaXMuX2xheWVyc01heFpvb209ZT09PS0oMS8wKT9pOmUsdGhpcy5fbGF5ZXJzTWluWm9vbT10PT09MS8wP2k6dCxuIT09dGhpcy5fZ2V0Wm9vbVNwYW4oKSYmdGhpcy5maXJlKCJ6b29tbGV2ZWxzY2hhbmdlIiksdGhpcy5vcHRpb25zLm1heFpvb209PT1pJiZ0aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLmdldFpvb20oKT50aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLnNldFpvb20odGhpcy5fbGF5ZXJzTWF4Wm9vbSksdGhpcy5vcHRpb25zLm1pblpvb209PT1pJiZ0aGlzLl9sYXllcnNNaW5ab29tJiZ0aGlzLmdldFpvb20oKTx0aGlzLl9sYXllcnNNaW5ab29tJiZ0aGlzLnNldFpvb20odGhpcy5fbGF5ZXJzTWluWm9vbSl9fSk7dmFyIHI9Il9sZWFmbGV0X2V2ZW50cyI7by5Eb21FdmVudD17b246ZnVuY3Rpb24odCxlLGksbil7aWYoIm9iamVjdCI9PXR5cGVvZiBlKWZvcih2YXIgcyBpbiBlKXRoaXMuX29uKHQscyxlW3NdLGkpO2Vsc2V7ZT1vLlV0aWwuc3BsaXRXb3JkcyhlKTtmb3IodmFyIHI9MCxhPWUubGVuZ3RoO3I8YTtyKyspdGhpcy5fb24odCxlW3JdLGksbil9cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbih0LGUsaSxuKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpZm9yKHZhciBzIGluIGUpdGhpcy5fb2ZmKHQscyxlW3NdLGkpO2Vsc2V7ZT1vLlV0aWwuc3BsaXRXb3JkcyhlKTtmb3IodmFyIHI9MCxhPWUubGVuZ3RoO3I8YTtyKyspdGhpcy5fb2ZmKHQsZVtyXSxpLG4pfXJldHVybiB0aGlzfSxfb246ZnVuY3Rpb24oZSxpLG4scyl7dmFyIGE9aStvLnN0YW1wKG4pKyhzPyJfIitvLnN0YW1wKHMpOiIiKTtpZihlW3JdJiZlW3JdW2FdKXJldHVybiB0aGlzO3ZhciBoPWZ1bmN0aW9uKGkpe3JldHVybiBuLmNhbGwoc3x8ZSxpfHx0LmV2ZW50KX0sbD1oO3JldHVybiBvLkJyb3dzZXIucG9pbnRlciYmMD09PWkuaW5kZXhPZigidG91Y2giKT90aGlzLmFkZFBvaW50ZXJMaXN0ZW5lcihlLGksaCxhKTohby5Ccm93c2VyLnRvdWNofHwiZGJsY2xpY2siIT09aXx8IXRoaXMuYWRkRG91YmxlVGFwTGlzdGVuZXJ8fG8uQnJvd3Nlci5wb2ludGVyJiZvLkJyb3dzZXIuY2hyb21lPyJhZGRFdmVudExpc3RlbmVyImluIGU/Im1vdXNld2hlZWwiPT09aT9lLmFkZEV2ZW50TGlzdGVuZXIoIm9ud2hlZWwiaW4gZT8id2hlZWwiOiJtb3VzZXdoZWVsIixoLCExKToibW91c2VlbnRlciI9PT1pfHwibW91c2VsZWF2ZSI9PT1pPyhoPWZ1bmN0aW9uKGkpe2k9aXx8dC5ldmVudCxvLkRvbUV2ZW50Ll9pc0V4dGVybmFsVGFyZ2V0KGUsaSkmJmwoaSl9LGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciI9PT1pPyJtb3VzZW92ZXIiOiJtb3VzZW91dCIsaCwhMSkpOigiY2xpY2siPT09aSYmby5Ccm93c2VyLmFuZHJvaWQmJihoPWZ1bmN0aW9uKHQpe3JldHVybiBvLkRvbUV2ZW50Ll9maWx0ZXJDbGljayh0LGwpfSksZS5hZGRFdmVudExpc3RlbmVyKGksaCwhMSkpOiJhdHRhY2hFdmVudCJpbiBlJiZlLmF0dGFjaEV2ZW50KCJvbiIraSxoKTp0aGlzLmFkZERvdWJsZVRhcExpc3RlbmVyKGUsaCxhKSxlW3JdPWVbcl18fHt9LGVbcl1bYV09aCx0aGlzfSxfb2ZmOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBzPWUrby5zdGFtcChpKSsobj8iXyIrby5zdGFtcChuKToiIiksYT10W3JdJiZ0W3JdW3NdO3JldHVybiBhPyhvLkJyb3dzZXIucG9pbnRlciYmMD09PWUuaW5kZXhPZigidG91Y2giKT90aGlzLnJlbW92ZVBvaW50ZXJMaXN0ZW5lcih0LGUscyk6by5Ccm93c2VyLnRvdWNoJiYiZGJsY2xpY2siPT09ZSYmdGhpcy5yZW1vdmVEb3VibGVUYXBMaXN0ZW5lcj90aGlzLnJlbW92ZURvdWJsZVRhcExpc3RlbmVyKHQscyk6InJlbW92ZUV2ZW50TGlzdGVuZXIiaW4gdD8ibW91c2V3aGVlbCI9PT1lP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigib253aGVlbCJpbiB0PyJ3aGVlbCI6Im1vdXNld2hlZWwiLGEsITEpOnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciI9PT1lPyJtb3VzZW92ZXIiOiJtb3VzZWxlYXZlIj09PWU/Im1vdXNlb3V0IjplLGEsITEpOiJkZXRhY2hFdmVudCJpbiB0JiZ0LmRldGFjaEV2ZW50KCJvbiIrZSxhKSx0W3JdW3NdPW51bGwsdGhpcyk6dGhpc30sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbj90LnN0b3BQcm9wYWdhdGlvbigpOnQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQuX3N0b3BwZWQ9ITA6dC5jYW5jZWxCdWJibGU9ITAsby5Eb21FdmVudC5fc2tpcHBlZCh0KSx0aGlzfSxkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIG8uRG9tRXZlbnQub24odCwibW91c2V3aGVlbCIsby5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24pfSxkaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbjpmdW5jdGlvbih0KXt2YXIgZT1vLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbjtyZXR1cm4gby5Eb21FdmVudC5vbih0LG8uRHJhZ2dhYmxlLlNUQVJULmpvaW4oIiAiKSxlKSxvLkRvbUV2ZW50Lm9uKHQse2NsaWNrOm8uRG9tRXZlbnQuX2Zha2VTdG9wLGRibGNsaWNrOmV9KX0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQ/dC5wcmV2ZW50RGVmYXVsdCgpOnQucmV0dXJuVmFsdWU9ITEsdGhpc30sc3RvcDpmdW5jdGlvbih0KXtyZXR1cm4gby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KS5zdG9wUHJvcGFnYXRpb24odCl9LGdldE1vdXNlUG9zaXRpb246ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm4gbmV3IG8uUG9pbnQodC5jbGllbnRYLHQuY2xpZW50WSk7dmFyIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gbmV3IG8uUG9pbnQodC5jbGllbnRYLWkubGVmdC1lLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLWUuY2xpZW50VG9wKX0sX3doZWVsUHhGYWN0b3I6by5Ccm93c2VyLndpbiYmby5Ccm93c2VyLmNocm9tZT8yOm8uQnJvd3Nlci5nZWNrbz90LmRldmljZVBpeGVsUmF0aW86MSxnZXRXaGVlbERlbHRhOmZ1bmN0aW9uKHQpe3JldHVybiBvLkJyb3dzZXIuZWRnZT90LndoZWVsRGVsdGFZLzI6dC5kZWx0YVkmJjA9PT10LmRlbHRhTW9kZT8tdC5kZWx0YVkvby5Eb21FdmVudC5fd2hlZWxQeEZhY3Rvcjp0LmRlbHRhWSYmMT09PXQuZGVsdGFNb2RlPzIwKi10LmRlbHRhWTp0LmRlbHRhWSYmMj09PXQuZGVsdGFNb2RlPzYwKi10LmRlbHRhWTp0LmRlbHRhWHx8dC5kZWx0YVo/MDp0LndoZWVsRGVsdGE/KHQud2hlZWxEZWx0YVl8fHQud2hlZWxEZWx0YSkvMjp0LmRldGFpbCYmTWF0aC5hYnModC5kZXRhaWwpPDMyNzY1PzIwKi10LmRldGFpbDp0LmRldGFpbD90LmRldGFpbC8tMzI3NjUqNjA6MH0sX3NraXBFdmVudHM6e30sX2Zha2VTdG9wOmZ1bmN0aW9uKHQpe28uRG9tRXZlbnQuX3NraXBFdmVudHNbdC50eXBlXT0hMH0sX3NraXBwZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2tpcEV2ZW50c1t0LnR5cGVdO3JldHVybiB0aGlzLl9za2lwRXZlbnRzW3QudHlwZV09ITEsZX0sX2lzRXh0ZXJuYWxUYXJnZXQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnJlbGF0ZWRUYXJnZXQ7aWYoIWkpcmV0dXJuITA7dHJ5e2Zvcig7aSYmaSE9PXQ7KWk9aS5wYXJlbnROb2RlfWNhdGNoKHQpe3JldHVybiExfXJldHVybiBpIT09dH0sX2ZpbHRlckNsaWNrOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC50aW1lU3RhbXB8fHQub3JpZ2luYWxFdmVudCYmdC5vcmlnaW5hbEV2ZW50LnRpbWVTdGFtcCxuPW8uRG9tRXZlbnQuX2xhc3RDbGljayYmaS1vLkRvbUV2ZW50Ll9sYXN0Q2xpY2s7cmV0dXJuIG4mJm4+MTAwJiZuPDUwMHx8dC50YXJnZXQuX3NpbXVsYXRlZENsaWNrJiYhdC5fc2ltdWxhdGVkP3ZvaWQgby5Eb21FdmVudC5zdG9wKHQpOihvLkRvbUV2ZW50Ll9sYXN0Q2xpY2s9aSx2b2lkIGUodCkpfX0sby5Eb21FdmVudC5hZGRMaXN0ZW5lcj1vLkRvbUV2ZW50Lm9uLG8uRG9tRXZlbnQucmVtb3ZlTGlzdGVuZXI9by5Eb21FdmVudC5vZmYsby5Qb3NBbmltYXRpb249by5FdmVudGVkLmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1pfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPW8uRG9tVXRpbC5nZXRQb3NpdGlvbih0KSx0aGlzLl9vZmZzZXQ9ZS5zdWJ0cmFjdCh0aGlzLl9zdGFydFBvcyksdGhpcy5fc3RhcnRUaW1lPStuZXcgRGF0ZSx0aGlzLmZpcmUoInN0YXJ0IiksdGhpcy5fYW5pbWF0ZSgpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5faW5Qcm9ncmVzcyYmKHRoaXMuX3N0ZXAoITApLHRoaXMuX2NvbXBsZXRlKCkpfSxfYW5pbWF0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1JZD1vLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl9hbmltYXRlLHRoaXMpLHRoaXMuX3N0ZXAoKX0sX3N0ZXA6ZnVuY3Rpb24odCl7dmFyIGU9K25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSxpPTFlMyp0aGlzLl9kdXJhdGlvbjtlPGk/dGhpcy5fcnVuRnJhbWUodGhpcy5fZWFzZU91dChlL2kpLHQpOih0aGlzLl9ydW5GcmFtZSgxKSx0aGlzLl9jb21wbGV0ZSgpKX0sX3J1bkZyYW1lOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3RhcnRQb3MuYWRkKHRoaXMuX29mZnNldC5tdWx0aXBseUJ5KHQpKTtlJiZpLl9yb3VuZCgpLG8uRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLl9lbCxpKSx0aGlzLmZpcmUoInN0ZXAiKX0sX2NvbXBsZXRlOmZ1bmN0aW9uKCl7by5VdGlsLmNhbmNlbEFuaW1GcmFtZSh0aGlzLl9hbmltSWQpLHRoaXMuX2luUHJvZ3Jlc3M9ITEsdGhpcy5maXJlKCJlbmQiKX0sX2Vhc2VPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LHRoaXMuX2Vhc2VPdXRQb3dlcil9fSksby5Qcm9qZWN0aW9uLk1lcmNhdG9yPXtSOjYzNzgxMzcsUl9NSU5PUjo2MzU2NzUyLjMxNDI0NTE3OSxib3VuZHM6by5ib3VuZHMoWy0yMDAzNzUwOC4zNDI3OSwtMTU0OTY1NzAuNzM5NzJdLFsyMDAzNzUwOC4zNDI3OSwxODc2NDY1Ni4yMzEzOF0pLHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS8xODAsaT10aGlzLlIsbj10LmxhdCplLHM9dGhpcy5SX01JTk9SL2kscj1NYXRoLnNxcnQoMS1zKnMpLGE9cipNYXRoLnNpbihuKSxoPU1hdGgudGFuKE1hdGguUEkvNC1uLzIpL01hdGgucG93KCgxLWEpLygxK2EpLHIvMik7cmV0dXJuIG49LWkqTWF0aC5sb2coTWF0aC5tYXgoaCwxZS0xMCkpLG5ldyBvLlBvaW50KHQubG5nKmUqaSxuKX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPTE4MC9NYXRoLlBJLG49dGhpcy5SLHM9dGhpcy5SX01JTk9SL24scj1NYXRoLnNxcnQoMS1zKnMpLGE9TWF0aC5leHAoLXQueS9uKSxoPU1hdGguUEkvMi0yKk1hdGguYXRhbihhKSxsPTAsdT0uMTtsPDE1JiZNYXRoLmFicyh1KT4xZS03O2wrKyllPXIqTWF0aC5zaW4oaCksZT1NYXRoLnBvdygoMS1lKS8oMStlKSxyLzIpLHU9TWF0aC5QSS8yLTIqTWF0aC5hdGFuKGEqZSktaCxoKz11O3JldHVybiBuZXcgby5MYXRMbmcoaCppLHQueCppL24pfX0sby5DUlMuRVBTRzMzOTU9by5leHRlbmQoe30sby5DUlMuRWFydGgse2NvZGU6IkVQU0c6MzM5NSIscHJvamVjdGlvbjpvLlByb2plY3Rpb24uTWVyY2F0b3IsdHJhbnNmb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgdD0uNS8oTWF0aC5QSSpvLlByb2plY3Rpb24uTWVyY2F0b3IuUik7cmV0dXJuIG5ldyBvLlRyYW5zZm9ybWF0aW9uKHQsLjUsLXQsLjUpfSgpfSksby5HcmlkTGF5ZXI9by5MYXllci5leHRlbmQoe29wdGlvbnM6e3RpbGVTaXplOjI1NixvcGFjaXR5OjEsdXBkYXRlV2hlbklkbGU6by5Ccm93c2VyLm1vYmlsZSx1cGRhdGVXaGVuWm9vbWluZzohMCx1cGRhdGVJbnRlcnZhbDoyMDAsekluZGV4OjEsYm91bmRzOm51bGwsbWluWm9vbTowLG1heFpvb206aSxub1dyYXA6ITEscGFuZToidGlsZVBhbmUiLGNsYXNzTmFtZToiIixrZWVwQnVmZmVyOjJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7by5zZXRPcHRpb25zKHRoaXMsdCl9LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5faW5pdENvbnRhaW5lcigpLHRoaXMuX2xldmVscz17fSx0aGlzLl90aWxlcz17fSx0aGlzLl9yZXNldFZpZXcoKSx0aGlzLl91cGRhdGUoKX0sYmVmb3JlQWRkOmZ1bmN0aW9uKHQpe3QuX2FkZFpvb21MaW1pdCh0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSxvLkRvbVV0aWwucmVtb3ZlKHRoaXMuX2NvbnRhaW5lciksdC5fcmVtb3ZlWm9vbUxpbWl0KHRoaXMpLHRoaXMuX2NvbnRhaW5lcj1udWxsLHRoaXMuX3RpbGVab29tPW51bGx9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJihvLkRvbVV0aWwudG9Gcm9udCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3NldEF1dG9aSW5kZXgoTWF0aC5tYXgpKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJihvLkRvbVV0aWwudG9CYWNrKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1pbikpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleD10LHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXN9LGlzTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2FkaW5nfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYodGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSx0aGlzLl91cGRhdGUoKSksdGhpc30sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdwcmVyZXNldDp0aGlzLl9pbnZhbGlkYXRlQWxsLHZpZXdyZXNldDp0aGlzLl9yZXNldFZpZXcsem9vbTp0aGlzLl9yZXNldFZpZXcsbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmR9O3JldHVybiB0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGV8fCh0aGlzLl9vbk1vdmV8fCh0aGlzLl9vbk1vdmU9by5VdGlsLnRocm90dGxlKHRoaXMuX29uTW92ZUVuZCx0aGlzLm9wdGlvbnMudXBkYXRlSW50ZXJ2YWwsdGhpcykpLHQubW92ZT10aGlzLl9vbk1vdmUpLHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KCJkaXYiKX0sZ2V0VGlsZVNpemU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMudGlsZVNpemU7cmV0dXJuIHQgaW5zdGFuY2VvZiBvLlBvaW50P3Q6bmV3IG8uUG9pbnQodCx0KX0sX3VwZGF0ZVpJbmRleDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lciYmdGhpcy5vcHRpb25zLnpJbmRleCE9PWkmJm51bGwhPT10aGlzLm9wdGlvbnMuekluZGV4JiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnpJbmRleD10aGlzLm9wdGlvbnMuekluZGV4KX0sX3NldEF1dG9aSW5kZXg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5nZXRQYW5lKCkuY2hpbGRyZW4sbj0tdCgtKDEvMCksMS8wKSxvPTAscz1pLmxlbmd0aDtvPHM7bysrKWU9aVtvXS5zdHlsZS56SW5kZXgsaVtvXSE9PXRoaXMuX2NvbnRhaW5lciYmZSYmKG49dChuLCtlKSk7aXNGaW5pdGUobikmJih0aGlzLm9wdGlvbnMuekluZGV4PW4rdCgtMSwxKSx0aGlzLl91cGRhdGVaSW5kZXgoKSl9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwJiYhby5Ccm93c2VyLmllbHQ5KXtvLkRvbVV0aWwuc2V0T3BhY2l0eSh0aGlzLl9jb250YWluZXIsdGhpcy5vcHRpb25zLm9wYWNpdHkpO3ZhciB0PStuZXcgRGF0ZSxlPSExLGk9ITE7Zm9yKHZhciBuIGluIHRoaXMuX3RpbGVzKXt2YXIgcz10aGlzLl90aWxlc1tuXTtpZihzLmN1cnJlbnQmJnMubG9hZGVkKXt2YXIgcj1NYXRoLm1pbigxLCh0LXMubG9hZGVkKS8yMDApO28uRG9tVXRpbC5zZXRPcGFjaXR5KHMuZWwscikscjwxP2U9ITA6KHMuYWN0aXZlJiYoaT0hMCkscy5hY3RpdmU9ITApfX1pJiYhdGhpcy5fbm9QcnVuZSYmdGhpcy5fcHJ1bmVUaWxlcygpLGUmJihvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2ZhZGVGcmFtZSksdGhpcy5fZmFkZUZyYW1lPW8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKHRoaXMuX3VwZGF0ZU9wYWNpdHksdGhpcykpfX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXJ8fCh0aGlzLl9jb250YWluZXI9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1sYXllciAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikpLHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpKX0sX3VwZGF0ZUxldmVsczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbGVab29tLGU9dGhpcy5vcHRpb25zLm1heFpvb207aWYodD09PWkpcmV0dXJuIGk7Zm9yKHZhciBuIGluIHRoaXMuX2xldmVscyl0aGlzLl9sZXZlbHNbbl0uZWwuY2hpbGRyZW4ubGVuZ3RofHxuPT09dD90aGlzLl9sZXZlbHNbbl0uZWwuc3R5bGUuekluZGV4PWUtTWF0aC5hYnModC1uKTooby5Eb21VdGlsLnJlbW92ZSh0aGlzLl9sZXZlbHNbbl0uZWwpLHRoaXMuX3JlbW92ZVRpbGVzQXRab29tKG4pLGRlbGV0ZSB0aGlzLl9sZXZlbHNbbl0pO3ZhciBzPXRoaXMuX2xldmVsc1t0XSxyPXRoaXMuX21hcDtyZXR1cm4gc3x8KHM9dGhpcy5fbGV2ZWxzW3RdPXt9LHMuZWw9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC10aWxlLWNvbnRhaW5lciBsZWFmbGV0LXpvb20tYW5pbWF0ZWQiLHRoaXMuX2NvbnRhaW5lcikscy5lbC5zdHlsZS56SW5kZXg9ZSxzLm9yaWdpbj1yLnByb2plY3Qoci51bnByb2plY3Qoci5nZXRQaXhlbE9yaWdpbigpKSx0KS5yb3VuZCgpLHMuem9vbT10LHRoaXMuX3NldFpvb21UcmFuc2Zvcm0ocyxyLmdldENlbnRlcigpLHIuZ2V0Wm9vbSgpKSxvLlV0aWwuZmFsc2VGbihzLmVsLm9mZnNldFdpZHRoKSksdGhpcy5fbGV2ZWw9cyxzfSxfcHJ1bmVUaWxlczpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQsZSxpPXRoaXMuX21hcC5nZXRab29tKCk7aWYoaT50aGlzLm9wdGlvbnMubWF4Wm9vbXx8aTx0aGlzLm9wdGlvbnMubWluWm9vbSlyZXR1cm4gdm9pZCB0aGlzLl9yZW1vdmVBbGxUaWxlcygpO2Zvcih0IGluIHRoaXMuX3RpbGVzKWU9dGhpcy5fdGlsZXNbdF0sZS5yZXRhaW49ZS5jdXJyZW50O2Zvcih0IGluIHRoaXMuX3RpbGVzKWlmKGU9dGhpcy5fdGlsZXNbdF0sZS5jdXJyZW50JiYhZS5hY3RpdmUpe3ZhciBuPWUuY29vcmRzO3RoaXMuX3JldGFpblBhcmVudChuLngsbi55LG4ueixuLnotNSl8fHRoaXMuX3JldGFpbkNoaWxkcmVuKG4ueCxuLnksbi56LG4ueisyKX1mb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5yZXRhaW58fHRoaXMuX3JlbW92ZVRpbGUodCl9fSxfcmVtb3ZlVGlsZXNBdFpvb206ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX3RpbGVzKXRoaXMuX3RpbGVzW2VdLmNvb3Jkcy56PT09dCYmdGhpcy5fcmVtb3ZlVGlsZShlKX0sX3JlbW92ZUFsbFRpbGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX3RpbGVzKXRoaXMuX3JlbW92ZVRpbGUodCl9LF9pbnZhbGlkYXRlQWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xldmVscylvLkRvbVV0aWwucmVtb3ZlKHRoaXMuX2xldmVsc1t0XS5lbCksZGVsZXRlIHRoaXMuX2xldmVsc1t0XTt0aGlzLl9yZW1vdmVBbGxUaWxlcygpLHRoaXMuX3RpbGVab29tPW51bGx9LF9yZXRhaW5QYXJlbnQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIHM9TWF0aC5mbG9vcih0LzIpLHI9TWF0aC5mbG9vcihlLzIpLGE9aS0xLGg9bmV3IG8uUG9pbnQoK3MsK3IpO2guej0rYTt2YXIgbD10aGlzLl90aWxlQ29vcmRzVG9LZXkoaCksdT10aGlzLl90aWxlc1tsXTtyZXR1cm4gdSYmdS5hY3RpdmU/KHUucmV0YWluPSEwLCEwKToodSYmdS5sb2FkZWQmJih1LnJldGFpbj0hMCksYT5uJiZ0aGlzLl9yZXRhaW5QYXJlbnQocyxyLGEsbikpfSxfcmV0YWluQ2hpbGRyZW46ZnVuY3Rpb24odCxlLGksbil7Zm9yKHZhciBzPTIqdDtzPDIqdCsyO3MrKylmb3IodmFyIHI9MiplO3I8MiplKzI7cisrKXt2YXIgYT1uZXcgby5Qb2ludChzLHIpO2Euej1pKzE7dmFyIGg9dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KGEpLGw9dGhpcy5fdGlsZXNbaF07bCYmbC5hY3RpdmU/bC5yZXRhaW49ITA6KGwmJmwubG9hZGVkJiYobC5yZXRhaW49ITApLGkrMTxuJiZ0aGlzLl9yZXRhaW5DaGlsZHJlbihzLHIsaSsxLG4pKX19LF9yZXNldFZpZXc6ZnVuY3Rpb24odCl7dmFyIGU9dCYmKHQucGluY2h8fHQuZmx5VG8pO3RoaXMuX3NldFZpZXcodGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCksZSxlKX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFZpZXcodC5jZW50ZXIsdC56b29tLCEwLHQubm9VcGRhdGUpfSxfc2V0VmlldzpmdW5jdGlvbih0LGUsbixvKXt2YXIgcz1NYXRoLnJvdW5kKGUpOyh0aGlzLm9wdGlvbnMubWF4Wm9vbSE9PWkmJnM+dGhpcy5vcHRpb25zLm1heFpvb218fHRoaXMub3B0aW9ucy5taW5ab29tIT09aSYmczx0aGlzLm9wdGlvbnMubWluWm9vbSkmJihzPWkpO3ZhciByPXRoaXMub3B0aW9ucy51cGRhdGVXaGVuWm9vbWluZyYmcyE9PXRoaXMuX3RpbGVab29tO28mJiFyfHwodGhpcy5fdGlsZVpvb209cyx0aGlzLl9hYm9ydExvYWRpbmcmJnRoaXMuX2Fib3J0TG9hZGluZygpLHRoaXMuX3VwZGF0ZUxldmVscygpLHRoaXMuX3Jlc2V0R3JpZCgpLHMhPT1pJiZ0aGlzLl91cGRhdGUodCksbnx8dGhpcy5fcHJ1bmVUaWxlcygpLHRoaXMuX25vUHJ1bmU9ISFuKSx0aGlzLl9zZXRab29tVHJhbnNmb3Jtcyh0LGUpfSxfc2V0Wm9vbVRyYW5zZm9ybXM6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdGhpcy5fbGV2ZWxzKXRoaXMuX3NldFpvb21UcmFuc2Zvcm0odGhpcy5fbGV2ZWxzW2ldLHQsZSl9LF9zZXRab29tVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGksdC56b29tKSxzPXQub3JpZ2luLm11bHRpcGx5Qnkobikuc3VidHJhY3QodGhpcy5fbWFwLl9nZXROZXdQaXhlbE9yaWdpbihlLGkpKS5yb3VuZCgpO28uQnJvd3Nlci5hbnkzZD9vLkRvbVV0aWwuc2V0VHJhbnNmb3JtKHQuZWwscyxuKTpvLkRvbVV0aWwuc2V0UG9zaXRpb24odC5lbCxzKX0sX3Jlc2V0R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPXQub3B0aW9ucy5jcnMsaT10aGlzLl90aWxlU2l6ZT10aGlzLmdldFRpbGVTaXplKCksbj10aGlzLl90aWxlWm9vbSxvPXRoaXMuX21hcC5nZXRQaXhlbFdvcmxkQm91bmRzKHRoaXMuX3RpbGVab29tKTtvJiYodGhpcy5fZ2xvYmFsVGlsZVJhbmdlPXRoaXMuX3B4Qm91bmRzVG9UaWxlUmFuZ2UobykpLHRoaXMuX3dyYXBYPWUud3JhcExuZyYmIXRoaXMub3B0aW9ucy5ub1dyYXAmJltNYXRoLmZsb29yKHQucHJvamVjdChbMCxlLndyYXBMbmdbMF1dLG4pLngvaS54KSxNYXRoLmNlaWwodC5wcm9qZWN0KFswLGUud3JhcExuZ1sxXV0sbikueC9pLnkpXSx0aGlzLl93cmFwWT1lLndyYXBMYXQmJiF0aGlzLm9wdGlvbnMubm9XcmFwJiZbTWF0aC5mbG9vcih0LnByb2plY3QoW2Uud3JhcExhdFswXSwwXSxuKS55L2kueCksTWF0aC5jZWlsKHQucHJvamVjdChbZS53cmFwTGF0WzFdLDBdLG4pLnkvaS55KV19LF9vbk1vdmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20mJnRoaXMuX3VwZGF0ZSgpfSxfZ2V0VGlsZWRQaXhlbEJvdW5kczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAsaT1lLl9hbmltYXRpbmdab29tP01hdGgubWF4KGUuX2FuaW1hdGVUb1pvb20sZS5nZXRab29tKCkpOmUuZ2V0Wm9vbSgpLG49ZS5nZXRab29tU2NhbGUoaSx0aGlzLl90aWxlWm9vbSkscz1lLnByb2plY3QodCx0aGlzLl90aWxlWm9vbSkuZmxvb3IoKSxyPWUuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIqbik7cmV0dXJuIG5ldyBvLkJvdW5kcyhzLnN1YnRyYWN0KHIpLHMuYWRkKHIpKX0sX3VwZGF0ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9tYXA7aWYobil7dmFyIHM9bi5nZXRab29tKCk7aWYodD09PWkmJih0PW4uZ2V0Q2VudGVyKCkpLHRoaXMuX3RpbGVab29tIT09aSl7dmFyIHI9dGhpcy5fZ2V0VGlsZWRQaXhlbEJvdW5kcyh0KSxhPXRoaXMuX3B4Qm91bmRzVG9UaWxlUmFuZ2UociksaD1hLmdldENlbnRlcigpLGw9W10sdT10aGlzLm9wdGlvbnMua2VlcEJ1ZmZlcixjPW5ldyBvLkJvdW5kcyhhLmdldEJvdHRvbUxlZnQoKS5zdWJ0cmFjdChbdSwtdV0pLGEuZ2V0VG9wUmlnaHQoKS5hZGQoW3UsLXVdKSk7Zm9yKHZhciBkIGluIHRoaXMuX3RpbGVzKXt2YXIgXz10aGlzLl90aWxlc1tkXS5jb29yZHM7Xy56PT09dGhpcy5fdGlsZVpvb20mJmMuY29udGFpbnMoby5wb2ludChfLngsXy55KSl8fCh0aGlzLl90aWxlc1tkXS5jdXJyZW50PSExKX1pZihNYXRoLmFicyhzLXRoaXMuX3RpbGVab29tKT4xKXJldHVybiB2b2lkIHRoaXMuX3NldFZpZXcodCxzKTtmb3IodmFyIG09YS5taW4ueTttPD1hLm1heC55O20rKylmb3IodmFyIHA9YS5taW4ueDtwPD1hLm1heC54O3ArKyl7dmFyIGY9bmV3IG8uUG9pbnQocCxtKTtpZihmLno9dGhpcy5fdGlsZVpvb20sdGhpcy5faXNWYWxpZFRpbGUoZikpe3ZhciBnPXRoaXMuX3RpbGVzW3RoaXMuX3RpbGVDb29yZHNUb0tleShmKV07Zz9nLmN1cnJlbnQ9ITA6bC5wdXNoKGYpfX1pZihsLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXN0YW5jZVRvKGgpLWUuZGlzdGFuY2VUbyhoKX0pLDAhPT1sLmxlbmd0aCl7dGhpcy5fbG9hZGluZ3x8KHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5maXJlKCJsb2FkaW5nIikpO3ZhciB2PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspdGhpcy5fYWRkVGlsZShsW3BdLHYpO3RoaXMuX2xldmVsLmVsLmFwcGVuZENoaWxkKHYpfX19fSxfaXNWYWxpZFRpbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLm9wdGlvbnMuY3JzO2lmKCFlLmluZmluaXRlKXt2YXIgaT10aGlzLl9nbG9iYWxUaWxlUmFuZ2U7aWYoIWUud3JhcExuZyYmKHQueDxpLm1pbi54fHx0Lng+aS5tYXgueCl8fCFlLndyYXBMYXQmJih0Lnk8aS5taW4ueXx8dC55PmkubWF4LnkpKXJldHVybiExfWlmKCF0aGlzLm9wdGlvbnMuYm91bmRzKXJldHVybiEwO3ZhciBuPXRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0KTtyZXR1cm4gby5sYXRMbmdCb3VuZHModGhpcy5vcHRpb25zLmJvdW5kcykub3ZlcmxhcHMobil9LF9rZXlUb0JvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdGlsZUNvb3Jkc1RvQm91bmRzKHRoaXMuX2tleVRvVGlsZUNvb3Jkcyh0KSl9LF90aWxlQ29vcmRzVG9Cb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9dGhpcy5nZXRUaWxlU2l6ZSgpLG49dC5zY2FsZUJ5KGkpLHM9bi5hZGQoaSkscj1lLnVucHJvamVjdChuLHQueiksYT1lLnVucHJvamVjdChzLHQueiksaD1uZXcgby5MYXRMbmdCb3VuZHMocixhKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5vV3JhcHx8ZS53cmFwTGF0TG5nQm91bmRzKGgpLGh9LF90aWxlQ29vcmRzVG9LZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHQueCsiOiIrdC55KyI6Iit0Lnp9LF9rZXlUb1RpbGVDb29yZHM6ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiOiIpLGk9bmV3IG8uUG9pbnQoK2VbMF0sK2VbMV0pO3JldHVybiBpLno9K2VbMl0saX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlsZXNbdF07ZSYmKG8uRG9tVXRpbC5yZW1vdmUoZS5lbCksZGVsZXRlIHRoaXMuX3RpbGVzW3RdLHRoaXMuZmlyZSgidGlsZXVubG9hZCIse3RpbGU6ZS5lbCxjb29yZHM6dGhpcy5fa2V5VG9UaWxlQ29vcmRzKHQpfSkpfSxfaW5pdFRpbGU6ZnVuY3Rpb24odCl7by5Eb21VdGlsLmFkZENsYXNzKHQsImxlYWZsZXQtdGlsZSIpO3ZhciBlPXRoaXMuZ2V0VGlsZVNpemUoKTt0LnN0eWxlLndpZHRoPWUueCsicHgiLHQuc3R5bGUuaGVpZ2h0PWUueSsicHgiLHQub25zZWxlY3RzdGFydD1vLlV0aWwuZmFsc2VGbix0Lm9ubW91c2Vtb3ZlPW8uVXRpbC5mYWxzZUZuLG8uQnJvd3Nlci5pZWx0OSYmdGhpcy5vcHRpb25zLm9wYWNpdHk8MSYmby5Eb21VdGlsLnNldE9wYWNpdHkodCx0aGlzLm9wdGlvbnMub3BhY2l0eSksby5Ccm93c2VyLmFuZHJvaWQmJiFvLkJyb3dzZXIuYW5kcm9pZDIzJiYodC5zdHlsZS5XZWJraXRCYWNrZmFjZVZpc2liaWxpdHk9ImhpZGRlbiIpfSxfYWRkVGlsZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2dldFRpbGVQb3ModCksbj10aGlzLl90aWxlQ29vcmRzVG9LZXkodCkscz10aGlzLmNyZWF0ZVRpbGUodGhpcy5fd3JhcENvb3Jkcyh0KSxvLmJpbmQodGhpcy5fdGlsZVJlYWR5LHRoaXMsdCkpO3RoaXMuX2luaXRUaWxlKHMpLHRoaXMuY3JlYXRlVGlsZS5sZW5ndGg8MiYmby5VdGlsLnJlcXVlc3RBbmltRnJhbWUoby5iaW5kKHRoaXMuX3RpbGVSZWFkeSx0aGlzLHQsbnVsbCxzKSksby5Eb21VdGlsLnNldFBvc2l0aW9uKHMsaSksdGhpcy5fdGlsZXNbbl09e2VsOnMsY29vcmRzOnQsY3VycmVudDohMH0sZS5hcHBlbmRDaGlsZChzKSx0aGlzLmZpcmUoInRpbGVsb2Fkc3RhcnQiLHt0aWxlOnMsY29vcmRzOnR9KX0sX3RpbGVSZWFkeTpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5fbWFwKXtlJiZ0aGlzLmZpcmUoInRpbGVlcnJvciIse2Vycm9yOmUsdGlsZTppLGNvb3Jkczp0fSk7dmFyIG49dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KHQpO2k9dGhpcy5fdGlsZXNbbl0saSYmKGkubG9hZGVkPStuZXcgRGF0ZSx0aGlzLl9tYXAuX2ZhZGVBbmltYXRlZD8oby5Eb21VdGlsLnNldE9wYWNpdHkoaS5lbCwwKSxvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2ZhZGVGcmFtZSksdGhpcy5fZmFkZUZyYW1lPW8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKHRoaXMuX3VwZGF0ZU9wYWNpdHksdGhpcykpOihpLmFjdGl2ZT0hMCx0aGlzLl9wcnVuZVRpbGVzKCkpLGV8fChvLkRvbVV0aWwuYWRkQ2xhc3MoaS5lbCwibGVhZmxldC10aWxlLWxvYWRlZCIpLHRoaXMuZmlyZSgidGlsZWxvYWQiLHt0aWxlOmkuZWwsY29vcmRzOnR9KSksdGhpcy5fbm9UaWxlc1RvTG9hZCgpJiYodGhpcy5fbG9hZGluZz0hMSx0aGlzLmZpcmUoImxvYWQiKSxvLkJyb3dzZXIuaWVsdDl8fCF0aGlzLl9tYXAuX2ZhZGVBbmltYXRlZD9vLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl9wcnVuZVRpbGVzLHRoaXMpOnNldFRpbWVvdXQoby5iaW5kKHRoaXMuX3BydW5lVGlsZXMsdGhpcyksMjUwKSkpfX0sX2dldFRpbGVQb3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2NhbGVCeSh0aGlzLmdldFRpbGVTaXplKCkpLnN1YnRyYWN0KHRoaXMuX2xldmVsLm9yaWdpbil9LF93cmFwQ29vcmRzOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBvLlBvaW50KHRoaXMuX3dyYXBYP28uVXRpbC53cmFwTnVtKHQueCx0aGlzLl93cmFwWCk6dC54LHRoaXMuX3dyYXBZP28uVXRpbC53cmFwTnVtKHQueSx0aGlzLl93cmFwWSk6dC55KTtyZXR1cm4gZS56PXQueixlfSxfcHhCb3VuZHNUb1RpbGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFRpbGVTaXplKCk7cmV0dXJuIG5ldyBvLkJvdW5kcyh0Lm1pbi51bnNjYWxlQnkoZSkuZmxvb3IoKSx0Lm1heC51bnNjYWxlQnkoZSkuY2VpbCgpLnN1YnRyYWN0KFsxLDFdKSl9LF9ub1RpbGVzVG9Mb2FkOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX3RpbGVzKWlmKCF0aGlzLl90aWxlc1t0XS5sb2FkZWQpcmV0dXJuITE7cmV0dXJuITB9fSksby5ncmlkTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkdyaWRMYXllcih0KX0sby5UaWxlTGF5ZXI9by5HcmlkTGF5ZXIuZXh0ZW5kKHtvcHRpb25zOnttaW5ab29tOjAsbWF4Wm9vbToxOCxtYXhOYXRpdmVab29tOm51bGwsbWluTmF0aXZlWm9vbTpudWxsLHN1YmRvbWFpbnM6ImFiYyIsZXJyb3JUaWxlVXJsOiIiLHpvb21PZmZzZXQ6MCx0bXM6ITEsem9vbVJldmVyc2U6ITEsZGV0ZWN0UmV0aW5hOiExLGNyb3NzT3JpZ2luOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7dGhpcy5fdXJsPXQsZT1vLnNldE9wdGlvbnModGhpcyxlKSxlLmRldGVjdFJldGluYSYmby5Ccm93c2VyLnJldGluYSYmZS5tYXhab29tPjAmJihlLnRpbGVTaXplPU1hdGguZmxvb3IoZS50aWxlU2l6ZS8yKSxlLnpvb21SZXZlcnNlPyhlLnpvb21PZmZzZXQtLSxlLm1pblpvb20rKyk6KGUuem9vbU9mZnNldCsrLGUubWF4Wm9vbS0tKSxlLm1pblpvb209TWF0aC5tYXgoMCxlLm1pblpvb20pKSwic3RyaW5nIj09dHlwZW9mIGUuc3ViZG9tYWlucyYmKGUuc3ViZG9tYWlucz1lLnN1YmRvbWFpbnMuc3BsaXQoIiIpKSxvLkJyb3dzZXIuYW5kcm9pZHx8dGhpcy5vbigidGlsZXVubG9hZCIsdGhpcy5fb25UaWxlUmVtb3ZlKX0sc2V0VXJsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3VybD10LGV8fHRoaXMucmVkcmF3KCksdGhpc30sY3JlYXRlVGlsZTpmdW5jdGlvbih0LGkpe3ZhciBuPWUuY3JlYXRlRWxlbWVudCgiaW1nIik7cmV0dXJuIG8uRG9tRXZlbnQub24obiwibG9hZCIsby5iaW5kKHRoaXMuX3RpbGVPbkxvYWQsdGhpcyxpLG4pKSxvLkRvbUV2ZW50Lm9uKG4sImVycm9yIixvLmJpbmQodGhpcy5fdGlsZU9uRXJyb3IsdGhpcyxpLG4pKSx0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJihuLmNyb3NzT3JpZ2luPSIiKSxuLmFsdD0iIixuLnNldEF0dHJpYnV0ZSgicm9sZSIsInByZXNlbnRhdGlvbiIpLG4uc3JjPXRoaXMuZ2V0VGlsZVVybCh0KSxufSxnZXRUaWxlVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXtyOm8uQnJvd3Nlci5yZXRpbmE/IkAyeCI6IiIsczp0aGlzLl9nZXRTdWJkb21haW4odCkseDp0LngseTp0Lnksejp0aGlzLl9nZXRab29tRm9yVXJsKCl9O2lmKHRoaXMuX21hcCYmIXRoaXMuX21hcC5vcHRpb25zLmNycy5pbmZpbml0ZSl7dmFyIGk9dGhpcy5fZ2xvYmFsVGlsZVJhbmdlLm1heC55LXQueTt0aGlzLm9wdGlvbnMudG1zJiYoZS55PWkpLGVbIi15Il09aX1yZXR1cm4gby5VdGlsLnRlbXBsYXRlKHRoaXMuX3VybCxvLmV4dGVuZChlLHRoaXMub3B0aW9ucykpfSxfdGlsZU9uTG9hZDpmdW5jdGlvbih0LGUpe28uQnJvd3Nlci5pZWx0OT9zZXRUaW1lb3V0KG8uYmluZCh0LHRoaXMsbnVsbCxlKSwwKTp0KG51bGwsZSl9LF90aWxlT25FcnJvcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5vcHRpb25zLmVycm9yVGlsZVVybDtuJiZlLnNyYyE9PW4mJihlLnNyYz1uKSx0KGksZSl9LGdldFRpbGVTaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGU9by5HcmlkTGF5ZXIucHJvdG90eXBlLmdldFRpbGVTaXplLmNhbGwodGhpcyksaT10aGlzLl90aWxlWm9vbSt0aGlzLm9wdGlvbnMuem9vbU9mZnNldCxuPXRoaXMub3B0aW9ucy5taW5OYXRpdmVab29tLHM9dGhpcy5vcHRpb25zLm1heE5hdGl2ZVpvb207cmV0dXJuIG51bGwhPT1uJiZpPG4/ZS5kaXZpZGVCeSh0LmdldFpvb21TY2FsZShuLGkpKS5yb3VuZCgpOm51bGwhPT1zJiZpPnM/ZS5kaXZpZGVCeSh0LmdldFpvb21TY2FsZShzLGkpKS5yb3VuZCgpOmV9LF9vblRpbGVSZW1vdmU6ZnVuY3Rpb24odCl7dC50aWxlLm9ubG9hZD1udWxsfSxfZ2V0Wm9vbUZvclVybDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbGVab29tLGU9dGhpcy5vcHRpb25zLm1heFpvb20saT10aGlzLm9wdGlvbnMuem9vbVJldmVyc2Usbj10aGlzLm9wdGlvbnMuem9vbU9mZnNldCxvPXRoaXMub3B0aW9ucy5taW5OYXRpdmVab29tLHM9dGhpcy5vcHRpb25zLm1heE5hdGl2ZVpvb207cmV0dXJuIGkmJih0PWUtdCksdCs9bixudWxsIT09byYmdDxvP286bnVsbCE9PXMmJnQ+cz9zOnR9LF9nZXRTdWJkb21haW46ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5hYnModC54K3QueSkldGhpcy5vcHRpb25zLnN1YmRvbWFpbnMubGVuZ3RoO3JldHVybiB0aGlzLm9wdGlvbnMuc3ViZG9tYWluc1tlXX0sX2Fib3J0TG9hZGluZzpmdW5jdGlvbigpe3ZhciB0LGU7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fdGlsZXNbdF0uY29vcmRzLnohPT10aGlzLl90aWxlWm9vbSYmKGU9dGhpcy5fdGlsZXNbdF0uZWwsZS5vbmxvYWQ9by5VdGlsLmZhbHNlRm4sZS5vbmVycm9yPW8uVXRpbC5mYWxzZUZuLGUuY29tcGxldGV8fChlLnNyYz1vLlV0aWwuZW1wdHlJbWFnZVVybCxvLkRvbVV0aWwucmVtb3ZlKGUpKSl9fSksby50aWxlTGF5ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uVGlsZUxheWVyKHQsZSl9LG8uVGlsZUxheWVyLldNUz1vLlRpbGVMYXllci5leHRlbmQoe2RlZmF1bHRXbXNQYXJhbXM6e3NlcnZpY2U6IldNUyIscmVxdWVzdDoiR2V0TWFwIixsYXllcnM6IiIsc3R5bGVzOiIiLGZvcm1hdDoiaW1hZ2UvanBlZyIsdHJhbnNwYXJlbnQ6ITEsdmVyc2lvbjoiMS4xLjEifSxvcHRpb25zOntjcnM6bnVsbCx1cHBlcmNhc2U6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl91cmw9dDt2YXIgaT1vLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRXbXNQYXJhbXMpO2Zvcih2YXIgbiBpbiBlKW4gaW4gdGhpcy5vcHRpb25zfHwoaVtuXT1lW25dKTtlPW8uc2V0T3B0aW9ucyh0aGlzLGUpLGkud2lkdGg9aS5oZWlnaHQ9ZS50aWxlU2l6ZSooZS5kZXRlY3RSZXRpbmEmJm8uQnJvd3Nlci5yZXRpbmE/MjoxKSx0aGlzLndtc1BhcmFtcz1pfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9jcnM9dGhpcy5vcHRpb25zLmNyc3x8dC5vcHRpb25zLmNycyx0aGlzLl93bXNWZXJzaW9uPXBhcnNlRmxvYXQodGhpcy53bXNQYXJhbXMudmVyc2lvbik7dmFyIGU9dGhpcy5fd21zVmVyc2lvbj49MS4zPyJjcnMiOiJzcnMiO3RoaXMud21zUGFyYW1zW2VdPXRoaXMuX2Nycy5jb2RlLG8uVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCl9LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlsZUNvb3Jkc1RvQm91bmRzKHQpLGk9dGhpcy5fY3JzLnByb2plY3QoZS5nZXROb3J0aFdlc3QoKSksbj10aGlzLl9jcnMucHJvamVjdChlLmdldFNvdXRoRWFzdCgpKSxzPSh0aGlzLl93bXNWZXJzaW9uPj0xLjMmJnRoaXMuX2Nycz09PW8uQ1JTLkVQU0c0MzI2P1tuLnksaS54LGkueSxuLnhdOltpLngsbi55LG4ueCxpLnldKS5qb2luKCIsIikscj1vLlRpbGVMYXllci5wcm90b3R5cGUuZ2V0VGlsZVVybC5jYWxsKHRoaXMsdCk7cmV0dXJuIHIrby5VdGlsLmdldFBhcmFtU3RyaW5nKHRoaXMud21zUGFyYW1zLHIsdGhpcy5vcHRpb25zLnVwcGVyY2FzZSkrKHRoaXMub3B0aW9ucy51cHBlcmNhc2U/IiZCQk9YPSI6IiZiYm94PSIpK3N9LHNldFBhcmFtczpmdW5jdGlvbih0LGUpe3JldHVybiBvLmV4dGVuZCh0aGlzLndtc1BhcmFtcyx0KSxlfHx0aGlzLnJlZHJhdygpLHRoaXN9fSksby50aWxlTGF5ZXIud21zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlRpbGVMYXllci5XTVModCxlKX0sby5JbWFnZU92ZXJsYXk9by5MYXllci5leHRlbmQoe29wdGlvbnM6e29wYWNpdHk6MSxhbHQ6IiIsaW50ZXJhY3RpdmU6ITEsY3Jvc3NPcmlnaW46ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX3VybD10LHRoaXMuX2JvdW5kcz1vLmxhdExuZ0JvdW5kcyhlKSxvLnNldE9wdGlvbnModGhpcyxpKX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbWFnZXx8KHRoaXMuX2luaXRJbWFnZSgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSksdGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYoby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2ltYWdlLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSkpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2ltYWdlKSx0aGlzLl9yZXNldCgpfSxvblJlbW92ZTpmdW5jdGlvbigpe28uRG9tVXRpbC5yZW1vdmUodGhpcy5faW1hZ2UpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5faW1hZ2UmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGFjaXR5JiZ0aGlzLnNldE9wYWNpdHkodC5vcGFjaXR5KSx0aGlzfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZvLkRvbVV0aWwudG9Gcm9udCh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZvLkRvbVV0aWwudG9CYWNrKHRoaXMuX2ltYWdlKSx0aGlzfSxzZXRVcmw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3VybD10LHRoaXMuX2ltYWdlJiYodGhpcy5faW1hZ2Uuc3JjPXQpLHRoaXN9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYm91bmRzPXQsdGhpcy5fbWFwJiZ0aGlzLl9yZXNldCgpLHRoaXN9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt6b29tOnRoaXMuX3Jlc2V0LHZpZXdyZXNldDp0aGlzLl9yZXNldH07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGdldEJvdW5kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZHN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW1hZ2V9LF9pbml0SW1hZ2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZT1vLkRvbVV0aWwuY3JlYXRlKCJpbWciLCJsZWFmbGV0LWltYWdlLWxheWVyICIrKHRoaXMuX3pvb21BbmltYXRlZD8ibGVhZmxldC16b29tLWFuaW1hdGVkIjoiIikpO3Qub25zZWxlY3RzdGFydD1vLlV0aWwuZmFsc2VGbix0Lm9ubW91c2Vtb3ZlPW8uVXRpbC5mYWxzZUZuLHQub25sb2FkPW8uYmluZCh0aGlzLmZpcmUsdGhpcywibG9hZCIpLHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiYmKHQuY3Jvc3NPcmlnaW49IiIpLHQuc3JjPXRoaXMuX3VybCx0LmFsdD10aGlzLm9wdGlvbnMuYWx0fSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLmdldFpvb21TY2FsZSh0Lnpvb20pLGk9dGhpcy5fbWFwLl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzKHRoaXMuX2JvdW5kcyx0Lnpvb20sdC5jZW50ZXIpLm1pbjtvLkRvbVV0aWwuc2V0VHJhbnNmb3JtKHRoaXMuX2ltYWdlLGksZSl9LF9yZXNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ltYWdlLGU9bmV3IG8uQm91bmRzKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSx0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2JvdW5kcy5nZXRTb3V0aEVhc3QoKSkpLGk9ZS5nZXRTaXplKCk7Cm8uRG9tVXRpbC5zZXRQb3NpdGlvbih0LGUubWluKSx0LnN0eWxlLndpZHRoPWkueCsicHgiLHQuc3R5bGUuaGVpZ2h0PWkueSsicHgifSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe28uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2ltYWdlLHRoaXMub3B0aW9ucy5vcGFjaXR5KX19KSxvLmltYWdlT3ZlcmxheT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBvLkltYWdlT3ZlcmxheSh0LGUsaSl9LG8uSWNvbj1vLkNsYXNzLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtvLnNldE9wdGlvbnModGhpcyx0KX0sY3JlYXRlSWNvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlSWNvbigiaWNvbiIsdCl9LGNyZWF0ZVNoYWRvdzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlSWNvbigic2hhZG93Iix0KX0sX2NyZWF0ZUljb246ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRJY29uVXJsKHQpO2lmKCFpKXtpZigiaWNvbiI9PT10KXRocm93IG5ldyBFcnJvcigiaWNvblVybCBub3Qgc2V0IGluIEljb24gb3B0aW9ucyAoc2VlIHRoZSBkb2NzKS4iKTtyZXR1cm4gbnVsbH12YXIgbj10aGlzLl9jcmVhdGVJbWcoaSxlJiYiSU1HIj09PWUudGFnTmFtZT9lOm51bGwpO3JldHVybiB0aGlzLl9zZXRJY29uU3R5bGVzKG4sdCksbn0sX3NldEljb25TdHlsZXM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbnMsbj1pW2UrIlNpemUiXTsibnVtYmVyIj09dHlwZW9mIG4mJihuPVtuLG5dKTt2YXIgcz1vLnBvaW50KG4pLHI9by5wb2ludCgic2hhZG93Ij09PWUmJmkuc2hhZG93QW5jaG9yfHxpLmljb25BbmNob3J8fHMmJnMuZGl2aWRlQnkoMiwhMCkpO3QuY2xhc3NOYW1lPSJsZWFmbGV0LW1hcmtlci0iK2UrIiAiKyhpLmNsYXNzTmFtZXx8IiIpLHImJih0LnN0eWxlLm1hcmdpbkxlZnQ9LXIueCsicHgiLHQuc3R5bGUubWFyZ2luVG9wPS1yLnkrInB4IikscyYmKHQuc3R5bGUud2lkdGg9cy54KyJweCIsdC5zdHlsZS5oZWlnaHQ9cy55KyJweCIpfSxfY3JlYXRlSW1nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8ZS5jcmVhdGVFbGVtZW50KCJpbWciKSxpLnNyYz10LGl9LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiBvLkJyb3dzZXIucmV0aW5hJiZ0aGlzLm9wdGlvbnNbdCsiUmV0aW5hVXJsIl18fHRoaXMub3B0aW9uc1t0KyJVcmwiXX19KSxvLmljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkljb24odCl9LG8uSWNvbi5EZWZhdWx0PW8uSWNvbi5leHRlbmQoe29wdGlvbnM6e2ljb25Vcmw6Im1hcmtlci1pY29uLnBuZyIsaWNvblJldGluYVVybDoibWFya2VyLWljb24tMngucG5nIixzaGFkb3dVcmw6Im1hcmtlci1zaGFkb3cucG5nIixpY29uU2l6ZTpbMjUsNDFdLGljb25BbmNob3I6WzEyLDQxXSxwb3B1cEFuY2hvcjpbMSwtMzRdLHRvb2x0aXBBbmNob3I6WzE2LC0yOF0sc2hhZG93U2l6ZTpbNDEsNDFdfSxfZ2V0SWNvblVybDpmdW5jdGlvbih0KXtyZXR1cm4gby5JY29uLkRlZmF1bHQuaW1hZ2VQYXRofHwoby5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoPXRoaXMuX2RldGVjdEljb25QYXRoKCkpLCh0aGlzLm9wdGlvbnMuaW1hZ2VQYXRofHxvLkljb24uRGVmYXVsdC5pbWFnZVBhdGgpK28uSWNvbi5wcm90b3R5cGUuX2dldEljb25VcmwuY2FsbCh0aGlzLHQpfSxfZGV0ZWN0SWNvblBhdGg6ZnVuY3Rpb24oKXt2YXIgdD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LWRlZmF1bHQtaWNvbi1wYXRoIixlLmJvZHkpLGk9by5Eb21VdGlsLmdldFN0eWxlKHQsImJhY2tncm91bmQtaW1hZ2UiKXx8by5Eb21VdGlsLmdldFN0eWxlKHQsImJhY2tncm91bmRJbWFnZSIpO3JldHVybiBlLmJvZHkucmVtb3ZlQ2hpbGQodCksMD09PWkuaW5kZXhPZigidXJsIik/aS5yZXBsYWNlKC9edXJsXChbXCJcJ10/LywiIikucmVwbGFjZSgvbWFya2VyLWljb25cLnBuZ1tcIlwnXT9cKSQvLCIiKToiIn19KSxvLk1hcmtlcj1vLkxheWVyLmV4dGVuZCh7b3B0aW9uczp7aWNvbjpuZXcgby5JY29uLkRlZmF1bHQsaW50ZXJhY3RpdmU6ITAsZHJhZ2dhYmxlOiExLGtleWJvYXJkOiEwLHRpdGxlOiIiLGFsdDoiIix6SW5kZXhPZmZzZXQ6MCxvcGFjaXR5OjEscmlzZU9uSG92ZXI6ITEscmlzZU9mZnNldDoyNTAscGFuZToibWFya2VyUGFuZSIsbm9uQnViYmxpbmdFdmVudHM6WyJjbGljayIsImRibGNsaWNrIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5fbGF0bG5nPW8ubGF0TG5nKHQpfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl96b29tQW5pbWF0ZWQ9dGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9wdGlvbnMubWFya2VyWm9vbUFuaW1hdGlvbix0aGlzLl96b29tQW5pbWF0ZWQmJnQub24oInpvb21hbmltIix0aGlzLl9hbmltYXRlWm9vbSx0aGlzKSx0aGlzLl9pbml0SWNvbigpLHRoaXMudXBkYXRlKCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZ2dpbmcmJnRoaXMuZHJhZ2dpbmcuZW5hYmxlZCgpJiYodGhpcy5vcHRpb25zLmRyYWdnYWJsZT0hMCx0aGlzLmRyYWdnaW5nLnJlbW92ZUhvb2tzKCkpLHRoaXMuX3pvb21BbmltYXRlZCYmdC5vZmYoInpvb21hbmltIix0aGlzLl9hbmltYXRlWm9vbSx0aGlzKSx0aGlzLl9yZW1vdmVJY29uKCksdGhpcy5fcmVtb3ZlU2hhZG93KCl9LGdldEV2ZW50czpmdW5jdGlvbigpe3JldHVybnt6b29tOnRoaXMudXBkYXRlLHZpZXdyZXNldDp0aGlzLnVwZGF0ZX19LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldExhdExuZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXRsbmc7cmV0dXJuIHRoaXMuX2xhdGxuZz1vLmxhdExuZyh0KSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgibW92ZSIse29sZExhdExuZzplLGxhdGxuZzp0aGlzLl9sYXRsbmd9KX0sc2V0WkluZGV4T2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0PXQsdGhpcy51cGRhdGUoKX0sc2V0SWNvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb249dCx0aGlzLl9tYXAmJih0aGlzLl9pbml0SWNvbigpLHRoaXMudXBkYXRlKCkpLHRoaXMuX3BvcHVwJiZ0aGlzLmJpbmRQb3B1cCh0aGlzLl9wb3B1cCx0aGlzLl9wb3B1cC5vcHRpb25zKSx0aGlzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb259LHVwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2ljb24pe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpO3RoaXMuX3NldFBvcyh0KX1yZXR1cm4gdGhpc30sX2luaXRJY29uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGU9ImxlYWZsZXQtem9vbS0iKyh0aGlzLl96b29tQW5pbWF0ZWQ/ImFuaW1hdGVkIjoiaGlkZSIpLGk9dC5pY29uLmNyZWF0ZUljb24odGhpcy5faWNvbiksbj0hMTtpIT09dGhpcy5faWNvbiYmKHRoaXMuX2ljb24mJnRoaXMuX3JlbW92ZUljb24oKSxuPSEwLHQudGl0bGUmJihpLnRpdGxlPXQudGl0bGUpLHQuYWx0JiYoaS5hbHQ9dC5hbHQpKSxvLkRvbVV0aWwuYWRkQ2xhc3MoaSxlKSx0LmtleWJvYXJkJiYoaS50YWJJbmRleD0iMCIpLHRoaXMuX2ljb249aSx0LnJpc2VPbkhvdmVyJiZ0aGlzLm9uKHttb3VzZW92ZXI6dGhpcy5fYnJpbmdUb0Zyb250LG1vdXNlb3V0OnRoaXMuX3Jlc2V0WkluZGV4fSk7dmFyIHM9dC5pY29uLmNyZWF0ZVNoYWRvdyh0aGlzLl9zaGFkb3cpLHI9ITE7cyE9PXRoaXMuX3NoYWRvdyYmKHRoaXMuX3JlbW92ZVNoYWRvdygpLHI9ITApLHMmJihvLkRvbVV0aWwuYWRkQ2xhc3MocyxlKSxzLmFsdD0iIiksdGhpcy5fc2hhZG93PXMsdC5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSxuJiZ0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9pY29uKSx0aGlzLl9pbml0SW50ZXJhY3Rpb24oKSxzJiZyJiZ0aGlzLmdldFBhbmUoInNoYWRvd1BhbmUiKS5hcHBlbmRDaGlsZCh0aGlzLl9zaGFkb3cpfSxfcmVtb3ZlSWNvbjpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5yaXNlT25Ib3ZlciYmdGhpcy5vZmYoe21vdXNlb3Zlcjp0aGlzLl9icmluZ1RvRnJvbnQsbW91c2VvdXQ6dGhpcy5fcmVzZXRaSW5kZXh9KSxvLkRvbVV0aWwucmVtb3ZlKHRoaXMuX2ljb24pLHRoaXMucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faWNvbiksdGhpcy5faWNvbj1udWxsfSxfcmVtb3ZlU2hhZG93OmZ1bmN0aW9uKCl7dGhpcy5fc2hhZG93JiZvLkRvbVV0aWwucmVtb3ZlKHRoaXMuX3NoYWRvdyksdGhpcy5fc2hhZG93PW51bGx9LF9zZXRQb3M6ZnVuY3Rpb24odCl7by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ljb24sdCksdGhpcy5fc2hhZG93JiZvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fc2hhZG93LHQpLHRoaXMuX3pJbmRleD10LnkrdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldCx0aGlzLl9yZXNldFpJbmRleCgpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuX2ljb24uc3R5bGUuekluZGV4PXRoaXMuX3pJbmRleCt0fSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcikucm91bmQoKTt0aGlzLl9zZXRQb3MoZSl9LF9pbml0SW50ZXJhY3Rpb246ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJihvLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5faWNvbiwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuYWRkSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faWNvbiksby5IYW5kbGVyLk1hcmtlckRyYWcpKXt2YXIgdD10aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO3RoaXMuZHJhZ2dpbmcmJih0PXRoaXMuZHJhZ2dpbmcuZW5hYmxlZCgpLHRoaXMuZHJhZ2dpbmcuZGlzYWJsZSgpKSx0aGlzLmRyYWdnaW5nPW5ldyBvLkhhbmRsZXIuTWFya2VyRHJhZyh0aGlzKSx0JiZ0aGlzLmRyYWdnaW5nLmVuYWJsZSgpfX0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcGFjaXR5O28uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2ljb24sdCksdGhpcy5fc2hhZG93JiZvLkRvbVV0aWwuc2V0T3BhY2l0eSh0aGlzLl9zaGFkb3csdCl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVaSW5kZXgodGhpcy5vcHRpb25zLnJpc2VPZmZzZXQpfSxfcmVzZXRaSW5kZXg6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVaSW5kZXgoMCl9LF9nZXRQb3B1cEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zLnBvcHVwQW5jaG9yfHxbMCwwXX0sX2dldFRvb2x0aXBBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb24ub3B0aW9ucy50b29sdGlwQW5jaG9yfHxbMCwwXX19KSxvLm1hcmtlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5NYXJrZXIodCxlKX0sby5EaXZJY29uPW8uSWNvbi5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsxMiwxMl0saHRtbDohMSxiZ1BvczpudWxsLGNsYXNzTmFtZToibGVhZmxldC1kaXYtaWNvbiJ9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7dmFyIGk9dCYmIkRJViI9PT10LnRhZ05hbWU/dDplLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG49dGhpcy5vcHRpb25zO2lmKGkuaW5uZXJIVE1MPW4uaHRtbCE9PSExP24uaHRtbDoiIixuLmJnUG9zKXt2YXIgcz1vLnBvaW50KG4uYmdQb3MpO2kuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uPS1zLngrInB4ICIrLXMueSsicHgifXJldHVybiB0aGlzLl9zZXRJY29uU3R5bGVzKGksImljb24iKSxpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19KSxvLmRpdkljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkRpdkljb24odCl9LG8uRGl2T3ZlcmxheT1vLkxheWVyLmV4dGVuZCh7b3B0aW9uczp7b2Zmc2V0OlswLDddLGNsYXNzTmFtZToiIixwYW5lOiJwb3B1cFBhbmUifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5zZXRPcHRpb25zKHRoaXMsdCksdGhpcy5fc291cmNlPWV9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3pvb21BbmltYXRlZD10Ll96b29tQW5pbWF0ZWQsdGhpcy5fY29udGFpbmVyfHx0aGlzLl9pbml0TGF5b3V0KCksdC5fZmFkZUFuaW1hdGVkJiZvLkRvbVV0aWwuc2V0T3BhY2l0eSh0aGlzLl9jb250YWluZXIsMCksY2xlYXJUaW1lb3V0KHRoaXMuX3JlbW92ZVRpbWVvdXQpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy51cGRhdGUoKSx0Ll9mYWRlQW5pbWF0ZWQmJm8uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lciwxKSx0aGlzLmJyaW5nVG9Gcm9udCgpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Ll9mYWRlQW5pbWF0ZWQ/KG8uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lciwwKSx0aGlzLl9yZW1vdmVUaW1lb3V0PXNldFRpbWVvdXQoby5iaW5kKG8uRG9tVXRpbC5yZW1vdmUsby5Eb21VdGlsLHRoaXMuX2NvbnRhaW5lciksMjAwKSk6by5Eb21VdGlsLnJlbW92ZSh0aGlzLl9jb250YWluZXIpfSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1vLmxhdExuZyh0KSx0aGlzLl9tYXAmJih0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FkanVzdFBhbigpKSx0aGlzfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHNldENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl91cGRhdGVDb250ZW50KCksdGhpcy5fdXBkYXRlTGF5b3V0KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iIix0aGlzLl9hZGp1c3RQYW4oKSl9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt6b29tOnRoaXMuX3VwZGF0ZVBvc2l0aW9uLHZpZXdyZXNldDp0aGlzLl91cGRhdGVQb3NpdGlvbn07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbWFwJiZ0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcyl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJm8uRG9tVXRpbC50b0Zyb250KHRoaXMuX2NvbnRhaW5lciksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZvLkRvbVV0aWwudG9CYWNrKHRoaXMuX2NvbnRhaW5lciksdGhpc30sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250ZW50KXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxlPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9jb250ZW50P3RoaXMuX2NvbnRlbnQodGhpcy5fc291cmNlfHx0aGlzKTp0aGlzLl9jb250ZW50O2lmKCJzdHJpbmciPT10eXBlb2YgZSl0LmlubmVySFRNTD1lO2Vsc2V7Zm9yKDt0Lmhhc0NoaWxkTm9kZXMoKTspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3QuYXBwZW5kQ2hpbGQoZSl9dGhpcy5maXJlKCJjb250ZW50dXBkYXRlIil9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSxlPW8ucG9pbnQodGhpcy5vcHRpb25zLm9mZnNldCksaT10aGlzLl9nZXRBbmNob3IoKTt0aGlzLl96b29tQW5pbWF0ZWQ/by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2NvbnRhaW5lcix0LmFkZChpKSk6ZT1lLmFkZCh0KS5hZGQoaSk7dmFyIG49dGhpcy5fY29udGFpbmVyQm90dG9tPS1lLnkscz10aGlzLl9jb250YWluZXJMZWZ0PS1NYXRoLnJvdW5kKHRoaXMuX2NvbnRhaW5lcldpZHRoLzIpK2UueDt0aGlzLl9jb250YWluZXIuc3R5bGUuYm90dG9tPW4rInB4Iix0aGlzLl9jb250YWluZXIuc3R5bGUubGVmdD1zKyJweCJ9fSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuWzAsMF19fSksby5Qb3B1cD1vLkRpdk92ZXJsYXkuZXh0ZW5kKHtvcHRpb25zOnttYXhXaWR0aDozMDAsbWluV2lkdGg6NTAsbWF4SGVpZ2h0Om51bGwsYXV0b1BhbjohMCxhdXRvUGFuUGFkZGluZ1RvcExlZnQ6bnVsbCxhdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0Om51bGwsYXV0b1BhblBhZGRpbmc6WzUsNV0sa2VlcEluVmlldzohMSxjbG9zZUJ1dHRvbjohMCxhdXRvQ2xvc2U6ITAsY2xhc3NOYW1lOiIifSxvcGVuT246ZnVuY3Rpb24odCl7cmV0dXJuIHQub3BlblBvcHVwKHRoaXMpLHRoaXN9LG9uQWRkOmZ1bmN0aW9uKHQpe28uRGl2T3ZlcmxheS5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpLHQuZmlyZSgicG9wdXBvcGVuIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuX3NvdXJjZS5maXJlKCJwb3B1cG9wZW4iLHtwb3B1cDp0aGlzfSwhMCksdGhpcy5fc291cmNlIGluc3RhbmNlb2Ygby5QYXRofHx0aGlzLl9zb3VyY2Uub24oInByZWNsaWNrIixvLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbikpfSxvblJlbW92ZTpmdW5jdGlvbih0KXtvLkRpdk92ZXJsYXkucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyx0KSx0LmZpcmUoInBvcHVwY2xvc2UiLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoInBvcHVwY2xvc2UiLHtwb3B1cDp0aGlzfSwhMCksdGhpcy5fc291cmNlIGluc3RhbmNlb2Ygby5QYXRofHx0aGlzLl9zb3VyY2Uub2ZmKCJwcmVjbGljayIsby5Eb21FdmVudC5zdG9wUHJvcGFnYXRpb24pKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9by5EaXZPdmVybGF5LnByb3RvdHlwZS5nZXRFdmVudHMuY2FsbCh0aGlzKTtyZXR1cm4oImNsb3NlT25DbGljayJpbiB0aGlzLm9wdGlvbnM/dGhpcy5vcHRpb25zLmNsb3NlT25DbGljazp0aGlzLl9tYXAub3B0aW9ucy5jbG9zZVBvcHVwT25DbGljaykmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHQubW92ZWVuZD10aGlzLl9hZGp1c3RQYW4pLHR9LF9jbG9zZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtcG9wdXAiLGU9dGhpcy5fY29udGFpbmVyPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsdCsiICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSsiIGxlYWZsZXQtem9vbS1hbmltYXRlZCIpO2lmKHRoaXMub3B0aW9ucy5jbG9zZUJ1dHRvbil7dmFyIGk9dGhpcy5fY2xvc2VCdXR0b249by5Eb21VdGlsLmNyZWF0ZSgiYSIsdCsiLWNsb3NlLWJ1dHRvbiIsZSk7aS5ocmVmPSIjY2xvc2UiLGkuaW5uZXJIVE1MPSImIzIxNTsiLG8uRG9tRXZlbnQub24oaSwiY2xpY2siLHRoaXMuX29uQ2xvc2VCdXR0b25DbGljayx0aGlzKX12YXIgbj10aGlzLl93cmFwcGVyPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsdCsiLWNvbnRlbnQtd3JhcHBlciIsZSk7dGhpcy5fY29udGVudE5vZGU9by5Eb21VdGlsLmNyZWF0ZSgiZGl2Iix0KyItY29udGVudCIsbiksby5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihuKS5kaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb24odGhpcy5fY29udGVudE5vZGUpLm9uKG4sImNvbnRleHRtZW51IixvLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbiksdGhpcy5fdGlwQ29udGFpbmVyPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsdCsiLXRpcC1jb250YWluZXIiLGUpLHRoaXMuX3RpcD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLHQrIi10aXAiLHRoaXMuX3RpcENvbnRhaW5lcil9LF91cGRhdGVMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxlPXQuc3R5bGU7ZS53aWR0aD0iIixlLndoaXRlU3BhY2U9Im5vd3JhcCI7dmFyIGk9dC5vZmZzZXRXaWR0aDtpPU1hdGgubWluKGksdGhpcy5vcHRpb25zLm1heFdpZHRoKSxpPU1hdGgubWF4KGksdGhpcy5vcHRpb25zLm1pbldpZHRoKSxlLndpZHRoPWkrMSsicHgiLGUud2hpdGVTcGFjZT0iIixlLmhlaWdodD0iIjt2YXIgbj10Lm9mZnNldEhlaWdodCxzPXRoaXMub3B0aW9ucy5tYXhIZWlnaHQscj0ibGVhZmxldC1wb3B1cC1zY3JvbGxlZCI7cyYmbj5zPyhlLmhlaWdodD1zKyJweCIsby5Eb21VdGlsLmFkZENsYXNzKHQscikpOm8uRG9tVXRpbC5yZW1vdmVDbGFzcyh0LHIpLHRoaXMuX2NvbnRhaW5lcldpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aH0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpLGk9dGhpcy5fZ2V0QW5jaG9yKCk7by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2NvbnRhaW5lcixlLmFkZChpKSl9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXtpZighKCF0aGlzLm9wdGlvbnMuYXV0b1Bhbnx8dGhpcy5fbWFwLl9wYW5BbmltJiZ0aGlzLl9tYXAuX3BhbkFuaW0uX2luUHJvZ3Jlc3MpKXt2YXIgdD10aGlzLl9tYXAsZT1wYXJzZUludChvLkRvbVV0aWwuZ2V0U3R5bGUodGhpcy5fY29udGFpbmVyLCJtYXJnaW5Cb3R0b20iKSwxMCl8fDAsaT10aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0K2Usbj10aGlzLl9jb250YWluZXJXaWR0aCxzPW5ldyBvLlBvaW50KHRoaXMuX2NvbnRhaW5lckxlZnQsLWktdGhpcy5fY29udGFpbmVyQm90dG9tKTtzLl9hZGQoby5Eb21VdGlsLmdldFBvc2l0aW9uKHRoaXMuX2NvbnRhaW5lcikpO3ZhciByPXQubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQocyksYT1vLnBvaW50KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZyksaD1vLnBvaW50KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ1RvcExlZnR8fGEpLGw9by5wb2ludCh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodHx8YSksdT10LmdldFNpemUoKSxjPTAsZD0wO3IueCtuK2wueD51LngmJihjPXIueCtuLXUueCtsLngpLHIueC1jLWgueDwwJiYoYz1yLngtaC54KSxyLnkraStsLnk+dS55JiYoZD1yLnkraS11LnkrbC55KSxyLnktZC1oLnk8MCYmKGQ9ci55LWgueSksKGN8fGQpJiZ0LmZpcmUoImF1dG9wYW5zdGFydCIpLnBhbkJ5KFtjLGRdKX19LF9vbkNsb3NlQnV0dG9uQ2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5fY2xvc2UoKSxvLkRvbUV2ZW50LnN0b3AodCl9LF9nZXRBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gby5wb2ludCh0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5fZ2V0UG9wdXBBbmNob3I/dGhpcy5fc291cmNlLl9nZXRQb3B1cEFuY2hvcigpOlswLDBdKX19KSxvLnBvcHVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlBvcHVwKHQsZSl9LG8uTWFwLm1lcmdlT3B0aW9ucyh7Y2xvc2VQb3B1cE9uQ2xpY2s6ITB9KSxvLk1hcC5pbmNsdWRlKHtvcGVuUG9wdXA6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0IGluc3RhbmNlb2Ygby5Qb3B1cHx8KHQ9bmV3IG8uUG9wdXAoaSkuc2V0Q29udGVudCh0KSksZSYmdC5zZXRMYXRMbmcoZSksdGhpcy5oYXNMYXllcih0KT90aGlzOih0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAub3B0aW9ucy5hdXRvQ2xvc2UmJnRoaXMuY2xvc2VQb3B1cCgpLHRoaXMuX3BvcHVwPXQsdGhpcy5hZGRMYXllcih0KSl9LGNsb3NlUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQhPT10aGlzLl9wb3B1cHx8KHQ9dGhpcy5fcG9wdXAsdGhpcy5fcG9wdXA9bnVsbCksdCYmdGhpcy5yZW1vdmVMYXllcih0KSx0aGlzfX0pLG8uTGF5ZXIuaW5jbHVkZSh7YmluZFBvcHVwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvLlBvcHVwPyhvLnNldE9wdGlvbnModCxlKSx0aGlzLl9wb3B1cD10LHQuX3NvdXJjZT10aGlzKToodGhpcy5fcG9wdXAmJiFlfHwodGhpcy5fcG9wdXA9bmV3IG8uUG9wdXAoZSx0aGlzKSksdGhpcy5fcG9wdXAuc2V0Q29udGVudCh0KSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkfHwodGhpcy5vbih7Y2xpY2s6dGhpcy5fb3BlblBvcHVwLHJlbW92ZTp0aGlzLmNsb3NlUG9wdXAsbW92ZTp0aGlzLl9tb3ZlUG9wdXB9KSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWQ9ITApLHRoaXN9LHVuYmluZFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5vZmYoe2NsaWNrOnRoaXMuX29wZW5Qb3B1cCxyZW1vdmU6dGhpcy5jbG9zZVBvcHVwLG1vdmU6dGhpcy5fbW92ZVBvcHVwfSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSExLHRoaXMuX3BvcHVwPW51bGwpLHRoaXN9LG9wZW5Qb3B1cDpmdW5jdGlvbih0LGUpe2lmKHQgaW5zdGFuY2VvZiBvLkxheWVyfHwoZT10LHQ9dGhpcyksdCBpbnN0YW5jZW9mIG8uRmVhdHVyZUdyb3VwKWZvcih2YXIgaSBpbiB0aGlzLl9sYXllcnMpe3Q9dGhpcy5fbGF5ZXJzW2ldO2JyZWFrfXJldHVybiBlfHwoZT10LmdldENlbnRlcj90LmdldENlbnRlcigpOnQuZ2V0TGF0TG5nKCkpLHRoaXMuX3BvcHVwJiZ0aGlzLl9tYXAmJih0aGlzLl9wb3B1cC5fc291cmNlPXQsdGhpcy5fcG9wdXAudXBkYXRlKCksdGhpcy5fbWFwLm9wZW5Qb3B1cCh0aGlzLl9wb3B1cCxlKSksdGhpc30sY2xvc2VQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuX2Nsb3NlKCksdGhpc30sdG9nZ2xlUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5fcG9wdXAuX21hcD90aGlzLmNsb3NlUG9wdXAoKTp0aGlzLm9wZW5Qb3B1cCh0KSksdGhpc30saXNQb3B1cE9wZW46ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5pc09wZW4oKX0sc2V0UG9wdXBDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuc2V0Q29udGVudCh0KSx0aGlzfSxnZXRQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cH0sX29wZW5Qb3B1cDpmdW5jdGlvbih0KXt2YXIgZT10LmxheWVyfHx0LnRhcmdldDtpZih0aGlzLl9wb3B1cCYmdGhpcy5fbWFwKXJldHVybiBvLkRvbUV2ZW50LnN0b3AodCksZSBpbnN0YW5jZW9mIG8uUGF0aD92b2lkIHRoaXMub3BlblBvcHVwKHQubGF5ZXJ8fHQudGFyZ2V0LHQubGF0bG5nKTp2b2lkKHRoaXMuX21hcC5oYXNMYXllcih0aGlzLl9wb3B1cCkmJnRoaXMuX3BvcHVwLl9zb3VyY2U9PT1lP3RoaXMuY2xvc2VQb3B1cCgpOnRoaXMub3BlblBvcHVwKGUsdC5sYXRsbmcpKX0sX21vdmVQb3B1cDpmdW5jdGlvbih0KXt0aGlzLl9wb3B1cC5zZXRMYXRMbmcodC5sYXRsbmcpfX0pLG8uVG9vbHRpcD1vLkRpdk92ZXJsYXkuZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJ0b29sdGlwUGFuZSIsb2Zmc2V0OlswLDBdLGRpcmVjdGlvbjoiYXV0byIscGVybWFuZW50OiExLHN0aWNreTohMSxpbnRlcmFjdGl2ZTohMSxvcGFjaXR5Oi45fSxvbkFkZDpmdW5jdGlvbih0KXtvLkRpdk92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyx0KSx0aGlzLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHkpLHQuZmlyZSgidG9vbHRpcG9wZW4iLHt0b29sdGlwOnRoaXN9KSx0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5maXJlKCJ0b29sdGlwb3BlbiIse3Rvb2x0aXA6dGhpc30sITApfSxvblJlbW92ZTpmdW5jdGlvbih0KXtvLkRpdk92ZXJsYXkucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyx0KSx0LmZpcmUoInRvb2x0aXBjbG9zZSIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLmZpcmUoInRvb2x0aXBjbG9zZSIse3Rvb2x0aXA6dGhpc30sITApfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1vLkRpdk92ZXJsYXkucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiBvLkJyb3dzZXIudG91Y2gmJiF0aGlzLm9wdGlvbnMucGVybWFuZW50JiYodC5wcmVjbGljaz10aGlzLl9jbG9zZSksdH0sX2Nsb3NlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl9tYXAuY2xvc2VUb29sdGlwKHRoaXMpfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PSJsZWFmbGV0LXRvb2x0aXAiLGU9dCsiICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSsiIGxlYWZsZXQtem9vbS0iKyh0aGlzLl96b29tQW5pbWF0ZWQ/ImFuaW1hdGVkIjoiaGlkZSIpO3RoaXMuX2NvbnRlbnROb2RlPXRoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUpfSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7fSxfYWRqdXN0UGFuOmZ1bmN0aW9uKCl7fSxfc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9dGhpcy5fY29udGFpbmVyLG49ZS5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGUuZ2V0Q2VudGVyKCkpLHM9ZS5sYXllclBvaW50VG9Db250YWluZXJQb2ludCh0KSxyPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sYT1pLm9mZnNldFdpZHRoLGg9aS5vZmZzZXRIZWlnaHQsbD1vLnBvaW50KHRoaXMub3B0aW9ucy5vZmZzZXQpLHU9dGhpcy5fZ2V0QW5jaG9yKCk7InRvcCI9PT1yP3Q9dC5hZGQoby5wb2ludCgtYS8yK2wueCwtaCtsLnkrdS55LCEwKSk6ImJvdHRvbSI9PT1yP3Q9dC5zdWJ0cmFjdChvLnBvaW50KGEvMi1sLngsLWwueSwhMCkpOiJjZW50ZXIiPT09cj90PXQuc3VidHJhY3Qoby5wb2ludChhLzIrbC54LGgvMi11LnkrbC55LCEwKSk6InJpZ2h0Ij09PXJ8fCJhdXRvIj09PXImJnMueDxuLng/KHI9InJpZ2h0Iix0PXQuYWRkKG8ucG9pbnQobC54K3UueCx1LnktaC8yK2wueSwhMCkpKToocj0ibGVmdCIsdD10LnN1YnRyYWN0KG8ucG9pbnQoYSt1LngtbC54LGgvMi11LnktbC55LCEwKSkpLG8uRG9tVXRpbC5yZW1vdmVDbGFzcyhpLCJsZWFmbGV0LXRvb2x0aXAtcmlnaHQiKSxvLkRvbVV0aWwucmVtb3ZlQ2xhc3MoaSwibGVhZmxldC10b29sdGlwLWxlZnQiKSxvLkRvbVV0aWwucmVtb3ZlQ2xhc3MoaSwibGVhZmxldC10b29sdGlwLXRvcCIpLG8uRG9tVXRpbC5yZW1vdmVDbGFzcyhpLCJsZWFmbGV0LXRvb2x0aXAtYm90dG9tIiksby5Eb21VdGlsLmFkZENsYXNzKGksImxlYWZsZXQtdG9vbHRpcC0iK3IpLG8uRG9tVXRpbC5zZXRQb3NpdGlvbihpLHQpfSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7dGhpcy5fc2V0UG9zaXRpb24odCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJm8uRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lcix0KX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpO3RoaXMuX3NldFBvc2l0aW9uKGUpfSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG8ucG9pbnQodGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuX2dldFRvb2x0aXBBbmNob3ImJiF0aGlzLm9wdGlvbnMuc3RpY2t5P3RoaXMuX3NvdXJjZS5fZ2V0VG9vbHRpcEFuY2hvcigpOlswLDBdKX19KSxvLnRvb2x0aXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uVG9vbHRpcCh0LGUpfSxvLk1hcC5pbmNsdWRlKHtvcGVuVG9vbHRpcDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvLlRvb2x0aXB8fCh0PW5ldyBvLlRvb2x0aXAoaSkuc2V0Q29udGVudCh0KSksZSYmdC5zZXRMYXRMbmcoZSksdGhpcy5oYXNMYXllcih0KT90aGlzOnRoaXMuYWRkTGF5ZXIodCl9LGNsb3NlVG9vbHRpcDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5yZW1vdmVMYXllcih0KSx0aGlzfX0pLG8uTGF5ZXIuaW5jbHVkZSh7YmluZFRvb2x0aXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG8uVG9vbHRpcD8oby5zZXRPcHRpb25zKHQsZSksdGhpcy5fdG9vbHRpcD10LHQuX3NvdXJjZT10aGlzKToodGhpcy5fdG9vbHRpcCYmIWV8fCh0aGlzLl90b29sdGlwPW8udG9vbHRpcChlLHRoaXMpKSx0aGlzLl90b29sdGlwLnNldENvbnRlbnQodCkpLHRoaXMuX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zKCksdGhpcy5fdG9vbHRpcC5vcHRpb25zLnBlcm1hbmVudCYmdGhpcy5fbWFwJiZ0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcykmJnRoaXMub3BlblRvb2x0aXAoKSx0aGlzfSx1bmJpbmRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJih0aGlzLl9pbml0VG9vbHRpcEludGVyYWN0aW9ucyghMCksdGhpcy5jbG9zZVRvb2x0aXAoKSx0aGlzLl90b29sdGlwPW51bGwpLHRoaXN9LF9pbml0VG9vbHRpcEludGVyYWN0aW9uczpmdW5jdGlvbih0KXtpZih0fHwhdGhpcy5fdG9vbHRpcEhhbmRsZXJzQWRkZWQpe3ZhciBlPXQ/Im9mZiI6Im9uIixpPXtyZW1vdmU6dGhpcy5jbG9zZVRvb2x0aXAsbW92ZTp0aGlzLl9tb3ZlVG9vbHRpcH07dGhpcy5fdG9vbHRpcC5vcHRpb25zLnBlcm1hbmVudD9pLmFkZD10aGlzLl9vcGVuVG9vbHRpcDooaS5tb3VzZW92ZXI9dGhpcy5fb3BlblRvb2x0aXAsaS5tb3VzZW91dD10aGlzLmNsb3NlVG9vbHRpcCx0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiYoaS5tb3VzZW1vdmU9dGhpcy5fbW92ZVRvb2x0aXApLG8uQnJvd3Nlci50b3VjaCYmKGkuY2xpY2s9dGhpcy5fb3BlblRvb2x0aXApKSx0aGlzW2VdKGkpLHRoaXMuX3Rvb2x0aXBIYW5kbGVyc0FkZGVkPSF0fX0sb3BlblRvb2x0aXA6ZnVuY3Rpb24odCxlKXtpZih0IGluc3RhbmNlb2Ygby5MYXllcnx8KGU9dCx0PXRoaXMpLHQgaW5zdGFuY2VvZiBvLkZlYXR1cmVHcm91cClmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXt0PXRoaXMuX2xheWVyc1tpXTticmVha31yZXR1cm4gZXx8KGU9dC5nZXRDZW50ZXI/dC5nZXRDZW50ZXIoKTp0LmdldExhdExuZygpKSx0aGlzLl90b29sdGlwJiZ0aGlzLl9tYXAmJih0aGlzLl90b29sdGlwLl9zb3VyY2U9dCx0aGlzLl90b29sdGlwLnVwZGF0ZSgpLHRoaXMuX21hcC5vcGVuVG9vbHRpcCh0aGlzLl90b29sdGlwLGUpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5fdG9vbHRpcC5fY29udGFpbmVyJiYoby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lciwibGVhZmxldC1jbGlja2FibGUiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lcikpKSx0aGlzfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX3Rvb2x0aXAuX2Nsb3NlKCksdGhpcy5fdG9vbHRpcC5vcHRpb25zLmludGVyYWN0aXZlJiZ0aGlzLl90b29sdGlwLl9jb250YWluZXImJihvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fdG9vbHRpcC5fY29udGFpbmVyLCJsZWFmbGV0LWNsaWNrYWJsZSIpLHRoaXMucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5fdG9vbHRpcC5fY29udGFpbmVyKSkpLHRoaXN9LHRvZ2dsZVRvb2x0aXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJih0aGlzLl90b29sdGlwLl9tYXA/dGhpcy5jbG9zZVRvb2x0aXAoKTp0aGlzLm9wZW5Ub29sdGlwKHQpKSx0aGlzfSxpc1Rvb2x0aXBPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAuaXNPcGVuKCl9LHNldFRvb2x0aXBDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b29sdGlwJiZ0aGlzLl90b29sdGlwLnNldENvbnRlbnQodCksdGhpc30sZ2V0VG9vbHRpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwfSxfb3BlblRvb2x0aXA6ZnVuY3Rpb24odCl7dmFyIGU9dC5sYXllcnx8dC50YXJnZXQ7dGhpcy5fdG9vbHRpcCYmdGhpcy5fbWFwJiZ0aGlzLm9wZW5Ub29sdGlwKGUsdGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreT90LmxhdGxuZzppKX0sX21vdmVUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlLGksbj10LmxhdGxuZzt0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiZ0Lm9yaWdpbmFsRXZlbnQmJihlPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0Lm9yaWdpbmFsRXZlbnQpLGk9dGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGUpLG49dGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhpKSksdGhpcy5fdG9vbHRpcC5zZXRMYXRMbmcobil9fSksby5MYXllckdyb3VwPW8uTGF5ZXIuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2xheWVycz17fTt2YXIgZSxpO2lmKHQpZm9yKGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspdGhpcy5hZGRMYXllcih0W2VdKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV09dCx0aGlzLl9tYXAmJnRoaXMuX21hcC5hZGRMYXllcih0KSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10IGluIHRoaXMuX2xheWVycz90OnRoaXMuZ2V0TGF5ZXJJZCh0KTtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9sYXllcnNbZV0mJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbZV0pLGRlbGV0ZSB0aGlzLl9sYXllcnNbZV0sdGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodCBpbiB0aGlzLl9sYXllcnN8fHRoaXMuZ2V0TGF5ZXJJZCh0KWluIHRoaXMuX2xheWVycyl9LGNsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLnJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1t0XSk7cmV0dXJuIHRoaXN9LGludm9rZTpmdW5jdGlvbih0KXt2YXIgZSxpLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2ZvcihlIGluIHRoaXMuX2xheWVycylpPXRoaXMuX2xheWVyc1tlXSxpW3RdJiZpW3RdLmFwcGx5KGksbik7cmV0dXJuIHRoaXN9LG9uQWRkOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLl9sYXllcnMpdC5hZGRMYXllcih0aGlzLl9sYXllcnNbZV0pfSxvblJlbW92ZTpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXQucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2VdKX0sZWFjaExheWVyOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHRoaXMuX2xheWVycyl0LmNhbGwoZSx0aGlzLl9sYXllcnNbaV0pO3JldHVybiB0aGlzfSxnZXRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5ZXJzW3RdfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXQucHVzaCh0aGlzLl9sYXllcnNbZV0pO3JldHVybiB0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKCJzZXRaSW5kZXgiLHQpfSxnZXRMYXllcklkOmZ1bmN0aW9uKHQpe3JldHVybiBvLnN0YW1wKHQpfX0pLG8ubGF5ZXJHcm91cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uTGF5ZXJHcm91cCh0KX0sby5GZWF0dXJlR3JvdXA9by5MYXllckdyb3VwLmV4dGVuZCh7YWRkTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk/dGhpczoodC5hZGRFdmVudFBhcmVudCh0aGlzKSxvLkxheWVyR3JvdXAucHJvdG90eXBlLmFkZExheWVyLmNhbGwodGhpcyx0KSx0aGlzLmZpcmUoImxheWVyYWRkIix7bGF5ZXI6dH0pKX0scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk/KHQgaW4gdGhpcy5fbGF5ZXJzJiYodD10aGlzLl9sYXllcnNbdF0pLHQucmVtb3ZlRXZlbnRQYXJlbnQodGhpcyksby5MYXllckdyb3VwLnByb3RvdHlwZS5yZW1vdmVMYXllci5jYWxsKHRoaXMsdCksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOnR9KSk6dGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKCJzZXRTdHlsZSIsdCl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiYnJpbmdUb0Zyb250Iil9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKCJicmluZ1RvQmFjayIpfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgby5MYXRMbmdCb3VuZHM7Zm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl7dmFyIGk9dGhpcy5fbGF5ZXJzW2VdO3QuZXh0ZW5kKGkuZ2V0Qm91bmRzP2kuZ2V0Qm91bmRzKCk6aS5nZXRMYXRMbmcoKSl9cmV0dXJuIHR9fSksby5mZWF0dXJlR3JvdXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkZlYXR1cmVHcm91cCh0KX0sby5SZW5kZXJlcj1vLkxheWVyLmV4dGVuZCh7b3B0aW9uczp7cGFkZGluZzouMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtvLnNldE9wdGlvbnModGhpcyx0KSxvLnN0YW1wKHRoaXMpLHRoaXMuX2xheWVycz10aGlzLl9sYXllcnN8fHt9fSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2luaXRDb250YWluZXIoKSx0aGlzLl96b29tQW5pbWF0ZWQmJm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3VwZGF0ZSgpLHRoaXMub24oInVwZGF0ZSIsdGhpcy5fdXBkYXRlUGF0aHMsdGhpcyl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7by5Eb21VdGlsLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLHRoaXMub2ZmKCJ1cGRhdGUiLHRoaXMuX3VwZGF0ZVBhdGhzLHRoaXMpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17dmlld3Jlc2V0OnRoaXMuX3Jlc2V0LHpvb206dGhpcy5fb25ab29tLG1vdmVlbmQ6dGhpcy5fdXBkYXRlLHpvb21lbmQ6dGhpcy5fb25ab29tRW5kfTtyZXR1cm4gdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9vbkFuaW1ab29tKSx0fSxfb25BbmltWm9vbTpmdW5jdGlvbih0KXt0aGlzLl91cGRhdGVUcmFuc2Zvcm0odC5jZW50ZXIsdC56b29tKX0sX29uWm9vbTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVRyYW5zZm9ybSh0aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fbWFwLmdldFpvb20oKSl9LF91cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGUsdGhpcy5fem9vbSksbj1vLkRvbVV0aWwuZ2V0UG9zaXRpb24odGhpcy5fY29udGFpbmVyKSxzPXRoaXMuX21hcC5nZXRTaXplKCkubXVsdGlwbHlCeSguNSt0aGlzLm9wdGlvbnMucGFkZGluZykscj10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9jZW50ZXIsZSksYT10aGlzLl9tYXAucHJvamVjdCh0LGUpLGg9YS5zdWJ0cmFjdChyKSxsPXMubXVsdGlwbHlCeSgtaSkuYWRkKG4pLmFkZChzKS5zdWJ0cmFjdChoKTtvLkJyb3dzZXIuYW55M2Q/by5Eb21VdGlsLnNldFRyYW5zZm9ybSh0aGlzLl9jb250YWluZXIsbCxpKTpvLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fY29udGFpbmVyLGwpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKSx0aGlzLl91cGRhdGVUcmFuc2Zvcm0odGhpcy5fY2VudGVyLHRoaXMuX3pvb20pO2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl9yZXNldCgpfSxfb25ab29tRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3Byb2plY3QoKX0sX3VwZGF0ZVBhdGhzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3VwZGF0ZSgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnBhZGRpbmcsZT10aGlzLl9tYXAuZ2V0U2l6ZSgpLGk9dGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KGUubXVsdGlwbHlCeSgtdCkpLnJvdW5kKCk7dGhpcy5fYm91bmRzPW5ldyBvLkJvdW5kcyhpLGkuYWRkKGUubXVsdGlwbHlCeSgxKzIqdCkpLnJvdW5kKCkpLHRoaXMuX2NlbnRlcj10aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fem9vbT10aGlzLl9tYXAuZ2V0Wm9vbSgpfX0pLG8uTWFwLmluY2x1ZGUoe2dldFJlbmRlcmVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQub3B0aW9ucy5yZW5kZXJlcnx8dGhpcy5fZ2V0UGFuZVJlbmRlcmVyKHQub3B0aW9ucy5wYW5lKXx8dGhpcy5vcHRpb25zLnJlbmRlcmVyfHx0aGlzLl9yZW5kZXJlcjtyZXR1cm4gZXx8KGU9dGhpcy5fcmVuZGVyZXI9dGhpcy5vcHRpb25zLnByZWZlckNhbnZhcyYmby5jYW52YXMoKXx8by5zdmcoKSksdGhpcy5oYXNMYXllcihlKXx8dGhpcy5hZGRMYXllcihlKSxlfSxfZ2V0UGFuZVJlbmRlcmVyOmZ1bmN0aW9uKHQpe2lmKCJvdmVybGF5UGFuZSI9PT10fHx0PT09aSlyZXR1cm4hMTt2YXIgZT10aGlzLl9wYW5lUmVuZGVyZXJzW3RdO3JldHVybiBlPT09aSYmKGU9by5TVkcmJm8uc3ZnKHtwYW5lOnR9KXx8by5DYW52YXMmJm8uY2FudmFzKHtwYW5lOnR9KSx0aGlzLl9wYW5lUmVuZGVyZXJzW3RdPWUpLGV9fSksby5QYXRoPW8uTGF5ZXIuZXh0ZW5kKHtvcHRpb25zOntzdHJva2U6ITAsY29sb3I6IiMzMzg4ZmYiLHdlaWdodDozLG9wYWNpdHk6MSxsaW5lQ2FwOiJyb3VuZCIsbGluZUpvaW46InJvdW5kIixkYXNoQXJyYXk6bnVsbCxkYXNoT2Zmc2V0Om51bGwsZmlsbDohMSxmaWxsQ29sb3I6bnVsbCxmaWxsT3BhY2l0eTouMixmaWxsUnVsZToiZXZlbm9kZCIsaW50ZXJhY3RpdmU6ITB9LGJlZm9yZUFkZDpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJlcj10LmdldFJlbmRlcmVyKHRoaXMpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9pbml0UGF0aCh0aGlzKSx0aGlzLl9yZXNldCgpLHRoaXMuX3JlbmRlcmVyLl9hZGRQYXRoKHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9yZW1vdmVQYXRoKHRoaXMpfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlUGF0aCh0aGlzKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gby5zZXRPcHRpb25zKHRoaXMsdCksdGhpcy5fcmVuZGVyZXImJnRoaXMuX3JlbmRlcmVyLl91cGRhdGVTdHlsZSh0aGlzKSx0aGlzfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXImJnRoaXMuX3JlbmRlcmVyLl9icmluZ1RvRnJvbnQodGhpcyksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXImJnRoaXMuX3JlbmRlcmVyLl9icmluZ1RvQmFjayh0aGlzKSx0aGlzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhdGh9LF9yZXNldDpmdW5jdGlvbigpe3RoaXMuX3Byb2plY3QoKSx0aGlzLl91cGRhdGUoKX0sX2NsaWNrVG9sZXJhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMub3B0aW9ucy5zdHJva2U/dGhpcy5vcHRpb25zLndlaWdodC8yOjApKyhvLkJyb3dzZXIudG91Y2g/MTA6MCl9fSksby5MaW5lVXRpbD17c2ltcGxpZnk6ZnVuY3Rpb24odCxlKXtpZighZXx8IXQubGVuZ3RoKXJldHVybiB0LnNsaWNlKCk7dmFyIGk9ZSplO3JldHVybiB0PXRoaXMuX3JlZHVjZVBvaW50cyh0LGkpLHQ9dGhpcy5fc2ltcGxpZnlEUCh0LGkpfSxwb2ludFRvU2VnbWVudERpc3RhbmNlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3NxQ2xvc2VzdFBvaW50T25TZWdtZW50KHQsZSxpLCEwKSl9LGNsb3Nlc3RQb2ludE9uU2VnbWVudDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX3NxQ2xvc2VzdFBvaW50T25TZWdtZW50KHQsZSxpKX0sX3NpbXBsaWZ5RFA6ZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aCxvPXR5cGVvZiBVaW50OEFycmF5IT1pKyIiP1VpbnQ4QXJyYXk6QXJyYXkscz1uZXcgbyhuKTtzWzBdPXNbbi0xXT0xLHRoaXMuX3NpbXBsaWZ5RFBTdGVwKHQscyxlLDAsbi0xKTt2YXIgcixhPVtdO2ZvcihyPTA7cjxuO3IrKylzW3JdJiZhLnB1c2godFtyXSk7cmV0dXJuIGF9LF9zaW1wbGlmeURQU3RlcDpmdW5jdGlvbih0LGUsaSxuLG8pe3ZhciBzLHIsYSxoPTA7Zm9yKHI9bisxO3I8PW8tMTtyKyspYT10aGlzLl9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudCh0W3JdLHRbbl0sdFtvXSwhMCksYT5oJiYocz1yLGg9YSk7aD5pJiYoZVtzXT0xLHRoaXMuX3NpbXBsaWZ5RFBTdGVwKHQsZSxpLG4scyksdGhpcy5fc2ltcGxpZnlEUFN0ZXAodCxlLGkscyxvKSl9LF9yZWR1Y2VQb2ludHM6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W3RbMF1dLG49MSxvPTAscz10Lmxlbmd0aDtuPHM7bisrKXRoaXMuX3NxRGlzdCh0W25dLHRbb10pPmUmJihpLnB1c2godFtuXSksbz1uKTtyZXR1cm4gbzxzLTEmJmkucHVzaCh0W3MtMV0pLGl9LGNsaXBTZWdtZW50OmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIHMscixhLGg9bj90aGlzLl9sYXN0Q29kZTp0aGlzLl9nZXRCaXRDb2RlKHQsaSksbD10aGlzLl9nZXRCaXRDb2RlKGUsaSk7Zm9yKHRoaXMuX2xhc3RDb2RlPWw7Oyl7aWYoIShofGwpKXJldHVyblt0LGVdO2lmKGgmbClyZXR1cm4hMTtzPWh8fGwscj10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uKHQsZSxzLGksbyksYT10aGlzLl9nZXRCaXRDb2RlKHIsaSkscz09PWg/KHQ9cixoPWEpOihlPXIsbD1hKX19LF9nZXRFZGdlSW50ZXJzZWN0aW9uOmZ1bmN0aW9uKHQsZSxpLG4scyl7dmFyIHIsYSxoPWUueC10LngsbD1lLnktdC55LHU9bi5taW4sYz1uLm1heDtyZXR1cm4gOCZpPyhyPXQueCtoKihjLnktdC55KS9sLGE9Yy55KTo0Jmk/KHI9dC54K2gqKHUueS10LnkpL2wsYT11LnkpOjImaT8ocj1jLngsYT10LnkrbCooYy54LXQueCkvaCk6MSZpJiYocj11LngsYT10LnkrbCoodS54LXQueCkvaCksbmV3IG8uUG9pbnQocixhLHMpfSxfZ2V0Qml0Q29kZTpmdW5jdGlvbih0LGUpe3ZhciBpPTA7cmV0dXJuIHQueDxlLm1pbi54P2l8PTE6dC54PmUubWF4LngmJihpfD0yKSx0Lnk8ZS5taW4ueT9pfD00OnQueT5lLm1heC55JiYoaXw9OCksaX0sX3NxRGlzdDpmdW5jdGlvbih0LGUpe3ZhciBpPWUueC10Lngsbj1lLnktdC55O3JldHVybiBpKmkrbipufSxfc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQ6ZnVuY3Rpb24odCxlLGksbil7dmFyIHMscj1lLngsYT1lLnksaD1pLngtcixsPWkueS1hLHU9aCpoK2wqbDtyZXR1cm4gdT4wJiYocz0oKHQueC1yKSpoKyh0LnktYSkqbCkvdSxzPjE/KHI9aS54LGE9aS55KTpzPjAmJihyKz1oKnMsYSs9bCpzKSksaD10LngtcixsPXQueS1hLG4/aCpoK2wqbDpuZXcgby5Qb2ludChyLGEpfX0sby5Qb2x5bGluZT1vLlBhdGguZXh0ZW5kKHtvcHRpb25zOntzbW9vdGhGYWN0b3I6MSxub0NsaXA6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtvLnNldE9wdGlvbnModGhpcyxlKSx0aGlzLl9zZXRMYXRMbmdzKHQpfSxnZXRMYXRMbmdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ3N9LHNldExhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldExhdExuZ3ModCksdGhpcy5yZWRyYXcoKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9sYXRsbmdzLmxlbmd0aH0sY2xvc2VzdExheWVyUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGksbj0xLzAscz1udWxsLHI9by5MaW5lVXRpbC5fc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQsYT0wLGg9dGhpcy5fcGFydHMubGVuZ3RoO2E8aDthKyspZm9yKHZhciBsPXRoaXMuX3BhcnRzW2FdLHU9MSxjPWwubGVuZ3RoO3U8Yzt1Kyspe2U9bFt1LTFdLGk9bFt1XTt2YXIgZD1yKHQsZSxpLCEwKTtkPG4mJihuPWQscz1yKHQsZSxpKSl9cmV0dXJuIHMmJihzLmRpc3RhbmNlPU1hdGguc3FydChuKSksc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcCl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKCkiKTt2YXIgdCxlLGksbixvLHMscixhPXRoaXMuX3JpbmdzWzBdLGg9YS5sZW5ndGg7aWYoIWgpcmV0dXJuIG51bGw7Zm9yKHQ9MCxlPTA7dDxoLTE7dCsrKWUrPWFbdF0uZGlzdGFuY2VUbyhhW3QrMV0pLzI7aWYoMD09PWUpcmV0dXJuIHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoYVswXSk7Zm9yKHQ9MCxuPTA7dDxoLTE7dCsrKWlmKG89YVt0XSxzPWFbdCsxXSxpPW8uZGlzdGFuY2VUbyhzKSxuKz1pLG4+ZSlyZXR1cm4gcj0obi1lKS9pLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoW3MueC1yKihzLngtby54KSxzLnktcioocy55LW8ueSldKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sYWRkTGF0TG5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZXx8dGhpcy5fZGVmYXVsdFNoYXBlKCksdD1vLmxhdExuZyh0KSxlLnB1c2godCksdGhpcy5fYm91bmRzLmV4dGVuZCh0KSx0aGlzLnJlZHJhdygpfSxfc2V0TGF0TG5nczpmdW5jdGlvbih0KXt0aGlzLl9ib3VuZHM9bmV3IG8uTGF0TG5nQm91bmRzLHRoaXMuX2xhdGxuZ3M9dGhpcy5fY29udmVydExhdExuZ3ModCl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4gby5Qb2x5bGluZS5fZmxhdCh0aGlzLl9sYXRsbmdzKT90aGlzLl9sYXRsbmdzOnRoaXMuX2xhdGxuZ3NbMF19LF9jb252ZXJ0TGF0TG5nczpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT1vLlBvbHlsaW5lLl9mbGF0KHQpLG49MCxzPXQubGVuZ3RoO248cztuKyspaT8oZVtuXT1vLmxhdExuZyh0W25dKSx0aGlzLl9ib3VuZHMuZXh0ZW5kKGVbbl0pKTplW25dPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHRbbl0pO3JldHVybiBlfSxfcHJvamVjdDpmdW5jdGlvbigpe3ZhciB0PW5ldyBvLkJvdW5kczt0aGlzLl9yaW5ncz1bXSx0aGlzLl9wcm9qZWN0TGF0bG5ncyh0aGlzLl9sYXRsbmdzLHRoaXMuX3JpbmdzLHQpO3ZhciBlPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCksaT1uZXcgby5Qb2ludChlLGUpO3RoaXMuX2JvdW5kcy5pc1ZhbGlkKCkmJnQuaXNWYWxpZCgpJiYodC5taW4uX3N1YnRyYWN0KGkpLHQubWF4Ll9hZGQoaSksdGhpcy5fcHhCb3VuZHM9dCl9LF9wcm9qZWN0TGF0bG5nczpmdW5jdGlvbih0LGUsaSl7dmFyIG4scyxyPXRbMF1pbnN0YW5jZW9mIG8uTGF0TG5nLGE9dC5sZW5ndGg7aWYocil7Zm9yKHM9W10sbj0wO248YTtuKyspc1tuXT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRbbl0pLGkuZXh0ZW5kKHNbbl0pO2UucHVzaChzKX1lbHNlIGZvcihuPTA7bjxhO24rKyl0aGlzLl9wcm9qZWN0TGF0bG5ncyh0W25dLGUsaSl9LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcztpZih0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSl7aWYodGhpcy5vcHRpb25zLm5vQ2xpcClyZXR1cm4gdm9pZCh0aGlzLl9wYXJ0cz10aGlzLl9yaW5ncyk7dmFyIGUsaSxuLHMscixhLGgsbD10aGlzLl9wYXJ0cztmb3IoZT0wLG49MCxzPXRoaXMuX3JpbmdzLmxlbmd0aDtlPHM7ZSsrKWZvcihoPXRoaXMuX3JpbmdzW2VdLGk9MCxyPWgubGVuZ3RoO2k8ci0xO2krKylhPW8uTGluZVV0aWwuY2xpcFNlZ21lbnQoaFtpXSxoW2krMV0sdCxpLCEwKSxhJiYobFtuXT1sW25dfHxbXSxsW25dLnB1c2goYVswXSksYVsxXT09PWhbaSsxXSYmaSE9PXItMnx8KGxbbl0ucHVzaChhWzFdKSxuKyspKX19LF9zaW1wbGlmeVBvaW50czpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9wYXJ0cyxlPXRoaXMub3B0aW9ucy5zbW9vdGhGYWN0b3IsaT0wLG49dC5sZW5ndGg7aTxuO2krKyl0W2ldPW8uTGluZVV0aWwuc2ltcGxpZnkodFtpXSxlKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NsaXBQb2ludHMoKSx0aGlzLl9zaW1wbGlmeVBvaW50cygpLHRoaXMuX3VwZGF0ZVBhdGgoKSl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVBvbHkodGhpcyl9fSksby5wb2x5bGluZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgby5Qb2x5bGluZSh0LGUpfSxvLlBvbHlsaW5lLl9mbGF0PWZ1bmN0aW9uKHQpe3JldHVybiFvLlV0aWwuaXNBcnJheSh0WzBdKXx8Im9iamVjdCIhPXR5cGVvZiB0WzBdWzBdJiYidW5kZWZpbmVkIiE9dHlwZW9mIHRbMF1bMF19LG8uUG9seVV0aWw9e30sby5Qb2x5VXRpbC5jbGlwUG9seWdvbj1mdW5jdGlvbih0LGUsaSl7dmFyIG4scyxyLGEsaCxsLHUsYyxkLF89WzEsNCwyLDhdLG09by5MaW5lVXRpbDtmb3Iocz0wLHU9dC5sZW5ndGg7czx1O3MrKyl0W3NdLl9jb2RlPW0uX2dldEJpdENvZGUodFtzXSxlKTtmb3IoYT0wO2E8NDthKyspe2ZvcihjPV9bYV0sbj1bXSxzPTAsdT10Lmxlbmd0aCxyPXUtMTtzPHU7cj1zKyspaD10W3NdLGw9dFtyXSxoLl9jb2RlJmM/bC5fY29kZSZjfHwoZD1tLl9nZXRFZGdlSW50ZXJzZWN0aW9uKGwsaCxjLGUsaSksZC5fY29kZT1tLl9nZXRCaXRDb2RlKGQsZSksbi5wdXNoKGQpKToobC5fY29kZSZjJiYoZD1tLl9nZXRFZGdlSW50ZXJzZWN0aW9uKGwsaCxjLGUsaSksZC5fY29kZT1tLl9nZXRCaXRDb2RlKGQsZSksbi5wdXNoKGQpKSxuLnB1c2goaCkpO3Q9bn1yZXR1cm4gdH0sby5Qb2x5Z29uPW8uUG9seWxpbmUuZXh0ZW5kKHtvcHRpb25zOntmaWxsOiEwfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2xhdGxuZ3MubGVuZ3RofHwhdGhpcy5fbGF0bG5nc1swXS5sZW5ndGh9LGdldENlbnRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLl9tYXApdGhyb3cgbmV3IEVycm9yKCJNdXN0IGFkZCBsYXllciB0byBtYXAgYmVmb3JlIHVzaW5nIGdldENlbnRlcigpIik7dmFyIHQsZSxpLG4sbyxzLHIsYSxoLGw9dGhpcy5fcmluZ3NbMF0sdT1sLmxlbmd0aDtpZighdSlyZXR1cm4gbnVsbDtmb3Iocz1yPWE9MCx0PTAsZT11LTE7dDx1O2U9dCsrKWk9bFt0XSxuPWxbZV0sbz1pLnkqbi54LW4ueSppLngscis9KGkueCtuLngpKm8sYSs9KGkueStuLnkpKm8scys9MypvO3JldHVybiBoPTA9PT1zP2xbMF06W3IvcyxhL3NdLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoaCl9LF9jb252ZXJ0TGF0TG5nczpmdW5jdGlvbih0KXt2YXIgZT1vLlBvbHlsaW5lLnByb3RvdHlwZS5fY29udmVydExhdExuZ3MuY2FsbCh0aGlzLHQpLGk9ZS5sZW5ndGg7cmV0dXJuIGk+PTImJmVbMF1pbnN0YW5jZW9mIG8uTGF0TG5nJiZlWzBdLmVxdWFscyhlW2ktMV0pJiZlLnBvcCgpLGV9LF9zZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe28uUG9seWxpbmUucHJvdG90eXBlLl9zZXRMYXRMbmdzLmNhbGwodGhpcyx0KSxvLlBvbHlsaW5lLl9mbGF0KHRoaXMuX2xhdGxuZ3MpJiYodGhpcy5fbGF0bG5ncz1bdGhpcy5fbGF0bG5nc10pfSxfZGVmYXVsdFNoYXBlOmZ1bmN0aW9uKCl7cmV0dXJuIG8uUG9seWxpbmUuX2ZsYXQodGhpcy5fbGF0bG5nc1swXSk/dGhpcy5fbGF0bG5nc1swXTp0aGlzLl9sYXRsbmdzWzBdWzBdfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMsZT10aGlzLm9wdGlvbnMud2VpZ2h0LGk9bmV3IG8uUG9pbnQoZSxlKTtpZih0PW5ldyBvLkJvdW5kcyh0Lm1pbi5zdWJ0cmFjdChpKSx0Lm1heC5hZGQoaSkpLHRoaXMuX3BhcnRzPVtdLHRoaXMuX3B4Qm91bmRzJiZ0aGlzLl9weEJvdW5kcy5pbnRlcnNlY3RzKHQpKXtpZih0aGlzLm9wdGlvbnMubm9DbGlwKXJldHVybiB2b2lkKHRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzKTtmb3IodmFyIG4scz0wLHI9dGhpcy5fcmluZ3MubGVuZ3RoO3M8cjtzKyspbj1vLlBvbHlVdGlsLmNsaXBQb2x5Z29uKHRoaXMuX3JpbmdzW3NdLHQsITApLG4ubGVuZ3RoJiZ0aGlzLl9wYXJ0cy5wdXNoKG4pfX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fdXBkYXRlUG9seSh0aGlzLCEwKX19KSxvLnBvbHlnb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uUG9seWdvbih0LGUpfSxvLlJlY3RhbmdsZT1vLlBvbHlnb24uZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5Qb2x5Z29uLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyx0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCksZSl9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRMYXRMbmdzKHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSl9LF9ib3VuZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9by5sYXRMbmdCb3VuZHModCksW3QuZ2V0U291dGhXZXN0KCksdC5nZXROb3J0aFdlc3QoKSx0LmdldE5vcnRoRWFzdCgpLHQuZ2V0U291dGhFYXN0KCldfX0pLG8ucmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvLlJlY3RhbmdsZSh0LGUpfSxvLkNpcmNsZU1hcmtlcj1vLlBhdGguZXh0ZW5kKHtvcHRpb25zOntmaWxsOiEwLHJhZGl1czoxMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe28uc2V0T3B0aW9ucyh0aGlzLGUpLHRoaXMuX2xhdGxuZz1vLmxhdExuZyh0KSx0aGlzLl9yYWRpdXM9dGhpcy5vcHRpb25zLnJhZGl1c30sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXRsbmc9by5sYXRMbmcodCksdGhpcy5yZWRyYXcoKSx0aGlzLmZpcmUoIm1vdmUiLHtsYXRsbmc6dGhpcy5fbGF0bG5nfSl9LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJhZGl1cz10aGlzLl9yYWRpdXM9dCx0aGlzLnJlZHJhdygpfSxnZXRSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10JiZ0LnJhZGl1c3x8dGhpcy5fcmFkaXVzO3JldHVybiBvLlBhdGgucHJvdG90eXBlLnNldFN0eWxlLmNhbGwodGhpcyx0KSx0aGlzLnNldFJhZGl1cyhlKSx0aGlzfSxfcHJvamVjdDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSx0aGlzLl91cGRhdGVCb3VuZHMoKX0sX3VwZGF0ZUJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JhZGl1cyxlPXRoaXMuX3JhZGl1c1l8fHQsaT10aGlzLl9jbGlja1RvbGVyYW5jZSgpLG49W3QraSxlK2ldO3RoaXMuX3B4Qm91bmRzPW5ldyBvLkJvdW5kcyh0aGlzLl9wb2ludC5zdWJ0cmFjdChuKSx0aGlzLl9wb2ludC5hZGQobikpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl91cGRhdGVQYXRoKCl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZUNpcmNsZSh0aGlzKX0sX2VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1cyYmIXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9weEJvdW5kcyl9fSksby5jaXJjbGVNYXJrZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uQ2lyY2xlTWFya2VyKHQsZSl9LG8uQ2lyY2xlPW8uQ2lyY2xlTWFya2VyLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7aWYoIm51bWJlciI9PXR5cGVvZiBlJiYoZT1vLmV4dGVuZCh7fSxpLHtyYWRpdXM6ZX0pKSxvLnNldE9wdGlvbnModGhpcyxlKSx0aGlzLl9sYXRsbmc9by5sYXRMbmcodCksaXNOYU4odGhpcy5vcHRpb25zLnJhZGl1cykpdGhyb3cgbmV3IEVycm9yKCJDaXJjbGUgcmFkaXVzIGNhbm5vdCBiZSBOYU4iKTt0aGlzLl9tUmFkaXVzPXRoaXMub3B0aW9ucy5yYWRpdXN9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbVJhZGl1cz10LHRoaXMucmVkcmF3KCl9LGdldFJhZGl1czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tUmFkaXVzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5fcmFkaXVzLHRoaXMuX3JhZGl1c1l8fHRoaXMuX3JhZGl1c107cmV0dXJuIG5ldyBvLkxhdExuZ0JvdW5kcyh0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50LnN1YnRyYWN0KHQpKSx0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50LmFkZCh0KSkpOwp9LHNldFN0eWxlOm8uUGF0aC5wcm90b3R5cGUuc2V0U3R5bGUsX3Byb2plY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYXRsbmcubG5nLGU9dGhpcy5fbGF0bG5nLmxhdCxpPXRoaXMuX21hcCxuPWkub3B0aW9ucy5jcnM7aWYobi5kaXN0YW5jZT09PW8uQ1JTLkVhcnRoLmRpc3RhbmNlKXt2YXIgcz1NYXRoLlBJLzE4MCxyPXRoaXMuX21SYWRpdXMvby5DUlMuRWFydGguUi9zLGE9aS5wcm9qZWN0KFtlK3IsdF0pLGg9aS5wcm9qZWN0KFtlLXIsdF0pLGw9YS5hZGQoaCkuZGl2aWRlQnkoMiksdT1pLnVucHJvamVjdChsKS5sYXQsYz1NYXRoLmFjb3MoKE1hdGguY29zKHIqcyktTWF0aC5zaW4oZSpzKSpNYXRoLnNpbih1KnMpKS8oTWF0aC5jb3MoZSpzKSpNYXRoLmNvcyh1KnMpKSkvczsoaXNOYU4oYyl8fDA9PT1jKSYmKGM9ci9NYXRoLmNvcyhNYXRoLlBJLzE4MCplKSksdGhpcy5fcG9pbnQ9bC5zdWJ0cmFjdChpLmdldFBpeGVsT3JpZ2luKCkpLHRoaXMuX3JhZGl1cz1pc05hTihjKT8wOk1hdGgubWF4KE1hdGgucm91bmQobC54LWkucHJvamVjdChbdSx0LWNdKS54KSwxKSx0aGlzLl9yYWRpdXNZPU1hdGgubWF4KE1hdGgucm91bmQobC55LWEueSksMSl9ZWxzZXt2YXIgZD1uLnVucHJvamVjdChuLnByb2plY3QodGhpcy5fbGF0bG5nKS5zdWJ0cmFjdChbdGhpcy5fbVJhZGl1cywwXSkpO3RoaXMuX3BvaW50PWkubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fcmFkaXVzPXRoaXMuX3BvaW50LngtaS5sYXRMbmdUb0xheWVyUG9pbnQoZCkueH10aGlzLl91cGRhdGVCb3VuZHMoKX19KSxvLmNpcmNsZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyBvLkNpcmNsZSh0LGUsaSl9LG8uU1ZHPW8uUmVuZGVyZXIuZXh0ZW5kKHtnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1vLlJlbmRlcmVyLnByb3RvdHlwZS5nZXRFdmVudHMuY2FsbCh0aGlzKTtyZXR1cm4gdC56b29tc3RhcnQ9dGhpcy5fb25ab29tU3RhcnQsdH0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9by5TVkcuY3JlYXRlKCJzdmciKSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSx0aGlzLl9yb290R3JvdXA9by5TVkcuY3JlYXRlKCJnIiksdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3RHcm91cCl9LF9vblpvb21TdGFydDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZSgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8IXRoaXMuX2JvdW5kcyl7by5SZW5kZXJlci5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpO3ZhciB0PXRoaXMuX2JvdW5kcyxlPXQuZ2V0U2l6ZSgpLGk9dGhpcy5fY29udGFpbmVyO3RoaXMuX3N2Z1NpemUmJnRoaXMuX3N2Z1NpemUuZXF1YWxzKGUpfHwodGhpcy5fc3ZnU2l6ZT1lLGkuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZS54KSxpLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlLnkpKSxvLkRvbVV0aWwuc2V0UG9zaXRpb24oaSx0Lm1pbiksaS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLFt0Lm1pbi54LHQubWluLnksZS54LGUueV0uam9pbigiICIpKSx0aGlzLmZpcmUoInVwZGF0ZSIpfX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BhdGg9by5TVkcuY3JlYXRlKCJwYXRoIik7dC5vcHRpb25zLmNsYXNzTmFtZSYmby5Eb21VdGlsLmFkZENsYXNzKGUsdC5vcHRpb25zLmNsYXNzTmFtZSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZvLkRvbVV0aWwuYWRkQ2xhc3MoZSwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tvLnN0YW1wKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9yb290R3JvdXAuYXBwZW5kQ2hpbGQodC5fcGF0aCksdC5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0Ll9wYXRoKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7by5Eb21VdGlsLnJlbW92ZSh0Ll9wYXRoKSx0LnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHQuX3BhdGgpLGRlbGV0ZSB0aGlzLl9sYXllcnNbby5zdGFtcCh0KV19LF91cGRhdGVQYXRoOmZ1bmN0aW9uKHQpe3QuX3Byb2plY3QoKSx0Ll91cGRhdGUoKX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BhdGgsaT10Lm9wdGlvbnM7ZSYmKGkuc3Ryb2tlPyhlLnNldEF0dHJpYnV0ZSgic3Ryb2tlIixpLmNvbG9yKSxlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLGkub3BhY2l0eSksZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsaS53ZWlnaHQpLGUuc2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWNhcCIsaS5saW5lQ2FwKSxlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVqb2luIixpLmxpbmVKb2luKSxpLmRhc2hBcnJheT9lLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hhcnJheSIsaS5kYXNoQXJyYXkpOmUucmVtb3ZlQXR0cmlidXRlKCJzdHJva2UtZGFzaGFycmF5IiksaS5kYXNoT2Zmc2V0P2Uuc2V0QXR0cmlidXRlKCJzdHJva2UtZGFzaG9mZnNldCIsaS5kYXNoT2Zmc2V0KTplLnJlbW92ZUF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hvZmZzZXQiKSk6ZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIm5vbmUiKSxpLmZpbGw/KGUuc2V0QXR0cmlidXRlKCJmaWxsIixpLmZpbGxDb2xvcnx8aS5jb2xvciksZS5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsaS5maWxsT3BhY2l0eSksZS5zZXRBdHRyaWJ1dGUoImZpbGwtcnVsZSIsaS5maWxsUnVsZXx8ImV2ZW5vZGQiKSk6ZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIikpfSxfdXBkYXRlUG9seTpmdW5jdGlvbih0LGUpe3RoaXMuX3NldFBhdGgodCxvLlNWRy5wb2ludHNUb1BhdGgodC5fcGFydHMsZSkpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BvaW50LGk9dC5fcmFkaXVzLG49dC5fcmFkaXVzWXx8aSxvPSJhIitpKyIsIituKyIgMCAxLDAgIixzPXQuX2VtcHR5KCk/Ik0wIDAiOiJNIisoZS54LWkpKyIsIitlLnkrbysyKmkrIiwwICIrbysyKi1pKyIsMCAiO3RoaXMuX3NldFBhdGgodCxzKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxlKXt0Ll9wYXRoLnNldEF0dHJpYnV0ZSgiZCIsZSl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24odCl7by5Eb21VdGlsLnRvRnJvbnQodC5fcGF0aCl9LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXtvLkRvbVV0aWwudG9CYWNrKHQuX3BhdGgpfX0pLG8uZXh0ZW5kKG8uU1ZHLHtjcmVhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCl9LHBvaW50c1RvUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpLG4scyxyLGEsaCxsPSIiO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7aSsrKXtmb3IoYT10W2ldLG49MCxyPWEubGVuZ3RoO248cjtuKyspaD1hW25dLGwrPShuPyJMIjoiTSIpK2gueCsiICIraC55O2wrPWU/by5Ccm93c2VyLnN2Zz8ieiI6IngiOiIifXJldHVybiBsfHwiTTAgMCJ9fSksby5Ccm93c2VyLnN2Zz0hKCFlLmNyZWF0ZUVsZW1lbnROU3x8IW8uU1ZHLmNyZWF0ZSgic3ZnIikuY3JlYXRlU1ZHUmVjdCksby5zdmc9ZnVuY3Rpb24odCl7cmV0dXJuIG8uQnJvd3Nlci5zdmd8fG8uQnJvd3Nlci52bWw/bmV3IG8uU1ZHKHQpOm51bGx9LG8uQnJvd3Nlci52bWw9IW8uQnJvd3Nlci5zdmcmJmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj0iMSIvPic7dmFyIGk9dC5maXJzdENoaWxkO3JldHVybiBpLnN0eWxlLmJlaGF2aW9yPSJ1cmwoI2RlZmF1bHQjVk1MKSIsaSYmIm9iamVjdCI9PXR5cGVvZiBpLmFkan1jYXRjaCh0KXtyZXR1cm4hMX19KCksby5TVkcuaW5jbHVkZShvLkJyb3dzZXIudm1sP3tfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcj1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LXZtbC1jb250YWluZXIiKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8KG8uUmVuZGVyZXIucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKSx0aGlzLmZpcmUoInVwZGF0ZSIpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2NvbnRhaW5lcj1vLlNWRy5jcmVhdGUoInNoYXBlIik7by5Eb21VdGlsLmFkZENsYXNzKGUsImxlYWZsZXQtdm1sLXNoYXBlICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSksZS5jb29yZHNpemU9IjEgMSIsdC5fcGF0aD1vLlNWRy5jcmVhdGUoInBhdGgiKSxlLmFwcGVuZENoaWxkKHQuX3BhdGgpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tvLnN0YW1wKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt2YXIgZT10Ll9jb250YWluZXI7dGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGUpLHQub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdC5hZGRJbnRlcmFjdGl2ZVRhcmdldChlKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5fY29udGFpbmVyO28uRG9tVXRpbC5yZW1vdmUoZSksdC5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldChlKSxkZWxldGUgdGhpcy5fbGF5ZXJzW28uc3RhbXAodCldfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5fc3Ryb2tlLGk9dC5fZmlsbCxuPXQub3B0aW9ucyxzPXQuX2NvbnRhaW5lcjtzLnN0cm9rZWQ9ISFuLnN0cm9rZSxzLmZpbGxlZD0hIW4uZmlsbCxuLnN0cm9rZT8oZXx8KGU9dC5fc3Ryb2tlPW8uU1ZHLmNyZWF0ZSgic3Ryb2tlIikpLHMuYXBwZW5kQ2hpbGQoZSksZS53ZWlnaHQ9bi53ZWlnaHQrInB4IixlLmNvbG9yPW4uY29sb3IsZS5vcGFjaXR5PW4ub3BhY2l0eSxuLmRhc2hBcnJheT9lLmRhc2hTdHlsZT1vLlV0aWwuaXNBcnJheShuLmRhc2hBcnJheSk/bi5kYXNoQXJyYXkuam9pbigiICIpOm4uZGFzaEFycmF5LnJlcGxhY2UoLyggKiwgKikvZywiICIpOmUuZGFzaFN0eWxlPSIiLGUuZW5kY2FwPW4ubGluZUNhcC5yZXBsYWNlKCJidXR0IiwiZmxhdCIpLGUuam9pbnN0eWxlPW4ubGluZUpvaW4pOmUmJihzLnJlbW92ZUNoaWxkKGUpLHQuX3N0cm9rZT1udWxsKSxuLmZpbGw/KGl8fChpPXQuX2ZpbGw9by5TVkcuY3JlYXRlKCJmaWxsIikpLHMuYXBwZW5kQ2hpbGQoaSksaS5jb2xvcj1uLmZpbGxDb2xvcnx8bi5jb2xvcixpLm9wYWNpdHk9bi5maWxsT3BhY2l0eSk6aSYmKHMucmVtb3ZlQ2hpbGQoaSksdC5fZmlsbD1udWxsKX0sX3VwZGF0ZUNpcmNsZTpmdW5jdGlvbih0KXt2YXIgZT10Ll9wb2ludC5yb3VuZCgpLGk9TWF0aC5yb3VuZCh0Ll9yYWRpdXMpLG49TWF0aC5yb3VuZCh0Ll9yYWRpdXNZfHxpKTt0aGlzLl9zZXRQYXRoKHQsdC5fZW1wdHkoKT8iTTAgMCI6IkFMICIrZS54KyIsIitlLnkrIiAiK2krIiwiK24rIiAwLDIzNTkyNjAwIil9LF9zZXRQYXRoOmZ1bmN0aW9uKHQsZSl7dC5fcGF0aC52PWV9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24odCl7by5Eb21VdGlsLnRvRnJvbnQodC5fY29udGFpbmVyKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe28uRG9tVXRpbC50b0JhY2sodC5fY29udGFpbmVyKX19Ont9KSxvLkJyb3dzZXIudm1sJiYoby5TVkcuY3JlYXRlPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLm5hbWVzcGFjZXMuYWRkKCJsdm1sIiwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiKSxmdW5jdGlvbih0KXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KCI8bHZtbDoiK3QrJyBjbGFzcz0ibHZtbCI+Jyl9fWNhdGNoKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KCI8Iit0KycgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC5jb206dm1sIiBjbGFzcz0ibHZtbCI+Jyl9fX0oKSksby5DYW52YXM9by5SZW5kZXJlci5leHRlbmQoe2dldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PW8uUmVuZGVyZXIucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0LnZpZXdwcmVyZXNldD10aGlzLl9vblZpZXdQcmVSZXNldCx0fSxfb25WaWV3UHJlUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSEwfSxvbkFkZDpmdW5jdGlvbigpe28uUmVuZGVyZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyksdGhpcy5fZHJhdygpfSxfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcj1lLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO28uRG9tRXZlbnQub24odCwibW91c2Vtb3ZlIixvLlV0aWwudGhyb3R0bGUodGhpcy5fb25Nb3VzZU1vdmUsMzIsdGhpcyksdGhpcykub24odCwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgY29udGV4dG1lbnUiLHRoaXMuX29uQ2xpY2ssdGhpcykub24odCwibW91c2VvdXQiLHRoaXMuX2hhbmRsZU1vdXNlT3V0LHRoaXMpLHRoaXMuX2N0eD10LmdldENvbnRleHQoIjJkIil9LF91cGRhdGVQYXRoczpmdW5jdGlvbigpe2lmKCF0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzKXt2YXIgdDt0aGlzLl9yZWRyYXdCb3VuZHM9bnVsbDtmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXQ9dGhpcy5fbGF5ZXJzW2VdLHQuX3VwZGF0ZSgpO3RoaXMuX3JlZHJhdygpfX0sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb218fCF0aGlzLl9ib3VuZHMpe3RoaXMuX2RyYXduTGF5ZXJzPXt9LG8uUmVuZGVyZXIucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKTt2YXIgdD10aGlzLl9ib3VuZHMsZT10aGlzLl9jb250YWluZXIsaT10LmdldFNpemUoKSxuPW8uQnJvd3Nlci5yZXRpbmE/MjoxO28uRG9tVXRpbC5zZXRQb3NpdGlvbihlLHQubWluKSxlLndpZHRoPW4qaS54LGUuaGVpZ2h0PW4qaS55LGUuc3R5bGUud2lkdGg9aS54KyJweCIsZS5zdHlsZS5oZWlnaHQ9aS55KyJweCIsby5Ccm93c2VyLnJldGluYSYmdGhpcy5fY3R4LnNjYWxlKDIsMiksdGhpcy5fY3R4LnRyYW5zbGF0ZSgtdC5taW4ueCwtdC5taW4ueSksdGhpcy5maXJlKCJ1cGRhdGUiKX19LF9yZXNldDpmdW5jdGlvbigpe28uUmVuZGVyZXIucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpLHRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHMmJih0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSExLHRoaXMuX3VwZGF0ZVBhdGhzKCkpfSxfaW5pdFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlRGFzaEFycmF5KHQpLHRoaXMuX2xheWVyc1tvLnN0YW1wKHQpXT10O3ZhciBlPXQuX29yZGVyPXtsYXllcjp0LHByZXY6dGhpcy5fZHJhd0xhc3QsbmV4dDpudWxsfTt0aGlzLl9kcmF3TGFzdCYmKHRoaXMuX2RyYXdMYXN0Lm5leHQ9ZSksdGhpcy5fZHJhd0xhc3Q9ZSx0aGlzLl9kcmF3Rmlyc3Q9dGhpcy5fZHJhd0ZpcnN0fHx0aGlzLl9kcmF3TGFzdH0sX2FkZFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5fb3JkZXIsaT1lLm5leHQsbj1lLnByZXY7aT9pLnByZXY9bjp0aGlzLl9kcmF3TGFzdD1uLG4/bi5uZXh0PWk6dGhpcy5fZHJhd0ZpcnN0PWksZGVsZXRlIHQuX29yZGVyLGRlbGV0ZSB0aGlzLl9sYXllcnNbby5zdGFtcCh0KV0sdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fZXh0ZW5kUmVkcmF3Qm91bmRzKHQpLHQuX3Byb2plY3QoKSx0Ll91cGRhdGUoKSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlRGFzaEFycmF5KHQpLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVEYXNoQXJyYXk6ZnVuY3Rpb24odCl7aWYodC5vcHRpb25zLmRhc2hBcnJheSl7dmFyIGUsaT10Lm9wdGlvbnMuZGFzaEFycmF5LnNwbGl0KCIsIiksbj1bXTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKW4ucHVzaChOdW1iZXIoaVtlXSkpO3Qub3B0aW9ucy5fZGFzaEFycmF5PW59fSxfcmVxdWVzdFJlZHJhdzpmdW5jdGlvbih0KXt0aGlzLl9tYXAmJih0aGlzLl9leHRlbmRSZWRyYXdCb3VuZHModCksdGhpcy5fcmVkcmF3UmVxdWVzdD10aGlzLl9yZWRyYXdSZXF1ZXN0fHxvLlV0aWwucmVxdWVzdEFuaW1GcmFtZSh0aGlzLl9yZWRyYXcsdGhpcykpfSxfZXh0ZW5kUmVkcmF3Qm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlPSh0Lm9wdGlvbnMud2VpZ2h0fHwwKSsxO3RoaXMuX3JlZHJhd0JvdW5kcz10aGlzLl9yZWRyYXdCb3VuZHN8fG5ldyBvLkJvdW5kcyx0aGlzLl9yZWRyYXdCb3VuZHMuZXh0ZW5kKHQuX3B4Qm91bmRzLm1pbi5zdWJ0cmFjdChbZSxlXSkpLHRoaXMuX3JlZHJhd0JvdW5kcy5leHRlbmQodC5fcHhCb3VuZHMubWF4LmFkZChbZSxlXSkpfSxfcmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3UmVxdWVzdD1udWxsLHRoaXMuX3JlZHJhd0JvdW5kcyYmKHRoaXMuX3JlZHJhd0JvdW5kcy5taW4uX2Zsb29yKCksdGhpcy5fcmVkcmF3Qm91bmRzLm1heC5fY2VpbCgpKSx0aGlzLl9jbGVhcigpLHRoaXMuX2RyYXcoKSx0aGlzLl9yZWRyYXdCb3VuZHM9bnVsbH0sX2NsZWFyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVkcmF3Qm91bmRzO2lmKHQpe3ZhciBlPXQuZ2V0U2l6ZSgpO3RoaXMuX2N0eC5jbGVhclJlY3QodC5taW4ueCx0Lm1pbi55LGUueCxlLnkpfWVsc2UgdGhpcy5fY3R4LmNsZWFyUmVjdCgwLDAsdGhpcy5fY29udGFpbmVyLndpZHRoLHRoaXMuX2NvbnRhaW5lci5oZWlnaHQpfSxfZHJhdzpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fcmVkcmF3Qm91bmRzO2lmKHRoaXMuX2N0eC5zYXZlKCksZSl7dmFyIGk9ZS5nZXRTaXplKCk7dGhpcy5fY3R4LmJlZ2luUGF0aCgpLHRoaXMuX2N0eC5yZWN0KGUubWluLngsZS5taW4ueSxpLngsaS55KSx0aGlzLl9jdHguY2xpcCgpfXRoaXMuX2RyYXdpbmc9ITA7Zm9yKHZhciBuPXRoaXMuX2RyYXdGaXJzdDtuO249bi5uZXh0KXQ9bi5sYXllciwoIWV8fHQuX3B4Qm91bmRzJiZ0Ll9weEJvdW5kcy5pbnRlcnNlY3RzKGUpKSYmdC5fdXBkYXRlUGF0aCgpO3RoaXMuX2RyYXdpbmc9ITEsdGhpcy5fY3R4LnJlc3RvcmUoKX0sX3VwZGF0ZVBvbHk6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kcmF3aW5nKXt2YXIgaSxuLG8scyxyPXQuX3BhcnRzLGE9ci5sZW5ndGgsaD10aGlzLl9jdHg7aWYoYSl7Zm9yKHRoaXMuX2RyYXduTGF5ZXJzW3QuX2xlYWZsZXRfaWRdPXQsaC5iZWdpblBhdGgoKSxoLnNldExpbmVEYXNoJiZoLnNldExpbmVEYXNoKHQub3B0aW9ucyYmdC5vcHRpb25zLl9kYXNoQXJyYXl8fFtdKSxpPTA7aTxhO2krKyl7Zm9yKG49MCxvPXJbaV0ubGVuZ3RoO248bztuKyspcz1yW2ldW25dLGhbbj8ibGluZVRvIjoibW92ZVRvIl0ocy54LHMueSk7ZSYmaC5jbG9zZVBhdGgoKX10aGlzLl9maWxsU3Ryb2tlKGgsdCl9fX0sX3VwZGF0ZUNpcmNsZTpmdW5jdGlvbih0KXtpZih0aGlzLl9kcmF3aW5nJiYhdC5fZW1wdHkoKSl7dmFyIGU9dC5fcG9pbnQsaT10aGlzLl9jdHgsbj10Ll9yYWRpdXMsbz0odC5fcmFkaXVzWXx8bikvbjt0aGlzLl9kcmF3bkxheWVyc1t0Ll9sZWFmbGV0X2lkXT10LDEhPT1vJiYoaS5zYXZlKCksaS5zY2FsZSgxLG8pKSxpLmJlZ2luUGF0aCgpLGkuYXJjKGUueCxlLnkvbyxuLDAsMipNYXRoLlBJLCExKSwxIT09byYmaS5yZXN0b3JlKCksdGhpcy5fZmlsbFN0cm9rZShpLHQpfX0sX2ZpbGxTdHJva2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLm9wdGlvbnM7aS5maWxsJiYodC5nbG9iYWxBbHBoYT1pLmZpbGxPcGFjaXR5LHQuZmlsbFN0eWxlPWkuZmlsbENvbG9yfHxpLmNvbG9yLHQuZmlsbChpLmZpbGxSdWxlfHwiZXZlbm9kZCIpKSxpLnN0cm9rZSYmMCE9PWkud2VpZ2h0JiYodC5nbG9iYWxBbHBoYT1pLm9wYWNpdHksdC5saW5lV2lkdGg9aS53ZWlnaHQsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQubGluZUNhcD1pLmxpbmVDYXAsdC5saW5lSm9pbj1pLmxpbmVKb2luLHQuc3Ryb2tlKCkpfSxfb25DbGljazpmdW5jdGlvbih0KXtmb3IodmFyIGUsaSxuPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpLHM9dGhpcy5fZHJhd0ZpcnN0O3M7cz1zLm5leHQpZT1zLmxheWVyLGUub3B0aW9ucy5pbnRlcmFjdGl2ZSYmZS5fY29udGFpbnNQb2ludChuKSYmIXRoaXMuX21hcC5fZHJhZ2dhYmxlTW92ZWQoZSkmJihpPWUpO2kmJihvLkRvbUV2ZW50Ll9mYWtlU3RvcCh0KSx0aGlzLl9maXJlRXZlbnQoW2ldLHQpKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX21hcCYmIXRoaXMuX21hcC5kcmFnZ2luZy5tb3ZpbmcoKSYmIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbSl7dmFyIGU9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0xheWVyUG9pbnQodCk7dGhpcy5faGFuZGxlTW91c2VIb3Zlcih0LGUpfX0sX2hhbmRsZU1vdXNlT3V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2hvdmVyZWRMYXllcjtlJiYoby5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX2ZpcmVFdmVudChbZV0sdCwibW91c2VvdXQiKSx0aGlzLl9ob3ZlcmVkTGF5ZXI9bnVsbCl9LF9oYW5kbGVNb3VzZUhvdmVyOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG4scz10aGlzLl9kcmF3Rmlyc3Q7cztzPXMubmV4dClpPXMubGF5ZXIsaS5vcHRpb25zLmludGVyYWN0aXZlJiZpLl9jb250YWluc1BvaW50KGUpJiYobj1pKTtuIT09dGhpcy5faG92ZXJlZExheWVyJiYodGhpcy5faGFuZGxlTW91c2VPdXQodCksbiYmKG8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLl9maXJlRXZlbnQoW25dLHQsIm1vdXNlb3ZlciIpLHRoaXMuX2hvdmVyZWRMYXllcj1uKSksdGhpcy5faG92ZXJlZExheWVyJiZ0aGlzLl9maXJlRXZlbnQoW3RoaXMuX2hvdmVyZWRMYXllcl0sdCl9LF9maXJlRXZlbnQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX21hcC5fZmlyZURPTUV2ZW50KGUsaXx8ZS50eXBlLHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX29yZGVyLGk9ZS5uZXh0LG49ZS5wcmV2O2kmJihpLnByZXY9bixuP24ubmV4dD1pOmkmJih0aGlzLl9kcmF3Rmlyc3Q9aSksZS5wcmV2PXRoaXMuX2RyYXdMYXN0LHRoaXMuX2RyYXdMYXN0Lm5leHQ9ZSxlLm5leHQ9bnVsbCx0aGlzLl9kcmF3TGFzdD1lLHRoaXMuX3JlcXVlc3RSZWRyYXcodCkpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7dmFyIGU9dC5fb3JkZXIsaT1lLm5leHQsbj1lLnByZXY7biYmKG4ubmV4dD1pLGk/aS5wcmV2PW46biYmKHRoaXMuX2RyYXdMYXN0PW4pLGUucHJldj1udWxsLGUubmV4dD10aGlzLl9kcmF3Rmlyc3QsdGhpcy5fZHJhd0ZpcnN0LnByZXY9ZSx0aGlzLl9kcmF3Rmlyc3Q9ZSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpKX19KSxvLkJyb3dzZXIuY2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuISFlLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHR9KCksby5jYW52YXM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uQnJvd3Nlci5jYW52YXM/bmV3IG8uQ2FudmFzKHQpOm51bGx9LG8uUG9seWxpbmUucHJvdG90eXBlLl9jb250YWluc1BvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGksbixzLHIsYSxoLGw9dGhpcy5fY2xpY2tUb2xlcmFuY2UoKTtpZighdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKGk9MCxyPXRoaXMuX3BhcnRzLmxlbmd0aDtpPHI7aSsrKWZvcihoPXRoaXMuX3BhcnRzW2ldLG49MCxhPWgubGVuZ3RoLHM9YS0xO248YTtzPW4rKylpZigoZXx8MCE9PW4pJiZvLkxpbmVVdGlsLnBvaW50VG9TZWdtZW50RGlzdGFuY2UodCxoW3NdLGhbbl0pPD1sKXJldHVybiEwO3JldHVybiExfSxvLlBvbHlnb24ucHJvdG90eXBlLl9jb250YWluc1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHIsYSxoLGwsdT0hMTtpZighdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKHM9MCxoPXRoaXMuX3BhcnRzLmxlbmd0aDtzPGg7cysrKWZvcihlPXRoaXMuX3BhcnRzW3NdLHI9MCxsPWUubGVuZ3RoLGE9bC0xO3I8bDthPXIrKylpPWVbcl0sbj1lW2FdLGkueT50LnkhPW4ueT50LnkmJnQueDwobi54LWkueCkqKHQueS1pLnkpLyhuLnktaS55KStpLngmJih1PSF1KTtyZXR1cm4gdXx8by5Qb2x5bGluZS5wcm90b3R5cGUuX2NvbnRhaW5zUG9pbnQuY2FsbCh0aGlzLHQsITApfSxvLkNpcmNsZU1hcmtlci5wcm90b3R5cGUuX2NvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLl9wb2ludCk8PXRoaXMuX3JhZGl1cyt0aGlzLl9jbGlja1RvbGVyYW5jZSgpfSxvLkdlb0pTT049by5GZWF0dXJlR3JvdXAuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7by5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5fbGF5ZXJzPXt9LHQmJnRoaXMuYWRkRGF0YSh0KX0sYWRkRGF0YTpmdW5jdGlvbih0KXt2YXIgZSxpLG4scz1vLlV0aWwuaXNBcnJheSh0KT90OnQuZmVhdHVyZXM7aWYocyl7Zm9yKGU9MCxpPXMubGVuZ3RoO2U8aTtlKyspbj1zW2VdLChuLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEobik7cmV0dXJuIHRoaXN9dmFyIHI9dGhpcy5vcHRpb25zO2lmKHIuZmlsdGVyJiYhci5maWx0ZXIodCkpcmV0dXJuIHRoaXM7dmFyIGE9by5HZW9KU09OLmdlb21ldHJ5VG9MYXllcih0LHIpO3JldHVybiBhPyhhLmZlYXR1cmU9by5HZW9KU09OLmFzRmVhdHVyZSh0KSxhLmRlZmF1bHRPcHRpb25zPWEub3B0aW9ucyx0aGlzLnJlc2V0U3R5bGUoYSksci5vbkVhY2hGZWF0dXJlJiZyLm9uRWFjaEZlYXR1cmUodCxhKSx0aGlzLmFkZExheWVyKGEpKTp0aGlzfSxyZXNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wdGlvbnM9by5VdGlsLmV4dGVuZCh7fSx0LmRlZmF1bHRPcHRpb25zKSx0aGlzLl9zZXRMYXllclN0eWxlKHQsdGhpcy5vcHRpb25zLnN0eWxlKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24oZSl7dGhpcy5fc2V0TGF5ZXJTdHlsZShlLHQpfSx0aGlzKX0sX3NldExheWVyU3R5bGU6ZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGU9ZSh0LmZlYXR1cmUpKSx0LnNldFN0eWxlJiZ0LnNldFN0eWxlKGUpfX0pLG8uZXh0ZW5kKG8uR2VvSlNPTix7Z2VvbWV0cnlUb0xheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzLHIsYT0iRmVhdHVyZSI9PT10LnR5cGU/dC5nZW9tZXRyeTp0LGg9YT9hLmNvb3JkaW5hdGVzOm51bGwsbD1bXSx1PWUmJmUucG9pbnRUb0xheWVyLGM9ZSYmZS5jb29yZHNUb0xhdExuZ3x8dGhpcy5jb29yZHNUb0xhdExuZztpZighaCYmIWEpcmV0dXJuIG51bGw7c3dpdGNoKGEudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIGk9YyhoKSx1P3UodCxpKTpuZXcgby5NYXJrZXIoaSk7Y2FzZSJNdWx0aVBvaW50Ijpmb3Iocz0wLHI9aC5sZW5ndGg7czxyO3MrKylpPWMoaFtzXSksbC5wdXNoKHU/dSh0LGkpOm5ldyBvLk1hcmtlcihpKSk7cmV0dXJuIG5ldyBvLkZlYXR1cmVHcm91cChsKTtjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpyZXR1cm4gbj10aGlzLmNvb3Jkc1RvTGF0TG5ncyhoLCJMaW5lU3RyaW5nIj09PWEudHlwZT8wOjEsYyksbmV3IG8uUG9seWxpbmUobixlKTtjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gbj10aGlzLmNvb3Jkc1RvTGF0TG5ncyhoLCJQb2x5Z29uIj09PWEudHlwZT8xOjIsYyksbmV3IG8uUG9seWdvbihuLGUpO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocz0wLHI9YS5nZW9tZXRyaWVzLmxlbmd0aDtzPHI7cysrKXt2YXIgZD10aGlzLmdlb21ldHJ5VG9MYXllcih7Z2VvbWV0cnk6YS5nZW9tZXRyaWVzW3NdLHR5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzfSxlKTtkJiZsLnB1c2goZCl9cmV0dXJuIG5ldyBvLkZlYXR1cmVHcm91cChsKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBHZW9KU09OIG9iamVjdC4iKX19LGNvb3Jkc1RvTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5MYXRMbmcodFsxXSx0WzBdLHRbMl0pfSxjb29yZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbixvPVtdLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspbj1lP3RoaXMuY29vcmRzVG9MYXRMbmdzKHRbc10sZS0xLGkpOihpfHx0aGlzLmNvb3Jkc1RvTGF0TG5nKSh0W3NdKSxvLnB1c2gobik7cmV0dXJuIG99LGxhdExuZ1RvQ29vcmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFsdCE9PWk/W3QubG5nLHQubGF0LHQuYWx0XTpbdC5sbmcsdC5sYXRdfSxsYXRMbmdzVG9Db29yZHM6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW4ucHVzaChlP28uR2VvSlNPTi5sYXRMbmdzVG9Db29yZHModFtzXSxlLTEsaSk6by5HZW9KU09OLmxhdExuZ1RvQ29vcmRzKHRbc10pKTtyZXR1cm4hZSYmaSYmbi5wdXNoKG5bMF0pLG59LGdldEZlYXR1cmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5mZWF0dXJlP28uZXh0ZW5kKHt9LHQuZmVhdHVyZSx7Z2VvbWV0cnk6ZX0pOm8uR2VvSlNPTi5hc0ZlYXR1cmUoZSl9LGFzRmVhdHVyZTpmdW5jdGlvbih0KXtyZXR1cm4iRmVhdHVyZSI9PT10LnR5cGV8fCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU/dDp7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7fSxnZW9tZXRyeTp0fX19KTt2YXIgYT17dG9HZW9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIG8uR2VvSlNPTi5nZXRGZWF0dXJlKHRoaXMse3R5cGU6IlBvaW50Iixjb29yZGluYXRlczpvLkdlb0pTT04ubGF0TG5nVG9Db29yZHModGhpcy5nZXRMYXRMbmcoKSl9KX19O28uTWFya2VyLmluY2x1ZGUoYSksby5DaXJjbGUuaW5jbHVkZShhKSxvLkNpcmNsZU1hcmtlci5pbmNsdWRlKGEpLG8uUG9seWxpbmUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbigpe3ZhciB0PSFvLlBvbHlsaW5lLl9mbGF0KHRoaXMuX2xhdGxuZ3MpLGU9by5HZW9KU09OLmxhdExuZ3NUb0Nvb3Jkcyh0aGlzLl9sYXRsbmdzLHQ/MTowKTtyZXR1cm4gby5HZW9KU09OLmdldEZlYXR1cmUodGhpcyx7dHlwZToodD8iTXVsdGkiOiIiKSsiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6ZX0pfSxvLlBvbHlnb24ucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbigpe3ZhciB0PSFvLlBvbHlsaW5lLl9mbGF0KHRoaXMuX2xhdGxuZ3MpLGU9dCYmIW8uUG9seWxpbmUuX2ZsYXQodGhpcy5fbGF0bG5nc1swXSksaT1vLkdlb0pTT04ubGF0TG5nc1RvQ29vcmRzKHRoaXMuX2xhdGxuZ3MsZT8yOnQ/MTowLCEwKTtyZXR1cm4gdHx8KGk9W2ldKSxvLkdlb0pTT04uZ2V0RmVhdHVyZSh0aGlzLHt0eXBlOihlPyJNdWx0aSI6IiIpKyJQb2x5Z29uIixjb29yZGluYXRlczppfSl9LG8uTGF5ZXJHcm91cC5pbmNsdWRlKHt0b011bHRpUG9pbnQ6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24oZSl7dC5wdXNoKGUudG9HZW9KU09OKCkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpfSksby5HZW9KU09OLmdldEZlYXR1cmUodGhpcyx7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6dH0pfSx0b0dlb0pTT046ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRyeSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5LnR5cGU7aWYoIk11bHRpUG9pbnQiPT09dClyZXR1cm4gdGhpcy50b011bHRpUG9pbnQoKTt2YXIgZT0iR2VvbWV0cnlDb2xsZWN0aW9uIj09PXQsaT1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7aWYodC50b0dlb0pTT04pe3ZhciBuPXQudG9HZW9KU09OKCk7aS5wdXNoKGU/bi5nZW9tZXRyeTpvLkdlb0pTT04uYXNGZWF0dXJlKG4pKX19KSxlP28uR2VvSlNPTi5nZXRGZWF0dXJlKHRoaXMse2dlb21ldHJpZXM6aSx0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24ifSk6e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczppfX19KSxvLmdlb0pTT049ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8uR2VvSlNPTih0LGUpfSxvLmdlb0pzb249by5nZW9KU09OLG8uRHJhZ2dhYmxlPW8uRXZlbnRlZC5leHRlbmQoe29wdGlvbnM6e2NsaWNrVG9sZXJhbmNlOjN9LHN0YXRpY3M6e1NUQVJUOm8uQnJvd3Nlci50b3VjaD9bInRvdWNoc3RhcnQiLCJtb3VzZWRvd24iXTpbIm1vdXNlZG93biJdLEVORDp7bW91c2Vkb3duOiJtb3VzZXVwIix0b3VjaHN0YXJ0OiJ0b3VjaGVuZCIscG9pbnRlcmRvd246InRvdWNoZW5kIixNU1BvaW50ZXJEb3duOiJ0b3VjaGVuZCJ9LE1PVkU6e21vdXNlZG93bjoibW91c2Vtb3ZlIix0b3VjaHN0YXJ0OiJ0b3VjaG1vdmUiLHBvaW50ZXJkb3duOiJ0b3VjaG1vdmUiLE1TUG9pbnRlckRvd246InRvdWNobW92ZSJ9fSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0PWV8fHQsdGhpcy5fcHJldmVudE91dGxpbmU9aX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZHx8KG8uRG9tRXZlbnQub24odGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LG8uRHJhZ2dhYmxlLlNUQVJULmpvaW4oIiAiKSx0aGlzLl9vbkRvd24sdGhpcyksdGhpcy5fZW5hYmxlZD0hMCl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbmFibGVkJiYoby5EcmFnZ2FibGUuX2RyYWdnaW5nPT09dGhpcyYmdGhpcy5maW5pc2hEcmFnKCksby5Eb21FdmVudC5vZmYodGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LG8uRHJhZ2dhYmxlLlNUQVJULmpvaW4oIiAiKSx0aGlzLl9vbkRvd24sdGhpcyksdGhpcy5fZW5hYmxlZD0hMSx0aGlzLl9tb3ZlZD0hMSl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYoIXQuX3NpbXVsYXRlZCYmdGhpcy5fZW5hYmxlZCYmKHRoaXMuX21vdmVkPSExLCFvLkRvbVV0aWwuaGFzQ2xhc3ModGhpcy5fZWxlbWVudCwibGVhZmxldC16b29tLWFuaW0iKSYmIShvLkRyYWdnYWJsZS5fZHJhZ2dpbmd8fHQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24mJiF0LnRvdWNoZXN8fChvLkRyYWdnYWJsZS5fZHJhZ2dpbmc9dGhpcyx0aGlzLl9wcmV2ZW50T3V0bGluZSYmby5Eb21VdGlsLnByZXZlbnRPdXRsaW5lKHRoaXMuX2VsZW1lbnQpLG8uRG9tVXRpbC5kaXNhYmxlSW1hZ2VEcmFnKCksby5Eb21VdGlsLmRpc2FibGVUZXh0U2VsZWN0aW9uKCksdGhpcy5fbW92aW5nKSkpKXt0aGlzLmZpcmUoImRvd24iKTt2YXIgaT10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQ7dGhpcy5fc3RhcnRQb2ludD1uZXcgby5Qb2ludChpLmNsaWVudFgsaS5jbGllbnRZKSxvLkRvbUV2ZW50Lm9uKGUsby5EcmFnZ2FibGUuTU9WRVt0LnR5cGVdLHRoaXMuX29uTW92ZSx0aGlzKS5vbihlLG8uRHJhZ2dhYmxlLkVORFt0LnR5cGVdLHRoaXMuX29uVXAsdGhpcyl9fSxfb25Nb3ZlOmZ1bmN0aW9uKGkpe2lmKCFpLl9zaW11bGF0ZWQmJnRoaXMuX2VuYWJsZWQpe2lmKGkudG91Y2hlcyYmaS50b3VjaGVzLmxlbmd0aD4xKXJldHVybiB2b2lkKHRoaXMuX21vdmVkPSEwKTt2YXIgbj1pLnRvdWNoZXMmJjE9PT1pLnRvdWNoZXMubGVuZ3RoP2kudG91Y2hlc1swXTppLHM9bmV3IG8uUG9pbnQobi5jbGllbnRYLG4uY2xpZW50WSkscj1zLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9pbnQpOyhyLnh8fHIueSkmJihNYXRoLmFicyhyLngpK01hdGguYWJzKHIueSk8dGhpcy5vcHRpb25zLmNsaWNrVG9sZXJhbmNlfHwoby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdChpKSx0aGlzLl9tb3ZlZHx8KHRoaXMuZmlyZSgiZHJhZ3N0YXJ0IiksdGhpcy5fbW92ZWQ9ITAsdGhpcy5fc3RhcnRQb3M9by5Eb21VdGlsLmdldFBvc2l0aW9uKHRoaXMuX2VsZW1lbnQpLnN1YnRyYWN0KHIpLG8uRG9tVXRpbC5hZGRDbGFzcyhlLmJvZHksImxlYWZsZXQtZHJhZ2dpbmciKSx0aGlzLl9sYXN0VGFyZ2V0PWkudGFyZ2V0fHxpLnNyY0VsZW1lbnQsdC5TVkdFbGVtZW50SW5zdGFuY2UmJnRoaXMuX2xhc3RUYXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50SW5zdGFuY2UmJih0aGlzLl9sYXN0VGFyZ2V0PXRoaXMuX2xhc3RUYXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLG8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9sYXN0VGFyZ2V0LCJsZWFmbGV0LWRyYWctdGFyZ2V0IikpLHRoaXMuX25ld1Bvcz10aGlzLl9zdGFydFBvcy5hZGQociksdGhpcy5fbW92aW5nPSEwLG8uVXRpbC5jYW5jZWxBbmltRnJhbWUodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuX2xhc3RFdmVudD1pLHRoaXMuX2FuaW1SZXF1ZXN0PW8uVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKHRoaXMuX3VwZGF0ZVBvc2l0aW9uLHRoaXMsITApKSl9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD17b3JpZ2luYWxFdmVudDp0aGlzLl9sYXN0RXZlbnR9O3RoaXMuZmlyZSgicHJlZHJhZyIsdCksby5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2VsZW1lbnQsdGhpcy5fbmV3UG9zKSx0aGlzLmZpcmUoImRyYWciLHQpfSxfb25VcDpmdW5jdGlvbih0KXshdC5fc2ltdWxhdGVkJiZ0aGlzLl9lbmFibGVkJiZ0aGlzLmZpbmlzaERyYWcoKX0sZmluaXNoRHJhZzpmdW5jdGlvbigpe28uRG9tVXRpbC5yZW1vdmVDbGFzcyhlLmJvZHksImxlYWZsZXQtZHJhZ2dpbmciKSx0aGlzLl9sYXN0VGFyZ2V0JiYoby5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2xhc3RUYXJnZXQsImxlYWZsZXQtZHJhZy10YXJnZXQiKSx0aGlzLl9sYXN0VGFyZ2V0PW51bGwpO2Zvcih2YXIgdCBpbiBvLkRyYWdnYWJsZS5NT1ZFKW8uRG9tRXZlbnQub2ZmKGUsby5EcmFnZ2FibGUuTU9WRVt0XSx0aGlzLl9vbk1vdmUsdGhpcykub2ZmKGUsby5EcmFnZ2FibGUuRU5EW3RdLHRoaXMuX29uVXAsdGhpcyk7by5Eb21VdGlsLmVuYWJsZUltYWdlRHJhZygpLG8uRG9tVXRpbC5lbmFibGVUZXh0U2VsZWN0aW9uKCksdGhpcy5fbW92ZWQmJnRoaXMuX21vdmluZyYmKG8uVXRpbC5jYW5jZWxBbmltRnJhbWUodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuZmlyZSgiZHJhZ2VuZCIse2Rpc3RhbmNlOnRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKX0pKSx0aGlzLl9tb3Zpbmc9ITEsby5EcmFnZ2FibGUuX2RyYWdnaW5nPSExfX0pLG8uSGFuZGxlcj1vLkNsYXNzLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dH0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ/dGhpczoodGhpcy5fZW5hYmxlZD0hMCx0aGlzLmFkZEhvb2tzKCksdGhpcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5hYmxlZD8odGhpcy5fZW5hYmxlZD0hMSx0aGlzLnJlbW92ZUhvb2tzKCksdGhpcyk6dGhpc30sZW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH19KSxvLk1hcC5tZXJnZU9wdGlvbnMoe2RyYWdnaW5nOiEwLGluZXJ0aWE6IW8uQnJvd3Nlci5hbmRyb2lkMjMsaW5lcnRpYURlY2VsZXJhdGlvbjozNDAwLGluZXJ0aWFNYXhTcGVlZDoxLzAsZWFzZUxpbmVhcml0eTouMix3b3JsZENvcHlKdW1wOiExLG1heEJvdW5kc1Zpc2Nvc2l0eTowfSksby5NYXAuRHJhZz1vLkhhbmRsZXIuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe2lmKCF0aGlzLl9kcmFnZ2FibGUpe3ZhciB0PXRoaXMuX21hcDt0aGlzLl9kcmFnZ2FibGU9bmV3IG8uRHJhZ2dhYmxlKHQuX21hcFBhbmUsdC5fY29udGFpbmVyKSx0aGlzLl9kcmFnZ2FibGUub24oe2Rvd246dGhpcy5fb25Eb3duLGRyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcyksdGhpcy5fZHJhZ2dhYmxlLm9uKCJwcmVkcmFnIix0aGlzLl9vblByZURyYWdMaW1pdCx0aGlzKSx0Lm9wdGlvbnMud29ybGRDb3B5SnVtcCYmKHRoaXMuX2RyYWdnYWJsZS5vbigicHJlZHJhZyIsdGhpcy5fb25QcmVEcmFnV3JhcCx0aGlzKSx0Lm9uKCJ6b29tZW5kIix0aGlzLl9vblpvb21FbmQsdGhpcyksdC53aGVuUmVhZHkodGhpcy5fb25ab29tRW5kLHRoaXMpKX1vLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtZ3JhYiBsZWFmbGV0LXRvdWNoLWRyYWciKSx0aGlzLl9kcmFnZ2FibGUuZW5hYmxlKCksdGhpcy5fcG9zaXRpb25zPVtdLHRoaXMuX3RpbWVzPVtdfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9tYXAuX2NvbnRhaW5lciwibGVhZmxldC1ncmFiIiksby5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLWRyYWciKSx0aGlzLl9kcmFnZ2FibGUuZGlzYWJsZSgpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92ZWR9LG1vdmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92aW5nfSxfb25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9zdG9wKCl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcDtpZih0aGlzLl9tYXAub3B0aW9ucy5tYXhCb3VuZHMmJnRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kc1Zpc2Nvc2l0eSl7dmFyIGU9by5sYXRMbmdCb3VuZHModGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzKTt0aGlzLl9vZmZzZXRMaW1pdD1vLmJvdW5kcyh0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChlLmdldE5vcnRoV2VzdCgpKS5tdWx0aXBseUJ5KC0xKSx0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChlLmdldFNvdXRoRWFzdCgpKS5tdWx0aXBseUJ5KC0xKS5hZGQodGhpcy5fbWFwLmdldFNpemUoKSkpLHRoaXMuX3Zpc2Nvc2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KSl9ZWxzZSB0aGlzLl9vZmZzZXRMaW1pdD1udWxsO3QuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0IiksdC5vcHRpb25zLmluZXJ0aWEmJih0aGlzLl9wb3NpdGlvbnM9W10sdGhpcy5fdGltZXM9W10pfSxfb25EcmFnOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX21hcC5vcHRpb25zLmluZXJ0aWEpe3ZhciBlPXRoaXMuX2xhc3RUaW1lPStuZXcgRGF0ZSxpPXRoaXMuX2xhc3RQb3M9dGhpcy5fZHJhZ2dhYmxlLl9hYnNQb3N8fHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zO3RoaXMuX3Bvc2l0aW9ucy5wdXNoKGkpLHRoaXMuX3RpbWVzLnB1c2goZSksZS10aGlzLl90aW1lc1swXT41MCYmKHRoaXMuX3Bvc2l0aW9ucy5zaGlmdCgpLHRoaXMuX3RpbWVzLnNoaWZ0KCkpfXRoaXMuX21hcC5maXJlKCJtb3ZlIix0KS5maXJlKCJkcmFnIix0KX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksZT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFswLDBdKTt0aGlzLl9pbml0aWFsV29ybGRPZmZzZXQ9ZS5zdWJ0cmFjdCh0KS54LHRoaXMuX3dvcmxkV2lkdGg9dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKS5nZXRTaXplKCkueH0sX3Zpc2NvdXNMaW1pdDpmdW5jdGlvbih0LGUpe3JldHVybiB0LSh0LWUpKnRoaXMuX3Zpc2Nvc2l0eX0sX29uUHJlRHJhZ0xpbWl0OmZ1bmN0aW9uKCl7aWYodGhpcy5fdmlzY29zaXR5JiZ0aGlzLl9vZmZzZXRMaW1pdCl7dmFyIHQ9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3Muc3VidHJhY3QodGhpcy5fZHJhZ2dhYmxlLl9zdGFydFBvcyksZT10aGlzLl9vZmZzZXRMaW1pdDt0Lng8ZS5taW4ueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGUubWluLngpKSx0Lnk8ZS5taW4ueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGUubWluLnkpKSx0Lng+ZS5tYXgueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGUubWF4LngpKSx0Lnk+ZS5tYXgueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGUubWF4LnkpKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcz10aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLmFkZCh0KX19LF9vblByZURyYWdXcmFwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd29ybGRXaWR0aCxlPU1hdGgucm91bmQodC8yKSxpPXRoaXMuX2luaXRpYWxXb3JsZE9mZnNldCxuPXRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLngsbz0obi1lK2kpJXQrZS1pLHM9KG4rZStpKSV0LWUtaSxyPU1hdGguYWJzKG8raSk8TWF0aC5hYnMocytpKT9vOnM7dGhpcy5fZHJhZ2dhYmxlLl9hYnNQb3M9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuY2xvbmUoKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy54PXJ9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9ZS5vcHRpb25zLG49IWkuaW5lcnRpYXx8dGhpcy5fdGltZXMubGVuZ3RoPDI7aWYoZS5maXJlKCJkcmFnZW5kIix0KSxuKWUuZmlyZSgibW92ZWVuZCIpO2Vsc2V7dmFyIHM9dGhpcy5fbGFzdFBvcy5zdWJ0cmFjdCh0aGlzLl9wb3NpdGlvbnNbMF0pLHI9KHRoaXMuX2xhc3RUaW1lLXRoaXMuX3RpbWVzWzBdKS8xZTMsYT1pLmVhc2VMaW5lYXJpdHksaD1zLm11bHRpcGx5QnkoYS9yKSxsPWguZGlzdGFuY2VUbyhbMCwwXSksdT1NYXRoLm1pbihpLmluZXJ0aWFNYXhTcGVlZCxsKSxjPWgubXVsdGlwbHlCeSh1L2wpLGQ9dS8oaS5pbmVydGlhRGVjZWxlcmF0aW9uKmEpLF89Yy5tdWx0aXBseUJ5KC1kLzIpLnJvdW5kKCk7Xy54fHxfLnk/KF89ZS5fbGltaXRPZmZzZXQoXyxlLm9wdGlvbnMubWF4Qm91bmRzKSxvLlV0aWwucmVxdWVzdEFuaW1GcmFtZShmdW5jdGlvbigpe2UucGFuQnkoXyx7ZHVyYXRpb246ZCxlYXNlTGluZWFyaXR5OmEsbm9Nb3ZlU3RhcnQ6ITAsYW5pbWF0ZTohMH0pfSkpOmUuZmlyZSgibW92ZWVuZCIpfX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImRyYWdnaW5nIixvLk1hcC5EcmFnKSxvLk1hcC5tZXJnZU9wdGlvbnMoe2RvdWJsZUNsaWNrWm9vbTohMH0pLG8uTWFwLkRvdWJsZUNsaWNrWm9vbT1vLkhhbmRsZXIuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LF9vbkRvdWJsZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPWUuZ2V0Wm9vbSgpLG49ZS5vcHRpb25zLnpvb21EZWx0YSxvPXQub3JpZ2luYWxFdmVudC5zaGlmdEtleT9pLW46aStuOyJjZW50ZXIiPT09ZS5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbT9lLnNldFpvb20obyk6ZS5zZXRab29tQXJvdW5kKHQuY29udGFpbmVyUG9pbnQsbyl9fSksby5NYXAuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJkb3VibGVDbGlja1pvb20iLG8uTWFwLkRvdWJsZUNsaWNrWm9vbSksby5NYXAubWVyZ2VPcHRpb25zKHtzY3JvbGxXaGVlbFpvb206ITAsd2hlZWxEZWJvdW5jZVRpbWU6NDAsd2hlZWxQeFBlclpvb21MZXZlbDo2MH0pLG8uTWFwLlNjcm9sbFdoZWVsWm9vbT1vLkhhbmRsZXIuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub24odGhpcy5fbWFwLl9jb250YWluZXIsIm1vdXNld2hlZWwiLHRoaXMuX29uV2hlZWxTY3JvbGwsdGhpcyksdGhpcy5fZGVsdGE9MH0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtvLkRvbUV2ZW50Lm9mZih0aGlzLl9tYXAuX2NvbnRhaW5lciwibW91c2V3aGVlbCIsdGhpcy5fb25XaGVlbFNjcm9sbCx0aGlzKX0sX29uV2hlZWxTY3JvbGw6ZnVuY3Rpb24odCl7dmFyIGU9by5Eb21FdmVudC5nZXRXaGVlbERlbHRhKHQpLGk9dGhpcy5fbWFwLm9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWU7dGhpcy5fZGVsdGErPWUsdGhpcy5fbGFzdE1vdXNlUG9zPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSx0aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlKTt2YXIgbj1NYXRoLm1heChpLSgrbmV3IERhdGUtdGhpcy5fc3RhcnRUaW1lKSwwKTtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoby5iaW5kKHRoaXMuX3BlcmZvcm1ab29tLHRoaXMpLG4pLG8uRG9tRXZlbnQuc3RvcCh0KX0sX3BlcmZvcm1ab29tOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGU9dC5nZXRab29tKCksaT10aGlzLl9tYXAub3B0aW9ucy56b29tU25hcHx8MDt0Ll9zdG9wKCk7dmFyIG49dGhpcy5fZGVsdGEvKDQqdGhpcy5fbWFwLm9wdGlvbnMud2hlZWxQeFBlclpvb21MZXZlbCksbz00Kk1hdGgubG9nKDIvKDErTWF0aC5leHAoLU1hdGguYWJzKG4pKSkpL01hdGguTE4yLHM9aT9NYXRoLmNlaWwoby9pKSppOm8scj10Ll9saW1pdFpvb20oZSsodGhpcy5fZGVsdGE+MD9zOi1zKSktZTt0aGlzLl9kZWx0YT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHImJigiY2VudGVyIj09PXQub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20/dC5zZXRab29tKGUrcik6dC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcyxlK3IpKX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsInNjcm9sbFdoZWVsWm9vbSIsby5NYXAuU2Nyb2xsV2hlZWxab29tKSxvLmV4dGVuZChvLkRvbUV2ZW50LHtfdG91Y2hzdGFydDpvLkJyb3dzZXIubXNQb2ludGVyPyJNU1BvaW50ZXJEb3duIjpvLkJyb3dzZXIucG9pbnRlcj8icG9pbnRlcmRvd24iOiJ0b3VjaHN0YXJ0IixfdG91Y2hlbmQ6by5Ccm93c2VyLm1zUG9pbnRlcj8iTVNQb2ludGVyVXAiOm8uQnJvd3Nlci5wb2ludGVyPyJwb2ludGVydXAiOiJ0b3VjaGVuZCIsYWRkRG91YmxlVGFwTGlzdGVuZXI6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7dmFyIGU7aWYoby5Ccm93c2VyLnBvaW50ZXIpe2lmKCFvLkJyb3dzZXIuZWRnZXx8Im1vdXNlIj09PXQucG9pbnRlclR5cGUpcmV0dXJuO2U9by5Eb21FdmVudC5fcG9pbnRlcnNDb3VudH1lbHNlIGU9dC50b3VjaGVzLmxlbmd0aDtpZighKGU+MSkpe3ZhciBpPURhdGUubm93KCksbj1pLShyfHxpKTthPXQudG91Y2hlcz90LnRvdWNoZXNbMF06dCxoPW4+MCYmbjw9bCxyPWl9fWZ1bmN0aW9uIHModCl7aWYoaCYmIWEuY2FuY2VsQnViYmxlKXtpZihvLkJyb3dzZXIucG9pbnRlcil7aWYoIW8uQnJvd3Nlci5lZGdlfHwibW91c2UiPT09dC5wb2ludGVyVHlwZSlyZXR1cm47dmFyIGksbixzPXt9O2ZvcihuIGluIGEpaT1hW25dLHNbbl09aSYmaS5iaW5kP2kuYmluZChhKTppO2E9c31hLnR5cGU9ImRibGNsaWNrIixlKGEpLHI9bnVsbH19dmFyIHIsYSxoPSExLGw9MjUwLHU9Il9sZWFmbGV0XyIsYz10aGlzLl90b3VjaHN0YXJ0LGQ9dGhpcy5fdG91Y2hlbmQ7cmV0dXJuIHRbdStjK2ldPW4sdFt1K2QraV09cyx0W3UrImRibGNsaWNrIitpXT1lLHQuYWRkRXZlbnRMaXN0ZW5lcihjLG4sITEpLHQuYWRkRXZlbnRMaXN0ZW5lcihkLHMsITEpLHQuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLGUsITEpLHRoaXN9LHJlbW92ZURvdWJsZVRhcExpc3RlbmVyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9Il9sZWFmbGV0XyIsbj10W2krdGhpcy5fdG91Y2hzdGFydCtlXSxzPXRbaSt0aGlzLl90b3VjaGVuZCtlXSxyPXRbaSsiZGJsY2xpY2siK2VdO3JldHVybiB0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fdG91Y2hzdGFydCxuLCExKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fdG91Y2hlbmQscywhMSksby5Ccm93c2VyLmVkZ2V8fHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLHIsITEpLHRoaXN9fSksby5leHRlbmQoby5Eb21FdmVudCx7UE9JTlRFUl9ET1dOOm8uQnJvd3Nlci5tc1BvaW50ZXI/Ik1TUG9pbnRlckRvd24iOiJwb2ludGVyZG93biIsUE9JTlRFUl9NT1ZFOm8uQnJvd3Nlci5tc1BvaW50ZXI/Ik1TUG9pbnRlck1vdmUiOiJwb2ludGVybW92ZSIsUE9JTlRFUl9VUDpvLkJyb3dzZXIubXNQb2ludGVyPyJNU1BvaW50ZXJVcCI6InBvaW50ZXJ1cCIsUE9JTlRFUl9DQU5DRUw6by5Ccm93c2VyLm1zUG9pbnRlcj8iTVNQb2ludGVyQ2FuY2VsIjoicG9pbnRlcmNhbmNlbCIsVEFHX1dISVRFX0xJU1Q6WyJJTlBVVCIsIlNFTEVDVCIsIk9QVElPTiJdLF9wb2ludGVyczp7fSxfcG9pbnRlcnNDb3VudDowLGFkZFBvaW50ZXJMaXN0ZW5lcjpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4idG91Y2hzdGFydCI9PT1lP3RoaXMuX2FkZFBvaW50ZXJTdGFydCh0LGksbik6InRvdWNobW92ZSI9PT1lP3RoaXMuX2FkZFBvaW50ZXJNb3ZlKHQsaSxuKToidG91Y2hlbmQiPT09ZSYmdGhpcy5fYWRkUG9pbnRlckVuZCh0LGksbiksdGhpc30scmVtb3ZlUG9pbnRlckxpc3RlbmVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10WyJfbGVhZmxldF8iK2UraV07cmV0dXJuInRvdWNoc3RhcnQiPT09ZT90LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX0RPV04sbiwhMSk6InRvdWNobW92ZSI9PT1lP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfTU9WRSxuLCExKToidG91Y2hlbmQiPT09ZSYmKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfVVAsbiwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuUE9JTlRFUl9DQU5DRUwsbiwhMSkpLHRoaXN9LF9hZGRQb2ludGVyU3RhcnQ6ZnVuY3Rpb24odCxpLG4pe3ZhciBzPW8uYmluZChmdW5jdGlvbih0KXtpZigibW91c2UiIT09dC5wb2ludGVyVHlwZSYmdC5NU1BPSU5URVJfVFlQRV9NT1VTRSYmdC5wb2ludGVyVHlwZSE9PXQuTVNQT0lOVEVSX1RZUEVfTU9VU0Upe2lmKCEodGhpcy5UQUdfV0hJVEVfTElTVC5pbmRleE9mKHQudGFyZ2V0LnRhZ05hbWUpPDApKXJldHVybjtvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpfXRoaXMuX2hhbmRsZVBvaW50ZXIodCxpKX0sdGhpcyk7aWYodFsiX2xlYWZsZXRfdG91Y2hzdGFydCIrbl09cyx0LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX0RPV04scywhMSksIXRoaXMuX3BvaW50ZXJEb2NMaXN0ZW5lcil7dmFyIHI9by5iaW5kKHRoaXMuX2dsb2JhbFBvaW50ZXJVcCx0aGlzKTtlLmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuUE9JTlRFUl9ET1dOLG8uYmluZCh0aGlzLl9nbG9iYWxQb2ludGVyRG93bix0aGlzKSwhMCksZS5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfTU9WRSxvLmJpbmQodGhpcy5fZ2xvYmFsUG9pbnRlck1vdmUsdGhpcyksITApLGUuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX1VQLHIsITApLGUuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX0NBTkNFTCxyLCEwKSx0aGlzLl9wb2ludGVyRG9jTGlzdGVuZXI9ITB9fSxfZ2xvYmFsUG9pbnRlckRvd246ZnVuY3Rpb24odCl7dGhpcy5fcG9pbnRlcnNbdC5wb2ludGVySWRdPXQsdGhpcy5fcG9pbnRlcnNDb3VudCsrfSxfZ2xvYmFsUG9pbnRlck1vdmU6ZnVuY3Rpb24odCl7dGhpcy5fcG9pbnRlcnNbdC5wb2ludGVySWRdJiYodGhpcy5fcG9pbnRlcnNbdC5wb2ludGVySWRdPXQpfSxfZ2xvYmFsUG9pbnRlclVwOmZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLl9wb2ludGVyc1t0LnBvaW50ZXJJZF0sdGhpcy5fcG9pbnRlcnNDb3VudC0tfSxfaGFuZGxlUG9pbnRlcjpmdW5jdGlvbih0LGUpe3QudG91Y2hlcz1bXTtmb3IodmFyIGkgaW4gdGhpcy5fcG9pbnRlcnMpdC50b3VjaGVzLnB1c2godGhpcy5fcG9pbnRlcnNbaV0pO3QuY2hhbmdlZFRvdWNoZXM9W3RdLGUodCl9LF9hZGRQb2ludGVyTW92ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG49by5iaW5kKGZ1bmN0aW9uKHQpeyh0LnBvaW50ZXJUeXBlIT09dC5NU1BPSU5URVJfVFlQRV9NT1VTRSYmIm1vdXNlIiE9PXQucG9pbnRlclR5cGV8fDAhPT10LmJ1dHRvbnMpJiZ0aGlzLl9oYW5kbGVQb2ludGVyKHQsZSl9LHRoaXMpO3RbIl9sZWFmbGV0X3RvdWNobW92ZSIraV09bix0LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX01PVkUsbiwhMSl9LF9hZGRQb2ludGVyRW5kOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1vLmJpbmQoZnVuY3Rpb24odCl7dGhpcy5faGFuZGxlUG9pbnRlcih0LGUpfSx0aGlzKTt0WyJfbGVhZmxldF90b3VjaGVuZCIraV09bix0LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5QT0lOVEVSX1VQLG4sITEpLHQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlBPSU5URVJfQ0FOQ0VMLG4sITEpfX0pLG8uTWFwLm1lcmdlT3B0aW9ucyh7dG91Y2hab29tOm8uQnJvd3Nlci50b3VjaCYmIW8uQnJvd3Nlci5hbmRyb2lkMjMsYm91bmNlQXRab29tTGltaXRzOiEwfSksby5NYXAuVG91Y2hab29tPW8uSGFuZGxlci5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLXpvb20iKSxvLkRvbUV2ZW50Lm9uKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7by5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLXpvb20iKSxvLkRvbUV2ZW50Lm9mZih0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaFN0YXJ0LHRoaXMpfSxfb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcDtpZih0LnRvdWNoZXMmJjI9PT10LnRvdWNoZXMubGVuZ3RoJiYhaS5fYW5pbWF0aW5nWm9vbSYmIXRoaXMuX3pvb21pbmcpe3ZhciBuPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzBdKSxzPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzFdKTt0aGlzLl9jZW50ZXJQb2ludD1pLmdldFNpemUoKS5fZGl2aWRlQnkoMiksdGhpcy5fc3RhcnRMYXRMbmc9aS5jb250YWluZXJQb2ludFRvTGF0TG5nKHRoaXMuX2NlbnRlclBvaW50KSwiY2VudGVyIiE9PWkub3B0aW9ucy50b3VjaFpvb20mJih0aGlzLl9waW5jaFN0YXJ0TGF0TG5nPWkuY29udGFpbmVyUG9pbnRUb0xhdExuZyhuLmFkZChzKS5fZGl2aWRlQnkoMikpKSx0aGlzLl9zdGFydERpc3Q9bi5kaXN0YW5jZVRvKHMpLHRoaXMuX3N0YXJ0Wm9vbT1pLmdldFpvb20oKSx0aGlzLl9tb3ZlZD0hMSx0aGlzLl96b29taW5nPSEwLGkuX3N0b3AoKSxvLkRvbUV2ZW50Lm9uKGUsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcykub24oZSwidG91Y2hlbmQiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksby5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KX19LF9vblRvdWNoTW92ZTpmdW5jdGlvbih0KXtpZih0LnRvdWNoZXMmJjI9PT10LnRvdWNoZXMubGVuZ3RoJiZ0aGlzLl96b29taW5nKXt2YXIgZT10aGlzLl9tYXAsaT1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbj1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSkscz1pLmRpc3RhbmNlVG8obikvdGhpcy5fc3RhcnREaXN0O2lmKHRoaXMuX3pvb209ZS5nZXRTY2FsZVpvb20ocyx0aGlzLl9zdGFydFpvb20pLCFlLm9wdGlvbnMuYm91bmNlQXRab29tTGltaXRzJiYodGhpcy5fem9vbTxlLmdldE1pblpvb20oKSYmczwxfHx0aGlzLl96b29tPmUuZ2V0TWF4Wm9vbSgpJiZzPjEpJiYodGhpcy5fem9vbT1lLl9saW1pdFpvb20odGhpcy5fem9vbSkpLCJjZW50ZXIiPT09ZS5vcHRpb25zLnRvdWNoWm9vbSl7aWYodGhpcy5fY2VudGVyPXRoaXMuX3N0YXJ0TGF0TG5nLDE9PT1zKXJldHVybn1lbHNle3ZhciByPWkuX2FkZChuKS5fZGl2aWRlQnkoMikuX3N1YnRyYWN0KHRoaXMuX2NlbnRlclBvaW50KTtpZigxPT09cyYmMD09PXIueCYmMD09PXIueSlyZXR1cm47dGhpcy5fY2VudGVyPWUudW5wcm9qZWN0KGUucHJvamVjdCh0aGlzLl9waW5jaFN0YXJ0TGF0TG5nLHRoaXMuX3pvb20pLnN1YnRyYWN0KHIpLHRoaXMuX3pvb20pfXRoaXMuX21vdmVkfHwoZS5fbW92ZVN0YXJ0KCEwKSx0aGlzLl9tb3ZlZD0hMCksby5VdGlsLmNhbmNlbEFuaW1GcmFtZSh0aGlzLl9hbmltUmVxdWVzdCk7dmFyIGE9by5iaW5kKGUuX21vdmUsZSx0aGlzLl9jZW50ZXIsdGhpcy5fem9vbSx7cGluY2g6ITAscm91bmQ6ITF9KTt0aGlzLl9hbmltUmVxdWVzdD1vLlV0aWwucmVxdWVzdEFuaW1GcmFtZShhLHRoaXMsITApLG8uRG9tRXZlbnQucHJldmVudERlZmF1bHQodCl9fSxfb25Ub3VjaEVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZlZCYmdGhpcy5fem9vbWluZz8odGhpcy5fem9vbWluZz0hMSxvLlV0aWwuY2FuY2VsQW5pbUZyYW1lKHRoaXMuX2FuaW1SZXF1ZXN0KSxvLkRvbUV2ZW50Lm9mZihlLCJ0b3VjaG1vdmUiLHRoaXMuX29uVG91Y2hNb3ZlKS5vZmYoZSwidG91Y2hlbmQiLHRoaXMuX29uVG91Y2hFbmQpLHZvaWQodGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbj90aGlzLl9tYXAuX2FuaW1hdGVab29tKHRoaXMuX2NlbnRlcix0aGlzLl9tYXAuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSwhMCx0aGlzLl9tYXAub3B0aW9ucy56b29tU25hcCk6dGhpcy5fbWFwLl9yZXNldFZpZXcodGhpcy5fY2VudGVyLHRoaXMuX21hcC5fbGltaXRab29tKHRoaXMuX3pvb20pKSkpOnZvaWQodGhpcy5fem9vbWluZz0hMSl9fSksby5NYXAuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0b3VjaFpvb20iLG8uTWFwLlRvdWNoWm9vbSksby5NYXAubWVyZ2VPcHRpb25zKHt0YXA6ITAsdGFwVG9sZXJhbmNlOjE1fSksby5NYXAuVGFwPW8uSGFuZGxlci5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbih0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Eb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vbkRvd24sdGhpcyl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYodC50b3VjaGVzKXtpZihvLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpLHRoaXMuX2ZpcmVDbGljaz0hMCx0LnRvdWNoZXMubGVuZ3RoPjEpcmV0dXJuIHRoaXMuX2ZpcmVDbGljaz0hMSx2b2lkIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7dmFyIGk9dC50b3VjaGVzWzBdLG49aS50YXJnZXQ7dGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyBvLlBvaW50KGkuY2xpZW50WCxpLmNsaWVudFkpLG4udGFnTmFtZSYmImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJm8uRG9tVXRpbC5hZGRDbGFzcyhuLCJsZWFmbGV0LWFjdGl2ZSIpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoby5iaW5kKGZ1bmN0aW9uKCl7dGhpcy5faXNUYXBWYWxpZCgpJiYodGhpcy5fZmlyZUNsaWNrPSExLHRoaXMuX29uVXAoKSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJjb250ZXh0bWVudSIsaSkpfSx0aGlzKSwxZTMpLHRoaXMuX3NpbXVsYXRlRXZlbnQoIm1vdXNlZG93biIsaSksby5Eb21FdmVudC5vbihlLHt0b3VjaG1vdmU6dGhpcy5fb25Nb3ZlLHRvdWNoZW5kOnRoaXMuX29uVXB9LHRoaXMpfX0sX29uVXA6ZnVuY3Rpb24odCl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KSxvLkRvbUV2ZW50Lm9mZihlLHt0b3VjaG1vdmU6dGhpcy5fb25Nb3ZlLHRvdWNoZW5kOnRoaXMuX29uVXB9LHRoaXMpLHRoaXMuX2ZpcmVDbGljayYmdCYmdC5jaGFuZ2VkVG91Y2hlcyl7dmFyIGk9dC5jaGFuZ2VkVG91Y2hlc1swXSxuPWkudGFyZ2V0O24mJm4udGFnTmFtZSYmImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJm8uRG9tVXRpbC5yZW1vdmVDbGFzcyhuLCJsZWFmbGV0LWFjdGl2ZSIpLHRoaXMuX3NpbXVsYXRlRXZlbnQoIm1vdXNldXAiLGkpLHRoaXMuX2lzVGFwVmFsaWQoKSYmdGhpcy5fc2ltdWxhdGVFdmVudCgiY2xpY2siLGkpfX0sX2lzVGFwVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV3UG9zLmRpc3RhbmNlVG8odGhpcy5fc3RhcnRQb3MpPD10aGlzLl9tYXAub3B0aW9ucy50YXBUb2xlcmFuY2V9LF9vbk1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC50b3VjaGVzWzBdO3RoaXMuX25ld1Bvcz1uZXcgby5Qb2ludChlLmNsaWVudFgsZS5jbGllbnRZKSwKdGhpcy5fc2ltdWxhdGVFdmVudCgibW91c2Vtb3ZlIixlKX0sX3NpbXVsYXRlRXZlbnQ6ZnVuY3Rpb24oaSxuKXt2YXIgbz1lLmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpO28uX3NpbXVsYXRlZD0hMCxuLnRhcmdldC5fc2ltdWxhdGVkQ2xpY2s9ITAsby5pbml0TW91c2VFdmVudChpLCEwLCEwLHQsMSxuLnNjcmVlblgsbi5zY3JlZW5ZLG4uY2xpZW50WCxuLmNsaWVudFksITEsITEsITEsITEsMCxudWxsKSxuLnRhcmdldC5kaXNwYXRjaEV2ZW50KG8pfX0pLG8uQnJvd3Nlci50b3VjaCYmIW8uQnJvd3Nlci5wb2ludGVyJiZvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsInRhcCIsby5NYXAuVGFwKSxvLk1hcC5tZXJnZU9wdGlvbnMoe2JveFpvb206ITB9KSxvLk1hcC5Cb3hab29tPW8uSGFuZGxlci5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPXQuX2NvbnRhaW5lcix0aGlzLl9wYW5lPXQuX3BhbmVzLm92ZXJsYXlQYW5lfSxhZGRIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub24odGhpcy5fY29udGFpbmVyLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKHRoaXMuX2NvbnRhaW5lciwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW92ZWR9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQ9ITF9LF9vbk1vdXNlRG93bjpmdW5jdGlvbih0KXtyZXR1cm4hKCF0LnNoaWZ0S2V5fHwxIT09dC53aGljaCYmMSE9PXQuYnV0dG9uKSYmKHRoaXMuX3Jlc2V0U3RhdGUoKSxvLkRvbVV0aWwuZGlzYWJsZVRleHRTZWxlY3Rpb24oKSxvLkRvbVV0aWwuZGlzYWJsZUltYWdlRHJhZygpLHRoaXMuX3N0YXJ0UG9pbnQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpLHZvaWQgby5Eb21FdmVudC5vbihlLHtjb250ZXh0bWVudTpvLkRvbUV2ZW50LnN0b3AsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKSl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLl9tb3ZlZHx8KHRoaXMuX21vdmVkPSEwLHRoaXMuX2JveD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LXpvb20tYm94Iix0aGlzLl9jb250YWluZXIpLG8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY3Jvc3NoYWlyIiksdGhpcy5fbWFwLmZpcmUoImJveHpvb21zdGFydCIpKSx0aGlzLl9wb2ludD10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCk7dmFyIGU9bmV3IG8uQm91bmRzKHRoaXMuX3BvaW50LHRoaXMuX3N0YXJ0UG9pbnQpLGk9ZS5nZXRTaXplKCk7by5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2JveCxlLm1pbiksdGhpcy5fYm94LnN0eWxlLndpZHRoPWkueCsicHgiLHRoaXMuX2JveC5zdHlsZS5oZWlnaHQ9aS55KyJweCJ9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZlZCYmKG8uRG9tVXRpbC5yZW1vdmUodGhpcy5fYm94KSxvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWNyb3NzaGFpciIpKSxvLkRvbVV0aWwuZW5hYmxlVGV4dFNlbGVjdGlvbigpLG8uRG9tVXRpbC5lbmFibGVJbWFnZURyYWcoKSxvLkRvbUV2ZW50Lm9mZihlLHtjb250ZXh0bWVudTpvLkRvbUV2ZW50LnN0b3AsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKX0sX29uTW91c2VVcDpmdW5jdGlvbih0KXtpZigoMT09PXQud2hpY2h8fDE9PT10LmJ1dHRvbikmJih0aGlzLl9maW5pc2goKSx0aGlzLl9tb3ZlZCkpe3NldFRpbWVvdXQoby5iaW5kKHRoaXMuX3Jlc2V0U3RhdGUsdGhpcyksMCk7dmFyIGU9bmV3IG8uTGF0TG5nQm91bmRzKHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHRoaXMuX3N0YXJ0UG9pbnQpLHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50KSk7dGhpcy5fbWFwLmZpdEJvdW5kcyhlKS5maXJlKCJib3h6b29tZW5kIix7Ym94Wm9vbUJvdW5kczplfSl9fSxfb25LZXlEb3duOmZ1bmN0aW9uKHQpezI3PT09dC5rZXlDb2RlJiZ0aGlzLl9maW5pc2goKX19KSxvLk1hcC5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImJveFpvb20iLG8uTWFwLkJveFpvb20pLG8uTWFwLm1lcmdlT3B0aW9ucyh7a2V5Ym9hcmQ6ITAsa2V5Ym9hcmRQYW5EZWx0YTo4MH0pLG8uTWFwLktleWJvYXJkPW8uSGFuZGxlci5leHRlbmQoe2tleUNvZGVzOntsZWZ0OlszN10scmlnaHQ6WzM5XSxkb3duOls0MF0sdXA6WzM4XSx6b29tSW46WzE4NywxMDcsNjEsMTcxXSx6b29tT3V0OlsxODksMTA5LDU0LDE3M119LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fc2V0UGFuRGVsdGEodC5vcHRpb25zLmtleWJvYXJkUGFuRGVsdGEpLHRoaXMuX3NldFpvb21EZWx0YSh0Lm9wdGlvbnMuem9vbURlbHRhKX0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuX2NvbnRhaW5lcjt0LnRhYkluZGV4PD0wJiYodC50YWJJbmRleD0iMCIpLG8uRG9tRXZlbnQub24odCx7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vbih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlSG9va3MoKSxvLkRvbUV2ZW50Lm9mZih0aGlzLl9tYXAuX2NvbnRhaW5lcix7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vZmYoe2ZvY3VzOnRoaXMuX2FkZEhvb2tzLGJsdXI6dGhpcy5fcmVtb3ZlSG9va3N9LHRoaXMpfSxfb25Nb3VzZURvd246ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZCl7dmFyIGk9ZS5ib2R5LG49ZS5kb2N1bWVudEVsZW1lbnQsbz1pLnNjcm9sbFRvcHx8bi5zY3JvbGxUb3Ascz1pLnNjcm9sbExlZnR8fG4uc2Nyb2xsTGVmdDt0aGlzLl9tYXAuX2NvbnRhaW5lci5mb2N1cygpLHQuc2Nyb2xsVG8ocyxvKX19LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMCx0aGlzLl9tYXAuZmlyZSgiZm9jdXMiKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5fbWFwLmZpcmUoImJsdXIiKX0sX3NldFBhbkRlbHRhOmZ1bmN0aW9uKHQpe3ZhciBlLGksbj10aGlzLl9wYW5LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoZT0wLGk9by5sZWZ0Lmxlbmd0aDtlPGk7ZSsrKW5bby5sZWZ0W2VdXT1bLTEqdCwwXTtmb3IoZT0wLGk9by5yaWdodC5sZW5ndGg7ZTxpO2UrKyluW28ucmlnaHRbZV1dPVt0LDBdO2ZvcihlPTAsaT1vLmRvd24ubGVuZ3RoO2U8aTtlKyspbltvLmRvd25bZV1dPVswLHRdO2ZvcihlPTAsaT1vLnVwLmxlbmd0aDtlPGk7ZSsrKW5bby51cFtlXV09WzAsLTEqdF19LF9zZXRab29tRGVsdGE6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX3pvb21LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoZT0wLGk9by56b29tSW4ubGVuZ3RoO2U8aTtlKyspbltvLnpvb21JbltlXV09dDtmb3IoZT0wLGk9by56b29tT3V0Lmxlbmd0aDtlPGk7ZSsrKW5bby56b29tT3V0W2VdXT0tdH0sX2FkZEhvb2tzOmZ1bmN0aW9uKCl7by5Eb21FdmVudC5vbihlLCJrZXlkb3duIix0aGlzLl9vbktleURvd24sdGhpcyl9LF9yZW1vdmVIb29rczpmdW5jdGlvbigpe28uRG9tRXZlbnQub2ZmKGUsImtleWRvd24iLHRoaXMuX29uS2V5RG93bix0aGlzKX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXtpZighKHQuYWx0S2V5fHx0LmN0cmxLZXl8fHQubWV0YUtleSkpe3ZhciBlLGk9dC5rZXlDb2RlLG49dGhpcy5fbWFwO2lmKGkgaW4gdGhpcy5fcGFuS2V5cyl7aWYobi5fcGFuQW5pbSYmbi5fcGFuQW5pbS5faW5Qcm9ncmVzcylyZXR1cm47ZT10aGlzLl9wYW5LZXlzW2ldLHQuc2hpZnRLZXkmJihlPW8ucG9pbnQoZSkubXVsdGlwbHlCeSgzKSksbi5wYW5CeShlKSxuLm9wdGlvbnMubWF4Qm91bmRzJiZuLnBhbkluc2lkZUJvdW5kcyhuLm9wdGlvbnMubWF4Qm91bmRzKX1lbHNlIGlmKGkgaW4gdGhpcy5fem9vbUtleXMpbi5zZXRab29tKG4uZ2V0Wm9vbSgpKyh0LnNoaWZ0S2V5PzM6MSkqdGhpcy5fem9vbUtleXNbaV0pO2Vsc2V7aWYoMjchPT1pKXJldHVybjtuLmNsb3NlUG9wdXAoKX1vLkRvbUV2ZW50LnN0b3AodCl9fX0pLG8uTWFwLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwia2V5Ym9hcmQiLG8uTWFwLktleWJvYXJkKSxvLkhhbmRsZXIuTWFya2VyRHJhZz1vLkhhbmRsZXIuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcmtlcj10fSxhZGRIb29rczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcmtlci5faWNvbjt0aGlzLl9kcmFnZ2FibGV8fCh0aGlzLl9kcmFnZ2FibGU9bmV3IG8uRHJhZ2dhYmxlKHQsdCwhMCkpLHRoaXMuX2RyYWdnYWJsZS5vbih7ZHJhZ3N0YXJ0OnRoaXMuX29uRHJhZ1N0YXJ0LGRyYWc6dGhpcy5fb25EcmFnLGRyYWdlbmQ6dGhpcy5fb25EcmFnRW5kfSx0aGlzKS5lbmFibGUoKSxvLkRvbVV0aWwuYWRkQ2xhc3ModCwibGVhZmxldC1tYXJrZXItZHJhZ2dhYmxlIil9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dhYmxlLm9mZih7ZHJhZ3N0YXJ0OnRoaXMuX29uRHJhZ1N0YXJ0LGRyYWc6dGhpcy5fb25EcmFnLGRyYWdlbmQ6dGhpcy5fb25EcmFnRW5kfSx0aGlzKS5kaXNhYmxlKCksdGhpcy5fbWFya2VyLl9pY29uJiZvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fbWFya2VyLl9pY29uLCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlJiZ0aGlzLl9kcmFnZ2FibGUuX21vdmVkfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9vbGRMYXRMbmc9dGhpcy5fbWFya2VyLmdldExhdExuZygpLHRoaXMuX21hcmtlci5jbG9zZVBvcHVwKCkuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0Iil9LF9vbkRyYWc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFya2VyLGk9ZS5fc2hhZG93LG49by5Eb21VdGlsLmdldFBvc2l0aW9uKGUuX2ljb24pLHM9ZS5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhuKTtpJiZvLkRvbVV0aWwuc2V0UG9zaXRpb24oaSxuKSxlLl9sYXRsbmc9cyx0LmxhdGxuZz1zLHQub2xkTGF0TG5nPXRoaXMuX29sZExhdExuZyxlLmZpcmUoIm1vdmUiLHQpLmZpcmUoImRyYWciLHQpfSxfb25EcmFnRW5kOmZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLl9vbGRMYXRMbmcsdGhpcy5fbWFya2VyLmZpcmUoIm1vdmVlbmQiKS5maXJlKCJkcmFnZW5kIix0KX19KSxvLkNvbnRyb2w9by5DbGFzcy5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJ0b3ByaWdodCJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7by5zZXRPcHRpb25zKHRoaXMsdCl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbn0sc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwO3JldHVybiBlJiZlLnJlbW92ZUNvbnRyb2wodGhpcyksdGhpcy5vcHRpb25zLnBvc2l0aW9uPXQsZSYmZS5hZGRDb250cm9sKHRoaXMpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlKCksdGhpcy5fbWFwPXQ7dmFyIGU9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQodCksaT10aGlzLmdldFBvc2l0aW9uKCksbj10Ll9jb250cm9sQ29ybmVyc1tpXTtyZXR1cm4gby5Eb21VdGlsLmFkZENsYXNzKGUsImxlYWZsZXQtY29udHJvbCIpLGkuaW5kZXhPZigiYm90dG9tIikhPT0tMT9uLmluc2VydEJlZm9yZShlLG4uZmlyc3RDaGlsZCk6bi5hcHBlbmRDaGlsZChlKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwPyhvLkRvbVV0aWwucmVtb3ZlKHRoaXMuX2NvbnRhaW5lciksdGhpcy5vblJlbW92ZSYmdGhpcy5vblJlbW92ZSh0aGlzLl9tYXApLHRoaXMuX21hcD1udWxsLHRoaXMpOnRoaXN9LF9yZWZvY3VzT25NYXA6ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiZ0JiZ0LnNjcmVlblg+MCYmdC5zY3JlZW5ZPjAmJnRoaXMuX21hcC5nZXRDb250YWluZXIoKS5mb2N1cygpfX0pLG8uY29udHJvbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uQ29udHJvbCh0KX0sby5NYXAuaW5jbHVkZSh7YWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxyZW1vdmVDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbW92ZSgpLHRoaXN9LF9pbml0Q29udHJvbFBvczpmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxzKXt2YXIgcj1pK3QrIiAiK2krcztlW3Qrc109by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixyLG4pfXZhciBlPXRoaXMuX2NvbnRyb2xDb3JuZXJzPXt9LGk9ImxlYWZsZXQtIixuPXRoaXMuX2NvbnRyb2xDb250YWluZXI9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixpKyJjb250cm9sLWNvbnRhaW5lciIsdGhpcy5fY29udGFpbmVyKTt0KCJ0b3AiLCJsZWZ0IiksdCgidG9wIiwicmlnaHQiKSx0KCJib3R0b20iLCJsZWZ0IiksdCgiYm90dG9tIiwicmlnaHQiKX0sX2NsZWFyQ29udHJvbFBvczpmdW5jdGlvbigpe28uRG9tVXRpbC5yZW1vdmUodGhpcy5fY29udHJvbENvbnRhaW5lcil9fSksby5Db250cm9sLlpvb209by5Db250cm9sLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246InRvcGxlZnQiLHpvb21JblRleHQ6IisiLHpvb21JblRpdGxlOiJab29tIGluIix6b29tT3V0VGV4dDoiLSIsem9vbU91dFRpdGxlOiJab29tIG91dCJ9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBlPSJsZWFmbGV0LWNvbnRyb2wtem9vbSIsaT1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUrIiBsZWFmbGV0LWJhciIpLG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbUluVGV4dCxuLnpvb21JblRpdGxlLGUrIi1pbiIsaSx0aGlzLl96b29tSW4pLHRoaXMuX3pvb21PdXRCdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbU91dFRleHQsbi56b29tT3V0VGl0bGUsZSsiLW91dCIsaSx0aGlzLl96b29tT3V0KSx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHQub24oInpvb21lbmQgem9vbWxldmVsc2NoYW5nZSIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyksaX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5vZmYoInpvb21lbmQgem9vbWxldmVsc2NoYW5nZSIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITAsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxfem9vbUluOmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPHRoaXMuX21hcC5nZXRNYXhab29tKCkmJnRoaXMuX21hcC56b29tSW4odGhpcy5fbWFwLm9wdGlvbnMuem9vbURlbHRhKih0LnNoaWZ0S2V5PzM6MSkpfSxfem9vbU91dDpmdW5jdGlvbih0KXshdGhpcy5fZGlzYWJsZWQmJnRoaXMuX21hcC5fem9vbT50aGlzLl9tYXAuZ2V0TWluWm9vbSgpJiZ0aGlzLl9tYXAuem9vbU91dCh0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk/MzoxKSl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxlLGksbixzKXt2YXIgcj1vLkRvbVV0aWwuY3JlYXRlKCJhIixpLG4pO3JldHVybiByLmlubmVySFRNTD10LHIuaHJlZj0iIyIsci50aXRsZT1lLHIuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksci5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGUpLG8uRG9tRXZlbnQub24ociwibW91c2Vkb3duIGRibGNsaWNrIixvLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbikub24ociwiY2xpY2siLG8uRG9tRXZlbnQuc3RvcCkub24ociwiY2xpY2siLHMsdGhpcykub24ociwiY2xpY2siLHRoaXMuX3JlZm9jdXNPbk1hcCx0aGlzKSxyfSxfdXBkYXRlRGlzYWJsZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT0ibGVhZmxldC1kaXNhYmxlZCI7by5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX3pvb21JbkJ1dHRvbixlKSxvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fem9vbU91dEJ1dHRvbixlKSwodGhpcy5fZGlzYWJsZWR8fHQuX3pvb209PT10LmdldE1pblpvb20oKSkmJm8uRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl96b29tT3V0QnV0dG9uLGUpLCh0aGlzLl9kaXNhYmxlZHx8dC5fem9vbT09PXQuZ2V0TWF4Wm9vbSgpKSYmby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX3pvb21JbkJ1dHRvbixlKX19KSxvLk1hcC5tZXJnZU9wdGlvbnMoe3pvb21Db250cm9sOiEwfSksby5NYXAuYWRkSW5pdEhvb2soZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuem9vbUNvbnRyb2wmJih0aGlzLnpvb21Db250cm9sPW5ldyBvLkNvbnRyb2wuWm9vbSx0aGlzLmFkZENvbnRyb2wodGhpcy56b29tQ29udHJvbCkpfSksby5jb250cm9sLnpvb209ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvLkNvbnRyb2wuWm9vbSh0KX0sby5Db250cm9sLkF0dHJpYnV0aW9uPW8uQ29udHJvbC5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJib3R0b21yaWdodCIscHJlZml4Oic8YSBocmVmPSJodHRwOi8vbGVhZmxldGpzLmNvbSIgdGl0bGU9IkEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcyI+TGVhZmxldDwvYT4nfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe28uc2V0T3B0aW9ucyh0aGlzLHQpLHRoaXMuX2F0dHJpYnV0aW9ucz17fX0sb25BZGQ6ZnVuY3Rpb24odCl7dC5hdHRyaWJ1dGlvbkNvbnRyb2w9dGhpcyx0aGlzLl9jb250YWluZXI9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1jb250cm9sLWF0dHJpYnV0aW9uIiksby5Eb21FdmVudCYmby5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbih0aGlzLl9jb250YWluZXIpO2Zvcih2YXIgZSBpbiB0Ll9sYXllcnMpdC5fbGF5ZXJzW2VdLmdldEF0dHJpYnV0aW9uJiZ0aGlzLmFkZEF0dHJpYnV0aW9uKHQuX2xheWVyc1tlXS5nZXRBdHRyaWJ1dGlvbigpKTtyZXR1cm4gdGhpcy5fdXBkYXRlKCksdGhpcy5fY29udGFpbmVyfSxzZXRQcmVmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fYXR0cmlidXRpb25zW3RdfHwodGhpcy5fYXR0cmlidXRpb25zW3RdPTApLHRoaXMuX2F0dHJpYnV0aW9uc1t0XSsrLHRoaXMuX3VwZGF0ZSgpLHRoaXMpOnRoaXN9LHJlbW92ZUF0dHJpYnV0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0Pyh0aGlzLl9hdHRyaWJ1dGlvbnNbdF0mJih0aGlzLl9hdHRyaWJ1dGlvbnNbdF0tLSx0aGlzLl91cGRhdGUoKSksdGhpcyk6dGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMuX2F0dHJpYnV0aW9ucyl0aGlzLl9hdHRyaWJ1dGlvbnNbZV0mJnQucHVzaChlKTt2YXIgaT1bXTt0aGlzLm9wdGlvbnMucHJlZml4JiZpLnB1c2godGhpcy5vcHRpb25zLnByZWZpeCksdC5sZW5ndGgmJmkucHVzaCh0LmpvaW4oIiwgIikpLHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUw9aS5qb2luKCIgfCAiKX19fSksby5NYXAubWVyZ2VPcHRpb25zKHthdHRyaWJ1dGlvbkNvbnRyb2w6ITB9KSxvLk1hcC5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wmJihuZXcgby5Db250cm9sLkF0dHJpYnV0aW9uKS5hZGRUbyh0aGlzKX0pLG8uY29udHJvbC5hdHRyaWJ1dGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uQ29udHJvbC5BdHRyaWJ1dGlvbih0KX0sby5Db250cm9sLlNjYWxlPW8uQ29udHJvbC5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJib3R0b21sZWZ0IixtYXhXaWR0aDoxMDAsbWV0cmljOiEwLGltcGVyaWFsOiEwfSxvbkFkZDpmdW5jdGlvbih0KXt2YXIgZT0ibGVhZmxldC1jb250cm9sLXNjYWxlIixpPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsZSksbj10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX2FkZFNjYWxlcyhuLGUrIi1saW5lIixpKSx0Lm9uKG4udXBkYXRlV2hlbklkbGU/Im1vdmVlbmQiOiJtb3ZlIix0aGlzLl91cGRhdGUsdGhpcyksdC53aGVuUmVhZHkodGhpcy5fdXBkYXRlLHRoaXMpLGl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKHRoaXMub3B0aW9ucy51cGRhdGVXaGVuSWRsZT8ibW92ZWVuZCI6Im1vdmUiLHRoaXMuX3VwZGF0ZSx0aGlzKX0sX2FkZFNjYWxlczpmdW5jdGlvbih0LGUsaSl7dC5tZXRyaWMmJih0aGlzLl9tU2NhbGU9by5Eb21VdGlsLmNyZWF0ZSgiZGl2IixlLGkpKSx0LmltcGVyaWFsJiYodGhpcy5faVNjYWxlPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsZSxpKSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT10LmdldFNpemUoKS55LzIsaT10LmRpc3RhbmNlKHQuY29udGFpbmVyUG9pbnRUb0xhdExuZyhbMCxlXSksdC5jb250YWluZXJQb2ludFRvTGF0TG5nKFt0aGlzLm9wdGlvbnMubWF4V2lkdGgsZV0pKTt0aGlzLl91cGRhdGVTY2FsZXMoaSl9LF91cGRhdGVTY2FsZXM6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm1ldHJpYyYmdCYmdGhpcy5fdXBkYXRlTWV0cmljKHQpLHRoaXMub3B0aW9ucy5pbXBlcmlhbCYmdCYmdGhpcy5fdXBkYXRlSW1wZXJpYWwodCl9LF91cGRhdGVNZXRyaWM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0Um91bmROdW0odCksaT1lPDFlMz9lKyIgbSI6ZS8xZTMrIiBrbSI7dGhpcy5fdXBkYXRlU2NhbGUodGhpcy5fbVNjYWxlLGksZS90KX0sX3VwZGF0ZUltcGVyaWFsOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixvPTMuMjgwODM5OSp0O28+NTI4MD8oZT1vLzUyODAsaT10aGlzLl9nZXRSb3VuZE51bShlKSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsaSsiIG1pIixpL2UpKToobj10aGlzLl9nZXRSb3VuZE51bShvKSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsbisiIGZ0IixuL28pKX0sX3VwZGF0ZVNjYWxlOmZ1bmN0aW9uKHQsZSxpKXt0LnN0eWxlLndpZHRoPU1hdGgucm91bmQodGhpcy5vcHRpb25zLm1heFdpZHRoKmkpKyJweCIsdC5pbm5lckhUTUw9ZX0sX2dldFJvdW5kTnVtOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgucG93KDEwLChNYXRoLmZsb29yKHQpKyIiKS5sZW5ndGgtMSksaT10L2U7cmV0dXJuIGk9aT49MTA/MTA6aT49NT81Omk+PTM/MzppPj0yPzI6MSxlKml9fSksby5jb250cm9sLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgby5Db250cm9sLlNjYWxlKHQpfSxvLkNvbnRyb2wuTGF5ZXJzPW8uQ29udHJvbC5leHRlbmQoe29wdGlvbnM6e2NvbGxhcHNlZDohMCxwb3NpdGlvbjoidG9wcmlnaHQiLGF1dG9aSW5kZXg6ITAsaGlkZVNpbmdsZUJhc2U6ITEsc29ydExheWVyczohMSxzb3J0RnVuY3Rpb246ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIGk8bj8tMTpuPGk/MTowfX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7by5zZXRPcHRpb25zKHRoaXMsaSksdGhpcy5fbGF5ZXJzPVtdLHRoaXMuX2xhc3RaSW5kZXg9MCx0aGlzLl9oYW5kbGluZ0NsaWNrPSExO2Zvcih2YXIgbiBpbiB0KXRoaXMuX2FkZExheWVyKHRbbl0sbik7Zm9yKG4gaW4gZSl0aGlzLl9hZGRMYXllcihlW25dLG4sITApfSxvbkFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW5pdExheW91dCgpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcD10LHQub24oInpvb21lbmQiLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMsdGhpcyksdGhpcy5fY29udGFpbmVyfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vZmYoInpvb21lbmQiLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMsdGhpcyk7Zm9yKHZhciB0PTA7dDx0aGlzLl9sYXllcnMubGVuZ3RoO3QrKyl0aGlzLl9sYXllcnNbdF0ubGF5ZXIub2ZmKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpfSxhZGRCYXNlTGF5ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fYWRkTGF5ZXIodCxlKSx0aGlzLl9tYXA/dGhpcy5fdXBkYXRlKCk6dGhpc30sYWRkT3ZlcmxheTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9hZGRMYXllcih0LGUsITApLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt0Lm9mZigiYWRkIHJlbW92ZSIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKTt2YXIgZT10aGlzLl9nZXRMYXllcihvLnN0YW1wKHQpKTtyZXR1cm4gZSYmdGhpcy5fbGF5ZXJzLnNwbGljZSh0aGlzLl9sYXllcnMuaW5kZXhPZihlKSwxKSx0aGlzLl9tYXA/dGhpcy5fdXBkYXRlKCk6dGhpc30sZXhwYW5kOmZ1bmN0aW9uKCl7by5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1jb250cm9sLWxheWVycy1leHBhbmRlZCIpLHRoaXMuX2Zvcm0uc3R5bGUuaGVpZ2h0PW51bGw7dmFyIHQ9dGhpcy5fbWFwLmdldFNpemUoKS55LSh0aGlzLl9jb250YWluZXIub2Zmc2V0VG9wKzUwKTtyZXR1cm4gdDx0aGlzLl9mb3JtLmNsaWVudEhlaWdodD8oby5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2Zvcm0sImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyIiksdGhpcy5fZm9ybS5zdHlsZS5oZWlnaHQ9dCsicHgiKTpvLkRvbVV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fZm9ybSwibGVhZmxldC1jb250cm9sLWxheWVycy1zY3JvbGxiYXIiKSx0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzKCksdGhpc30sY29sbGFwc2U6ZnVuY3Rpb24oKXtyZXR1cm4gby5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1jb250cm9sLWxheWVycy1leHBhbmRlZCIpLHRoaXN9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtY29udHJvbC1sYXllcnMiLGU9dGhpcy5fY29udGFpbmVyPW8uRG9tVXRpbC5jcmVhdGUoImRpdiIsdCksaT10aGlzLm9wdGlvbnMuY29sbGFwc2VkO2Uuc2V0QXR0cmlidXRlKCJhcmlhLWhhc3BvcHVwIiwhMCksby5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihlKSxvLkJyb3dzZXIudG91Y2h8fG8uRG9tRXZlbnQuZGlzYWJsZVNjcm9sbFByb3BhZ2F0aW9uKGUpO3ZhciBuPXRoaXMuX2Zvcm09by5Eb21VdGlsLmNyZWF0ZSgiZm9ybSIsdCsiLWxpc3QiKTtpJiYodGhpcy5fbWFwLm9uKCJjbGljayIsdGhpcy5jb2xsYXBzZSx0aGlzKSxvLkJyb3dzZXIuYW5kcm9pZHx8by5Eb21FdmVudC5vbihlLHttb3VzZWVudGVyOnRoaXMuZXhwYW5kLG1vdXNlbGVhdmU6dGhpcy5jb2xsYXBzZX0sdGhpcykpO3ZhciBzPXRoaXMuX2xheWVyc0xpbms9by5Eb21VdGlsLmNyZWF0ZSgiYSIsdCsiLXRvZ2dsZSIsZSk7cy5ocmVmPSIjIixzLnRpdGxlPSJMYXllcnMiLG8uQnJvd3Nlci50b3VjaD9vLkRvbUV2ZW50Lm9uKHMsImNsaWNrIixvLkRvbUV2ZW50LnN0b3ApLm9uKHMsImNsaWNrIix0aGlzLmV4cGFuZCx0aGlzKTpvLkRvbUV2ZW50Lm9uKHMsImZvY3VzIix0aGlzLmV4cGFuZCx0aGlzKSxvLkRvbUV2ZW50Lm9uKG4sImNsaWNrIixmdW5jdGlvbigpe3NldFRpbWVvdXQoby5iaW5kKHRoaXMuX29uSW5wdXRDbGljayx0aGlzKSwwKX0sdGhpcyksaXx8dGhpcy5leHBhbmQoKSx0aGlzLl9iYXNlTGF5ZXJzTGlzdD1vLkRvbVV0aWwuY3JlYXRlKCJkaXYiLHQrIi1iYXNlIixuKSx0aGlzLl9zZXBhcmF0b3I9by5Eb21VdGlsLmNyZWF0ZSgiZGl2Iix0KyItc2VwYXJhdG9yIixuKSx0aGlzLl9vdmVybGF5c0xpc3Q9by5Eb21VdGlsLmNyZWF0ZSgiZGl2Iix0KyItb3ZlcmxheXMiLG4pLGUuYXBwZW5kQ2hpbGQobil9LF9nZXRMYXllcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2xheWVycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2xheWVyc1tlXSYmby5zdGFtcCh0aGlzLl9sYXllcnNbZV0ubGF5ZXIpPT09dClyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSxfYWRkTGF5ZXI6ZnVuY3Rpb24odCxlLGkpe3Qub24oImFkZCByZW1vdmUiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyksdGhpcy5fbGF5ZXJzLnB1c2goe2xheWVyOnQsbmFtZTplLG92ZXJsYXk6aX0pLHRoaXMub3B0aW9ucy5zb3J0TGF5ZXJzJiZ0aGlzLl9sYXllcnMuc29ydChvLmJpbmQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vcHRpb25zLnNvcnRGdW5jdGlvbih0LmxheWVyLGUubGF5ZXIsdC5uYW1lLGUubmFtZSl9LHRoaXMpKSx0aGlzLm9wdGlvbnMuYXV0b1pJbmRleCYmdC5zZXRaSW5kZXgmJih0aGlzLl9sYXN0WkluZGV4KyssdC5zZXRaSW5kZXgodGhpcy5fbGFzdFpJbmRleCkpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2NvbnRhaW5lcilyZXR1cm4gdGhpcztvLkRvbVV0aWwuZW1wdHkodGhpcy5fYmFzZUxheWVyc0xpc3QpLG8uRG9tVXRpbC5lbXB0eSh0aGlzLl9vdmVybGF5c0xpc3QpO3ZhciB0LGUsaSxuLHM9MDtmb3IoaT0wO2k8dGhpcy5fbGF5ZXJzLmxlbmd0aDtpKyspbj10aGlzLl9sYXllcnNbaV0sdGhpcy5fYWRkSXRlbShuKSxlPWV8fG4ub3ZlcmxheSx0PXR8fCFuLm92ZXJsYXkscys9bi5vdmVybGF5PzA6MTtyZXR1cm4gdGhpcy5vcHRpb25zLmhpZGVTaW5nbGVCYXNlJiYodD10JiZzPjEsdGhpcy5fYmFzZUxheWVyc0xpc3Quc3R5bGUuZGlzcGxheT10PyIiOiJub25lIiksdGhpcy5fc2VwYXJhdG9yLnN0eWxlLmRpc3BsYXk9ZSYmdD8iIjoibm9uZSIsdGhpc30sX29uTGF5ZXJDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy5faGFuZGxpbmdDbGlja3x8dGhpcy5fdXBkYXRlKCk7dmFyIGU9dGhpcy5fZ2V0TGF5ZXIoby5zdGFtcCh0LnRhcmdldCkpLGk9ZS5vdmVybGF5PyJhZGQiPT09dC50eXBlPyJvdmVybGF5YWRkIjoib3ZlcmxheXJlbW92ZSI6ImFkZCI9PT10LnR5cGU/ImJhc2VsYXllcmNoYW5nZSI6bnVsbDtpJiZ0aGlzLl9tYXAuZmlyZShpLGUpfSxfY3JlYXRlUmFkaW9FbGVtZW50OmZ1bmN0aW9uKHQsaSl7dmFyIG49JzxpbnB1dCB0eXBlPSJyYWRpbyIgY2xhc3M9ImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2VsZWN0b3IiIG5hbWU9IicrdCsnIicrKGk/JyBjaGVja2VkPSJjaGVja2VkIic6IiIpKyIvPiIsbz1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBvLmlubmVySFRNTD1uLG8uZmlyc3RDaGlsZH0sX2FkZEl0ZW06ZnVuY3Rpb24odCl7dmFyIGksbj1lLmNyZWF0ZUVsZW1lbnQoImxhYmVsIikscz10aGlzLl9tYXAuaGFzTGF5ZXIodC5sYXllcik7dC5vdmVybGF5PyhpPWUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnR5cGU9ImNoZWNrYm94IixpLmNsYXNzTmFtZT0ibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvciIsaS5kZWZhdWx0Q2hlY2tlZD1zKTppPXRoaXMuX2NyZWF0ZVJhZGlvRWxlbWVudCgibGVhZmxldC1iYXNlLWxheWVycyIscyksaS5sYXllcklkPW8uc3RhbXAodC5sYXllciksby5Eb21FdmVudC5vbihpLCJjbGljayIsdGhpcy5fb25JbnB1dENsaWNrLHRoaXMpO3ZhciByPWUuY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuaW5uZXJIVE1MPSIgIit0Lm5hbWU7dmFyIGE9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLmFwcGVuZENoaWxkKGEpLGEuYXBwZW5kQ2hpbGQoaSksYS5hcHBlbmRDaGlsZChyKTt2YXIgaD10Lm92ZXJsYXk/dGhpcy5fb3ZlcmxheXNMaXN0OnRoaXMuX2Jhc2VMYXllcnNMaXN0O3JldHVybiBoLmFwcGVuZENoaWxkKG4pLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMoKSxufSxfb25JbnB1dENsaWNrOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG49dGhpcy5fZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxvPVtdLHM9W107dGhpcy5faGFuZGxpbmdDbGljaz0hMDtmb3IodmFyIHI9bi5sZW5ndGgtMTtyPj0wO3ItLSl0PW5bcl0sZT10aGlzLl9nZXRMYXllcih0LmxheWVySWQpLmxheWVyLGk9dGhpcy5fbWFwLmhhc0xheWVyKGUpLHQuY2hlY2tlZCYmIWk/by5wdXNoKGUpOiF0LmNoZWNrZWQmJmkmJnMucHVzaChlKTtmb3Iocj0wO3I8cy5sZW5ndGg7cisrKXRoaXMuX21hcC5yZW1vdmVMYXllcihzW3JdKTtmb3Iocj0wO3I8by5sZW5ndGg7cisrKXRoaXMuX21hcC5hZGRMYXllcihvW3JdKTt0aGlzLl9oYW5kbGluZ0NsaWNrPSExLHRoaXMuX3JlZm9jdXNPbk1hcCgpfSxfY2hlY2tEaXNhYmxlZExheWVyczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLG49dGhpcy5fZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxvPXRoaXMuX21hcC5nZXRab29tKCkscz1uLmxlbmd0aC0xO3M+PTA7cy0tKXQ9bltzXSxlPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5kaXNhYmxlZD1lLm9wdGlvbnMubWluWm9vbSE9PWkmJm88ZS5vcHRpb25zLm1pblpvb218fGUub3B0aW9ucy5tYXhab29tIT09aSYmbz5lLm9wdGlvbnMubWF4Wm9vbX0sX2V4cGFuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cGFuZCgpfSxfY29sbGFwc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZSgpfX0pLG8uY29udHJvbC5sYXllcnM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgby5Db250cm9sLkxheWVycyh0LGUsaSl9fSh3aW5kb3csZG9jdW1lbnQpOw=="></script>
<link href="data:text/css;charset=utf-8,%0Aimg%2Eleaflet%2Dtile%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%2Dradius%3A%200%3B%0Aborder%3A%20none%3B%0A%7D%0A%2Einfo%20%7B%0Apadding%3A%206px%208px%3B%0Afont%3A%2014px%2F16px%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0Abackground%3A%20white%3B%0Abackground%3A%20rgba%28255%2C255%2C255%2C0%2E8%29%3B%0Abox%2Dshadow%3A%200%200%2015px%20rgba%280%2C0%2C0%2C0%2E2%29%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0A%2Elegend%20%7B%0Aline%2Dheight%3A%2018px%3B%0Acolor%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20text%20%7B%0Afill%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20line%20%7B%0Astroke%3A%20%23555%3B%0A%7D%0A%2Elegend%20i%20%7B%0Awidth%3A%2018px%3B%0Aheight%3A%2018px%3B%0Afloat%3A%20left%3B%0Amargin%2Dright%3A%208px%3B%0Aopacity%3A%200%2E7%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKGEpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyltb2R1bGUuZXhwb3J0cz1hKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShhKTtlbHNle3ZhciBiOyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P2I9d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2I9Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmKGI9c2VsZiksYi5wcm9qND1hKCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBhKGIsYyxkKXtmdW5jdGlvbiBlKGcsaCl7aWYoIWNbZ10pe2lmKCFiW2ddKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighaCYmaSlyZXR1cm4gaShnLCEwKTtpZihmKXJldHVybiBmKGcsITApO3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2crIiciKX12YXIgaj1jW2ddPXtleHBvcnRzOnt9fTtiW2ddWzBdLmNhbGwoai5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbZ11bMV1bYV07cmV0dXJuIGUoYz9jOmEpfSxqLGouZXhwb3J0cyxhLGIsYyxkKX1yZXR1cm4gY1tnXS5leHBvcnRzfWZvcih2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxnPTA7ZzxkLmxlbmd0aDtnKyspZShkW2ddKTtyZXR1cm4gZX0oezE6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBQb2ludChhLGIsYyl7aWYoISh0aGlzIGluc3RhbmNlb2YgUG9pbnQpKXJldHVybiBuZXcgUG9pbnQoYSxiLGMpO2lmKEFycmF5LmlzQXJyYXkoYSkpdGhpcy54PWFbMF0sdGhpcy55PWFbMV0sdGhpcy56PWFbMl18fDA7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGEpdGhpcy54PWEueCx0aGlzLnk9YS55LHRoaXMuej1hLnp8fDA7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGEmJiJ1bmRlZmluZWQiPT10eXBlb2YgYil7dmFyIGQ9YS5zcGxpdCgiLCIpO3RoaXMueD1wYXJzZUZsb2F0KGRbMF0sMTApLHRoaXMueT1wYXJzZUZsb2F0KGRbMV0sMTApLHRoaXMuej1wYXJzZUZsb2F0KGRbMl0sMTApfHwwfWVsc2UgdGhpcy54PWEsdGhpcy55PWIsdGhpcy56PWN8fDA7Y29uc29sZS53YXJuKCJwcm9qNC5Qb2ludCB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLCB1c2UgcHJvajQudG9Qb2ludCIpfXZhciBkPWEoIm1ncnMiKTtQb2ludC5mcm9tTUdSUz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFBvaW50KGQudG9Qb2ludChhKSl9LFBvaW50LnByb3RvdHlwZS50b01HUlM9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuZm9yd2FyZChbdGhpcy54LHRoaXMueV0sYSl9LGIuZXhwb3J0cz1Qb2ludH0se21ncnM6Njd9XSwyOltmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gUHJvamVjdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFByb2plY3Rpb24pKXJldHVybiBuZXcgUHJvamVjdGlvbihhKTtiPWJ8fGZ1bmN0aW9uKGEpe2lmKGEpdGhyb3cgYX07dmFyIGM9ZChhKTtpZigib2JqZWN0IiE9dHlwZW9mIGMpcmV0dXJuIHZvaWQgYihhKTt2YXIgZj1nKGMpLGg9UHJvamVjdGlvbi5wcm9qZWN0aW9ucy5nZXQoZi5wcm9qTmFtZSk7aD8oZSh0aGlzLGYpLGUodGhpcyxoKSx0aGlzLmluaXQoKSxiKG51bGwsdGhpcykpOmIoYSl9dmFyIGQ9YSgiLi9wYXJzZUNvZGUiKSxlPWEoIi4vZXh0ZW5kIiksZj1hKCIuL3Byb2plY3Rpb25zIiksZz1hKCIuL2Rlcml2ZUNvbnN0YW50cyIpO1Byb2plY3Rpb24ucHJvamVjdGlvbnM9ZixQcm9qZWN0aW9uLnByb2plY3Rpb25zLnN0YXJ0KCksYi5leHBvcnRzPVByb2plY3Rpb259LHsiLi9kZXJpdmVDb25zdGFudHMiOjMzLCIuL2V4dGVuZCI6MzQsIi4vcGFyc2VDb2RlIjozNywiLi9wcm9qZWN0aW9ucyI6Mzl9XSwzOltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1jLngsaD1jLnksaT1jLnp8fDA7Zm9yKGY9MDszPmY7ZisrKWlmKCFifHwyIT09Znx8dm9pZCAwIT09Yy56KXN3aXRjaCgwPT09Zj8oZD1nLGU9IngiKToxPT09Zj8oZD1oLGU9InkiKTooZD1pLGU9InoiKSxhLmF4aXNbZl0pe2Nhc2UiZSI6Y1tlXT1kO2JyZWFrO2Nhc2UidyI6Y1tlXT0tZDticmVhaztjYXNlIm4iOmNbZV09ZDticmVhaztjYXNlInMiOmNbZV09LWQ7YnJlYWs7Y2FzZSJ1Ijp2b2lkIDAhPT1jW2VdJiYoYy56PWQpO2JyZWFrO2Nhc2UiZCI6dm9pZCAwIT09Y1tlXSYmKGMuej0tZCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm4gY319LHt9XSw0OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5QSS8yLGU9YSgiLi9zaWduIik7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhKTxkP2E6YS1lKGEpKk1hdGguUEl9fSx7Ii4vc2lnbiI6MjF9XSw1OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MipNYXRoLlBJLGU9My4xNDE1OTI2NTM1OSxmPWEoIi4vc2lnbiIpO2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoYSk8PWU/YTphLWYoYSkqZH19LHsiLi9zaWduIjoyMX1dLDY6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKGEpPjEmJihhPWE+MT8xOi0xKSxNYXRoLmFzaW4oYSl9fSx7fV0sNzpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gMS0uMjUqYSooMSthLzE2KigzKzEuMjUqYSkpfX0se31dLDg6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuLjM3NSphKigxKy4yNSphKigxKy40Njg3NSphKSl9fSx7fV0sOTpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4uMDU4NTkzNzUqYSphKigxKy43NSphKX19LHt9XSwxMDpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gYSphKmEqKDM1LzMwNzIpfX0se31dLDExOltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iKmM7cmV0dXJuIGEvTWF0aC5zcXJ0KDEtZCpkKX19LHt9XSwxMjpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7Zj1hL2I7Zm9yKHZhciBoPTA7MTU+aDtoKyspaWYoZz0oYS0oYipmLWMqTWF0aC5zaW4oMipmKStkKk1hdGguc2luKDQqZiktZSpNYXRoLnNpbig2KmYpKSkvKGItMipjKk1hdGguY29zKDIqZikrNCpkKk1hdGguY29zKDQqZiktNiplKk1hdGguY29zKDYqZikpLGYrPWcsTWF0aC5hYnMoZyk8PTFlLTEwKXJldHVybiBmO3JldHVybiBOYU59fSx7fV0sMTM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzI7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM9MS0oMS1hKmEpLygyKmEpKk1hdGgubG9nKCgxLWEpLygxK2EpKTtpZihNYXRoLmFicyhNYXRoLmFicyhiKS1jKTwxZS02KXJldHVybiAwPmI/LTEqZDpkO2Zvcih2YXIgZSxmLGcsaCxpPU1hdGguYXNpbiguNSpiKSxqPTA7MzA+ajtqKyspaWYoZj1NYXRoLnNpbihpKSxnPU1hdGguY29zKGkpLGg9YSpmLGU9TWF0aC5wb3coMS1oKmgsMikvKDIqZykqKGIvKDEtYSphKS1mLygxLWgqaCkrLjUvYSpNYXRoLmxvZygoMS1oKS8oMStoKSkpLGkrPWUsTWF0aC5hYnMoZSk8PTFlLTEwKXJldHVybiBpO3JldHVybiBOYU59fSx7fV0sMTQ6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gYSplLWIqTWF0aC5zaW4oMiplKStjKk1hdGguc2luKDQqZSktZCpNYXRoLnNpbig2KmUpfX0se31dLDE1OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hKmI7cmV0dXJuIGMvTWF0aC5zcXJ0KDEtZCpkKX19LHt9XSwxNjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguUEkvMjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZSxmPS41KmEsZz1kLTIqTWF0aC5hdGFuKGIpLGg9MDsxNT49aDtoKyspaWYoYz1hKk1hdGguc2luKGcpLGU9ZC0yKk1hdGguYXRhbihiKk1hdGgucG93KCgxLWMpLygxK2MpLGYpKS1nLGcrPWUsTWF0aC5hYnMoZSk8PTFlLTEwKXJldHVybiBnO3JldHVybi05OTk5fX0se31dLDE3OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MSxlPS4yNSxmPS4wNDY4NzUsZz0uMDE5NTMxMjUsaD0uMDEwNjgxMTUyMzQzNzUsaT0uNzUsaj0uNDY4NzUsaz0uMDEzMDIwODMzMzMzMzMzMzM0LGw9LjAwNzEyMDc2ODIyOTE2NjY2NyxtPS4zNjQ1ODMzMzMzMzMzMzMzLG49LjAwNTY5NjYxNDU4MzMzMzMzMyxvPS4zMDc2MTcxODc1O2IuZXhwb3J0cz1mdW5jdGlvbihhKXt2YXIgYj1bXTtiWzBdPWQtYSooZSthKihmK2EqKGcrYSpoKSkpLGJbMV09YSooaS1hKihmK2EqKGcrYSpoKSkpO3ZhciBjPWEqYTtyZXR1cm4gYlsyXT1jKihqLWEqKGsrYSpsKSksYyo9YSxiWzNdPWMqKG0tYSpuKSxiWzRdPWMqYSpvLGJ9fSx7fV0sMTg6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuL3BqX21sZm4iKSxlPTFlLTEwLGY9MjA7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGc9MS8oMS1iKSxoPWEsaT1mO2k7LS1pKXt2YXIgaj1NYXRoLnNpbihoKSxrPTEtYipqKmo7aWYoaz0oZChoLGosTWF0aC5jb3MoaCksYyktYSkqKGsqTWF0aC5zcXJ0KGspKSpnLGgtPWssTWF0aC5hYnMoayk8ZSlyZXR1cm4gaH1yZXR1cm4gaH19LHsiLi9wal9tbGZuIjoxOX1dLDE5OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjKj1iLGIqPWIsZFswXSphLWMqKGRbMV0rYiooZFsyXStiKihkWzNdK2IqZFs0XSkpKX19LHt9XSwyMDpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBhPjFlLTc/KGM9YSpiLCgxLWEqYSkqKGIvKDEtYypjKS0uNS9hKk1hdGgubG9nKCgxLWMpLygxK2MpKSkpOjIqYn19LHt9XSwyMTpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gMD5hPy0xOjF9fSx7fV0sMjI6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5wb3coKDEtYSkvKDErYSksYil9fSx7fV0sMjM6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9e3g6YVswXSx5OmFbMV19O3JldHVybiBhLmxlbmd0aD4yJiYoYi56PWFbMl0pLGEubGVuZ3RoPjMmJihiLm09YVszXSksYn19LHt9XSwyNDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguUEkvMjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEqYyxmPS41KmE7cmV0dXJuIGU9TWF0aC5wb3coKDEtZSkvKDErZSksZiksTWF0aC50YW4oLjUqKGQtYikpL2V9fSx7fV0sMjU6W2Z1bmN0aW9uKGEsYixjKXtjLndnczg0PXt0b3dnczg0OiIwLDAsMCIsZWxsaXBzZToiV0dTODQiLGRhdHVtTmFtZToiV0dTODQifSxjLmNoMTkwMz17dG93Z3M4NDoiNjc0LjM3NCwxNS4wNTYsNDA1LjM0NiIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6InN3aXNzIn0sYy5nZ3JzODc9e3Rvd2dzODQ6Ii0xOTkuODcsNzQuNzksMjQ2LjYyIixlbGxpcHNlOiJHUlM4MCIsZGF0dW1OYW1lOiJHcmVla19HZW9kZXRpY19SZWZlcmVuY2VfU3lzdGVtXzE5ODcifSxjLm5hZDgzPXt0b3dnczg0OiIwLDAsMCIsZWxsaXBzZToiR1JTODAiLGRhdHVtTmFtZToiTm9ydGhfQW1lcmljYW5fRGF0dW1fMTk4MyJ9LGMubmFkMjc9e25hZGdyaWRzOiJAY29udXMsQGFsYXNrYSxAbnR2Ml8wLmdzYixAbnR2MV9jYW4uZGF0IixlbGxpcHNlOiJjbHJrNjYiLGRhdHVtTmFtZToiTm9ydGhfQW1lcmljYW5fRGF0dW1fMTkyNyJ9LGMucG90c2RhbT17dG93Z3M4NDoiNjA2LjAsMjMuMCw0MTMuMCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6IlBvdHNkYW0gUmF1ZW5iZXJnIDE5NTAgREhETiJ9LGMuY2FydGhhZ2U9e3Rvd2dzODQ6Ii0yNjMuMCw2LjAsNDMxLjAiLGVsbGlwc2U6ImNsYXJrODAiLGRhdHVtTmFtZToiQ2FydGhhZ2UgMTkzNCBUdW5pc2lhIn0sYy5oZXJtYW5uc2tvZ2VsPXt0b3dnczg0OiI2NTMuMCwtMjEyLjAsNDQ5LjAiLGVsbGlwc2U6ImJlc3NlbCIsZGF0dW1OYW1lOiJIZXJtYW5uc2tvZ2VsIn0sYy5pcmU2NT17dG93Z3M4NDoiNDgyLjUzMCwtMTMwLjU5Niw1NjQuNTU3LC0xLjA0MiwtMC4yMTQsLTAuNjMxLDguMTUiLGVsbGlwc2U6Im1vZF9haXJ5IixkYXR1bU5hbWU6IklyZWxhbmQgMTk2NSJ9LGMucmFzc2FkaXJhbj17dG93Z3M4NDoiLTEzMy42MywtMTU3LjUsLTE1OC42MiIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJSYXNzYWRpcmFuIn0sYy5uemdkNDk9e3Rvd2dzODQ6IjU5LjQ3LC01LjA0LDE4Ny40NCwwLjQ3LC0wLjEsMS4wMjQsLTQuNTk5MyIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJOZXcgWmVhbGFuZCBHZW9kZXRpYyBEYXR1bSAxOTQ5In0sYy5vc2diMzY9e3Rvd2dzODQ6IjQ0Ni40NDgsLTEyNS4xNTcsNTQyLjA2MCwwLjE1MDIsMC4yNDcwLDAuODQyMSwtMjAuNDg5NCIsZWxsaXBzZToiYWlyeSIsZGF0dW1OYW1lOiJBaXJ5IDE4MzAifSxjLnNfanRzaz17dG93Z3M4NDoiNTg5LDc2LDQ4MCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6IlMtSlRTSyAoRmVycm8pIn0sYy5iZWR1YXJhbT17dG93Z3M4NDoiLTEwNiwtODcsMTg4IixlbGxpcHNlOiJjbHJrODAiLGRhdHVtTmFtZToiQmVkdWFyYW0ifSxjLmd1bnVuZ19zZWdhcmE9e3Rvd2dzODQ6Ii00MDMsNjg0LDQxIixlbGxpcHNlOiJiZXNzZWwiLGRhdHVtTmFtZToiR3VudW5nIFNlZ2FyYSBKYWthcnRhIn0sYy5ybmI3Mj17dG93Z3M4NDoiMTA2Ljg2OSwtNTIuMjk3OCwxMDMuNzI0LC0wLjMzNjU3LDAuNDU2OTU1LC0xLjg0MjE4LDEiLGVsbGlwc2U6ImludGwiLGRhdHVtTmFtZToiUmVzZWF1IE5hdGlvbmFsIEJlbGdlIDE5NzIifX0se31dLDI2OltmdW5jdGlvbihhLGIsYyl7Yy5NRVJJVD17YTo2Mzc4MTM3LHJmOjI5OC4yNTcsZWxsaXBzZU5hbWU6Ik1FUklUIDE5ODMifSxjLlNHUzg1PXthOjYzNzgxMzYscmY6Mjk4LjI1NyxlbGxpcHNlTmFtZToiU292aWV0IEdlb2RldGljIFN5c3RlbSA4NSJ9LGMuR1JTODA9e2E6NjM3ODEzNyxyZjoyOTguMjU3MjIyMTAxLGVsbGlwc2VOYW1lOiJHUlMgMTk4MChJVUdHLCAxOTgwKSJ9LGMuSUFVNzY9e2E6NjM3ODE0MCxyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJJQVUgMTk3NiJ9LGMuYWlyeT17YTo2Mzc3NTYzLjM5NixiOjYzNTYyNTYuOTEsZWxsaXBzZU5hbWU6IkFpcnkgMTgzMCJ9LGMuQVBMND17YTo2Mzc4MTM3LHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiQXBwbC4gUGh5c2ljcy4gMTk2NSJ9LGMuTldMOUQ9e2E6NjM3ODE0NSxyZjoyOTguMjUsZWxsaXBzZU5hbWU6Ik5hdmFsIFdlYXBvbnMgTGFiLiwgMTk2NSJ9LGMubW9kX2Fpcnk9e2E6NjM3NzM0MC4xODksYjo2MzU2MDM0LjQ0NixlbGxpcHNlTmFtZToiTW9kaWZpZWQgQWlyeSJ9LGMuYW5kcmFlPXthOjYzNzcxMDQuNDMscmY6MzAwLGVsbGlwc2VOYW1lOiJBbmRyYWUgMTg3NiAoRGVuLiwgSWNsbmQuKSJ9LGMuYXVzdF9TQT17YTo2Mzc4MTYwLHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiQXVzdHJhbGlhbiBOYXRsICYgUy4gQW1lci4gMTk2OSJ9LGMuR1JTNjc9e2E6NjM3ODE2MCxyZjoyOTguMjQ3MTY3NDI3LGVsbGlwc2VOYW1lOiJHUlMgNjcoSVVHRyAxOTY3KSJ9LGMuYmVzc2VsPXthOjYzNzczOTcuMTU1LHJmOjI5OS4xNTI4MTI4LGVsbGlwc2VOYW1lOiJCZXNzZWwgMTg0MSJ9LGMuYmVzc19uYW09e2E6NjM3NzQ4My44NjUscmY6Mjk5LjE1MjgxMjgsZWxsaXBzZU5hbWU6IkJlc3NlbCAxODQxIChOYW1pYmlhKSJ9LGMuY2xyazY2PXthOjYzNzgyMDYuNCxiOjYzNTY1ODMuOCxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4NjYifSxjLmNscms4MD17YTo2Mzc4MjQ5LjE0NSxyZjoyOTMuNDY2MyxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4ODAgbW9kLiJ9LGMuY2xyazU4PXthOjYzNzgyOTMuNjQ1MjA4NzU5LHJmOjI5NC4yNjA2NzYzNjkyNjU0LGVsbGlwc2VOYW1lOiJDbGFya2UgMTg1OCJ9LGMuQ1BNPXthOjYzNzU3MzguNyxyZjozMzQuMjksZWxsaXBzZU5hbWU6IkNvbW0uIGRlcyBQb2lkcyBldCBNZXN1cmVzIDE3OTkifSxjLmRlbG1icj17YTo2Mzc2NDI4LHJmOjMxMS41LGVsbGlwc2VOYW1lOiJEZWxhbWJyZSAxODEwIChCZWxnaXVtKSJ9LGMuZW5nZWxpcz17YTo2Mzc4MTM2LjA1LHJmOjI5OC4yNTY2LGVsbGlwc2VOYW1lOiJFbmdlbGlzIDE5ODUifSxjLmV2cnN0MzA9e2E6NjM3NzI3Ni4zNDUscmY6MzAwLjgwMTcsZWxsaXBzZU5hbWU6IkV2ZXJlc3QgMTgzMCJ9LGMuZXZyc3Q0OD17YTo2Mzc3MzA0LjA2MyxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxOTQ4In0sYy5ldnJzdDU2PXthOjYzNzczMDEuMjQzLHJmOjMwMC44MDE3LGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE5NTYifSxjLmV2cnN0Njk9e2E6NjM3NzI5NS42NjQscmY6MzAwLjgwMTcsZWxsaXBzZU5hbWU6IkV2ZXJlc3QgMTk2OSJ9LGMuZXZyc3RTUz17YTo2Mzc3Mjk4LjU1NixyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAoU2FiYWggJiBTYXJhd2FrKSJ9LGMuZnNjaHI2MD17YTo2Mzc4MTY2LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJGaXNjaGVyIChNZXJjdXJ5IERhdHVtKSAxOTYwIn0sYy5mc2NocjYwbT17YTo2Mzc4MTU1LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJGaXNjaGVyIDE5NjAifSxjLmZzY2hyNjg9e2E6NjM3ODE1MCxyZjoyOTguMyxlbGxpcHNlTmFtZToiRmlzY2hlciAxOTY4In0sYy5oZWxtZXJ0PXthOjYzNzgyMDAscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IkhlbG1lcnQgMTkwNiJ9LGMuaG91Z2g9e2E6NjM3ODI3MCxyZjoyOTcsZWxsaXBzZU5hbWU6IkhvdWdoIn0sYy5pbnRsPXthOjYzNzgzODgscmY6Mjk3LGVsbGlwc2VOYW1lOiJJbnRlcm5hdGlvbmFsIDE5MDkgKEhheWZvcmQpIn0sYy5rYXVsYT17YTo2Mzc4MTYzLHJmOjI5OC4yNCxlbGxpcHNlTmFtZToiS2F1bGEgMTk2MSJ9LGMubGVyY2g9e2E6NjM3ODEzOSxyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJMZXJjaCAxOTc5In0sYy5tcHJ0cz17YTo2Mzk3MzAwLHJmOjE5MSxlbGxpcHNlTmFtZToiTWF1cGVydGl1cyAxNzM4In0sYy5uZXdfaW50bD17YTo2Mzc4MTU3LjUsYjo2MzU2NzcyLjIsZWxsaXBzZU5hbWU6Ik5ldyBJbnRlcm5hdGlvbmFsIDE5NjcifSxjLnBsZXNzaXM9e2E6NjM3NjUyMyxyZjo2MzU1ODYzLGVsbGlwc2VOYW1lOiJQbGVzc2lzIDE4MTcgKEZyYW5jZSkifSxjLmtyYXNzPXthOjYzNzgyNDUscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IktyYXNzb3Zza3ksIDE5NDIifSxjLlNFYXNpYT17YTo2Mzc4MTU1LGI6NjM1Njc3My4zMjA1LGVsbGlwc2VOYW1lOiJTb3V0aGVhc3QgQXNpYSJ9LGMud2FsYmVjaz17YTo2Mzc2ODk2LGI6NjM1NTgzNC44NDY3LGVsbGlwc2VOYW1lOiJXYWxiZWNrIn0sYy5XR1M2MD17YTo2Mzc4MTY1LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJXR1MgNjAifSxjLldHUzY2PXthOjYzNzgxNDUscmY6Mjk4LjI1LGVsbGlwc2VOYW1lOiJXR1MgNjYifSxjLldHUzc9e2E6NjM3ODEzNSxyZjoyOTguMjYsZWxsaXBzZU5hbWU6IldHUyA3MiJ9LGMuV0dTODQ9e2E6NjM3ODEzNyxyZjoyOTguMjU3MjIzNTYzLGVsbGlwc2VOYW1lOiJXR1MgODQifSxjLnNwaGVyZT17YTo2MzcwOTk3LGI6NjM3MDk5NyxlbGxpcHNlTmFtZToiTm9ybWFsIFNwaGVyZSAocj02MzcwOTk3KSJ9fSx7fV0sMjc6W2Z1bmN0aW9uKGEsYixjKXtjLmdyZWVud2ljaD0wLGMubGlzYm9uPS05LjEzMTkwNjExMTExMSxjLnBhcmlzPTIuMzM3MjI5MTY2NjY3LGMuYm9nb3RhPS03NC4wODA5MTY2NjY2NjcsYy5tYWRyaWQ9LTMuNjg3OTM4ODg4ODg5LGMucm9tZT0xMi40NTIzMzMzMzMzMzMsYy5iZXJuPTcuNDM5NTgzMzMzMzMzLGMuamFrYXJ0YT0xMDYuODA3NzE5NDQ0NDQ0LGMuZmVycm89LTE3LjY2NjY2NjY2NjY2NyxjLmJydXNzZWxzPTQuMzY3OTc1LGMuc3RvY2tob2xtPTE4LjA1ODI3Nzc3Nzc3OCxjLmF0aGVucz0yMy43MTYzMzc1LGMub3Nsbz0xMC43MjI5MTY2NjY2Njd9LHt9XSwyODpbZnVuY3Rpb24oYSxiLGMpe2MuZnQ9e3RvX21ldGVyOi4zMDQ4fSxjWyJ1cy1mdCJdPXt0b19tZXRlcjoxMjAwLzM5Mzd9fSx7fV0sMjk6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYixjKXt2YXIgZDtyZXR1cm4gQXJyYXkuaXNBcnJheShjKT8oZD1nKGEsYixjKSwzPT09Yy5sZW5ndGg/W2QueCxkLnksZC56XTpbZC54LGQueV0pOmcoYSxiLGMpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBmP2E6YS5vUHJvaj9hLm9Qcm9qOmYoYSl9ZnVuY3Rpb24gcHJvajQoYSxiLGMpe2E9ZShhKTt2YXIgZixnPSExO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYj8oYj1hLGE9aCxnPSEwKTooInVuZGVmaW5lZCIhPXR5cGVvZiBiLnh8fEFycmF5LmlzQXJyYXkoYikpJiYoYz1iLGI9YSxhPWgsZz0hMCksYj1lKGIpLGM/ZChhLGIsYyk6KGY9e2ZvcndhcmQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGQoYSxiLGMpfSxpbnZlcnNlOmZ1bmN0aW9uKGMpe3JldHVybiBkKGIsYSxjKX19LGcmJihmLm9Qcm9qPWIpLGYpfXZhciBmPWEoIi4vUHJvaiIpLGc9YSgiLi90cmFuc2Zvcm0iKSxoPWYoIldHUzg0Iik7Yi5leHBvcnRzPXByb2o0fSx7Ii4vUHJvaiI6MiwiLi90cmFuc2Zvcm0iOjY1fV0sMzA6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzIsZT0xLGY9MixnPTMsaD00LGk9NSxqPTQ4NDgxMzY4MTEwOTUzNmUtMjAsaz0xLjAwMjYsbD0uMzgyNjgzNDMyMzY1MDg5OCxtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbT8odGhpcy5kYXR1bV90eXBlPWgsdm9pZChhJiYoYS5kYXR1bUNvZGUmJiJub25lIj09PWEuZGF0dW1Db2RlJiYodGhpcy5kYXR1bV90eXBlPWkpLGEuZGF0dW1fcGFyYW1zJiYodGhpcy5kYXR1bV9wYXJhbXM9YS5kYXR1bV9wYXJhbXMubWFwKHBhcnNlRmxvYXQpLCgwIT09dGhpcy5kYXR1bV9wYXJhbXNbMF18fDAhPT10aGlzLmRhdHVtX3BhcmFtc1sxXXx8MCE9PXRoaXMuZGF0dW1fcGFyYW1zWzJdKSYmKHRoaXMuZGF0dW1fdHlwZT1lKSx0aGlzLmRhdHVtX3BhcmFtcy5sZW5ndGg+MyYmKDAhPT10aGlzLmRhdHVtX3BhcmFtc1szXXx8MCE9PXRoaXMuZGF0dW1fcGFyYW1zWzRdfHwwIT09dGhpcy5kYXR1bV9wYXJhbXNbNV18fDAhPT10aGlzLmRhdHVtX3BhcmFtc1s2XSkmJih0aGlzLmRhdHVtX3R5cGU9Zix0aGlzLmRhdHVtX3BhcmFtc1szXSo9aix0aGlzLmRhdHVtX3BhcmFtc1s0XSo9aix0aGlzLmRhdHVtX3BhcmFtc1s1XSo9aix0aGlzLmRhdHVtX3BhcmFtc1s2XT10aGlzLmRhdHVtX3BhcmFtc1s2XS8xZTYrMSkpLHRoaXMuZGF0dW1fdHlwZT1hLmdyaWRzP2c6dGhpcy5kYXR1bV90eXBlLHRoaXMuYT1hLmEsdGhpcy5iPWEuYix0aGlzLmVzPWEuZXMsdGhpcy5lcDI9YS5lcDIsdGhpcy5kYXR1bV90eXBlPT09ZyYmKHRoaXMuZ3JpZHM9YS5ncmlkcykpKSk6bmV3IG0oYSl9O20ucHJvdG90eXBlPXtjb21wYXJlX2RhdHVtczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXR1bV90eXBlIT09YS5kYXR1bV90eXBlPyExOnRoaXMuYSE9PWEuYXx8TWF0aC5hYnModGhpcy5lcy1hLmVzKT41ZS0xMT8hMTp0aGlzLmRhdHVtX3R5cGU9PT1lP3RoaXMuZGF0dW1fcGFyYW1zWzBdPT09YS5kYXR1bV9wYXJhbXNbMF0mJnRoaXMuZGF0dW1fcGFyYW1zWzFdPT09YS5kYXR1bV9wYXJhbXNbMV0mJnRoaXMuZGF0dW1fcGFyYW1zWzJdPT09YS5kYXR1bV9wYXJhbXNbMl06dGhpcy5kYXR1bV90eXBlPT09Zj90aGlzLmRhdHVtX3BhcmFtc1swXT09PWEuZGF0dW1fcGFyYW1zWzBdJiZ0aGlzLmRhdHVtX3BhcmFtc1sxXT09PWEuZGF0dW1fcGFyYW1zWzFdJiZ0aGlzLmRhdHVtX3BhcmFtc1syXT09PWEuZGF0dW1fcGFyYW1zWzJdJiZ0aGlzLmRhdHVtX3BhcmFtc1szXT09PWEuZGF0dW1fcGFyYW1zWzNdJiZ0aGlzLmRhdHVtX3BhcmFtc1s0XT09PWEuZGF0dW1fcGFyYW1zWzRdJiZ0aGlzLmRhdHVtX3BhcmFtc1s1XT09PWEuZGF0dW1fcGFyYW1zWzVdJiZ0aGlzLmRhdHVtX3BhcmFtc1s2XT09PWEuZGF0dW1fcGFyYW1zWzZdOnRoaXMuZGF0dW1fdHlwZT09PWd8fGEuZGF0dW1fdHlwZT09PWc/dGhpcy5uYWRncmlkcz09PWEubmFkZ3JpZHM6ITB9LGdlb2RldGljX3RvX2dlb2NlbnRyaWM6ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGYsZyxoLGksaj1hLngsaz1hLnksbD1hLno/YS56OjAsbT0wO2lmKC1kPmsmJms+LTEuMDAxKmQpaz0tZDtlbHNlIGlmKGs+ZCYmMS4wMDEqZD5rKWs9ZDtlbHNlIGlmKC1kPmt8fGs+ZClyZXR1cm4gbnVsbDtyZXR1cm4gaj5NYXRoLlBJJiYoai09MipNYXRoLlBJKSxnPU1hdGguc2luKGspLGk9TWF0aC5jb3MoayksaD1nKmcsZj10aGlzLmEvTWF0aC5zcXJ0KDEtdGhpcy5lcypoKSxiPShmK2wpKmkqTWF0aC5jb3MoaiksYz0oZitsKSppKk1hdGguc2luKGopLGU9KGYqKDEtdGhpcy5lcykrbCkqZyxhLng9YixhLnk9YyxhLno9ZSxtfSxnZW9jZW50cmljX3RvX2dlb2RldGljOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdD0xZS0xMix1PXQqdCx2PTMwLHc9YS54LHg9YS55LHk9YS56P2EuejowO2lmKG89ITEsYj1NYXRoLnNxcnQodyp3K3gqeCksYz1NYXRoLnNxcnQodyp3K3gqeCt5KnkpLGIvdGhpcy5hPHQpe2lmKG89ITAscT0wLGMvdGhpcy5hPHQpcmV0dXJuIHI9ZCx2b2lkKHM9LXRoaXMuYil9ZWxzZSBxPU1hdGguYXRhbjIoeCx3KTtlPXkvYyxmPWIvYyxnPTEvTWF0aC5zcXJ0KDEtdGhpcy5lcyooMi10aGlzLmVzKSpmKmYpLGo9ZiooMS10aGlzLmVzKSpnLGs9ZSpnLHA9MDtkbyBwKyssaT10aGlzLmEvTWF0aC5zcXJ0KDEtdGhpcy5lcyprKmspLHM9YipqK3kqay1pKigxLXRoaXMuZXMqayprKSxoPXRoaXMuZXMqaS8oaStzKSxnPTEvTWF0aC5zcXJ0KDEtaCooMi1oKSpmKmYpLGw9ZiooMS1oKSpnLG09ZSpnLG49bSpqLWwqayxqPWwsaz1tO3doaWxlKG4qbj51JiZ2PnApO3JldHVybiByPU1hdGguYXRhbihtL01hdGguYWJzKGwpKSxhLng9cSxhLnk9cixhLno9cyxhfSxnZW9jZW50cmljX3RvX2dlb2RldGljX25vbml0ZXI6ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGYsZyxoLGksaixtLG4sbyxwLHEscixzLHQsdSx2PWEueCx3PWEueSx4PWEuej9hLno6MDtpZih2PXBhcnNlRmxvYXQodiksdz1wYXJzZUZsb2F0KHcpLHg9cGFyc2VGbG9hdCh4KSx1PSExLDAhPT12KWI9TWF0aC5hdGFuMih3LHYpO2Vsc2UgaWYodz4wKWI9ZDtlbHNlIGlmKDA+dyliPS1kO2Vsc2UgaWYodT0hMCxiPTAseD4wKWM9ZDtlbHNle2lmKCEoMD54KSlyZXR1cm4gYz1kLHZvaWQoZT0tdGhpcy5iKTtjPS1kfXJldHVybiBnPXYqdit3KncsZj1NYXRoLnNxcnQoZyksaD14Kmssaj1NYXRoLnNxcnQoaCpoK2cpLG49aC9qLHA9Zi9qLG89bipuKm4saT14K3RoaXMuYip0aGlzLmVwMipvLHQ9Zi10aGlzLmEqdGhpcy5lcypwKnAqcCxtPU1hdGguc3FydChpKmkrdCp0KSxxPWkvbSxyPXQvbSxzPXRoaXMuYS9NYXRoLnNxcnQoMS10aGlzLmVzKnEqcSksZT1yPj1sP2Yvci1zOi1sPj1yP2YvLXItczp4L3ErcyoodGhpcy5lcy0xKSx1PT09ITEmJihjPU1hdGguYXRhbihxL3IpKSxhLng9YixhLnk9YyxhLno9ZSxhfSxnZW9jZW50cmljX3RvX3dnczg0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuZGF0dW1fdHlwZT09PWUpYS54Kz10aGlzLmRhdHVtX3BhcmFtc1swXSxhLnkrPXRoaXMuZGF0dW1fcGFyYW1zWzFdLGEueis9dGhpcy5kYXR1bV9wYXJhbXNbMl07ZWxzZSBpZih0aGlzLmRhdHVtX3R5cGU9PT1mKXt2YXIgYj10aGlzLmRhdHVtX3BhcmFtc1swXSxjPXRoaXMuZGF0dW1fcGFyYW1zWzFdLGQ9dGhpcy5kYXR1bV9wYXJhbXNbMl0sZz10aGlzLmRhdHVtX3BhcmFtc1szXSxoPXRoaXMuZGF0dW1fcGFyYW1zWzRdLGk9dGhpcy5kYXR1bV9wYXJhbXNbNV0saj10aGlzLmRhdHVtX3BhcmFtc1s2XSxrPWoqKGEueC1pKmEueStoKmEueikrYixsPWoqKGkqYS54K2EueS1nKmEueikrYyxtPWoqKC1oKmEueCtnKmEueSthLnopK2Q7YS54PWssYS55PWwsYS56PW19fSxnZW9jZW50cmljX2Zyb21fd2dzODQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5kYXR1bV90eXBlPT09ZSlhLngtPXRoaXMuZGF0dW1fcGFyYW1zWzBdLGEueS09dGhpcy5kYXR1bV9wYXJhbXNbMV0sYS56LT10aGlzLmRhdHVtX3BhcmFtc1syXTtlbHNlIGlmKHRoaXMuZGF0dW1fdHlwZT09PWYpe3ZhciBiPXRoaXMuZGF0dW1fcGFyYW1zWzBdLGM9dGhpcy5kYXR1bV9wYXJhbXNbMV0sZD10aGlzLmRhdHVtX3BhcmFtc1syXSxnPXRoaXMuZGF0dW1fcGFyYW1zWzNdLGg9dGhpcy5kYXR1bV9wYXJhbXNbNF0saT10aGlzLmRhdHVtX3BhcmFtc1s1XSxqPXRoaXMuZGF0dW1fcGFyYW1zWzZdLGs9KGEueC1iKS9qLGw9KGEueS1jKS9qLG09KGEuei1kKS9qO2EueD1rK2kqbC1oKm0sYS55PS1pKmsrbCtnKm0sYS56PWgqay1nKmwrbX19fSxiLmV4cG9ydHM9bX0se31dLDMxOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MSxlPTIsZj0zLGc9NSxoPTYzNzgxMzcsaT0uMDA2Njk0Mzc5OTkwMTQxMzE2O2IuZXhwb3J0cz1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gaihhKXtyZXR1cm4gYT09PWR8fGE9PT1lfXZhciBrLGwsbTtpZihhLmNvbXBhcmVfZGF0dW1zKGIpKXJldHVybiBjO2lmKGEuZGF0dW1fdHlwZT09PWd8fGIuZGF0dW1fdHlwZT09PWcpcmV0dXJuIGM7dmFyIG49YS5hLG89YS5lcyxwPWIuYSxxPWIuZXMscj1hLmRhdHVtX3R5cGU7aWYocj09PWYpaWYoMD09PXRoaXMuYXBwbHlfZ3JpZHNoaWZ0KGEsMCxjKSlhLmE9aCxhLmVzPWk7ZWxzZXtpZighYS5kYXR1bV9wYXJhbXMpcmV0dXJuIGEuYT1uLGEuZXM9YS5lcyxjO2ZvcihrPTEsbD0wLG09YS5kYXR1bV9wYXJhbXMubGVuZ3RoO20+bDtsKyspayo9YS5kYXR1bV9wYXJhbXNbbF07aWYoMD09PWspcmV0dXJuIGEuYT1uLGEuZXM9YS5lcyxjO3I9YS5kYXR1bV9wYXJhbXMubGVuZ3RoPjM/ZTpkfXJldHVybiBiLmRhdHVtX3R5cGU9PT1mJiYoYi5hPWgsYi5lcz1pKSwoYS5lcyE9PWIuZXN8fGEuYSE9PWIuYXx8aihyKXx8aihiLmRhdHVtX3R5cGUpKSYmKGEuZ2VvZGV0aWNfdG9fZ2VvY2VudHJpYyhjKSxqKGEuZGF0dW1fdHlwZSkmJmEuZ2VvY2VudHJpY190b193Z3M4NChjKSxqKGIuZGF0dW1fdHlwZSkmJmIuZ2VvY2VudHJpY19mcm9tX3dnczg0KGMpLGIuZ2VvY2VudHJpY190b19nZW9kZXRpYyhjKSksYi5kYXR1bV90eXBlPT09ZiYmdGhpcy5hcHBseV9ncmlkc2hpZnQoYiwxLGMpLGEuYT1uLGEuZXM9byxiLmE9cCxiLmVzPXEsY319LHt9XSwzMjpbZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9dGhpcztpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGM9YXJndW1lbnRzWzFdOyJzdHJpbmciPT10eXBlb2YgYz8iKyI9PT1jLmNoYXJBdCgwKT9kW2FdPWYoYXJndW1lbnRzWzFdKTpkW2FdPWcoYXJndW1lbnRzWzFdKTpkW2FdPWN9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7QXJyYXkuaXNBcnJheShhKT9kLmFwcGx5KGIsYSk6ZChhKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSl7aWYoYSBpbiBkKXJldHVybiBkW2FdfWVsc2UiRVBTRyJpbiBhP2RbIkVQU0c6IithLkVQU0ddPWE6IkVTUkkiaW4gYT9kWyJFU1JJOiIrYS5FU1JJXT1hOiJJQVUyMDAwImluIGE/ZFsiSUFVMjAwMDoiK2EuSUFVMjAwMF09YTpjb25zb2xlLmxvZyhhKTtyZXR1cm59fXZhciBlPWEoIi4vZ2xvYmFsIiksZj1hKCIuL3Byb2pTdHJpbmciKSxnPWEoIi4vd2t0Iik7ZShkKSxiLmV4cG9ydHM9ZH0seyIuL2dsb2JhbCI6MzUsIi4vcHJvalN0cmluZyI6MzgsIi4vd2t0Ijo2Nn1dLDMzOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi9jb25zdGFudHMvRGF0dW0iKSxlPWEoIi4vY29uc3RhbnRzL0VsbGlwc29pZCIpLGY9YSgiLi9leHRlbmQiKSxnPWEoIi4vZGF0dW0iKSxoPTFlLTEwLGk9LjE2NjY2NjY2NjY2NjY2NjY2LGo9LjA0NzIyMjIyMjIyMjIyMjIyLGs9LjAyMjE1NjA4NDY1NjA4NDY1NTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7aWYoYS5kYXR1bUNvZGUmJiJub25lIiE9PWEuZGF0dW1Db2RlKXt2YXIgYj1kW2EuZGF0dW1Db2RlXTtiJiYoYS5kYXR1bV9wYXJhbXM9Yi50b3dnczg0P2IudG93Z3M4NC5zcGxpdCgiLCIpOm51bGwsYS5lbGxwcz1iLmVsbGlwc2UsYS5kYXR1bU5hbWU9Yi5kYXR1bU5hbWU/Yi5kYXR1bU5hbWU6YS5kYXR1bUNvZGUpfWlmKCFhLmEpe3ZhciBjPWVbYS5lbGxwc10/ZVthLmVsbHBzXTplLldHUzg0O2YoYSxjKX1yZXR1cm4gYS5yZiYmIWEuYiYmKGEuYj0oMS0xL2EucmYpKmEuYSksKDA9PT1hLnJmfHxNYXRoLmFicyhhLmEtYS5iKTxoKSYmKGEuc3BoZXJlPSEwLGEuYj1hLmEpLGEuYTI9YS5hKmEuYSxhLmIyPWEuYiphLmIsYS5lcz0oYS5hMi1hLmIyKS9hLmEyLGEuZT1NYXRoLnNxcnQoYS5lcyksYS5SX0EmJihhLmEqPTEtYS5lcyooaSthLmVzKihqK2EuZXMqaykpLGEuYTI9YS5hKmEuYSxhLmIyPWEuYiphLmIsYS5lcz0wKSxhLmVwMj0oYS5hMi1hLmIyKS9hLmIyLGEuazB8fChhLmswPTEpLGEuYXhpc3x8KGEuYXhpcz0iZW51IiksYS5kYXR1bXx8KGEuZGF0dW09ZyhhKSksYX19LHsiLi9jb25zdGFudHMvRGF0dW0iOjI1LCIuL2NvbnN0YW50cy9FbGxpcHNvaWQiOjI2LCIuL2RhdHVtIjozMCwiLi9leHRlbmQiOjM0fV0sMzQ6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXthPWF8fHt9O3ZhciBjLGQ7aWYoIWIpcmV0dXJuIGE7Zm9yKGQgaW4gYiljPWJbZF0sdm9pZCAwIT09YyYmKGFbZF09Yyk7cmV0dXJuIGF9fSx7fV0sMzU6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7YSgiRVBTRzo0MzI2IiwiK3RpdGxlPVdHUyA4NCAobG9uZy9sYXQpICtwcm9qPWxvbmdsYXQgK2VsbHBzPVdHUzg0ICtkYXR1bT1XR1M4NCArdW5pdHM9ZGVncmVlcyIpLGEoIkVQU0c6NDI2OSIsIit0aXRsZT1OQUQ4MyAobG9uZy9sYXQpICtwcm9qPWxvbmdsYXQgK2E9NjM3ODEzNy4wICtiPTYzNTY3NTIuMzE0MTQwMzYgK2VsbHBzPUdSUzgwICtkYXR1bT1OQUQ4MyArdW5pdHM9ZGVncmVlcyIpLGEoIkVQU0c6Mzg1NyIsIit0aXRsZT1XR1MgODQgLyBQc2V1ZG8tTWVyY2F0b3IgK3Byb2o9bWVyYyArYT02Mzc4MTM3ICtiPTYzNzgxMzcgK2xhdF90cz0wLjAgK2xvbl8wPTAuMCAreF8wPTAuMCAreV8wPTAgK2s9MS4wICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArbm9fZGVmcyIpLGEuV0dTODQ9YVsiRVBTRzo0MzI2Il0sYVsiRVBTRzozNzg1Il09YVsiRVBTRzozODU3Il0sYS5HT09HTEU9YVsiRVBTRzozODU3Il0sYVsiRVBTRzo5MDA5MTMiXT1hWyJFUFNHOjM4NTciXSxhWyJFUFNHOjEwMjExMyJdPWFbIkVQU0c6Mzg1NyJdfX0se31dLDM2OltmdW5jdGlvbihhLGIsYyl7dmFyIHByb2o0PWEoIi4vY29yZSIpO3Byb2o0LmRlZmF1bHREYXR1bT0iV0dTODQiLHByb2o0LlByb2o9YSgiLi9Qcm9qIikscHJvajQuV0dTODQ9bmV3IHByb2o0LlByb2ooIldHUzg0IikscHJvajQuUG9pbnQ9YSgiLi9Qb2ludCIpLHByb2o0LnRvUG9pbnQ9YSgiLi9jb21tb24vdG9Qb2ludCIpLHByb2o0LmRlZnM9YSgiLi9kZWZzIikscHJvajQudHJhbnNmb3JtPWEoIi4vdHJhbnNmb3JtIikscHJvajQubWdycz1hKCJtZ3JzIikscHJvajQudmVyc2lvbj1hKCIuLi9wYWNrYWdlLmpzb24iKS52ZXJzaW9uLGEoIi4vaW5jbHVkZWRQcm9qZWN0aW9ucyIpKHByb2o0KSxiLmV4cG9ydHM9cHJvajR9LHsiLi4vcGFja2FnZS5qc29uIjo2OCwiLi9Qb2ludCI6MSwiLi9Qcm9qIjoyLCIuL2NvbW1vbi90b1BvaW50IjoyMywiLi9jb3JlIjoyOSwiLi9kZWZzIjozMiwiLi9pbmNsdWRlZFByb2plY3Rpb25zIjoiaFRFRHBuIiwiLi90cmFuc2Zvcm0iOjY1LG1ncnM6Njd9XSwzNzpbZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEgaW4gaX1mdW5jdGlvbiBmKGEpe3ZhciBiPVsiR0VPR0NTIiwiR0VPQ0NTIiwiUFJPSkNTIiwiTE9DQUxfQ1MiXTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYixjKXtyZXR1cm4gYisxK2EuaW5kZXhPZihjKX0sMCl9ZnVuY3Rpb24gZyhhKXtyZXR1cm4iKyI9PT1hWzBdfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGQoYSk/ZShhKT9pW2FdOmYoYSk/aihhKTpnKGEpP2soYSk6dm9pZCAwOmF9dmFyIGk9YSgiLi9kZWZzIiksaj1hKCIuL3drdCIpLGs9YSgiLi9wcm9qU3RyaW5nIik7Yi5leHBvcnRzPWh9LHsiLi9kZWZzIjozMiwiLi9wcm9qU3RyaW5nIjozOCwiLi93a3QiOjY2fV0sMzg6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD0uMDE3NDUzMjkyNTE5OTQzMjk1LGU9YSgiLi9jb25zdGFudHMvUHJpbWVNZXJpZGlhbiIpLGY9YSgiLi9jb25zdGFudHMvdW5pdHMiKTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz17fTthLnNwbGl0KCIrIikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRyaW0oKX0pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYX0pLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdCgiPSIpO2IucHVzaCghMCksY1tiWzBdLnRvTG93ZXJDYXNlKCldPWJbMV19KTt2YXIgZyxoLGksaj17cHJvajoicHJvak5hbWUiLGRhdHVtOiJkYXR1bUNvZGUiLHJmOmZ1bmN0aW9uKGEpe2IucmY9cGFyc2VGbG9hdChhKX0sbGF0XzA6ZnVuY3Rpb24oYSl7Yi5sYXQwPWEqZH0sbGF0XzE6ZnVuY3Rpb24oYSl7Yi5sYXQxPWEqZH0sbGF0XzI6ZnVuY3Rpb24oYSl7Yi5sYXQyPWEqZH0sbGF0X3RzOmZ1bmN0aW9uKGEpe2IubGF0X3RzPWEqZH0sbG9uXzA6ZnVuY3Rpb24oYSl7Yi5sb25nMD1hKmR9LGxvbl8xOmZ1bmN0aW9uKGEpe2IubG9uZzE9YSpkfSxsb25fMjpmdW5jdGlvbihhKXtiLmxvbmcyPWEqZH0sYWxwaGE6ZnVuY3Rpb24oYSl7Yi5hbHBoYT1wYXJzZUZsb2F0KGEpKmR9LGxvbmM6ZnVuY3Rpb24oYSl7Yi5sb25nYz1hKmR9LHhfMDpmdW5jdGlvbihhKXtiLngwPXBhcnNlRmxvYXQoYSl9LHlfMDpmdW5jdGlvbihhKXtiLnkwPXBhcnNlRmxvYXQoYSl9LGtfMDpmdW5jdGlvbihhKXtiLmswPXBhcnNlRmxvYXQoYSl9LGs6ZnVuY3Rpb24oYSl7Yi5rMD1wYXJzZUZsb2F0KGEpfSxhOmZ1bmN0aW9uKGEpe2IuYT1wYXJzZUZsb2F0KGEpfSxiOmZ1bmN0aW9uKGEpe2IuYj1wYXJzZUZsb2F0KGEpfSxyX2E6ZnVuY3Rpb24oKXtiLlJfQT0hMH0sem9uZTpmdW5jdGlvbihhKXtiLnpvbmU9cGFyc2VJbnQoYSwxMCl9LHNvdXRoOmZ1bmN0aW9uKCl7Yi51dG1Tb3V0aD0hMH0sdG93Z3M4NDpmdW5jdGlvbihhKXtiLmRhdHVtX3BhcmFtcz1hLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUZsb2F0KGEpfSl9LHRvX21ldGVyOmZ1bmN0aW9uKGEpe2IudG9fbWV0ZXI9cGFyc2VGbG9hdChhKX0sdW5pdHM6ZnVuY3Rpb24oYSl7Yi51bml0cz1hLGZbYV0mJihiLnRvX21ldGVyPWZbYV0udG9fbWV0ZXIpfSxmcm9tX2dyZWVud2ljaDpmdW5jdGlvbihhKXtiLmZyb21fZ3JlZW53aWNoPWEqZH0scG06ZnVuY3Rpb24oYSl7Yi5mcm9tX2dyZWVud2ljaD0oZVthXT9lW2FdOnBhcnNlRmxvYXQoYSkpKmR9LG5hZGdyaWRzOmZ1bmN0aW9uKGEpeyJAbnVsbCI9PT1hP2IuZGF0dW1Db2RlPSJub25lIjpiLm5hZGdyaWRzPWF9LGF4aXM6ZnVuY3Rpb24oYSl7dmFyIGM9ImV3bnN1ZCI7Mz09PWEubGVuZ3RoJiYtMSE9PWMuaW5kZXhPZihhLnN1YnN0cigwLDEpKSYmLTEhPT1jLmluZGV4T2YoYS5zdWJzdHIoMSwxKSkmJi0xIT09Yy5pbmRleE9mKGEuc3Vic3RyKDIsMSkpJiYoYi5heGlzPWEpfX07Zm9yKGcgaW4gYyloPWNbZ10sZyBpbiBqPyhpPWpbZ10sImZ1bmN0aW9uIj09dHlwZW9mIGk/aShoKTpiW2ldPWgpOmJbZ109aDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGIuZGF0dW1Db2RlJiYiV0dTODQiIT09Yi5kYXR1bUNvZGUmJihiLmRhdHVtQ29kZT1iLmRhdHVtQ29kZS50b0xvd2VyQ2FzZSgpKSxifX0seyIuL2NvbnN0YW50cy9QcmltZU1lcmlkaWFuIjoyNywiLi9jb25zdGFudHMvdW5pdHMiOjI4fV0sMzk6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM9Zy5sZW5ndGg7cmV0dXJuIGEubmFtZXM/KGdbY109YSxhLm5hbWVzLmZvckVhY2goZnVuY3Rpb24oYSl7ZlthLnRvTG93ZXJDYXNlKCldPWN9KSx0aGlzKTooY29uc29sZS5sb2coYiksITApfXZhciBlPVthKCIuL3Byb2plY3Rpb25zL21lcmMiKSxhKCIuL3Byb2plY3Rpb25zL2xvbmdsYXQiKV0sZj17fSxnPVtdO2MuYWRkPWQsYy5nZXQ9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZltiXSYmZ1tmW2JdXT9nW2ZbYl1dOnZvaWQgMH0sYy5zdGFydD1mdW5jdGlvbigpe2UuZm9yRWFjaChkKX19LHsiLi9wcm9qZWN0aW9ucy9sb25nbGF0Ijo1MSwiLi9wcm9qZWN0aW9ucy9tZXJjIjo1Mn1dLDQwOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MWUtMTAsZT1hKCIuLi9jb21tb24vbXNmbnoiKSxmPWEoIi4uL2NvbW1vbi9xc2ZueiIpLGc9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxoPWEoIi4uL2NvbW1vbi9hc2lueiIpO2MuaW5pdD1mdW5jdGlvbigpe01hdGguYWJzKHRoaXMubGF0MSt0aGlzLmxhdDIpPGR8fCh0aGlzLnRlbXA9dGhpcy5iL3RoaXMuYSx0aGlzLmVzPTEtTWF0aC5wb3codGhpcy50ZW1wLDIpLHRoaXMuZTM9TWF0aC5zcXJ0KHRoaXMuZXMpLHRoaXMuc2luX3BvPU1hdGguc2luKHRoaXMubGF0MSksdGhpcy5jb3NfcG89TWF0aC5jb3ModGhpcy5sYXQxKSx0aGlzLnQxPXRoaXMuc2luX3BvLHRoaXMuY29uPXRoaXMuc2luX3BvLHRoaXMubXMxPWUodGhpcy5lMyx0aGlzLnNpbl9wbyx0aGlzLmNvc19wbyksdGhpcy5xczE9Zih0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnNpbl9wbz1NYXRoLnNpbih0aGlzLmxhdDIpLHRoaXMuY29zX3BvPU1hdGguY29zKHRoaXMubGF0MiksdGhpcy50Mj10aGlzLnNpbl9wbyx0aGlzLm1zMj1lKHRoaXMuZTMsdGhpcy5zaW5fcG8sdGhpcy5jb3NfcG8pLHRoaXMucXMyPWYodGhpcy5lMyx0aGlzLnNpbl9wbyx0aGlzLmNvc19wbyksdGhpcy5zaW5fcG89TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLmNvc19wbz1NYXRoLmNvcyh0aGlzLmxhdDApLHRoaXMudDM9dGhpcy5zaW5fcG8sdGhpcy5xczA9Zih0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSxNYXRoLmFicyh0aGlzLmxhdDEtdGhpcy5sYXQyKT5kP3RoaXMubnMwPSh0aGlzLm1zMSp0aGlzLm1zMS10aGlzLm1zMip0aGlzLm1zMikvKHRoaXMucXMyLXRoaXMucXMxKTp0aGlzLm5zMD10aGlzLmNvbix0aGlzLmM9dGhpcy5tczEqdGhpcy5tczErdGhpcy5uczAqdGhpcy5xczEsdGhpcy5yaD10aGlzLmEqTWF0aC5zcXJ0KHRoaXMuYy10aGlzLm5zMCp0aGlzLnFzMCkvdGhpcy5uczApfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55O3RoaXMuc2luX3BoaT1NYXRoLnNpbihjKSx0aGlzLmNvc19waGk9TWF0aC5jb3MoYyk7dmFyIGQ9Zih0aGlzLmUzLHRoaXMuc2luX3BoaSx0aGlzLmNvc19waGkpLGU9dGhpcy5hKk1hdGguc3FydCh0aGlzLmMtdGhpcy5uczAqZCkvdGhpcy5uczAsaD10aGlzLm5zMCpnKGItdGhpcy5sb25nMCksaT1lKk1hdGguc2luKGgpK3RoaXMueDAsaj10aGlzLnJoLWUqTWF0aC5jb3MoaCkrdGhpcy55MDtyZXR1cm4gYS54PWksYS55PWosYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsaDtyZXR1cm4gYS54LT10aGlzLngwLGEueT10aGlzLnJoLWEueSt0aGlzLnkwLHRoaXMubnMwPj0wPyhiPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGQ9MSk6KGI9LU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGQ9LTEpLGU9MCwwIT09YiYmKGU9TWF0aC5hdGFuMihkKmEueCxkKmEueSkpLGQ9Yip0aGlzLm5zMC90aGlzLmEsdGhpcy5zcGhlcmU/aD1NYXRoLmFzaW4oKHRoaXMuYy1kKmQpLygyKnRoaXMubnMwKSk6KGM9KHRoaXMuYy1kKmQpL3RoaXMubnMwLGg9dGhpcy5waGkxeih0aGlzLmUzLGMpKSxmPWcoZS90aGlzLm5zMCt0aGlzLmxvbmcwKSxhLng9ZixhLnk9aCxhfSxjLnBoaTF6PWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaSxqPWgoLjUqYik7aWYoZD5hKXJldHVybiBqO2Zvcih2YXIgaz1hKmEsbD0xOzI1Pj1sO2wrKylpZihjPU1hdGguc2luKGopLGU9TWF0aC5jb3MoaiksZj1hKmMsZz0xLWYqZixpPS41KmcqZy9lKihiLygxLWspLWMvZysuNS9hKk1hdGgubG9nKCgxLWYpLygxK2YpKSksais9aSxNYXRoLmFicyhpKTw9MWUtNylyZXR1cm4gajtyZXR1cm4gbnVsbH0sYy5uYW1lcz1bIkFsYmVyc19Db25pY19FcXVhbF9BcmVhIiwiQWxiZXJzIiwiYWVhIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9hc2lueiI6NiwiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3FzZm56IjoyMH1dLDQxOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxlPU1hdGguUEkvMixmPTFlLTEwLGc9YSgiLi4vY29tbW9uL21sZm4iKSxoPWEoIi4uL2NvbW1vbi9lMGZuIiksaT1hKCIuLi9jb21tb24vZTFmbiIpLGo9YSgiLi4vY29tbW9uL2UyZm4iKSxrPWEoIi4uL2NvbW1vbi9lM2ZuIiksbD1hKCIuLi9jb21tb24vZ04iKSxtPWEoIi4uL2NvbW1vbi9hc2lueiIpLG49YSgiLi4vY29tbW9uL2ltbGZuIik7Yy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5zaW5fcDEyPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5jb3NfcDEyPU1hdGguY29zKHRoaXMubGF0MCl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHkseixBLEIsQyxELEUsRixHLEg9YS54LEk9YS55LEo9TWF0aC5zaW4oYS55KSxLPU1hdGguY29zKGEueSksTD1kKEgtdGhpcy5sb25nMCk7cmV0dXJuIHRoaXMuc3BoZXJlP01hdGguYWJzKHRoaXMuc2luX3AxMi0xKTw9Zj8oYS54PXRoaXMueDArdGhpcy5hKihlLUkpKk1hdGguc2luKEwpLGEueT10aGlzLnkwLXRoaXMuYSooZS1JKSpNYXRoLmNvcyhMKSxhKTpNYXRoLmFicyh0aGlzLnNpbl9wMTIrMSk8PWY/KGEueD10aGlzLngwK3RoaXMuYSooZStJKSpNYXRoLnNpbihMKSxhLnk9dGhpcy55MCt0aGlzLmEqKGUrSSkqTWF0aC5jb3MoTCksYSk6KEI9dGhpcy5zaW5fcDEyKkordGhpcy5jb3NfcDEyKksqTWF0aC5jb3MoTCksej1NYXRoLmFjb3MoQiksQT16L01hdGguc2luKHopLGEueD10aGlzLngwK3RoaXMuYSpBKksqTWF0aC5zaW4oTCksYS55PXRoaXMueTArdGhpcy5hKkEqKHRoaXMuY29zX3AxMipKLXRoaXMuc2luX3AxMipLKk1hdGguY29zKEwpKSxhKTooYj1oKHRoaXMuZXMpLGM9aSh0aGlzLmVzKSxtPWoodGhpcy5lcyksbj1rKHRoaXMuZXMpLE1hdGguYWJzKHRoaXMuc2luX3AxMi0xKTw9Zj8obz10aGlzLmEqZyhiLGMsbSxuLGUpLHA9dGhpcy5hKmcoYixjLG0sbixJKSxhLng9dGhpcy54MCsoby1wKSpNYXRoLnNpbihMKSxhLnk9dGhpcy55MC0oby1wKSpNYXRoLmNvcyhMKSxhKTpNYXRoLmFicyh0aGlzLnNpbl9wMTIrMSk8PWY/KG89dGhpcy5hKmcoYixjLG0sbixlKSxwPXRoaXMuYSpnKGIsYyxtLG4sSSksYS54PXRoaXMueDArKG8rcCkqTWF0aC5zaW4oTCksYS55PXRoaXMueTArKG8rcCkqTWF0aC5jb3MoTCksYSk6KHE9Si9LLHI9bCh0aGlzLmEsdGhpcy5lLHRoaXMuc2luX3AxMikscz1sKHRoaXMuYSx0aGlzLmUsSiksdD1NYXRoLmF0YW4oKDEtdGhpcy5lcykqcSt0aGlzLmVzKnIqdGhpcy5zaW5fcDEyLyhzKkspKSx1PU1hdGguYXRhbjIoTWF0aC5zaW4oTCksdGhpcy5jb3NfcDEyKk1hdGgudGFuKHQpLXRoaXMuc2luX3AxMipNYXRoLmNvcyhMKSksQz0wPT09dT9NYXRoLmFzaW4odGhpcy5jb3NfcDEyKk1hdGguc2luKHQpLXRoaXMuc2luX3AxMipNYXRoLmNvcyh0KSk6TWF0aC5hYnMoTWF0aC5hYnModSktTWF0aC5QSSk8PWY/LU1hdGguYXNpbih0aGlzLmNvc19wMTIqTWF0aC5zaW4odCktdGhpcy5zaW5fcDEyKk1hdGguY29zKHQpKTpNYXRoLmFzaW4oTWF0aC5zaW4oTCkqTWF0aC5jb3ModCkvTWF0aC5zaW4odSkpLHY9dGhpcy5lKnRoaXMuc2luX3AxMi9NYXRoLnNxcnQoMS10aGlzLmVzKSx3PXRoaXMuZSp0aGlzLmNvc19wMTIqTWF0aC5jb3ModSkvTWF0aC5zcXJ0KDEtdGhpcy5lcykseD12KncseT13KncsRD1DKkMsRT1EKkMsRj1FKkMsRz1GKkMsej1yKkMqKDEtRCp5KigxLXkpLzYrRS84KngqKDEtMip5KStGLzEyMCooeSooNC03KnkpLTMqdip2KigxLTcqeSkpLUcvNDgqeCksYS54PXRoaXMueDAreipNYXRoLnNpbih1KSxhLnk9dGhpcy55MCt6Kk1hdGguY29zKHUpLGEpKX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnktPXRoaXMueTA7dmFyIGIsYyxvLHAscSxyLHMsdCx1LHYsdyx4LHkseixBLEIsQyxELEUsRixHLEgsSTtpZih0aGlzLnNwaGVyZSl7aWYoYj1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSxiPjIqZSp0aGlzLmEpcmV0dXJuO3JldHVybiBjPWIvdGhpcy5hLG89TWF0aC5zaW4oYykscD1NYXRoLmNvcyhjKSxxPXRoaXMubG9uZzAsTWF0aC5hYnMoYik8PWY/cj10aGlzLmxhdDA6KHI9bShwKnRoaXMuc2luX3AxMithLnkqbyp0aGlzLmNvc19wMTIvYikscz1NYXRoLmFicyh0aGlzLmxhdDApLWUscT1kKE1hdGguYWJzKHMpPD1mP3RoaXMubGF0MD49MD90aGlzLmxvbmcwK01hdGguYXRhbjIoYS54LC1hLnkpOnRoaXMubG9uZzAtTWF0aC5hdGFuMigtYS54LGEueSk6dGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCpvLGIqdGhpcy5jb3NfcDEyKnAtYS55KnRoaXMuc2luX3AxMipvKSkpLGEueD1xLGEueT1yLGF9cmV0dXJuIHQ9aCh0aGlzLmVzKSx1PWkodGhpcy5lcyksdj1qKHRoaXMuZXMpLHc9ayh0aGlzLmVzKSxNYXRoLmFicyh0aGlzLnNpbl9wMTItMSk8PWY/KHg9dGhpcy5hKmcodCx1LHYsdyxlKSxiPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLHk9eC1iLHI9bih5L3RoaXMuYSx0LHUsdix3KSxxPWQodGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCwtMSphLnkpKSxhLng9cSxhLnk9cixhKTpNYXRoLmFicyh0aGlzLnNpbl9wMTIrMSk8PWY/KHg9dGhpcy5hKmcodCx1LHYsdyxlKSxiPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLHk9Yi14LHI9bih5L3RoaXMuYSx0LHUsdix3KSxxPWQodGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCxhLnkpKSxhLng9cSxhLnk9cixhKTooYj1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSxCPU1hdGguYXRhbjIoYS54LGEueSksej1sKHRoaXMuYSx0aGlzLmUsdGhpcy5zaW5fcDEyKSxDPU1hdGguY29zKEIpLEQ9dGhpcy5lKnRoaXMuY29zX3AxMipDLEU9LUQqRC8oMS10aGlzLmVzKSxGPTMqdGhpcy5lcyooMS1FKSp0aGlzLnNpbl9wMTIqdGhpcy5jb3NfcDEyKkMvKDEtdGhpcy5lcyksRz1iL3osSD1HLUUqKDErRSkqTWF0aC5wb3coRywzKS82LUYqKDErMypFKSpNYXRoLnBvdyhHLDQpLzI0LEk9MS1FKkgqSC8yLUcqSCpIKkgvNixBPU1hdGguYXNpbih0aGlzLnNpbl9wMTIqTWF0aC5jb3MoSCkrdGhpcy5jb3NfcDEyKk1hdGguc2luKEgpKkMpLHE9ZCh0aGlzLmxvbmcwK01hdGguYXNpbihNYXRoLnNpbihCKSpNYXRoLnNpbihIKS9NYXRoLmNvcyhBKSkpLHI9TWF0aC5hdGFuKCgxLXRoaXMuZXMqSSp0aGlzLnNpbl9wMTIvTWF0aC5zaW4oQSkpKk1hdGgudGFuKEEpLygxLXRoaXMuZXMpKSxhLng9cSxhLnk9cixhKX0sYy5uYW1lcz1bIkF6aW11dGhhbF9FcXVpZGlzdGFudCIsImFlcWQiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2FzaW56Ijo2LCIuLi9jb21tb24vZTBmbiI6NywiLi4vY29tbW9uL2UxZm4iOjgsIi4uL2NvbW1vbi9lMmZuIjo5LCIuLi9jb21tb24vZTNmbiI6MTAsIi4uL2NvbW1vbi9nTiI6MTEsIi4uL2NvbW1vbi9pbWxmbiI6MTIsIi4uL2NvbW1vbi9tbGZuIjoxNH1dLDQyOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL21sZm4iKSxlPWEoIi4uL2NvbW1vbi9lMGZuIiksZj1hKCIuLi9jb21tb24vZTFmbiIpLGc9YSgiLi4vY29tbW9uL2UyZm4iKSxoPWEoIi4uL2NvbW1vbi9lM2ZuIiksaT1hKCIuLi9jb21tb24vZ04iKSxqPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaz1hKCIuLi9jb21tb24vYWRqdXN0X2xhdCIpLGw9YSgiLi4vY29tbW9uL2ltbGZuIiksbT1NYXRoLlBJLzIsbj0xZS0xMDtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZXx8KHRoaXMuZTA9ZSh0aGlzLmVzKSx0aGlzLmUxPWYodGhpcy5lcyksdGhpcy5lMj1nKHRoaXMuZXMpLHRoaXMuZTM9aCh0aGlzLmVzKSx0aGlzLm1sMD10aGlzLmEqZCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MCkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlPWEueCxmPWEueTtpZihlPWooZS10aGlzLmxvbmcwKSx0aGlzLnNwaGVyZSliPXRoaXMuYSpNYXRoLmFzaW4oTWF0aC5jb3MoZikqTWF0aC5zaW4oZSkpLGM9dGhpcy5hKihNYXRoLmF0YW4yKE1hdGgudGFuKGYpLE1hdGguY29zKGUpKS10aGlzLmxhdDApO2Vsc2V7dmFyIGc9TWF0aC5zaW4oZiksaD1NYXRoLmNvcyhmKSxrPWkodGhpcy5hLHRoaXMuZSxnKSxsPU1hdGgudGFuKGYpKk1hdGgudGFuKGYpLG09ZSpNYXRoLmNvcyhmKSxuPW0qbSxvPXRoaXMuZXMqaCpoLygxLXRoaXMuZXMpLHA9dGhpcy5hKmQodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyxmKTtiPWsqbSooMS1uKmwqKDEvNi0oOC1sKzgqbykqbi8xMjApKSxjPXAtdGhpcy5tbDAraypnL2gqbiooLjUrKDUtbCs2Km8pKm4vMjQpfXJldHVybiBhLng9Yit0aGlzLngwLGEueT1jK3RoaXMueTAsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnktPXRoaXMueTA7dmFyIGIsYyxkPWEueC90aGlzLmEsZT1hLnkvdGhpcy5hO2lmKHRoaXMuc3BoZXJlKXt2YXIgZj1lK3RoaXMubGF0MDtiPU1hdGguYXNpbihNYXRoLnNpbihmKSpNYXRoLmNvcyhkKSksYz1NYXRoLmF0YW4yKE1hdGgudGFuKGQpLE1hdGguY29zKGYpKX1lbHNle3ZhciBnPXRoaXMubWwwL3RoaXMuYStlLGg9bChnLHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMpO2lmKE1hdGguYWJzKE1hdGguYWJzKGgpLW0pPD1uKXJldHVybiBhLng9dGhpcy5sb25nMCxhLnk9bSwwPmUmJihhLnkqPS0xKSxhO3ZhciBvPWkodGhpcy5hLHRoaXMuZSxNYXRoLnNpbihoKSkscD1vKm8qby90aGlzLmEvdGhpcy5hKigxLXRoaXMuZXMpLHE9TWF0aC5wb3coTWF0aC50YW4oaCksMikscj1kKnRoaXMuYS9vLHM9cipyO2I9aC1vKk1hdGgudGFuKGgpL3AqcipyKiguNS0oMSszKnEpKnIqci8yNCksYz1yKigxLXMqKHEvMysoMSszKnEpKnEqcy8xNSkpL01hdGguY29zKGgpfXJldHVybiBhLng9aihjK3RoaXMubG9uZzApLGEueT1rKGIpLGF9LGMubmFtZXM9WyJDYXNzaW5pIiwiQ2Fzc2luaV9Tb2xkbmVyIiwiY2FzcyJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbGF0Ijo0LCIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2UwZm4iOjcsIi4uL2NvbW1vbi9lMWZuIjo4LCIuLi9jb21tb24vZTJmbiI6OSwiLi4vY29tbW9uL2UzZm4iOjEwLCIuLi9jb21tb24vZ04iOjExLCIuLi9jb21tb24vaW1sZm4iOjEyLCIuLi9jb21tb24vbWxmbiI6MTR9XSw0MzpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT1hKCIuLi9jb21tb24vcXNmbnoiKSxmPWEoIi4uL2NvbW1vbi9tc2ZueiIpLGc9YSgiLi4vY29tbW9uL2lxc2ZueiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuc3BoZXJlfHwodGhpcy5rMD1mKHRoaXMuZSxNYXRoLnNpbih0aGlzLmxhdF90cyksTWF0aC5jb3ModGhpcy5sYXRfdHMpKSl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGY9YS54LGc9YS55LGg9ZChmLXRoaXMubG9uZzApO2lmKHRoaXMuc3BoZXJlKWI9dGhpcy54MCt0aGlzLmEqaCpNYXRoLmNvcyh0aGlzLmxhdF90cyksYz10aGlzLnkwK3RoaXMuYSpNYXRoLnNpbihnKS9NYXRoLmNvcyh0aGlzLmxhdF90cyk7ZWxzZXt2YXIgaT1lKHRoaXMuZSxNYXRoLnNpbihnKSk7Yj10aGlzLngwK3RoaXMuYSp0aGlzLmswKmgsYz10aGlzLnkwK3RoaXMuYSppKi41L3RoaXMuazB9cmV0dXJuIGEueD1iLGEueT1jLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXthLngtPXRoaXMueDAsYS55LT10aGlzLnkwO3ZhciBiLGM7cmV0dXJuIHRoaXMuc3BoZXJlPyhiPWQodGhpcy5sb25nMCthLngvdGhpcy5hL01hdGguY29zKHRoaXMubGF0X3RzKSksYz1NYXRoLmFzaW4oYS55L3RoaXMuYSpNYXRoLmNvcyh0aGlzLmxhdF90cykpKTooYz1nKHRoaXMuZSwyKmEueSp0aGlzLmswL3RoaXMuYSksYj1kKHRoaXMubG9uZzArYS54Lyh0aGlzLmEqdGhpcy5rMCkpKSxhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsiY2VhIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9pcXNmbnoiOjEzLCIuLi9jb21tb24vbXNmbnoiOjE1LCIuLi9jb21tb24vcXNmbnoiOjIwfV0sNDQ6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGU9YSgiLi4vY29tbW9uL2FkanVzdF9sYXQiKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLngwPXRoaXMueDB8fDAsdGhpcy55MD10aGlzLnkwfHwwLHRoaXMubGF0MD10aGlzLmxhdDB8fDAsdGhpcy5sb25nMD10aGlzLmxvbmcwfHwwLHRoaXMubGF0X3RzPXRoaXMubGF0X3RzfHwwLHRoaXMudGl0bGU9dGhpcy50aXRsZXx8IkVxdWlkaXN0YW50IEN5bGluZHJpY2FsIChQbGF0ZSBDYXJyZSkiLHRoaXMucmM9TWF0aC5jb3ModGhpcy5sYXRfdHMpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55LGY9ZChiLXRoaXMubG9uZzApLGc9ZShjLXRoaXMubGF0MCk7cmV0dXJuIGEueD10aGlzLngwK3RoaXMuYSpmKnRoaXMucmMsYS55PXRoaXMueTArdGhpcy5hKmcsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiPWEueCxjPWEueTtyZXR1cm4gYS54PWQodGhpcy5sb25nMCsoYi10aGlzLngwKS8odGhpcy5hKnRoaXMucmMpKSxhLnk9ZSh0aGlzLmxhdDArKGMtdGhpcy55MCkvdGhpcy5hKSxhfSxjLm5hbWVzPVsiRXF1aXJlY3Rhbmd1bGFyIiwiRXF1aWRpc3RhbnRfQ3lsaW5kcmljYWwiLCJlcWMiXX0seyIuLi9jb21tb24vYWRqdXN0X2xhdCI6NCwiLi4vY29tbW9uL2FkanVzdF9sb24iOjV9XSw0NTpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9lMGZuIiksZT1hKCIuLi9jb21tb24vZTFmbiIpLGY9YSgiLi4vY29tbW9uL2UyZm4iKSxnPWEoIi4uL2NvbW1vbi9lM2ZuIiksaD1hKCIuLi9jb21tb24vbXNmbnoiKSxpPWEoIi4uL2NvbW1vbi9tbGZuIiksaj1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGs9YSgiLi4vY29tbW9uL2FkanVzdF9sYXQiKSxsPWEoIi4uL2NvbW1vbi9pbWxmbiIpLG09MWUtMTA7Yy5pbml0PWZ1bmN0aW9uKCl7TWF0aC5hYnModGhpcy5sYXQxK3RoaXMubGF0Mik8bXx8KHRoaXMubGF0Mj10aGlzLmxhdDJ8fHRoaXMubGF0MSx0aGlzLnRlbXA9dGhpcy5iL3RoaXMuYSx0aGlzLmVzPTEtTWF0aC5wb3codGhpcy50ZW1wLDIpLHRoaXMuZT1NYXRoLnNxcnQodGhpcy5lcyksdGhpcy5lMD1kKHRoaXMuZXMpLHRoaXMuZTE9ZSh0aGlzLmVzKSx0aGlzLmUyPWYodGhpcy5lcyksdGhpcy5lMz1nKHRoaXMuZXMpLHRoaXMuc2lucGhpPU1hdGguc2luKHRoaXMubGF0MSksdGhpcy5jb3NwaGk9TWF0aC5jb3ModGhpcy5sYXQxKSx0aGlzLm1zMT1oKHRoaXMuZSx0aGlzLnNpbnBoaSx0aGlzLmNvc3BoaSksdGhpcy5tbDE9aSh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MSksTWF0aC5hYnModGhpcy5sYXQxLXRoaXMubGF0Mik8bT90aGlzLm5zPXRoaXMuc2lucGhpOih0aGlzLnNpbnBoaT1NYXRoLnNpbih0aGlzLmxhdDIpLHRoaXMuY29zcGhpPU1hdGguY29zKHRoaXMubGF0MiksdGhpcy5tczI9aCh0aGlzLmUsdGhpcy5zaW5waGksdGhpcy5jb3NwaGkpLHRoaXMubWwyPWkodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyx0aGlzLmxhdDIpLHRoaXMubnM9KHRoaXMubXMxLXRoaXMubXMyKS8odGhpcy5tbDItdGhpcy5tbDEpKSx0aGlzLmc9dGhpcy5tbDErdGhpcy5tczEvdGhpcy5ucyx0aGlzLm1sMD1pKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQwKSx0aGlzLnJoPXRoaXMuYSoodGhpcy5nLXRoaXMubWwwKSl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjPWEueCxkPWEueTtpZih0aGlzLnNwaGVyZSliPXRoaXMuYSoodGhpcy5nLWQpO2Vsc2V7dmFyIGU9aSh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLGQpO2I9dGhpcy5hKih0aGlzLmctZSl9dmFyIGY9dGhpcy5ucypqKGMtdGhpcy5sb25nMCksZz10aGlzLngwK2IqTWF0aC5zaW4oZiksaD10aGlzLnkwK3RoaXMucmgtYipNYXRoLmNvcyhmKTtyZXR1cm4gYS54PWcsYS55PWgsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnk9dGhpcy5yaC1hLnkrdGhpcy55MDt2YXIgYixjLGQsZTt0aGlzLm5zPj0wPyhjPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGI9MSk6KGM9LU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGI9LTEpO3ZhciBmPTA7aWYoMCE9PWMmJihmPU1hdGguYXRhbjIoYiphLngsYiphLnkpKSx0aGlzLnNwaGVyZSlyZXR1cm4gZT1qKHRoaXMubG9uZzArZi90aGlzLm5zKSxkPWsodGhpcy5nLWMvdGhpcy5hKSxhLng9ZSxhLnk9ZCxhO3ZhciBnPXRoaXMuZy1jL3RoaXMuYTtyZXR1cm4gZD1sKGcsdGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksZT1qKHRoaXMubG9uZzArZi90aGlzLm5zKSxhLng9ZSxhLnk9ZCxhfSxjLm5hbWVzPVsiRXF1aWRpc3RhbnRfQ29uaWMiLCJlcWRjIl19LHsiLi4vY29tbW9uL2FkanVzdF9sYXQiOjQsIi4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vZTBmbiI6NywiLi4vY29tbW9uL2UxZm4iOjgsIi4uL2NvbW1vbi9lMmZuIjo5LCIuLi9jb21tb24vZTNmbiI6MTAsIi4uL2NvbW1vbi9pbWxmbiI6MTIsIi4uL2NvbW1vbi9tbGZuIjoxNCwiLi4vY29tbW9uL21zZm56IjoxNX1dLDQ2OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5QSS80LGU9YSgiLi4vY29tbW9uL3NyYXQiKSxmPU1hdGguUEkvMixnPTIwO2MuaW5pdD1mdW5jdGlvbigpe3ZhciBhPU1hdGguc2luKHRoaXMubGF0MCksYj1NYXRoLmNvcyh0aGlzLmxhdDApO2IqPWIsdGhpcy5yYz1NYXRoLnNxcnQoMS10aGlzLmVzKS8oMS10aGlzLmVzKmEqYSksdGhpcy5DPU1hdGguc3FydCgxK3RoaXMuZXMqYipiLygxLXRoaXMuZXMpKSx0aGlzLnBoaWMwPU1hdGguYXNpbihhL3RoaXMuQyksdGhpcy5yYXRleHA9LjUqdGhpcy5DKnRoaXMuZSx0aGlzLks9TWF0aC50YW4oLjUqdGhpcy5waGljMCtkKS8oTWF0aC5wb3coTWF0aC50YW4oLjUqdGhpcy5sYXQwK2QpLHRoaXMuQykqZSh0aGlzLmUqYSx0aGlzLnJhdGV4cCkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55O3JldHVybiBhLnk9MipNYXRoLmF0YW4odGhpcy5LKk1hdGgucG93KE1hdGgudGFuKC41KmMrZCksdGhpcy5DKSplKHRoaXMuZSpNYXRoLnNpbihjKSx0aGlzLnJhdGV4cCkpLWYsYS54PXRoaXMuQypiLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MWUtMTQsYz1hLngvdGhpcy5DLGg9YS55LGk9TWF0aC5wb3coTWF0aC50YW4oLjUqaCtkKS90aGlzLkssMS90aGlzLkMpLGo9ZztqPjAmJihoPTIqTWF0aC5hdGFuKGkqZSh0aGlzLmUqTWF0aC5zaW4oYS55KSwtLjUqdGhpcy5lKSktZiwhKE1hdGguYWJzKGgtYS55KTxiKSk7LS1qKWEueT1oO3JldHVybiBqPyhhLng9YyxhLnk9aCxhKTpudWxsfSxjLm5hbWVzPVsiZ2F1c3MiXX0seyIuLi9jb21tb24vc3JhdCI6MjJ9XSw0NzpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT0xZS0xMCxmPWEoIi4uL2NvbW1vbi9hc2lueiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuc2luX3AxND1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zX3AxND1NYXRoLmNvcyh0aGlzLmxhdDApLAp0aGlzLmluZmluaXR5X2Rpc3Q9MWUzKnRoaXMuYSx0aGlzLnJjPTF9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGYsZyxoLGksaixrLGw9YS54LG09YS55O3JldHVybiBmPWQobC10aGlzLmxvbmcwKSxiPU1hdGguc2luKG0pLGM9TWF0aC5jb3MobSksZz1NYXRoLmNvcyhmKSxpPXRoaXMuc2luX3AxNCpiK3RoaXMuY29zX3AxNCpjKmcsaD0xLGk+MHx8TWF0aC5hYnMoaSk8PWU/KGo9dGhpcy54MCt0aGlzLmEqaCpjKk1hdGguc2luKGYpL2ksaz10aGlzLnkwK3RoaXMuYSpoKih0aGlzLmNvc19wMTQqYi10aGlzLnNpbl9wMTQqYypnKS9pKTooaj10aGlzLngwK3RoaXMuaW5maW5pdHlfZGlzdCpjKk1hdGguc2luKGYpLGs9dGhpcy55MCt0aGlzLmluZmluaXR5X2Rpc3QqKHRoaXMuY29zX3AxNCpiLXRoaXMuc2luX3AxNCpjKmcpKSxhLng9aixhLnk9ayxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGcsaCxpO3JldHVybiBhLng9KGEueC10aGlzLngwKS90aGlzLmEsYS55PShhLnktdGhpcy55MCkvdGhpcy5hLGEueC89dGhpcy5rMCxhLnkvPXRoaXMuazAsKGI9TWF0aC5zcXJ0KGEueCphLngrYS55KmEueSkpPyhnPU1hdGguYXRhbjIoYix0aGlzLnJjKSxjPU1hdGguc2luKGcpLGU9TWF0aC5jb3MoZyksaT1mKGUqdGhpcy5zaW5fcDE0K2EueSpjKnRoaXMuY29zX3AxNC9iKSxoPU1hdGguYXRhbjIoYS54KmMsYip0aGlzLmNvc19wMTQqZS1hLnkqdGhpcy5zaW5fcDE0KmMpLGg9ZCh0aGlzLmxvbmcwK2gpKTooaT10aGlzLnBoaWMwLGg9MCksYS54PWgsYS55PWksYX0sYy5uYW1lcz1bImdub20iXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL2FzaW56Ijo2fV0sNDg6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuYT02Mzc3Mzk3LjE1NSx0aGlzLmVzPS4wMDY2NzQzNzIyMzA2MTQsdGhpcy5lPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLmxhdDB8fCh0aGlzLmxhdDA9Ljg2MzkzNzk3OTczNzE5MyksdGhpcy5sb25nMHx8KHRoaXMubG9uZzA9LjQzMzQyMzQzMDkxMTkyNTEpLHRoaXMuazB8fCh0aGlzLmswPS45OTk5KSx0aGlzLnM0NT0uNzg1Mzk4MTYzMzk3NDQ4LHRoaXMuczkwPTIqdGhpcy5zNDUsdGhpcy5maTA9dGhpcy5sYXQwLHRoaXMuZTI9dGhpcy5lcyx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZTIpLHRoaXMuYWxmYT1NYXRoLnNxcnQoMSt0aGlzLmUyKk1hdGgucG93KE1hdGguY29zKHRoaXMuZmkwKSw0KS8oMS10aGlzLmUyKSksdGhpcy51cT0xLjA0MjE2ODU2MzgwNDc0LHRoaXMudTA9TWF0aC5hc2luKE1hdGguc2luKHRoaXMuZmkwKS90aGlzLmFsZmEpLHRoaXMuZz1NYXRoLnBvdygoMSt0aGlzLmUqTWF0aC5zaW4odGhpcy5maTApKS8oMS10aGlzLmUqTWF0aC5zaW4odGhpcy5maTApKSx0aGlzLmFsZmEqdGhpcy5lLzIpLHRoaXMuaz1NYXRoLnRhbih0aGlzLnUwLzIrdGhpcy5zNDUpL01hdGgucG93KE1hdGgudGFuKHRoaXMuZmkwLzIrdGhpcy5zNDUpLHRoaXMuYWxmYSkqdGhpcy5nLHRoaXMuazE9dGhpcy5rMCx0aGlzLm4wPXRoaXMuYSpNYXRoLnNxcnQoMS10aGlzLmUyKS8oMS10aGlzLmUyKk1hdGgucG93KE1hdGguc2luKHRoaXMuZmkwKSwyKSksdGhpcy5zMD0xLjM3MDA4MzQ2MjgxNTU1LHRoaXMubj1NYXRoLnNpbih0aGlzLnMwKSx0aGlzLnJvMD10aGlzLmsxKnRoaXMubjAvTWF0aC50YW4odGhpcy5zMCksdGhpcy5hZD10aGlzLnM5MC10aGlzLnVxfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxlLGYsZyxoLGksaj1hLngsaz1hLnksbD1kKGotdGhpcy5sb25nMCk7cmV0dXJuIGI9TWF0aC5wb3coKDErdGhpcy5lKk1hdGguc2luKGspKS8oMS10aGlzLmUqTWF0aC5zaW4oaykpLHRoaXMuYWxmYSp0aGlzLmUvMiksYz0yKihNYXRoLmF0YW4odGhpcy5rKk1hdGgucG93KE1hdGgudGFuKGsvMit0aGlzLnM0NSksdGhpcy5hbGZhKS9iKS10aGlzLnM0NSksZT0tbCp0aGlzLmFsZmEsZj1NYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5hZCkqTWF0aC5zaW4oYykrTWF0aC5zaW4odGhpcy5hZCkqTWF0aC5jb3MoYykqTWF0aC5jb3MoZSkpLGc9TWF0aC5hc2luKE1hdGguY29zKGMpKk1hdGguc2luKGUpL01hdGguY29zKGYpKSxoPXRoaXMubipnLGk9dGhpcy5ybzAqTWF0aC5wb3coTWF0aC50YW4odGhpcy5zMC8yK3RoaXMuczQ1KSx0aGlzLm4pL01hdGgucG93KE1hdGgudGFuKGYvMit0aGlzLnM0NSksdGhpcy5uKSxhLnk9aSpNYXRoLmNvcyhoKS8xLGEueD1pKk1hdGguc2luKGgpLzEsdGhpcy5jemVjaHx8KGEueSo9LTEsYS54Kj0tMSksYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGksaj1hLng7YS54PWEueSxhLnk9aix0aGlzLmN6ZWNofHwoYS55Kj0tMSxhLngqPS0xKSxnPU1hdGguc3FydChhLngqYS54K2EueSphLnkpLGY9TWF0aC5hdGFuMihhLnksYS54KSxlPWYvTWF0aC5zaW4odGhpcy5zMCksZD0yKihNYXRoLmF0YW4oTWF0aC5wb3codGhpcy5ybzAvZywxL3RoaXMubikqTWF0aC50YW4odGhpcy5zMC8yK3RoaXMuczQ1KSktdGhpcy5zNDUpLGI9TWF0aC5hc2luKE1hdGguY29zKHRoaXMuYWQpKk1hdGguc2luKGQpLU1hdGguc2luKHRoaXMuYWQpKk1hdGguY29zKGQpKk1hdGguY29zKGUpKSxjPU1hdGguYXNpbihNYXRoLmNvcyhkKSpNYXRoLnNpbihlKS9NYXRoLmNvcyhiKSksYS54PXRoaXMubG9uZzAtYy90aGlzLmFsZmEsaD1iLGk9MDt2YXIgaz0wO2RvIGEueT0yKihNYXRoLmF0YW4oTWF0aC5wb3codGhpcy5rLC0xL3RoaXMuYWxmYSkqTWF0aC5wb3coTWF0aC50YW4oYi8yK3RoaXMuczQ1KSwxL3RoaXMuYWxmYSkqTWF0aC5wb3coKDErdGhpcy5lKk1hdGguc2luKGgpKS8oMS10aGlzLmUqTWF0aC5zaW4oaCkpLHRoaXMuZS8yKSktdGhpcy5zNDUpLE1hdGguYWJzKGgtYS55KTwxZS0xMCYmKGk9MSksaD1hLnksays9MTt3aGlsZSgwPT09aSYmMTU+ayk7cmV0dXJuIGs+PTE1P251bGw6YX0sYy5uYW1lcz1bIktyb3ZhayIsImtyb3ZhayJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1fV0sNDk6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLlBJLzIsZT1NYXRoLlBJLzQsZj0xZS0xMCxnPWEoIi4uL2NvbW1vbi9xc2ZueiIpLGg9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKTtjLlNfUE9MRT0xLGMuTl9QT0xFPTIsYy5FUVVJVD0zLGMuT0JMSVE9NCxjLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmFicyh0aGlzLmxhdDApO2lmKE1hdGguYWJzKGEtZCk8Zj90aGlzLm1vZGU9dGhpcy5sYXQwPDA/dGhpcy5TX1BPTEU6dGhpcy5OX1BPTEU6TWF0aC5hYnMoYSk8Zj90aGlzLm1vZGU9dGhpcy5FUVVJVDp0aGlzLm1vZGU9dGhpcy5PQkxJUSx0aGlzLmVzPjApe3ZhciBiO3N3aXRjaCh0aGlzLnFwPWcodGhpcy5lLDEpLHRoaXMubW1mPS41LygxLXRoaXMuZXMpLHRoaXMuYXBhPXRoaXMuYXV0aHNldCh0aGlzLmVzKSx0aGlzLm1vZGUpe2Nhc2UgdGhpcy5OX1BPTEU6dGhpcy5kZD0xO2JyZWFrO2Nhc2UgdGhpcy5TX1BPTEU6dGhpcy5kZD0xO2JyZWFrO2Nhc2UgdGhpcy5FUVVJVDp0aGlzLnJxPU1hdGguc3FydCguNSp0aGlzLnFwKSx0aGlzLmRkPTEvdGhpcy5ycSx0aGlzLnhtZj0xLHRoaXMueW1mPS41KnRoaXMucXA7YnJlYWs7Y2FzZSB0aGlzLk9CTElROnRoaXMucnE9TWF0aC5zcXJ0KC41KnRoaXMucXApLGI9TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLnNpbmIxPWcodGhpcy5lLGIpL3RoaXMucXAsdGhpcy5jb3NiMT1NYXRoLnNxcnQoMS10aGlzLnNpbmIxKnRoaXMuc2luYjEpLHRoaXMuZGQ9TWF0aC5jb3ModGhpcy5sYXQwKS8oTWF0aC5zcXJ0KDEtdGhpcy5lcypiKmIpKnRoaXMucnEqdGhpcy5jb3NiMSksdGhpcy55bWY9KHRoaXMueG1mPXRoaXMucnEpL3RoaXMuZGQsdGhpcy54bWYqPXRoaXMuZGR9fWVsc2UgdGhpcy5tb2RlPT09dGhpcy5PQkxJUSYmKHRoaXMuc2lucGgwPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5jb3NwaDA9TWF0aC5jb3ModGhpcy5sYXQwKSl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGksaixrLGwsbSxuLG8scCxxPWEueCxyPWEueTtpZihxPWgocS10aGlzLmxvbmcwKSx0aGlzLnNwaGVyZSl7aWYoaz1NYXRoLnNpbihyKSxwPU1hdGguY29zKHIpLGk9TWF0aC5jb3MocSksdGhpcy5tb2RlPT09dGhpcy5PQkxJUXx8dGhpcy5tb2RlPT09dGhpcy5FUVVJVCl7aWYoYz10aGlzLm1vZGU9PT10aGlzLkVRVUlUPzErcCppOjErdGhpcy5zaW5waDAqayt0aGlzLmNvc3BoMCpwKmksZj49YylyZXR1cm4gbnVsbDtjPU1hdGguc3FydCgyL2MpLGI9YypwKk1hdGguc2luKHEpLGMqPXRoaXMubW9kZT09PXRoaXMuRVFVSVQ/azp0aGlzLmNvc3BoMCprLXRoaXMuc2lucGgwKnAqaX1lbHNlIGlmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFfHx0aGlzLm1vZGU9PT10aGlzLlNfUE9MRSl7aWYodGhpcy5tb2RlPT09dGhpcy5OX1BPTEUmJihpPS1pKSxNYXRoLmFicyhyK3RoaXMucGhpMCk8ZilyZXR1cm4gbnVsbDtjPWUtLjUqcixjPTIqKHRoaXMubW9kZT09PXRoaXMuU19QT0xFP01hdGguY29zKGMpOk1hdGguc2luKGMpKSxiPWMqTWF0aC5zaW4ocSksYyo9aX19ZWxzZXtzd2l0Y2gobT0wLG49MCxvPTAsaT1NYXRoLmNvcyhxKSxqPU1hdGguc2luKHEpLGs9TWF0aC5zaW4ociksbD1nKHRoaXMuZSxrKSwodGhpcy5tb2RlPT09dGhpcy5PQkxJUXx8dGhpcy5tb2RlPT09dGhpcy5FUVVJVCkmJihtPWwvdGhpcy5xcCxuPU1hdGguc3FydCgxLW0qbSkpLHRoaXMubW9kZSl7Y2FzZSB0aGlzLk9CTElROm89MSt0aGlzLnNpbmIxKm0rdGhpcy5jb3NiMSpuKmk7YnJlYWs7Y2FzZSB0aGlzLkVRVUlUOm89MStuKmk7YnJlYWs7Y2FzZSB0aGlzLk5fUE9MRTpvPWQrcixsPXRoaXMucXAtbDticmVhaztjYXNlIHRoaXMuU19QT0xFOm89ci1kLGw9dGhpcy5xcCtsfWlmKE1hdGguYWJzKG8pPGYpcmV0dXJuIG51bGw7c3dpdGNoKHRoaXMubW9kZSl7Y2FzZSB0aGlzLk9CTElROmNhc2UgdGhpcy5FUVVJVDpvPU1hdGguc3FydCgyL28pLGM9dGhpcy5tb2RlPT09dGhpcy5PQkxJUT90aGlzLnltZipvKih0aGlzLmNvc2IxKm0tdGhpcy5zaW5iMSpuKmkpOihvPU1hdGguc3FydCgyLygxK24qaSkpKSptKnRoaXMueW1mLGI9dGhpcy54bWYqbypuKmo7YnJlYWs7Y2FzZSB0aGlzLk5fUE9MRTpjYXNlIHRoaXMuU19QT0xFOmw+PTA/KGI9KG89TWF0aC5zcXJ0KGwpKSpqLGM9aSoodGhpcy5tb2RlPT09dGhpcy5TX1BPTEU/bzotbykpOmI9Yz0wfX1yZXR1cm4gYS54PXRoaXMuYSpiK3RoaXMueDAsYS55PXRoaXMuYSpjK3RoaXMueTAsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnktPXRoaXMueTA7dmFyIGIsYyxlLGcsaSxqLGssbD1hLngvdGhpcy5hLG09YS55L3RoaXMuYTtpZih0aGlzLnNwaGVyZSl7dmFyIG4sbz0wLHA9MDtpZihuPU1hdGguc3FydChsKmwrbSptKSxjPS41Km4sYz4xKXJldHVybiBudWxsO3N3aXRjaChjPTIqTWF0aC5hc2luKGMpLCh0aGlzLm1vZGU9PT10aGlzLk9CTElRfHx0aGlzLm1vZGU9PT10aGlzLkVRVUlUKSYmKHA9TWF0aC5zaW4oYyksbz1NYXRoLmNvcyhjKSksdGhpcy5tb2RlKXtjYXNlIHRoaXMuRVFVSVQ6Yz1NYXRoLmFicyhuKTw9Zj8wOk1hdGguYXNpbihtKnAvbiksbCo9cCxtPW8qbjticmVhaztjYXNlIHRoaXMuT0JMSVE6Yz1NYXRoLmFicyhuKTw9Zj90aGlzLnBoaTA6TWF0aC5hc2luKG8qdGhpcy5zaW5waDArbSpwKnRoaXMuY29zcGgwL24pLGwqPXAqdGhpcy5jb3NwaDAsbT0oby1NYXRoLnNpbihjKSp0aGlzLnNpbnBoMCkqbjticmVhaztjYXNlIHRoaXMuTl9QT0xFOm09LW0sYz1kLWM7YnJlYWs7Y2FzZSB0aGlzLlNfUE9MRTpjLT1kfWI9MCE9PW18fHRoaXMubW9kZSE9PXRoaXMuRVFVSVQmJnRoaXMubW9kZSE9PXRoaXMuT0JMSVE/TWF0aC5hdGFuMihsLG0pOjB9ZWxzZXtpZihrPTAsdGhpcy5tb2RlPT09dGhpcy5PQkxJUXx8dGhpcy5tb2RlPT09dGhpcy5FUVVJVCl7aWYobC89dGhpcy5kZCxtKj10aGlzLmRkLGo9TWF0aC5zcXJ0KGwqbCttKm0pLGY+ailyZXR1cm4gYS54PTAsYS55PXRoaXMucGhpMCxhO2c9MipNYXRoLmFzaW4oLjUqai90aGlzLnJxKSxlPU1hdGguY29zKGcpLGwqPWc9TWF0aC5zaW4oZyksdGhpcy5tb2RlPT09dGhpcy5PQkxJUT8oaz1lKnRoaXMuc2luYjErbSpnKnRoaXMuY29zYjEvaixpPXRoaXMucXAqayxtPWoqdGhpcy5jb3NiMSplLW0qdGhpcy5zaW5iMSpnKTooaz1tKmcvaixpPXRoaXMucXAqayxtPWoqZSl9ZWxzZSBpZih0aGlzLm1vZGU9PT10aGlzLk5fUE9MRXx8dGhpcy5tb2RlPT09dGhpcy5TX1BPTEUpe2lmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFJiYobT0tbSksaT1sKmwrbSptLCFpKXJldHVybiBhLng9MCxhLnk9dGhpcy5waGkwLGE7az0xLWkvdGhpcy5xcCx0aGlzLm1vZGU9PT10aGlzLlNfUE9MRSYmKGs9LWspfWI9TWF0aC5hdGFuMihsLG0pLGM9dGhpcy5hdXRobGF0KE1hdGguYXNpbihrKSx0aGlzLmFwYSl9cmV0dXJuIGEueD1oKHRoaXMubG9uZzArYiksYS55PWMsYX0sYy5QMDA9LjMzMzMzMzMzMzMzMzMzMzMsYy5QMDE9LjE3MjIyMjIyMjIyMjIyMjIyLGMuUDAyPS4xMDI1NzkzNjUwNzkzNjUwOCxjLlAxMD0uMDYzODg4ODg4ODg4ODg4ODgsYy5QMTE9LjA2NjQwMjExNjQwMjExNjQsYy5QMjA9LjAxNjQxNTAxMjk0MjE5MTU0MyxjLmF1dGhzZXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtyZXR1cm4gY1swXT1hKnRoaXMuUDAwLGI9YSphLGNbMF0rPWIqdGhpcy5QMDEsY1sxXT1iKnRoaXMuUDEwLGIqPWEsY1swXSs9Yip0aGlzLlAwMixjWzFdKz1iKnRoaXMuUDExLGNbMl09Yip0aGlzLlAyMCxjfSxjLmF1dGhsYXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hK2E7cmV0dXJuIGErYlswXSpNYXRoLnNpbihjKStiWzFdKk1hdGguc2luKGMrYykrYlsyXSpNYXRoLnNpbihjK2MrYyl9LGMubmFtZXM9WyJMYW1iZXJ0IEF6aW11dGhhbCBFcXVhbCBBcmVhIiwiTGFtYmVydF9BemltdXRoYWxfRXF1YWxfQXJlYSIsImxhZWEiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL3FzZm56IjoyMH1dLDUwOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MWUtMTAsZT1hKCIuLi9jb21tb24vbXNmbnoiKSxmPWEoIi4uL2NvbW1vbi90c2ZueiIpLGc9TWF0aC5QSS8yLGg9YSgiLi4vY29tbW9uL3NpZ24iKSxpPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaj1hKCIuLi9jb21tb24vcGhpMnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmxhdDJ8fCh0aGlzLmxhdDI9dGhpcy5sYXQxKSx0aGlzLmswfHwodGhpcy5rMD0xKSx0aGlzLngwPXRoaXMueDB8fDAsdGhpcy55MD10aGlzLnkwfHwwLCEoTWF0aC5hYnModGhpcy5sYXQxK3RoaXMubGF0Mik8ZCkpe3ZhciBhPXRoaXMuYi90aGlzLmE7dGhpcy5lPU1hdGguc3FydCgxLWEqYSk7dmFyIGI9TWF0aC5zaW4odGhpcy5sYXQxKSxjPU1hdGguY29zKHRoaXMubGF0MSksZz1lKHRoaXMuZSxiLGMpLGg9Zih0aGlzLmUsdGhpcy5sYXQxLGIpLGk9TWF0aC5zaW4odGhpcy5sYXQyKSxqPU1hdGguY29zKHRoaXMubGF0Miksaz1lKHRoaXMuZSxpLGopLGw9Zih0aGlzLmUsdGhpcy5sYXQyLGkpLG09Zih0aGlzLmUsdGhpcy5sYXQwLE1hdGguc2luKHRoaXMubGF0MCkpO01hdGguYWJzKHRoaXMubGF0MS10aGlzLmxhdDIpPmQ/dGhpcy5ucz1NYXRoLmxvZyhnL2spL01hdGgubG9nKGgvbCk6dGhpcy5ucz1iLGlzTmFOKHRoaXMubnMpJiYodGhpcy5ucz1iKSx0aGlzLmYwPWcvKHRoaXMubnMqTWF0aC5wb3coaCx0aGlzLm5zKSksdGhpcy5yaD10aGlzLmEqdGhpcy5mMCpNYXRoLnBvdyhtLHRoaXMubnMpLHRoaXMudGl0bGV8fCh0aGlzLnRpdGxlPSJMYW1iZXJ0IENvbmZvcm1hbCBDb25pYyIpfX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPWEueCxjPWEueTtNYXRoLmFicygyKk1hdGguYWJzKGMpLU1hdGguUEkpPD1kJiYoYz1oKGMpKihnLTIqZCkpO3ZhciBlLGosaz1NYXRoLmFicyhNYXRoLmFicyhjKS1nKTtpZihrPmQpZT1mKHRoaXMuZSxjLE1hdGguc2luKGMpKSxqPXRoaXMuYSp0aGlzLmYwKk1hdGgucG93KGUsdGhpcy5ucyk7ZWxzZXtpZihrPWMqdGhpcy5ucywwPj1rKXJldHVybiBudWxsO2o9MH12YXIgbD10aGlzLm5zKmkoYi10aGlzLmxvbmcwKTtyZXR1cm4gYS54PXRoaXMuazAqKGoqTWF0aC5zaW4obCkpK3RoaXMueDAsYS55PXRoaXMuazAqKHRoaXMucmgtaipNYXRoLmNvcyhsKSkrdGhpcy55MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixoPShhLngtdGhpcy54MCkvdGhpcy5rMCxrPXRoaXMucmgtKGEueS10aGlzLnkwKS90aGlzLmswO3RoaXMubnM+MD8oYj1NYXRoLnNxcnQoaCpoK2sqayksYz0xKTooYj0tTWF0aC5zcXJ0KGgqaCtrKmspLGM9LTEpO3ZhciBsPTA7aWYoMCE9PWImJihsPU1hdGguYXRhbjIoYypoLGMqaykpLDAhPT1ifHx0aGlzLm5zPjApe2lmKGM9MS90aGlzLm5zLGQ9TWF0aC5wb3coYi8odGhpcy5hKnRoaXMuZjApLGMpLGU9aih0aGlzLmUsZCksLTk5OTk9PT1lKXJldHVybiBudWxsfWVsc2UgZT0tZztyZXR1cm4gZj1pKGwvdGhpcy5ucyt0aGlzLmxvbmcwKSxhLng9ZixhLnk9ZSxhfSxjLm5hbWVzPVsiTGFtYmVydCBUYW5nZW50aWFsIENvbmZvcm1hbCBDb25pYyBQcm9qZWN0aW9uIiwiTGFtYmVydF9Db25mb3JtYWxfQ29uaWMiLCJMYW1iZXJ0X0NvbmZvcm1hbF9Db25pY18yU1AiLCJsY2MiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3BoaTJ6IjoxNiwiLi4vY29tbW9uL3NpZ24iOjIxLCIuLi9jb21tb24vdHNmbnoiOjI0fV0sNTE6W2Z1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhfWMuaW5pdD1mdW5jdGlvbigpe30sYy5mb3J3YXJkPWQsYy5pbnZlcnNlPWQsYy5uYW1lcz1bImxvbmdsYXQiLCJpZGVudGl0eSJdfSx7fV0sNTI6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vbXNmbnoiKSxlPU1hdGguUEkvMixmPTFlLTEwLGc9NTcuMjk1Nzc5NTEzMDgyMzIsaD1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGk9TWF0aC5QSS80LGo9YSgiLi4vY29tbW9uL3RzZm56Iiksaz1hKCIuLi9jb21tb24vcGhpMnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmIvdGhpcy5hO3RoaXMuZXM9MS1hKmEsIngwImluIHRoaXN8fCh0aGlzLngwPTApLCJ5MCJpbiB0aGlzfHwodGhpcy55MD0wKSx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZXMpLHRoaXMubGF0X3RzP3RoaXMuc3BoZXJlP3RoaXMuazA9TWF0aC5jb3ModGhpcy5sYXRfdHMpOnRoaXMuazA9ZCh0aGlzLmUsTWF0aC5zaW4odGhpcy5sYXRfdHMpLE1hdGguY29zKHRoaXMubGF0X3RzKSk6dGhpcy5rMHx8KHRoaXMuaz90aGlzLmswPXRoaXMuazp0aGlzLmswPTEpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55O2lmKGMqZz45MCYmLTkwPmMqZyYmYipnPjE4MCYmLTE4MD5iKmcpcmV0dXJuIG51bGw7dmFyIGQsaztpZihNYXRoLmFicyhNYXRoLmFicyhjKS1lKTw9ZilyZXR1cm4gbnVsbDtpZih0aGlzLnNwaGVyZSlkPXRoaXMueDArdGhpcy5hKnRoaXMuazAqaChiLXRoaXMubG9uZzApLGs9dGhpcy55MCt0aGlzLmEqdGhpcy5rMCpNYXRoLmxvZyhNYXRoLnRhbihpKy41KmMpKTtlbHNle3ZhciBsPU1hdGguc2luKGMpLG09aih0aGlzLmUsYyxsKTtkPXRoaXMueDArdGhpcy5hKnRoaXMuazAqaChiLXRoaXMubG9uZzApLGs9dGhpcy55MC10aGlzLmEqdGhpcy5rMCpNYXRoLmxvZyhtKX1yZXR1cm4gYS54PWQsYS55PWssYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLngtdGhpcy54MCxmPWEueS10aGlzLnkwO2lmKHRoaXMuc3BoZXJlKWM9ZS0yKk1hdGguYXRhbihNYXRoLmV4cCgtZi8odGhpcy5hKnRoaXMuazApKSk7ZWxzZXt2YXIgZz1NYXRoLmV4cCgtZi8odGhpcy5hKnRoaXMuazApKTtpZihjPWsodGhpcy5lLGcpLC05OTk5PT09YylyZXR1cm4gbnVsbH1yZXR1cm4gYj1oKHRoaXMubG9uZzArZC8odGhpcy5hKnRoaXMuazApKSxhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsiTWVyY2F0b3IiLCJQb3B1bGFyIFZpc3VhbGlzYXRpb24gUHNldWRvIE1lcmNhdG9yIiwiTWVyY2F0b3JfMVNQIiwiTWVyY2F0b3JfQXV4aWxpYXJ5X1NwaGVyZSIsIm1lcmMiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NSwiLi4vY29tbW9uL21zZm56IjoxNSwiLi4vY29tbW9uL3BoaTJ6IjoxNiwiLi4vY29tbW9uL3RzZm56IjoyNH1dLDUzOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKTtjLmluaXQ9ZnVuY3Rpb24oKXt9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYj1hLngsYz1hLnksZT1kKGItdGhpcy5sb25nMCksZj10aGlzLngwK3RoaXMuYSplLGc9dGhpcy55MCt0aGlzLmEqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K2MvMi41KSkqMS4yNTtyZXR1cm4gYS54PWYsYS55PWcsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe2EueC09dGhpcy54MCxhLnktPXRoaXMueTA7dmFyIGI9ZCh0aGlzLmxvbmcwK2EueC90aGlzLmEpLGM9Mi41KihNYXRoLmF0YW4oTWF0aC5leHAoLjgqYS55L3RoaXMuYSkpLU1hdGguUEkvNCk7cmV0dXJuIGEueD1iLGEueT1jLGF9LGMubmFtZXM9WyJNaWxsZXJfQ3lsaW5kcmljYWwiLCJtaWxsIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjV9XSw1NDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT0xZS0xMDtjLmluaXQ9ZnVuY3Rpb24oKXt9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS54LGM9YS55LGY9ZChiLXRoaXMubG9uZzApLGc9YyxoPU1hdGguUEkqTWF0aC5zaW4oYyksaT0wOyEwO2krKyl7dmFyIGo9LShnK01hdGguc2luKGcpLWgpLygxK01hdGguY29zKGcpKTtpZihnKz1qLE1hdGguYWJzKGopPGUpYnJlYWt9Zy89MixNYXRoLlBJLzItTWF0aC5hYnMoYyk8ZSYmKGY9MCk7dmFyIGs9LjkwMDMxNjMxNjE1OCp0aGlzLmEqZipNYXRoLmNvcyhnKSt0aGlzLngwLGw9MS40MTQyMTM1NjIzNzMxKnRoaXMuYSpNYXRoLnNpbihnKSt0aGlzLnkwO3JldHVybiBhLng9ayxhLnk9bCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYzthLngtPXRoaXMueDAsYS55LT10aGlzLnkwLGM9YS55LygxLjQxNDIxMzU2MjM3MzEqdGhpcy5hKSxNYXRoLmFicyhjKT4uOTk5OTk5OTk5OTk5JiYoYz0uOTk5OTk5OTk5OTk5KSxiPU1hdGguYXNpbihjKTt2YXIgZT1kKHRoaXMubG9uZzArYS54LyguOTAwMzE2MzE2MTU4KnRoaXMuYSpNYXRoLmNvcyhiKSkpO2U8LU1hdGguUEkmJihlPS1NYXRoLlBJKSxlPk1hdGguUEkmJihlPU1hdGguUEkpLGM9KDIqYitNYXRoLnNpbigyKmIpKS9NYXRoLlBJLE1hdGguYWJzKGMpPjEmJihjPTEpO3ZhciBmPU1hdGguYXNpbihjKTtyZXR1cm4gYS54PWUsYS55PWYsYX0sYy5uYW1lcz1bIk1vbGx3ZWlkZSIsIm1vbGwiXX0seyIuLi9jb21tb24vYWRqdXN0X2xvbiI6NX1dLDU1OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9NDg0ODEzNjgxMTA5NTM2ZS0yMDtjLml0ZXJhdGlvbnM9MSxjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLkE9W10sdGhpcy5BWzFdPS42Mzk5MTc1MDczLHRoaXMuQVsyXT0tLjEzNTg3OTc2MTMsdGhpcy5BWzNdPS4wNjMyOTQ0MDksdGhpcy5BWzRdPS0uMDI1MjY4NTMsdGhpcy5BWzVdPS4wMTE3ODc5LHRoaXMuQVs2XT0tLjAwNTUxNjEsdGhpcy5BWzddPS4wMDI2OTA2LHRoaXMuQVs4XT0tLjAwMTMzMyx0aGlzLkFbOV09NjdlLTUsdGhpcy5BWzEwXT0tMzRlLTUsdGhpcy5CX3JlPVtdLHRoaXMuQl9pbT1bXSx0aGlzLkJfcmVbMV09Ljc1NTc4NTMyMjgsdGhpcy5CX2ltWzFdPTAsdGhpcy5CX3JlWzJdPS4yNDkyMDQ2NDYsdGhpcy5CX2ltWzJdPS4wMDMzNzE1MDcsdGhpcy5CX3JlWzNdPS0uMDAxNTQxNzM5LHRoaXMuQl9pbVszXT0uMDQxMDU4NTYsdGhpcy5CX3JlWzRdPS0uMTAxNjI5MDcsdGhpcy5CX2ltWzRdPS4wMTcyNzYwOSx0aGlzLkJfcmVbNV09LS4yNjYyMzQ4OSx0aGlzLkJfaW1bNV09LS4zNjI0OTIxOCx0aGlzLkJfcmVbNl09LS42ODcwOTgzLHRoaXMuQl9pbVs2XT0tMS4xNjUxOTY3LHRoaXMuQ19yZT1bXSx0aGlzLkNfaW09W10sdGhpcy5DX3JlWzFdPTEuMzIzMTI3MDQzOSx0aGlzLkNfaW1bMV09MCx0aGlzLkNfcmVbMl09LS41NzcyNDU3ODksdGhpcy5DX2ltWzJdPS0uMDA3ODA5NTk4LHRoaXMuQ19yZVszXT0uNTA4MzA3NTEzLHRoaXMuQ19pbVszXT0tLjExMjIwODk1Mix0aGlzLkNfcmVbNF09LS4xNTA5NDc2Mix0aGlzLkNfaW1bNF09LjE4MjAwNjAyLHRoaXMuQ19yZVs1XT0xLjAxNDE4MTc5LHRoaXMuQ19pbVs1XT0xLjY0NDk3Njk2LHRoaXMuQ19yZVs2XT0xLjk2NjA1NDksdGhpcy5DX2ltWzZdPTIuNTEyNzY0NSx0aGlzLkQ9W10sdGhpcy5EWzFdPTEuNTYyNzAxNDI0Myx0aGlzLkRbMl09LjUxODU0MDYzOTgsdGhpcy5EWzNdPS0uMDMzMzMwOTgsdGhpcy5EWzRdPS0uMTA1MjkwNix0aGlzLkRbNV09LS4wMzY4NTk0LHRoaXMuRFs2XT0uMDA3MzE3LHRoaXMuRFs3XT0uMDEyMix0aGlzLkRbOF09LjAwMzk0LHRoaXMuRFs5XT0tLjAwMTN9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjPWEueCxlPWEueSxmPWUtdGhpcy5sYXQwLGc9Yy10aGlzLmxvbmcwLGg9Zi9kKjFlLTUsaT1nLGo9MSxrPTA7Zm9yKGI9MTsxMD49YjtiKyspaio9aCxrKz10aGlzLkFbYl0qajt2YXIgbCxtLG49ayxvPWkscD0xLHE9MCxyPTAscz0wO2ZvcihiPTE7Nj49YjtiKyspbD1wKm4tcSpvLG09cSpuK3AqbyxwPWwscT1tLHI9cit0aGlzLkJfcmVbYl0qcC10aGlzLkJfaW1bYl0qcSxzPXMrdGhpcy5CX2ltW2JdKnArdGhpcy5CX3JlW2JdKnE7cmV0dXJuIGEueD1zKnRoaXMuYSt0aGlzLngwLGEueT1yKnRoaXMuYSt0aGlzLnkwLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGUsZj1hLngsZz1hLnksaD1mLXRoaXMueDAsaT1nLXRoaXMueTAsaj1pL3RoaXMuYSxrPWgvdGhpcy5hLGw9MSxtPTAsbj0wLG89MDtmb3IoYj0xOzY+PWI7YisrKWM9bCpqLW0qayxlPW0qaitsKmssbD1jLG09ZSxuPW4rdGhpcy5DX3JlW2JdKmwtdGhpcy5DX2ltW2JdKm0sbz1vK3RoaXMuQ19pbVtiXSpsK3RoaXMuQ19yZVtiXSptO2Zvcih2YXIgcD0wO3A8dGhpcy5pdGVyYXRpb25zO3ArKyl7dmFyIHEscixzPW4sdD1vLHU9aix2PWs7Zm9yKGI9Mjs2Pj1iO2IrKylxPXMqbi10Km8scj10Km4rcypvLHM9cSx0PXIsdSs9KGItMSkqKHRoaXMuQl9yZVtiXSpzLXRoaXMuQl9pbVtiXSp0KSx2Kz0oYi0xKSoodGhpcy5CX2ltW2JdKnMrdGhpcy5CX3JlW2JdKnQpO3M9MSx0PTA7dmFyIHc9dGhpcy5CX3JlWzFdLHg9dGhpcy5CX2ltWzFdO2ZvcihiPTI7Nj49YjtiKyspcT1zKm4tdCpvLHI9dCpuK3MqbyxzPXEsdD1yLHcrPWIqKHRoaXMuQl9yZVtiXSpzLXRoaXMuQl9pbVtiXSp0KSx4Kz1iKih0aGlzLkJfaW1bYl0qcyt0aGlzLkJfcmVbYl0qdCk7dmFyIHk9dyp3K3gqeDtuPSh1Kncrdip4KS95LG89KHYqdy11KngpL3l9dmFyIHo9bixBPW8sQj0xLEM9MDtmb3IoYj0xOzk+PWI7YisrKUIqPXosQys9dGhpcy5EW2JdKkI7dmFyIEQ9dGhpcy5sYXQwK0MqZCoxZTUsRT10aGlzLmxvbmcwK0E7cmV0dXJuIGEueD1FLGEueT1ELGF9LGMubmFtZXM9WyJOZXdfWmVhbGFuZF9NYXBfR3JpZCIsIm56bWciXX0se31dLDU2OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL3RzZm56IiksZT1hKCIuLi9jb21tb24vYWRqdXN0X2xvbiIpLGY9YSgiLi4vY29tbW9uL3BoaTJ6IiksZz1NYXRoLlBJLzIsaD1NYXRoLlBJLzQsaT0xZS0xMDtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLm5vX29mZj10aGlzLm5vX29mZnx8ITEsdGhpcy5ub19yb3Q9dGhpcy5ub19yb3R8fCExLGlzTmFOKHRoaXMuazApJiYodGhpcy5rMD0xKTt2YXIgYT1NYXRoLnNpbih0aGlzLmxhdDApLGI9TWF0aC5jb3ModGhpcy5sYXQwKSxjPXRoaXMuZSphO3RoaXMuYmw9TWF0aC5zcXJ0KDErdGhpcy5lcy8oMS10aGlzLmVzKSpNYXRoLnBvdyhiLDQpKSx0aGlzLmFsPXRoaXMuYSp0aGlzLmJsKnRoaXMuazAqTWF0aC5zcXJ0KDEtdGhpcy5lcykvKDEtYypjKTt2YXIgZj1kKHRoaXMuZSx0aGlzLmxhdDAsYSksZz10aGlzLmJsL2IqTWF0aC5zcXJ0KCgxLXRoaXMuZXMpLygxLWMqYykpOzE+ZypnJiYoZz0xKTt2YXIgaCxpO2lmKGlzTmFOKHRoaXMubG9uZ2MpKXt2YXIgaj1kKHRoaXMuZSx0aGlzLmxhdDEsTWF0aC5zaW4odGhpcy5sYXQxKSksaz1kKHRoaXMuZSx0aGlzLmxhdDIsTWF0aC5zaW4odGhpcy5sYXQyKSk7dGhpcy5sYXQwPj0wP3RoaXMuZWw9KGcrTWF0aC5zcXJ0KGcqZy0xKSkqTWF0aC5wb3coZix0aGlzLmJsKTp0aGlzLmVsPShnLU1hdGguc3FydChnKmctMSkpKk1hdGgucG93KGYsdGhpcy5ibCk7dmFyIGw9TWF0aC5wb3coaix0aGlzLmJsKSxtPU1hdGgucG93KGssdGhpcy5ibCk7aD10aGlzLmVsL2wsaT0uNSooaC0xL2gpO3ZhciBuPSh0aGlzLmVsKnRoaXMuZWwtbSpsKS8odGhpcy5lbCp0aGlzLmVsK20qbCksbz0obS1sKS8obStsKSxwPWUodGhpcy5sb25nMS10aGlzLmxvbmcyKTt0aGlzLmxvbmcwPS41Kih0aGlzLmxvbmcxK3RoaXMubG9uZzIpLU1hdGguYXRhbihuKk1hdGgudGFuKC41KnRoaXMuYmwqcCkvbykvdGhpcy5ibCx0aGlzLmxvbmcwPWUodGhpcy5sb25nMCk7dmFyIHE9ZSh0aGlzLmxvbmcxLXRoaXMubG9uZzApO3RoaXMuZ2FtbWEwPU1hdGguYXRhbihNYXRoLnNpbih0aGlzLmJsKnEpL2kpLHRoaXMuYWxwaGE9TWF0aC5hc2luKGcqTWF0aC5zaW4odGhpcy5nYW1tYTApKX1lbHNlIGg9dGhpcy5sYXQwPj0wP2crTWF0aC5zcXJ0KGcqZy0xKTpnLU1hdGguc3FydChnKmctMSksdGhpcy5lbD1oKk1hdGgucG93KGYsdGhpcy5ibCksaT0uNSooaC0xL2gpLHRoaXMuZ2FtbWEwPU1hdGguYXNpbihNYXRoLnNpbih0aGlzLmFscGhhKS9nKSx0aGlzLmxvbmcwPXRoaXMubG9uZ2MtTWF0aC5hc2luKGkqTWF0aC50YW4odGhpcy5nYW1tYTApKS90aGlzLmJsO3RoaXMubm9fb2ZmP3RoaXMudWM9MDp0aGlzLmxhdDA+PTA/dGhpcy51Yz10aGlzLmFsL3RoaXMuYmwqTWF0aC5hdGFuMihNYXRoLnNxcnQoZypnLTEpLE1hdGguY29zKHRoaXMuYWxwaGEpKTp0aGlzLnVjPS0xKnRoaXMuYWwvdGhpcy5ibCpNYXRoLmF0YW4yKE1hdGguc3FydChnKmctMSksTWF0aC5jb3ModGhpcy5hbHBoYSkpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmLGo9YS54LGs9YS55LGw9ZShqLXRoaXMubG9uZzApO2lmKE1hdGguYWJzKE1hdGguYWJzKGspLWcpPD1pKWY9az4wPy0xOjEsYz10aGlzLmFsL3RoaXMuYmwqTWF0aC5sb2coTWF0aC50YW4oaCtmKnRoaXMuZ2FtbWEwKi41KSksYj0tMSpmKmcqdGhpcy5hbC90aGlzLmJsO2Vsc2V7dmFyIG09ZCh0aGlzLmUsayxNYXRoLnNpbihrKSksbj10aGlzLmVsL01hdGgucG93KG0sdGhpcy5ibCksbz0uNSoobi0xL24pLHA9LjUqKG4rMS9uKSxxPU1hdGguc2luKHRoaXMuYmwqbCkscj0obypNYXRoLnNpbih0aGlzLmdhbW1hMCktcSpNYXRoLmNvcyh0aGlzLmdhbW1hMCkpL3A7Yz1NYXRoLmFicyhNYXRoLmFicyhyKS0xKTw9aT9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6LjUqdGhpcy5hbCpNYXRoLmxvZygoMS1yKS8oMStyKSkvdGhpcy5ibCxiPU1hdGguYWJzKE1hdGguY29zKHRoaXMuYmwqbCkpPD1pP3RoaXMuYWwqdGhpcy5ibCpsOnRoaXMuYWwqTWF0aC5hdGFuMihvKk1hdGguY29zKHRoaXMuZ2FtbWEwKStxKk1hdGguc2luKHRoaXMuZ2FtbWEwKSxNYXRoLmNvcyh0aGlzLmJsKmwpKS90aGlzLmJsfXJldHVybiB0aGlzLm5vX3JvdD8oYS54PXRoaXMueDArYixhLnk9dGhpcy55MCtjKTooYi09dGhpcy51YyxhLng9dGhpcy54MCtjKk1hdGguY29zKHRoaXMuYWxwaGEpK2IqTWF0aC5zaW4odGhpcy5hbHBoYSksYS55PXRoaXMueTArYipNYXRoLmNvcyh0aGlzLmFscGhhKS1jKk1hdGguc2luKHRoaXMuYWxwaGEpKSxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYzt0aGlzLm5vX3JvdD8oYz1hLnktdGhpcy55MCxiPWEueC10aGlzLngwKTooYz0oYS54LXRoaXMueDApKk1hdGguY29zKHRoaXMuYWxwaGEpLShhLnktdGhpcy55MCkqTWF0aC5zaW4odGhpcy5hbHBoYSksYj0oYS55LXRoaXMueTApKk1hdGguY29zKHRoaXMuYWxwaGEpKyhhLngtdGhpcy54MCkqTWF0aC5zaW4odGhpcy5hbHBoYSksYis9dGhpcy51Yyk7dmFyIGQ9TWF0aC5leHAoLTEqdGhpcy5ibCpjL3RoaXMuYWwpLGg9LjUqKGQtMS9kKSxqPS41KihkKzEvZCksaz1NYXRoLnNpbih0aGlzLmJsKmIvdGhpcy5hbCksbD0oaypNYXRoLmNvcyh0aGlzLmdhbW1hMCkraCpNYXRoLnNpbih0aGlzLmdhbW1hMCkpL2osbT1NYXRoLnBvdyh0aGlzLmVsL01hdGguc3FydCgoMStsKS8oMS1sKSksMS90aGlzLmJsKTtyZXR1cm4gTWF0aC5hYnMobC0xKTxpPyhhLng9dGhpcy5sb25nMCxhLnk9Zyk6TWF0aC5hYnMobCsxKTxpPyhhLng9dGhpcy5sb25nMCxhLnk9LTEqZyk6KGEueT1mKHRoaXMuZSxtKSxhLng9ZSh0aGlzLmxvbmcwLU1hdGguYXRhbjIoaCpNYXRoLmNvcyh0aGlzLmdhbW1hMCktaypNYXRoLnNpbih0aGlzLmdhbW1hMCksTWF0aC5jb3ModGhpcy5ibCpiL3RoaXMuYWwpKS90aGlzLmJsKSksYX0sYy5uYW1lcz1bIkhvdGluZV9PYmxpcXVlX01lcmNhdG9yIiwiSG90aW5lIE9ibGlxdWUgTWVyY2F0b3IiLCJIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9BemltdXRoX05hdHVyYWxfT3JpZ2luIiwiSG90aW5lX09ibGlxdWVfTWVyY2F0b3JfQXppbXV0aF9DZW50ZXIiLCJvbWVyYyJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vcGhpMnoiOjE2LCIuLi9jb21tb24vdHNmbnoiOjI0fV0sNTc6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vZTBmbiIpLGU9YSgiLi4vY29tbW9uL2UxZm4iKSxmPWEoIi4uL2NvbW1vbi9lMmZuIiksZz1hKCIuLi9jb21tb24vZTNmbiIpLGg9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxpPWEoIi4uL2NvbW1vbi9hZGp1c3RfbGF0Iiksaj1hKCIuLi9jb21tb24vbWxmbiIpLGs9MWUtMTAsbD1hKCIuLi9jb21tb24vZ04iKSxtPTIwO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMudGVtcD10aGlzLmIvdGhpcy5hLHRoaXMuZXM9MS1NYXRoLnBvdyh0aGlzLnRlbXAsMiksdGhpcy5lPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLmUwPWQodGhpcy5lcyksdGhpcy5lMT1lKHRoaXMuZXMpLHRoaXMuZTI9Zih0aGlzLmVzKSx0aGlzLmUzPWcodGhpcy5lcyksdGhpcy5tbDA9dGhpcy5hKmoodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyx0aGlzLmxhdDApfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9YS54LGY9YS55LGc9aChlLXRoaXMubG9uZzApO2lmKGQ9ZypNYXRoLnNpbihmKSx0aGlzLnNwaGVyZSlNYXRoLmFicyhmKTw9az8oYj10aGlzLmEqZyxjPS0xKnRoaXMuYSp0aGlzLmxhdDApOihiPXRoaXMuYSpNYXRoLnNpbihkKS9NYXRoLnRhbihmKSxjPXRoaXMuYSooaShmLXRoaXMubGF0MCkrKDEtTWF0aC5jb3MoZCkpL01hdGgudGFuKGYpKSk7ZWxzZSBpZihNYXRoLmFicyhmKTw9ayliPXRoaXMuYSpnLGM9LTEqdGhpcy5tbDA7ZWxzZXt2YXIgbT1sKHRoaXMuYSx0aGlzLmUsTWF0aC5zaW4oZikpL01hdGgudGFuKGYpO2I9bSpNYXRoLnNpbihkKSxjPXRoaXMuYSpqKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsZiktdGhpcy5tbDArbSooMS1NYXRoLmNvcyhkKSl9cmV0dXJuIGEueD1iK3RoaXMueDAsYS55PWMrdGhpcy55MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGksbCxuO2lmKGQ9YS54LXRoaXMueDAsZT1hLnktdGhpcy55MCx0aGlzLnNwaGVyZSlpZihNYXRoLmFicyhlK3RoaXMuYSp0aGlzLmxhdDApPD1rKWI9aChkL3RoaXMuYSt0aGlzLmxvbmcwKSxjPTA7ZWxzZXtnPXRoaXMubGF0MCtlL3RoaXMuYSxpPWQqZC90aGlzLmEvdGhpcy5hK2cqZyxsPWc7dmFyIG87Zm9yKGY9bTtmOy0tZilpZihvPU1hdGgudGFuKGwpLG49LTEqKGcqKGwqbysxKS1sLS41KihsKmwraSkqbykvKChsLWcpL28tMSksbCs9bixNYXRoLmFicyhuKTw9ayl7Yz1sO2JyZWFrfWI9aCh0aGlzLmxvbmcwK01hdGguYXNpbihkKk1hdGgudGFuKGwpL3RoaXMuYSkvTWF0aC5zaW4oYykpfWVsc2UgaWYoTWF0aC5hYnMoZSt0aGlzLm1sMCk8PWspYz0wLGI9aCh0aGlzLmxvbmcwK2QvdGhpcy5hKTtlbHNle2c9KHRoaXMubWwwK2UpL3RoaXMuYSxpPWQqZC90aGlzLmEvdGhpcy5hK2cqZyxsPWc7dmFyIHAscSxyLHMsdDtmb3IoZj1tO2Y7LS1mKWlmKHQ9dGhpcy5lKk1hdGguc2luKGwpLHA9TWF0aC5zcXJ0KDEtdCp0KSpNYXRoLnRhbihsKSxxPXRoaXMuYSpqKHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsbCkscj10aGlzLmUwLTIqdGhpcy5lMSpNYXRoLmNvcygyKmwpKzQqdGhpcy5lMipNYXRoLmNvcyg0KmwpLTYqdGhpcy5lMypNYXRoLmNvcyg2KmwpLHM9cS90aGlzLmEsbj0oZyoocCpzKzEpLXMtLjUqcCoocypzK2kpKS8odGhpcy5lcypNYXRoLnNpbigyKmwpKihzKnMraS0yKmcqcykvKDQqcCkrKGctcykqKHAqci0yL01hdGguc2luKDIqbCkpLXIpLGwtPW4sTWF0aC5hYnMobik8PWspe2M9bDticmVha31wPU1hdGguc3FydCgxLXRoaXMuZXMqTWF0aC5wb3coTWF0aC5zaW4oYyksMikpKk1hdGgudGFuKGMpLGI9aCh0aGlzLmxvbmcwK01hdGguYXNpbihkKnAvdGhpcy5hKS9NYXRoLnNpbihjKSl9cmV0dXJuIGEueD1iLGEueT1jLGF9LGMubmFtZXM9WyJQb2x5Y29uaWMiLCJwb2x5Il19LHsiLi4vY29tbW9uL2FkanVzdF9sYXQiOjQsIi4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vZTBmbiI6NywiLi4vY29tbW9uL2UxZm4iOjgsIi4uL2NvbW1vbi9lMmZuIjo5LCIuLi9jb21tb24vZTNmbiI6MTAsIi4uL2NvbW1vbi9nTiI6MTEsIi4uL2NvbW1vbi9tbGZuIjoxNH1dLDU4OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKSxlPWEoIi4uL2NvbW1vbi9hZGp1c3RfbGF0IiksZj1hKCIuLi9jb21tb24vcGpfZW5mbiIpLGc9MjAsaD1hKCIuLi9jb21tb24vcGpfbWxmbiIpLGk9YSgiLi4vY29tbW9uL3BqX2ludl9tbGZuIiksaj1NYXRoLlBJLzIsaz0xZS0xMCxsPWEoIi4uL2NvbW1vbi9hc2lueiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuc3BoZXJlPyh0aGlzLm49MSx0aGlzLm09MCx0aGlzLmVzPTAsdGhpcy5DX3k9TWF0aC5zcXJ0KCh0aGlzLm0rMSkvdGhpcy5uKSx0aGlzLkNfeD10aGlzLkNfeS8odGhpcy5tKzEpKTp0aGlzLmVuPWYodGhpcy5lcyl9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGU9YS54LGY9YS55O2lmKGU9ZChlLXRoaXMubG9uZzApLHRoaXMuc3BoZXJlKXtpZih0aGlzLm0pZm9yKHZhciBpPXRoaXMubipNYXRoLnNpbihmKSxqPWc7ajstLWope3ZhciBsPSh0aGlzLm0qZitNYXRoLnNpbihmKS1pKS8odGhpcy5tK01hdGguY29zKGYpKTtpZihmLT1sLE1hdGguYWJzKGwpPGspYnJlYWt9ZWxzZSBmPTEhPT10aGlzLm4/TWF0aC5hc2luKHRoaXMubipNYXRoLnNpbihmKSk6ZjtiPXRoaXMuYSp0aGlzLkNfeCplKih0aGlzLm0rTWF0aC5jb3MoZikpLGM9dGhpcy5hKnRoaXMuQ195KmZ9ZWxzZXt2YXIgbT1NYXRoLnNpbihmKSxuPU1hdGguY29zKGYpO2M9dGhpcy5hKmgoZixtLG4sdGhpcy5lbiksYj10aGlzLmEqZSpuL01hdGguc3FydCgxLXRoaXMuZXMqbSptKX1yZXR1cm4gYS54PWIsYS55PWMsYX0sYy5pbnZlcnNlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnO3JldHVybiBhLngtPXRoaXMueDAsZj1hLngvdGhpcy5hLGEueS09dGhpcy55MCxiPWEueS90aGlzLmEsdGhpcy5zcGhlcmU/KGIvPXRoaXMuQ195LGYvPXRoaXMuQ194Kih0aGlzLm0rTWF0aC5jb3MoYikpLHRoaXMubT9iPWwoKHRoaXMubSpiK01hdGguc2luKGIpKS90aGlzLm4pOjEhPT10aGlzLm4mJihiPWwoTWF0aC5zaW4oYikvdGhpcy5uKSksZj1kKGYrdGhpcy5sb25nMCksYj1lKGIpKTooYj1pKGEueS90aGlzLmEsdGhpcy5lcyx0aGlzLmVuKSxnPU1hdGguYWJzKGIpLGo+Zz8oZz1NYXRoLnNpbihiKSxjPXRoaXMubG9uZzArYS54Kk1hdGguc3FydCgxLXRoaXMuZXMqZypnKS8odGhpcy5hKk1hdGguY29zKGIpKSxmPWQoYykpOmo+Zy1rJiYoZj10aGlzLmxvbmcwKSksYS54PWYsYS55PWIsYX0sYy5uYW1lcz1bIlNpbnVzb2lkYWwiLCJzaW51Il19LHsiLi4vY29tbW9uL2FkanVzdF9sYXQiOjQsIi4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vYXNpbnoiOjYsIi4uL2NvbW1vbi9wal9lbmZuIjoxNywiLi4vY29tbW9uL3BqX2ludl9tbGZuIjoxOCwiLi4vY29tbW9uL3BqX21sZm4iOjE5fV0sNTk6W2Z1bmN0aW9uKGEsYixjKXtjLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxhdDA7dGhpcy5sYW1iZGEwPXRoaXMubG9uZzA7dmFyIGI9TWF0aC5zaW4oYSksYz10aGlzLmEsZD10aGlzLnJmLGU9MS9kLGY9MiplLU1hdGgucG93KGUsMiksZz10aGlzLmU9TWF0aC5zcXJ0KGYpO3RoaXMuUj10aGlzLmswKmMqTWF0aC5zcXJ0KDEtZikvKDEtZipNYXRoLnBvdyhiLDIpKSx0aGlzLmFscGhhPU1hdGguc3FydCgxK2YvKDEtZikqTWF0aC5wb3coTWF0aC5jb3MoYSksNCkpLHRoaXMuYjA9TWF0aC5hc2luKGIvdGhpcy5hbHBoYSk7dmFyIGg9TWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K3RoaXMuYjAvMikpLGk9TWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K2EvMikpLGo9TWF0aC5sb2coKDErZypiKS8oMS1nKmIpKTt0aGlzLks9aC10aGlzLmFscGhhKmkrdGhpcy5hbHBoYSpnLzIqan0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNC1hLnkvMikpLGM9dGhpcy5lLzIqTWF0aC5sb2coKDErdGhpcy5lKk1hdGguc2luKGEueSkpLygxLXRoaXMuZSpNYXRoLnNpbihhLnkpKSksZD0tdGhpcy5hbHBoYSooYitjKSt0aGlzLkssZT0yKihNYXRoLmF0YW4oTWF0aC5leHAoZCkpLU1hdGguUEkvNCksZj10aGlzLmFscGhhKihhLngtdGhpcy5sYW1iZGEwKSxnPU1hdGguYXRhbihNYXRoLnNpbihmKS8oTWF0aC5zaW4odGhpcy5iMCkqTWF0aC50YW4oZSkrTWF0aC5jb3ModGhpcy5iMCkqTWF0aC5jb3MoZikpKSxoPU1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmIwKSpNYXRoLnNpbihlKS1NYXRoLnNpbih0aGlzLmIwKSpNYXRoLmNvcyhlKSpNYXRoLmNvcyhmKSk7cmV0dXJuIGEueT10aGlzLlIvMipNYXRoLmxvZygoMStNYXRoLnNpbihoKSkvKDEtTWF0aC5zaW4oaCkpKSt0aGlzLnkwLGEueD10aGlzLlIqZyt0aGlzLngwLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS54LXRoaXMueDAsYz1hLnktdGhpcy55MCxkPWIvdGhpcy5SLGU9MiooTWF0aC5hdGFuKE1hdGguZXhwKGMvdGhpcy5SKSktTWF0aC5QSS80KSxmPU1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmIwKSpNYXRoLnNpbihlKStNYXRoLnNpbih0aGlzLmIwKSpNYXRoLmNvcyhlKSpNYXRoLmNvcyhkKSksZz1NYXRoLmF0YW4oTWF0aC5zaW4oZCkvKE1hdGguY29zKHRoaXMuYjApKk1hdGguY29zKGQpLU1hdGguc2luKHRoaXMuYjApKk1hdGgudGFuKGUpKSksaD10aGlzLmxhbWJkYTArZy90aGlzLmFscGhhLGk9MCxqPWYsaz0tMWUzLGw9MDtNYXRoLmFicyhqLWspPjFlLTc7KXtpZigrK2w+MjApcmV0dXJuO2k9MS90aGlzLmFscGhhKihNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQrZi8yKSktdGhpcy5LKSt0aGlzLmUqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K01hdGguYXNpbih0aGlzLmUqTWF0aC5zaW4oaikpLzIpKSxrPWosaj0yKk1hdGguYXRhbihNYXRoLmV4cChpKSktTWF0aC5QSS8yfXJldHVybiBhLng9aCxhLnk9aixhfSxjLm5hbWVzPVsic29tZXJjIl19LHt9XSw2MDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguUEkvMixlPTFlLTEwLGY9YSgiLi4vY29tbW9uL3NpZ24iKSxnPWEoIi4uL2NvbW1vbi9tc2ZueiIpLGg9YSgiLi4vY29tbW9uL3RzZm56IiksaT1hKCIuLi9jb21tb24vcGhpMnoiKSxqPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIik7Yy5zc2ZuXz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIqPWMsTWF0aC50YW4oLjUqKGQrYSkpKk1hdGgucG93KCgxLWIpLygxK2IpLC41KmMpfSxjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmNvc2xhdDA9TWF0aC5jb3ModGhpcy5sYXQwKSx0aGlzLnNpbmxhdDA9TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLnNwaGVyZT8xPT09dGhpcy5rMCYmIWlzTmFOKHRoaXMubGF0X3RzKSYmTWF0aC5hYnModGhpcy5jb3NsYXQwKTw9ZSYmKHRoaXMuazA9LjUqKDErZih0aGlzLmxhdDApKk1hdGguc2luKHRoaXMubGF0X3RzKSkpOihNYXRoLmFicyh0aGlzLmNvc2xhdDApPD1lJiYodGhpcy5sYXQwPjA/dGhpcy5jb249MTp0aGlzLmNvbj0tMSksdGhpcy5jb25zPU1hdGguc3FydChNYXRoLnBvdygxK3RoaXMuZSwxK3RoaXMuZSkqTWF0aC5wb3coMS10aGlzLmUsMS10aGlzLmUpKSwxPT09dGhpcy5rMCYmIWlzTmFOKHRoaXMubGF0X3RzKSYmTWF0aC5hYnModGhpcy5jb3NsYXQwKTw9ZSYmKHRoaXMuazA9LjUqdGhpcy5jb25zKmcodGhpcy5lLE1hdGguc2luKHRoaXMubGF0X3RzKSxNYXRoLmNvcyh0aGlzLmxhdF90cykpL2godGhpcy5lLHRoaXMuY29uKnRoaXMubGF0X3RzLHRoaXMuY29uKk1hdGguc2luKHRoaXMubGF0X3RzKSkpLHRoaXMubXMxPWcodGhpcy5lLHRoaXMuc2lubGF0MCx0aGlzLmNvc2xhdDApLHRoaXMuWDA9MipNYXRoLmF0YW4odGhpcy5zc2ZuXyh0aGlzLmxhdDAsdGhpcy5zaW5sYXQwLHRoaXMuZSkpLWQsdGhpcy5jb3NYMD1NYXRoLmNvcyh0aGlzLlgwKSx0aGlzLnNpblgwPU1hdGguc2luKHRoaXMuWDApKX0sYy5mb3J3YXJkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnLGksayxsPWEueCxtPWEueSxuPU1hdGguc2luKG0pLG89TWF0aC5jb3MobSkscD1qKGwtdGhpcy5sb25nMCk7cmV0dXJuIE1hdGguYWJzKE1hdGguYWJzKGwtdGhpcy5sb25nMCktTWF0aC5QSSk8PWUmJk1hdGguYWJzKG0rdGhpcy5sYXQwKTw9ZT8oYS54PU5hTixhLnk9TmFOLGEpOnRoaXMuc3BoZXJlPyhiPTIqdGhpcy5rMC8oMSt0aGlzLnNpbmxhdDAqbit0aGlzLmNvc2xhdDAqbypNYXRoLmNvcyhwKSksYS54PXRoaXMuYSpiKm8qTWF0aC5zaW4ocCkrdGhpcy54MCxhLnk9dGhpcy5hKmIqKHRoaXMuY29zbGF0MCpuLXRoaXMuc2lubGF0MCpvKk1hdGguY29zKHApKSt0aGlzLnkwLGEpOihjPTIqTWF0aC5hdGFuKHRoaXMuc3Nmbl8obSxuLHRoaXMuZSkpLWQsZz1NYXRoLmNvcyhjKSxmPU1hdGguc2luKGMpLE1hdGguYWJzKHRoaXMuY29zbGF0MCk8PWU/KGk9aCh0aGlzLmUsbSp0aGlzLmNvbix0aGlzLmNvbipuKSxrPTIqdGhpcy5hKnRoaXMuazAqaS90aGlzLmNvbnMsYS54PXRoaXMueDAraypNYXRoLnNpbihsLXRoaXMubG9uZzApLGEueT10aGlzLnkwLXRoaXMuY29uKmsqTWF0aC5jb3MobC10aGlzLmxvbmcwKSxhKTooTWF0aC5hYnModGhpcy5zaW5sYXQwKTxlPyhiPTIqdGhpcy5hKnRoaXMuazAvKDErZypNYXRoLmNvcyhwKSksYS55PWIqZik6KGI9Mip0aGlzLmEqdGhpcy5rMCp0aGlzLm1zMS8odGhpcy5jb3NYMCooMSt0aGlzLnNpblgwKmYrdGhpcy5jb3NYMCpnKk1hdGguY29zKHApKSksYS55PWIqKHRoaXMuY29zWDAqZi10aGlzLnNpblgwKmcqTWF0aC5jb3MocCkpK3RoaXMueTApLGEueD1iKmcqTWF0aC5zaW4ocCkrdGhpcy54MCxhKSl9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXthLngtPXRoaXMueDAsYS55LT10aGlzLnkwO3ZhciBiLGMsZixnLGgsaz1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KTtpZih0aGlzLnNwaGVyZSl7dmFyIGw9MipNYXRoLmF0YW4oay8oLjUqdGhpcy5hKnRoaXMuazApKTtyZXR1cm4gYj10aGlzLmxvbmcwLGM9dGhpcy5sYXQwLGU+PWs/KGEueD1iLGEueT1jLGEpOihjPU1hdGguYXNpbihNYXRoLmNvcyhsKSp0aGlzLnNpbmxhdDArYS55Kk1hdGguc2luKGwpKnRoaXMuY29zbGF0MC9rKSxiPWooTWF0aC5hYnModGhpcy5jb3NsYXQwKTxlP3RoaXMubGF0MD4wP3RoaXMubG9uZzArTWF0aC5hdGFuMihhLngsLTEqYS55KTp0aGlzLmxvbmcwK01hdGguYXRhbjIoYS54LGEueSk6dGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCpNYXRoLnNpbihsKSxrKnRoaXMuY29zbGF0MCpNYXRoLmNvcyhsKS1hLnkqdGhpcy5zaW5sYXQwKk1hdGguc2luKGwpKSksYS54PWIsYS55PWMsYSl9aWYoTWF0aC5hYnModGhpcy5jb3NsYXQwKTw9ZSl7aWYoZT49aylyZXR1cm4gYz10aGlzLmxhdDAsYj10aGlzLmxvbmcwLGEueD1iLGEueT1jLGE7YS54Kj10aGlzLmNvbixhLnkqPXRoaXMuY29uLGY9ayp0aGlzLmNvbnMvKDIqdGhpcy5hKnRoaXMuazApLGM9dGhpcy5jb24qaSh0aGlzLmUsZiksYj10aGlzLmNvbipqKHRoaXMuY29uKnRoaXMubG9uZzArTWF0aC5hdGFuMihhLngsLTEqYS55KSl9ZWxzZSBnPTIqTWF0aC5hdGFuKGsqdGhpcy5jb3NYMC8oMip0aGlzLmEqdGhpcy5rMCp0aGlzLm1zMSkpLGI9dGhpcy5sb25nMCxlPj1rP2g9dGhpcy5YMDooaD1NYXRoLmFzaW4oTWF0aC5jb3MoZykqdGhpcy5zaW5YMCthLnkqTWF0aC5zaW4oZykqdGhpcy5jb3NYMC9rKSxiPWoodGhpcy5sb25nMCtNYXRoLmF0YW4yKGEueCpNYXRoLnNpbihnKSxrKnRoaXMuY29zWDAqTWF0aC5jb3MoZyktYS55KnRoaXMuc2luWDAqTWF0aC5zaW4oZykpKSksYz0tMSppKHRoaXMuZSxNYXRoLnRhbiguNSooZCtoKSkpO3JldHVybiBhLng9YixhLnk9YyxhfSxjLm5hbWVzPVsic3RlcmUiLCJTdGVyZW9ncmFwaGljX1NvdXRoX1BvbGUiLCJQb2xhciBTdGVyZW9ncmFwaGljICh2YXJpYW50IEIpIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9tc2ZueiI6MTUsIi4uL2NvbW1vbi9waGkyeiI6MTYsIi4uL2NvbW1vbi9zaWduIjoyMSwiLi4vY29tbW9uL3RzZm56IjoyNH1dLDYxOltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi9nYXVzcyIpLGU9YSgiLi4vY29tbW9uL2FkanVzdF9sb24iKTtjLmluaXQ9ZnVuY3Rpb24oKXtkLmluaXQuYXBwbHkodGhpcyksdGhpcy5yYyYmKHRoaXMuc2luYzA9TWF0aC5zaW4odGhpcy5waGljMCksdGhpcy5jb3NjMD1NYXRoLmNvcyh0aGlzLnBoaWMwKSx0aGlzLlIyPTIqdGhpcy5yYyx0aGlzLnRpdGxlfHwodGhpcy50aXRsZT0iT2JsaXF1ZSBTdGVyZW9ncmFwaGljIEFsdGVybmF0aXZlIikpfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmLGc7cmV0dXJuIGEueD1lKGEueC10aGlzLmxvbmcwKSxkLmZvcndhcmQuYXBwbHkodGhpcyxbYV0pLGI9TWF0aC5zaW4oYS55KSxjPU1hdGguY29zKGEueSksZj1NYXRoLmNvcyhhLngpLGc9dGhpcy5rMCp0aGlzLlIyLygxK3RoaXMuc2luYzAqYit0aGlzLmNvc2MwKmMqZiksYS54PWcqYypNYXRoLnNpbihhLngpLGEueT1nKih0aGlzLmNvc2MwKmItdGhpcy5zaW5jMCpjKmYpLGEueD10aGlzLmEqYS54K3RoaXMueDAsYS55PXRoaXMuYSphLnkrdGhpcy55MCxhfSxjLmludmVyc2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxmLGcsaDtpZihhLng9KGEueC10aGlzLngwKS90aGlzLmEsYS55PShhLnktdGhpcy55MCkvdGhpcy5hLGEueC89dGhpcy5rMCxhLnkvPXRoaXMuazAsaD1NYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSl7dmFyIGk9MipNYXRoLmF0YW4yKGgsdGhpcy5SMik7Yj1NYXRoLnNpbihpKSxjPU1hdGguY29zKGkpLGc9TWF0aC5hc2luKGMqdGhpcy5zaW5jMCthLnkqYip0aGlzLmNvc2MwL2gpLGY9TWF0aC5hdGFuMihhLngqYixoKnRoaXMuY29zYzAqYy1hLnkqdGhpcy5zaW5jMCpiKX1lbHNlIGc9dGhpcy5waGljMCxmPTA7cmV0dXJuIGEueD1mLGEueT1nLGQuaW52ZXJzZS5hcHBseSh0aGlzLFthXSksYS54PWUoYS54K3RoaXMubG9uZzApLGF9LGMubmFtZXM9WyJTdGVyZW9ncmFwaGljX05vcnRoX1BvbGUiLCJPYmxpcXVlX1N0ZXJlb2dyYXBoaWMiLCJQb2xhcl9TdGVyZW9ncmFwaGljIiwic3RlcmVhIiwiT2JsaXF1ZSBTdGVyZW9ncmFwaGljIEFsdGVybmF0aXZlIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4vZ2F1c3MiOjQ2fV0sNjI6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuLi9jb21tb24vZTBmbiIpLGU9YSgiLi4vY29tbW9uL2UxZm4iKSxmPWEoIi4uL2NvbW1vbi9lMmZuIiksZz1hKCIuLi9jb21tb24vZTNmbiIpLGg9YSgiLi4vY29tbW9uL21sZm4iKSxpPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksaj1NYXRoLlBJLzIsaz0xZS0xMCxsPWEoIi4uL2NvbW1vbi9zaWduIiksbT1hKCIuLi9jb21tb24vYXNpbnoiKTtjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmUwPWQodGhpcy5lcyksdGhpcy5lMT1lKHRoaXMuZXMpLHRoaXMuZTI9Zih0aGlzLmVzKSx0aGlzLmUzPWcodGhpcy5lcyksdGhpcy5tbDA9dGhpcy5hKmgodGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyx0aGlzLmxhdDApfSxjLmZvcndhcmQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9YS54LGY9YS55LGc9aShlLXRoaXMubG9uZzApLGo9TWF0aC5zaW4oZiksaz1NYXRoLmNvcyhmKTtpZih0aGlzLnNwaGVyZSl7dmFyIGw9aypNYXRoLnNpbihnKTtpZihNYXRoLmFicyhNYXRoLmFicyhsKS0xKTwxZS0xMClyZXR1cm4gOTM7Yz0uNSp0aGlzLmEqdGhpcy5rMCpNYXRoLmxvZygoMStsKS8oMS1sKSksYj1NYXRoLmFjb3MoaypNYXRoLmNvcyhnKS9NYXRoLnNxcnQoMS1sKmwpKSwwPmYmJihiPS1iKSxkPXRoaXMuYSp0aGlzLmswKihiLXRoaXMubGF0MCl9ZWxzZXt2YXIgbT1rKmcsbj1NYXRoLnBvdyhtLDIpLG89dGhpcy5lcDIqTWF0aC5wb3coaywyKSxwPU1hdGgudGFuKGYpLHE9TWF0aC5wb3cocCwyKTtiPTEtdGhpcy5lcypNYXRoLnBvdyhqLDIpO3ZhciByPXRoaXMuYS9NYXRoLnNxcnQoYikscz10aGlzLmEqaCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLGYpO2M9dGhpcy5rMCpyKm0qKDErbi82KigxLXErbytuLzIwKig1LTE4KnErTWF0aC5wb3cocSwyKSs3MipvLTU4KnRoaXMuZXAyKSkpK3RoaXMueDAsZD10aGlzLmswKihzLXRoaXMubWwwK3IqcCoobiooLjUrbi8yNCooNS1xKzkqbys0Kk1hdGgucG93KG8sMikrbi8zMCooNjEtNTgqcStNYXRoLnBvdyhxLDIpKzYwMCpvLTMzMCp0aGlzLmVwMikpKSkpK3RoaXMueTB9cmV0dXJuIGEueD1jLGEueT1kLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD02O2lmKHRoaXMuc3BoZXJlKXt2YXIgbj1NYXRoLmV4cChhLngvKHRoaXMuYSp0aGlzLmswKSksbz0uNSoobi0xL24pLHA9dGhpcy5sYXQwK2EueS8odGhpcy5hKnRoaXMuazApLHE9TWF0aC5jb3MocCk7Yj1NYXRoLnNxcnQoKDEtcSpxKS8oMStvKm8pKSxmPW0oYiksMD5wJiYoZj0tZiksZz0wPT09byYmMD09PXE/dGhpcy5sb25nMDppKE1hdGguYXRhbjIobyxxKSt0aGlzLmxvbmcwKX1lbHNle3ZhciByPWEueC10aGlzLngwLHM9YS55LXRoaXMueTA7Zm9yKGI9KHRoaXMubWwwK3MvdGhpcy5rMCkvdGhpcy5hLGM9YixlPTA7ITAmJihkPShiK3RoaXMuZTEqTWF0aC5zaW4oMipjKS10aGlzLmUyKk1hdGguc2luKDQqYykrdGhpcy5lMypNYXRoLnNpbig2KmMpKS90aGlzLmUwLWMsYys9ZCwhKE1hdGguYWJzKGQpPD1rKSk7ZSsrKWlmKGU+PWgpcmV0dXJuIDk1O2lmKE1hdGguYWJzKGMpPGope3ZhciB0PU1hdGguc2luKGMpLHU9TWF0aC5jb3MoYyksdj1NYXRoLnRhbihjKSx3PXRoaXMuZXAyKk1hdGgucG93KHUsMikseD1NYXRoLnBvdyh3LDIpLHk9TWF0aC5wb3codiwyKSx6PU1hdGgucG93KHksMik7Yj0xLXRoaXMuZXMqTWF0aC5wb3codCwyKTt2YXIgQT10aGlzLmEvTWF0aC5zcXJ0KGIpLEI9QSooMS10aGlzLmVzKS9iLEM9ci8oQSp0aGlzLmswKSxEPU1hdGgucG93KEMsMik7Zj1jLUEqdipEL0IqKC41LUQvMjQqKDUrMyp5KzEwKnctNCp4LTkqdGhpcy5lcDItRC8zMCooNjErOTAqeSsyOTgqdys0NSp6LTI1Mip0aGlzLmVwMi0zKngpKSksZz1pKHRoaXMubG9uZzArQyooMS1ELzYqKDErMip5K3ctRC8yMCooNS0yKncrMjgqeS0zKngrOCp0aGlzLmVwMisyNCp6KSkpL3UpfWVsc2UgZj1qKmwocyksZz10aGlzLmxvbmcwfXJldHVybiBhLng9ZyxhLnk9ZixhfSxjLm5hbWVzPVsiVHJhbnN2ZXJzZV9NZXJjYXRvciIsIlRyYW5zdmVyc2UgTWVyY2F0b3IiLCJ0bWVyYyJdfSx7Ii4uL2NvbW1vbi9hZGp1c3RfbG9uIjo1LCIuLi9jb21tb24vYXNpbnoiOjYsIi4uL2NvbW1vbi9lMGZuIjo3LCIuLi9jb21tb24vZTFmbiI6OCwiLi4vY29tbW9uL2UyZm4iOjksIi4uL2NvbW1vbi9lM2ZuIjoxMCwiLi4vY29tbW9uL21sZm4iOjE0LCIuLi9jb21tb24vc2lnbiI6MjF9XSw2MzpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPS4wMTc0NTMyOTI1MTk5NDMyOTUsZT1hKCIuL3RtZXJjIik7Yy5kZXBlbmRzT249InRtZXJjIixjLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnpvbmUmJih0aGlzLmxhdDA9MCx0aGlzLmxvbmcwPSg2Kk1hdGguYWJzKHRoaXMuem9uZSktMTgzKSpkLHRoaXMueDA9NWU1LHRoaXMueTA9dGhpcy51dG1Tb3V0aD8xZTc6MCx0aGlzLmswPS45OTk2LGUuaW5pdC5hcHBseSh0aGlzKSx0aGlzLmZvcndhcmQ9ZS5mb3J3YXJkLHRoaXMuaW52ZXJzZT1lLmludmVyc2UpfSxjLm5hbWVzPVsiVW5pdmVyc2FsIFRyYW5zdmVyc2UgTWVyY2F0b3IgU3lzdGVtIiwidXRtIl19LHsiLi90bWVyYyI6NjJ9XSw2NDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4uL2NvbW1vbi9hZGp1c3RfbG9uIiksZT1NYXRoLlBJLzIsZj0xZS0xMCxnPWEoIi4uL2NvbW1vbi9hc2lueiIpO2MuaW5pdD1mdW5jdGlvbigpe3RoaXMuUj10aGlzLmF9LGMuZm9yd2FyZD1mdW5jdGlvbihhKXt2YXIgYixjLGg9YS54LGk9YS55LGo9ZChoLXRoaXMubG9uZzApO01hdGguYWJzKGkpPD1mJiYoYj10aGlzLngwK3RoaXMuUipqLGM9dGhpcy55MCk7dmFyIGs9ZygyKk1hdGguYWJzKGkvTWF0aC5QSSkpOyhNYXRoLmFicyhqKTw9Znx8TWF0aC5hYnMoTWF0aC5hYnMoaSktZSk8PWYpJiYoYj10aGlzLngwLGM9aT49MD90aGlzLnkwK01hdGguUEkqdGhpcy5SKk1hdGgudGFuKC41KmspOnRoaXMueTArTWF0aC5QSSp0aGlzLlIqLU1hdGgudGFuKC41KmspKTt2YXIgbD0uNSpNYXRoLmFicyhNYXRoLlBJL2otai9NYXRoLlBJKSxtPWwqbCxuPU1hdGguc2luKGspLG89TWF0aC5jb3MoaykscD1vLyhuK28tMSkscT1wKnAscj1wKigyL24tMSkscz1yKnIsdD1NYXRoLlBJKnRoaXMuUioobCoocC1zKStNYXRoLnNxcnQobSoocC1zKSoocC1zKS0ocyttKSoocS1zKSkpLyhzK20pOzA+aiYmKHQ9LXQpLGI9dGhpcy54MCt0O3ZhciB1PW0rcDtyZXR1cm4gdD1NYXRoLlBJKnRoaXMuUioocip1LWwqTWF0aC5zcXJ0KChzK20pKihtKzEpLXUqdSkpLyhzK20pLGM9aT49MD90aGlzLnkwK3Q6dGhpcy55MC10LGEueD1iLGEueT1jLGF9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYixjLGUsZyxoLGksaixrLGwsbSxuLG8scDtyZXR1cm4gYS54LT10aGlzLngwLGEueS09dGhpcy55MCxuPU1hdGguUEkqdGhpcy5SLGU9YS54L24sZz1hLnkvbixoPWUqZStnKmcsaT0tTWF0aC5hYnMoZykqKDEraCksaj1pLTIqZypnK2UqZSxrPS0yKmkrMSsyKmcqZytoKmgscD1nKmcvaysoMipqKmoqai9rL2svay05Kmkqai9rL2spLzI3LGw9KGktaipqLzMvaykvayxtPTIqTWF0aC5zcXJ0KC1sLzMpLG49MypwL2wvbSxNYXRoLmFicyhuKT4xJiYobj1uPj0wPzE6LTEpLG89TWF0aC5hY29zKG4pLzMsYz1hLnk+PTA/KC1tKk1hdGguY29zKG8rTWF0aC5QSS8zKS1qLzMvaykqTWF0aC5QSTotKC1tKk1hdGguY29zKG8rTWF0aC5QSS8zKS1qLzMvaykqTWF0aC5QSSxiPU1hdGguYWJzKGUpPGY/dGhpcy5sb25nMDpkKHRoaXMubG9uZzArTWF0aC5QSSooaC0xK01hdGguc3FydCgxKzIqKGUqZS1nKmcpK2gqaCkpLzIvZSksYS54PWIsYS55PWMsYX0sYy5uYW1lcz1bIlZhbl9kZXJfR3JpbnRlbl9JIiwiVmFuRGVyR3JpbnRlbiIsInZhbmRnIl19LHsiLi4vY29tbW9uL2FkanVzdF9sb24iOjUsIi4uL2NvbW1vbi9hc2lueiI6Nn1dLDY1OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9LjAxNzQ1MzI5MjUxOTk0MzI5NSxlPTU3LjI5NTc3OTUxMzA4MjMyLGY9MSxnPTIsaD1hKCIuL2RhdHVtX3RyYW5zZm9ybSIpLGk9YSgiLi9hZGp1c3RfYXhpcyIpLGo9YSgiLi9Qcm9qIiksaz1hKCIuL2NvbW1vbi90b1BvaW50Iik7Yi5leHBvcnRzPWZ1bmN0aW9uIGwoYSxiLGMpe2Z1bmN0aW9uIG0oYSxiKXtyZXR1cm4oYS5kYXR1bS5kYXR1bV90eXBlPT09Znx8YS5kYXR1bS5kYXR1bV90eXBlPT09ZykmJiJXR1M4NCIhPT1iLmRhdHVtQ29kZX12YXIgbjtyZXR1cm4gQXJyYXkuaXNBcnJheShjKSYmKGM9ayhjKSksYS5kYXR1bSYmYi5kYXR1bSYmKG0oYSxiKXx8bShiLGEpKSYmKG49bmV3IGooIldHUzg0IiksbChhLG4sYyksYT1uKSwiZW51IiE9PWEuYXhpcyYmaShhLCExLGMpLCJsb25nbGF0Ij09PWEucHJvak5hbWU/KGMueCo9ZCxjLnkqPWQpOihhLnRvX21ldGVyJiYoYy54Kj1hLnRvX21ldGVyLGMueSo9YS50b19tZXRlciksYS5pbnZlcnNlKGMpKSxhLmZyb21fZ3JlZW53aWNoJiYoYy54Kz1hLmZyb21fZ3JlZW53aWNoKSxjPWgoYS5kYXR1bSxiLmRhdHVtLGMpLGIuZnJvbV9ncmVlbndpY2gmJihjLngtPWIuZnJvbV9ncmVlbndpY2gpLCJsb25nbGF0Ij09PWIucHJvak5hbWU/KGMueCo9ZSxjLnkqPWUpOihiLmZvcndhcmQoYyksYi50b19tZXRlciYmKGMueC89Yi50b19tZXRlcixjLnkvPWIudG9fbWV0ZXIpKSwiZW51IiE9PWIuYXhpcyYmaShiLCEwLGMpLGN9fSx7Ii4vUHJvaiI6MiwiLi9hZGp1c3RfYXhpcyI6MywiLi9jb21tb24vdG9Qb2ludCI6MjMsIi4vZGF0dW1fdHJhbnNmb3JtIjozMX1dLDY2OltmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIsYyl7YVtiXT1jLm1hcChmdW5jdGlvbihhKXt2YXIgYj17fTtyZXR1cm4gZShhLGIpLGJ9KS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gaihhLGIpfSx7fSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjO3JldHVybiBBcnJheS5pc0FycmF5KGEpPyhjPWEuc2hpZnQoKSwiUEFSQU1FVEVSIj09PWMmJihjPWEuc2hpZnQoKSksMT09PWEubGVuZ3RoP0FycmF5LmlzQXJyYXkoYVswXSk/KGJbY109e30sZShhWzBdLGJbY10pKTpiW2NdPWFbMF06YS5sZW5ndGg/IlRPV0dTODQiPT09Yz9iW2NdPWE6KGJbY109e30sWyJVTklUIiwiUFJJTUVNIiwiVkVSVF9EQVRVTSJdLmluZGV4T2YoYyk+LTE/KGJbY109e25hbWU6YVswXS50b0xvd2VyQ2FzZSgpLGNvbnZlcnQ6YVsxXX0sMz09PWEubGVuZ3RoJiYoYltjXS5hdXRoPWFbMl0pKToiU1BIRVJPSUQiPT09Yz8oYltjXT17bmFtZTphWzBdLGE6YVsxXSxyZjphWzJdfSw0PT09YS5sZW5ndGgmJihiW2NdLmF1dGg9YVszXSkpOlsiR0VPR0NTIiwiR0VPQ0NTIiwiREFUVU0iLCJWRVJUX0NTIiwiQ09NUERfQ1MiLCJMT0NBTF9DUyIsIkZJVFRFRF9DUyIsIkxPQ0FMX0RBVFVNIl0uaW5kZXhPZihjKT4tMT8oYVswXT1bIm5hbWUiLGFbMF1dLGQoYixjLGEpKTphLmV2ZXJ5KGZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpfSk/ZChiLGMsYSk6ZShhLGJbY10pKTpiW2NdPSEwLHZvaWQgMCk6dm9pZChiW2FdPSEwKX1mdW5jdGlvbiBmKGEsYil7dmFyIGM9YlswXSxkPWJbMV07IShjIGluIGEpJiZkIGluIGEmJihhW2NdPWFbZF0sMz09PWIubGVuZ3RoJiYoYVtjXT1iWzJdKGFbY10pKSl9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYSppfWZ1bmN0aW9uIGgoYSl7ZnVuY3Rpb24gYihiKXt2YXIgYz1hLnRvX21ldGVyfHwxO3JldHVybiBwYXJzZUZsb2F0KGIsMTApKmN9IkdFT0dDUyI9PT1hLnR5cGU/YS5wcm9qTmFtZT0ibG9uZ2xhdCI6IkxPQ0FMX0NTIj09PWEudHlwZT8oYS5wcm9qTmFtZT0iaWRlbnRpdHkiLGEubG9jYWw9ITApOiJvYmplY3QiPT10eXBlb2YgYS5QUk9KRUNUSU9OP2EucHJvak5hbWU9T2JqZWN0LmtleXMoYS5QUk9KRUNUSU9OKVswXTphLnByb2pOYW1lPWEuUFJPSkVDVElPTixhLlVOSVQmJihhLnVuaXRzPWEuVU5JVC5uYW1lLnRvTG93ZXJDYXNlKCksIm1ldHJlIj09PWEudW5pdHMmJihhLnVuaXRzPSJtZXRlciIpLAphLlVOSVQuY29udmVydCYmKCJHRU9HQ1MiPT09YS50eXBlP2EuREFUVU0mJmEuREFUVU0uU1BIRVJPSUQmJihhLnRvX21ldGVyPXBhcnNlRmxvYXQoYS5VTklULmNvbnZlcnQsMTApKmEuREFUVU0uU1BIRVJPSUQuYSk6YS50b19tZXRlcj1wYXJzZUZsb2F0KGEuVU5JVC5jb252ZXJ0LDEwKSkpLGEuR0VPR0NTJiYoYS5HRU9HQ1MuREFUVU0/YS5kYXR1bUNvZGU9YS5HRU9HQ1MuREFUVU0ubmFtZS50b0xvd2VyQ2FzZSgpOmEuZGF0dW1Db2RlPWEuR0VPR0NTLm5hbWUudG9Mb3dlckNhc2UoKSwiZF8iPT09YS5kYXR1bUNvZGUuc2xpY2UoMCwyKSYmKGEuZGF0dW1Db2RlPWEuZGF0dW1Db2RlLnNsaWNlKDIpKSwoIm5ld196ZWFsYW5kX2dlb2RldGljX2RhdHVtXzE5NDkiPT09YS5kYXR1bUNvZGV8fCJuZXdfemVhbGFuZF8xOTQ5Ij09PWEuZGF0dW1Db2RlKSYmKGEuZGF0dW1Db2RlPSJuemdkNDkiKSwid2dzXzE5ODQiPT09YS5kYXR1bUNvZGUmJigiTWVyY2F0b3JfQXV4aWxpYXJ5X1NwaGVyZSI9PT1hLlBST0pFQ1RJT04mJihhLnNwaGVyZT0hMCksYS5kYXR1bUNvZGU9Indnczg0IiksIl9mZXJybyI9PT1hLmRhdHVtQ29kZS5zbGljZSgtNikmJihhLmRhdHVtQ29kZT1hLmRhdHVtQ29kZS5zbGljZSgwLC02KSksIl9qYWthcnRhIj09PWEuZGF0dW1Db2RlLnNsaWNlKC04KSYmKGEuZGF0dW1Db2RlPWEuZGF0dW1Db2RlLnNsaWNlKDAsLTgpKSx+YS5kYXR1bUNvZGUuaW5kZXhPZigiYmVsZ2UiKSYmKGEuZGF0dW1Db2RlPSJybmI3MiIpLGEuR0VPR0NTLkRBVFVNJiZhLkdFT0dDUy5EQVRVTS5TUEhFUk9JRCYmKGEuZWxscHM9YS5HRU9HQ1MuREFUVU0uU1BIRVJPSUQubmFtZS5yZXBsYWNlKCJfMTkiLCIiKS5yZXBsYWNlKC9bQ2NdbGFya2VcXzE4LywiY2xyayIpLCJpbnRlcm5hdGlvbmFsIj09PWEuZWxscHMudG9Mb3dlckNhc2UoKS5zbGljZSgwLDEzKSYmKGEuZWxscHM9ImludGwiKSxhLmE9YS5HRU9HQ1MuREFUVU0uU1BIRVJPSUQuYSxhLnJmPXBhcnNlRmxvYXQoYS5HRU9HQ1MuREFUVU0uU1BIRVJPSUQucmYsMTApKSx+YS5kYXR1bUNvZGUuaW5kZXhPZigib3NnYl8xOTM2IikmJihhLmRhdHVtQ29kZT0ib3NnYjM2IikpLGEuYiYmIWlzRmluaXRlKGEuYikmJihhLmI9YS5hKTt2YXIgYz1mdW5jdGlvbihiKXtyZXR1cm4gZihhLGIpfSxkPVtbInN0YW5kYXJkX3BhcmFsbGVsXzEiLCJTdGFuZGFyZF9QYXJhbGxlbF8xIl0sWyJzdGFuZGFyZF9wYXJhbGxlbF8yIiwiU3RhbmRhcmRfUGFyYWxsZWxfMiJdLFsiZmFsc2VfZWFzdGluZyIsIkZhbHNlX0Vhc3RpbmciXSxbImZhbHNlX25vcnRoaW5nIiwiRmFsc2VfTm9ydGhpbmciXSxbImNlbnRyYWxfbWVyaWRpYW4iLCJDZW50cmFsX01lcmlkaWFuIl0sWyJsYXRpdHVkZV9vZl9vcmlnaW4iLCJMYXRpdHVkZV9PZl9PcmlnaW4iXSxbImxhdGl0dWRlX29mX29yaWdpbiIsIkNlbnRyYWxfUGFyYWxsZWwiXSxbInNjYWxlX2ZhY3RvciIsIlNjYWxlX0ZhY3RvciJdLFsiazAiLCJzY2FsZV9mYWN0b3IiXSxbImxhdGl0dWRlX29mX2NlbnRlciIsIkxhdGl0dWRlX29mX2NlbnRlciJdLFsibGF0MCIsImxhdGl0dWRlX29mX2NlbnRlciIsZ10sWyJsb25naXR1ZGVfb2ZfY2VudGVyIiwiTG9uZ2l0dWRlX09mX0NlbnRlciJdLFsibG9uZ2MiLCJsb25naXR1ZGVfb2ZfY2VudGVyIixnXSxbIngwIiwiZmFsc2VfZWFzdGluZyIsYl0sWyJ5MCIsImZhbHNlX25vcnRoaW5nIixiXSxbImxvbmcwIiwiY2VudHJhbF9tZXJpZGlhbiIsZ10sWyJsYXQwIiwibGF0aXR1ZGVfb2Zfb3JpZ2luIixnXSxbImxhdDAiLCJzdGFuZGFyZF9wYXJhbGxlbF8xIixnXSxbImxhdDEiLCJzdGFuZGFyZF9wYXJhbGxlbF8xIixnXSxbImxhdDIiLCJzdGFuZGFyZF9wYXJhbGxlbF8yIixnXSxbImFscGhhIiwiYXppbXV0aCIsZ10sWyJzcnNDb2RlIiwibmFtZSJdXTtkLmZvckVhY2goYyksYS5sb25nMHx8IWEubG9uZ2N8fCJBbGJlcnNfQ29uaWNfRXF1YWxfQXJlYSIhPT1hLnByb2pOYW1lJiYiTGFtYmVydF9BemltdXRoYWxfRXF1YWxfQXJlYSIhPT1hLnByb2pOYW1lfHwoYS5sb25nMD1hLmxvbmdjKSxhLmxhdF90c3x8IWEubGF0MXx8IlN0ZXJlb2dyYXBoaWNfU291dGhfUG9sZSIhPT1hLnByb2pOYW1lJiYiUG9sYXIgU3RlcmVvZ3JhcGhpYyAodmFyaWFudCBCKSIhPT1hLnByb2pOYW1lfHwoYS5sYXQwPWcoYS5sYXQxPjA/OTA6LTkwKSxhLmxhdF90cz1hLmxhdDEpfXZhciBpPS4wMTc0NTMyOTI1MTk5NDMyOTUsaj1hKCIuL2V4dGVuZCIpO2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjPUpTT04ucGFyc2UoKCIsIithKS5yZXBsYWNlKC9ccypcLFxzKihbQS1aXzAtOV0rPykoXFspL2csJyxbIiQxIiwnKS5zbGljZSgxKS5yZXBsYWNlKC9ccypcLFxzKihbQS1aXzAtOV0rPylcXS9nLCcsIiQxIl0nKS5yZXBsYWNlKC8sXFsiVkVSVENTIi4rLywiIikpLGQ9Yy5zaGlmdCgpLGY9Yy5zaGlmdCgpO2MudW5zaGlmdChbIm5hbWUiLGZdKSxjLnVuc2hpZnQoWyJ0eXBlIixkXSksYy51bnNoaWZ0KCJvdXRwdXQiKTt2YXIgZz17fTtyZXR1cm4gZShjLGcpLGgoZy5vdXRwdXQpLGooYixnLm91dHB1dCl9fSx7Ii4vZXh0ZW5kIjozNH1dLDY3OltmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYSooTWF0aC5QSS8xODApfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIDE4MCooYS9NYXRoLlBJKX1mdW5jdGlvbiBmKGEpe3ZhciBiLGMsZSxmLGcsaSxqLGssbCxtPWEubGF0LG49YS5sb24sbz02Mzc4MTM3LHA9LjAwNjY5NDM4LHE9Ljk5OTYscj1kKG0pLHM9ZChuKTtsPU1hdGguZmxvb3IoKG4rMTgwKS82KSsxLDE4MD09PW4mJihsPTYwKSxtPj01NiYmNjQ+bSYmbj49MyYmMTI+biYmKGw9MzIpLG0+PTcyJiY4ND5tJiYobj49MCYmOT5uP2w9MzE6bj49OSYmMjE+bj9sPTMzOm4+PTIxJiYzMz5uP2w9MzU6bj49MzMmJjQyPm4mJihsPTM3KSksYj02KihsLTEpLTE4MCszLGs9ZChiKSxjPXAvKDEtcCksZT1vL01hdGguc3FydCgxLXAqTWF0aC5zaW4ocikqTWF0aC5zaW4ocikpLGY9TWF0aC50YW4ocikqTWF0aC50YW4ociksZz1jKk1hdGguY29zKHIpKk1hdGguY29zKHIpLGk9TWF0aC5jb3MocikqKHMtayksaj1vKigoMS1wLzQtMypwKnAvNjQtNSpwKnAqcC8yNTYpKnItKDMqcC84KzMqcCpwLzMyKzQ1KnAqcCpwLzEwMjQpKk1hdGguc2luKDIqcikrKDE1KnAqcC8yNTYrNDUqcCpwKnAvMTAyNCkqTWF0aC5zaW4oNCpyKS0zNSpwKnAqcC8zMDcyKk1hdGguc2luKDYqcikpO3ZhciB0PXEqZSooaSsoMS1mK2cpKmkqaSppLzYrKDUtMTgqZitmKmYrNzIqZy01OCpjKSppKmkqaSppKmkvMTIwKSs1ZTUsdT1xKihqK2UqTWF0aC50YW4ocikqKGkqaS8yKyg1LWYrOSpnKzQqZypnKSppKmkqaSppLzI0Kyg2MS01OCpmK2YqZis2MDAqZy0zMzAqYykqaSppKmkqaSppKmkvNzIwKSk7cmV0dXJuIDA+bSYmKHUrPTFlNykse25vcnRoaW5nOk1hdGgucm91bmQodSksZWFzdGluZzpNYXRoLnJvdW5kKHQpLHpvbmVOdW1iZXI6bCx6b25lTGV0dGVyOmgobSl9fWZ1bmN0aW9uIGcoYSl7dmFyIGI9YS5ub3J0aGluZyxjPWEuZWFzdGluZyxkPWEuem9uZUxldHRlcixmPWEuem9uZU51bWJlcjtpZigwPmZ8fGY+NjApcmV0dXJuIG51bGw7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscj0uOTk5NixzPTYzNzgxMzcsdD0uMDA2Njk0MzgsdT0oMS1NYXRoLnNxcnQoMS10KSkvKDErTWF0aC5zcXJ0KDEtdCkpLHY9Yy01ZTUsdz1iOyJOIj5kJiYody09MWU3KSxvPTYqKGYtMSktMTgwKzMsaD10LygxLXQpLG49dy9yLHA9bi8ocyooMS10LzQtMyp0KnQvNjQtNSp0KnQqdC8yNTYpKSxxPXArKDMqdS8yLTI3KnUqdSp1LzMyKSpNYXRoLnNpbigyKnApKygyMSp1KnUvMTYtNTUqdSp1KnUqdS8zMikqTWF0aC5zaW4oNCpwKSsxNTEqdSp1KnUvOTYqTWF0aC5zaW4oNipwKSxpPXMvTWF0aC5zcXJ0KDEtdCpNYXRoLnNpbihxKSpNYXRoLnNpbihxKSksaj1NYXRoLnRhbihxKSpNYXRoLnRhbihxKSxrPWgqTWF0aC5jb3MocSkqTWF0aC5jb3MocSksbD1zKigxLXQpL01hdGgucG93KDEtdCpNYXRoLnNpbihxKSpNYXRoLnNpbihxKSwxLjUpLG09di8oaSpyKTt2YXIgeD1xLWkqTWF0aC50YW4ocSkvbCoobSptLzItKDUrMypqKzEwKmstNCprKmstOSpoKSptKm0qbSptLzI0Kyg2MSs5MCpqKzI5OCprKzQ1Kmoqai0yNTIqaC0zKmsqaykqbSptKm0qbSptKm0vNzIwKTt4PWUoeCk7dmFyIHk9KG0tKDErMipqK2spKm0qbSptLzYrKDUtMiprKzI4KmotMyprKmsrOCpoKzI0KmoqaikqbSptKm0qbSptLzEyMCkvTWF0aC5jb3MocSk7eT1vK2UoeSk7dmFyIHo7aWYoYS5hY2N1cmFjeSl7dmFyIEE9Zyh7bm9ydGhpbmc6YS5ub3J0aGluZythLmFjY3VyYWN5LGVhc3Rpbmc6YS5lYXN0aW5nK2EuYWNjdXJhY3ksem9uZUxldHRlcjphLnpvbmVMZXR0ZXIsem9uZU51bWJlcjphLnpvbmVOdW1iZXJ9KTt6PXt0b3A6QS5sYXQscmlnaHQ6QS5sb24sYm90dG9tOngsbGVmdDp5fX1lbHNlIHo9e2xhdDp4LGxvbjp5fTtyZXR1cm4gen1mdW5jdGlvbiBoKGEpe3ZhciBiPSJaIjtyZXR1cm4gODQ+PWEmJmE+PTcyP2I9IlgiOjcyPmEmJmE+PTY0P2I9IlciOjY0PmEmJmE+PTU2P2I9IlYiOjU2PmEmJmE+PTQ4P2I9IlUiOjQ4PmEmJmE+PTQwP2I9IlQiOjQwPmEmJmE+PTMyP2I9IlMiOjMyPmEmJmE+PTI0P2I9IlIiOjI0PmEmJmE+PTE2P2I9IlEiOjE2PmEmJmE+PTg/Yj0iUCI6OD5hJiZhPj0wP2I9Ik4iOjA+YSYmYT49LTg/Yj0iTSI6LTg+YSYmYT49LTE2P2I9IkwiOi0xNj5hJiZhPj0tMjQ/Yj0iSyI6LTI0PmEmJmE+PS0zMj9iPSJKIjotMzI+YSYmYT49LTQwP2I9IkgiOi00MD5hJiZhPj0tNDg/Yj0iRyI6LTQ4PmEmJmE+PS01Nj9iPSJGIjotNTY+YSYmYT49LTY0P2I9IkUiOi02ND5hJiZhPj0tNzI/Yj0iRCI6LTcyPmEmJmE+PS04MCYmKGI9IkMiKSxifWZ1bmN0aW9uIGkoYSxiKXt2YXIgYz0iMDAwMDAiK2EuZWFzdGluZyxkPSIwMDAwMCIrYS5ub3J0aGluZztyZXR1cm4gYS56b25lTnVtYmVyK2Euem9uZUxldHRlcitqKGEuZWFzdGluZyxhLm5vcnRoaW5nLGEuem9uZU51bWJlcikrYy5zdWJzdHIoYy5sZW5ndGgtNSxiKStkLnN1YnN0cihkLmxlbmd0aC01LGIpfWZ1bmN0aW9uIGooYSxiLGMpe3ZhciBkPWsoYyksZT1NYXRoLmZsb29yKGEvMWU1KSxmPU1hdGguZmxvb3IoYi8xZTUpJTIwO3JldHVybiBsKGUsZixkKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWElcTtyZXR1cm4gMD09PWImJihiPXEpLGJ9ZnVuY3Rpb24gbChhLGIsYyl7dmFyIGQ9Yy0xLGU9ci5jaGFyQ29kZUF0KGQpLGY9cy5jaGFyQ29kZUF0KGQpLGc9ZSthLTEsaD1mK2IsaT0hMTtnPngmJihnPWcteCt0LTEsaT0hMCksKGc9PT11fHx1PmUmJmc+dXx8KGc+dXx8dT5lKSYmaSkmJmcrKywoZz09PXZ8fHY+ZSYmZz52fHwoZz52fHx2PmUpJiZpKSYmKGcrKyxnPT09dSYmZysrKSxnPngmJihnPWcteCt0LTEpLGg+dz8oaD1oLXcrdC0xLGk9ITApOmk9ITEsKGg9PT11fHx1PmYmJmg+dXx8KGg+dXx8dT5mKSYmaSkmJmgrKywoaD09PXZ8fHY+ZiYmaD52fHwoaD52fHx2PmYpJiZpKSYmKGgrKyxoPT09dSYmaCsrKSxoPncmJihoPWgtdyt0LTEpO3ZhciBqPVN0cmluZy5mcm9tQ2hhckNvZGUoZykrU3RyaW5nLmZyb21DaGFyQ29kZShoKTtyZXR1cm4gan1mdW5jdGlvbiBtKGEpe2lmKGEmJjA9PT1hLmxlbmd0aCl0aHJvdyJNR1JTUG9pbnQgY292ZXJ0aW5nIGZyb20gbm90aGluZyI7Zm9yKHZhciBiLGM9YS5sZW5ndGgsZD1udWxsLGU9IiIsZj0wOyEvW0EtWl0vLnRlc3QoYj1hLmNoYXJBdChmKSk7KXtpZihmPj0yKXRocm93Ik1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiAiK2E7ZSs9YixmKyt9dmFyIGc9cGFyc2VJbnQoZSwxMCk7aWYoMD09PWZ8fGYrMz5jKXRocm93Ik1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiAiK2E7dmFyIGg9YS5jaGFyQXQoZisrKTtpZigiQSI+PWh8fCJCIj09PWh8fCJZIj09PWh8fGg+PSJaInx8IkkiPT09aHx8Ik8iPT09aCl0aHJvdyJNR1JTUG9pbnQgem9uZSBsZXR0ZXIgIitoKyIgbm90IGhhbmRsZWQ6ICIrYTtkPWEuc3Vic3RyaW5nKGYsZis9Mik7Zm9yKHZhciBpPWsoZyksaj1uKGQuY2hhckF0KDApLGkpLGw9byhkLmNoYXJBdCgxKSxpKTtsPHAoaCk7KWwrPTJlNjt2YXIgbT1jLWY7aWYobSUyIT09MCl0aHJvdyJNR1JTUG9pbnQgaGFzIHRvIGhhdmUgYW4gZXZlbiBudW1iZXIgXG5vZiBkaWdpdHMgYWZ0ZXIgdGhlIHpvbmUgbGV0dGVyIGFuZCB0d28gMTAwa20gbGV0dGVycyAtIGZyb250IFxuaGFsZiBmb3IgZWFzdGluZyBtZXRlcnMsIHNlY29uZCBoYWxmIGZvciBcbm5vcnRoaW5nIG1ldGVycyIrYTt2YXIgcSxyLHMsdCx1LHY9bS8yLHc9MCx4PTA7cmV0dXJuIHY+MCYmKHE9MWU1L01hdGgucG93KDEwLHYpLHI9YS5zdWJzdHJpbmcoZixmK3YpLHc9cGFyc2VGbG9hdChyKSpxLHM9YS5zdWJzdHJpbmcoZit2KSx4PXBhcnNlRmxvYXQocykqcSksdD13K2osdT14K2wse2Vhc3Rpbmc6dCxub3J0aGluZzp1LHpvbmVMZXR0ZXI6aCx6b25lTnVtYmVyOmcsYWNjdXJhY3k6cX19ZnVuY3Rpb24gbihhLGIpe2Zvcih2YXIgYz1yLmNoYXJDb2RlQXQoYi0xKSxkPTFlNSxlPSExO2MhPT1hLmNoYXJDb2RlQXQoMCk7KXtpZihjKyssYz09PXUmJmMrKyxjPT09diYmYysrLGM+eCl7aWYoZSl0aHJvdyJCYWQgY2hhcmFjdGVyOiAiK2E7Yz10LGU9ITB9ZCs9MWU1fXJldHVybiBkfWZ1bmN0aW9uIG8oYSxiKXtpZihhPiJWIil0aHJvdyJNR1JTUG9pbnQgZ2l2ZW4gaW52YWxpZCBOb3J0aGluZyAiK2E7Zm9yKHZhciBjPXMuY2hhckNvZGVBdChiLTEpLGQ9MCxlPSExO2MhPT1hLmNoYXJDb2RlQXQoMCk7KXtpZihjKyssYz09PXUmJmMrKyxjPT09diYmYysrLGM+dyl7aWYoZSl0aHJvdyJCYWQgY2hhcmFjdGVyOiAiK2E7Yz10LGU9ITB9ZCs9MWU1fXJldHVybiBkfWZ1bmN0aW9uIHAoYSl7dmFyIGI7c3dpdGNoKGEpe2Nhc2UiQyI6Yj0xMWU1O2JyZWFrO2Nhc2UiRCI6Yj0yZTY7YnJlYWs7Y2FzZSJFIjpiPTI4ZTU7YnJlYWs7Y2FzZSJGIjpiPTM3ZTU7YnJlYWs7Y2FzZSJHIjpiPTQ2ZTU7YnJlYWs7Y2FzZSJIIjpiPTU1ZTU7YnJlYWs7Y2FzZSJKIjpiPTY0ZTU7YnJlYWs7Y2FzZSJLIjpiPTczZTU7YnJlYWs7Y2FzZSJMIjpiPTgyZTU7YnJlYWs7Y2FzZSJNIjpiPTkxZTU7YnJlYWs7Y2FzZSJOIjpiPTA7YnJlYWs7Y2FzZSJQIjpiPThlNTticmVhaztjYXNlIlEiOmI9MTdlNTticmVhaztjYXNlIlIiOmI9MjZlNTticmVhaztjYXNlIlMiOmI9MzVlNTticmVhaztjYXNlIlQiOmI9NDRlNTticmVhaztjYXNlIlUiOmI9NTNlNTticmVhaztjYXNlIlYiOmI9NjJlNTticmVhaztjYXNlIlciOmI9N2U2O2JyZWFrO2Nhc2UiWCI6Yj03OWU1O2JyZWFrO2RlZmF1bHQ6Yj0tMX1pZihiPj0wKXJldHVybiBiO3Rocm93IkludmFsaWQgem9uZSBsZXR0ZXI6ICIrYX12YXIgcT02LHI9IkFKU0FKUyIscz0iQUZBRkFGIix0PTY1LHU9NzMsdj03OSx3PTg2LHg9OTA7Yy5mb3J3YXJkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9Ynx8NSxpKGYoe2xhdDphWzFdLGxvbjphWzBdfSksYil9LGMuaW52ZXJzZT1mdW5jdGlvbihhKXt2YXIgYj1nKG0oYS50b1VwcGVyQ2FzZSgpKSk7cmV0dXJuIGIubGF0JiZiLmxvbj9bYi5sb24sYi5sYXQsYi5sb24sYi5sYXRdOltiLmxlZnQsYi5ib3R0b20sYi5yaWdodCxiLnRvcF19LGMudG9Qb2ludD1mdW5jdGlvbihhKXt2YXIgYj1nKG0oYS50b1VwcGVyQ2FzZSgpKSk7cmV0dXJuIGIubGF0JiZiLmxvbj9bYi5sb24sYi5sYXRdOlsoYi5sZWZ0K2IucmlnaHQpLzIsKGIudG9wK2IuYm90dG9tKS8yXX19LHt9XSw2ODpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz17bmFtZToicHJvajQiLHZlcnNpb246IjIuMy4xNCIsZGVzY3JpcHRpb246IlByb2o0anMgaXMgYSBKYXZhU2NyaXB0IGxpYnJhcnkgdG8gdHJhbnNmb3JtIHBvaW50IGNvb3JkaW5hdGVzIGZyb20gb25lIGNvb3JkaW5hdGUgc3lzdGVtIHRvIGFub3RoZXIsIGluY2x1ZGluZyBkYXR1bSB0cmFuc2Zvcm1hdGlvbnMuIixtYWluOiJsaWIvaW5kZXguanMiLGRpcmVjdG9yaWVzOnt0ZXN0OiJ0ZXN0Iixkb2M6ImRvY3MifSxzY3JpcHRzOnt0ZXN0OiIuL25vZGVfbW9kdWxlcy9pc3RhbmJ1bC9saWIvY2xpLmpzIHRlc3QgLi9ub2RlX21vZHVsZXMvbW9jaGEvYmluL19tb2NoYSB0ZXN0L3Rlc3QuanMifSxyZXBvc2l0b3J5Ont0eXBlOiJnaXQiLHVybDoiZ2l0Oi8vZ2l0aHViLmNvbS9wcm9qNGpzL3Byb2o0anMuZ2l0In0sYXV0aG9yOiIiLGxpY2Vuc2U6Ik1JVCIsamFtOnttYWluOiJkaXN0L3Byb2o0LmpzIixpbmNsdWRlOlsiZGlzdC9wcm9qNC5qcyIsIlJFQURNRS5tZCIsIkFVVEhPUlMiLCJMSUNFTlNFLm1kIl19LGRldkRlcGVuZGVuY2llczp7ImdydW50LWNsaSI6In4wLjEuMTMiLGdydW50OiJ+MC40LjIiLCJncnVudC1jb250cmliLWNvbm5lY3QiOiJ+MC42LjAiLCJncnVudC1jb250cmliLWpzaGludCI6In4wLjguMCIsY2hhaToifjEuOC4xIixtb2NoYToifjEuMTcuMSIsImdydW50LW1vY2hhLXBoYW50b21qcyI6In4wLjQuMCIsYnJvd3NlcmlmeToifjEyLjAuMSIsImdydW50LWJyb3dzZXJpZnkiOiJ+NC4wLjEiLCJncnVudC1jb250cmliLXVnbGlmeSI6In4wLjExLjEiLGN1cmw6ImdpdDovL2dpdGh1Yi5jb20vY3Vqb2pzL2N1cmwuZ2l0Iixpc3RhbmJ1bDoifjAuMi40Iix0aW46In4wLjQuMCJ9LGRlcGVuZGVuY2llczp7bWdyczoifjAuMC4yIn19fSx7fV0sIi4vaW5jbHVkZWRQcm9qZWN0aW9ucyI6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9YSgiaFRFRHBuIil9LHt9XSxoVEVEcG46W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1bYSgiLi9saWIvcHJvamVjdGlvbnMvdG1lcmMiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy91dG0iKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9zdGVyZWEiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9zdGVyZSIpLGEoIi4vbGliL3Byb2plY3Rpb25zL3NvbWVyYyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL29tZXJjIiksYSgiLi9saWIvcHJvamVjdGlvbnMvbGNjIiksYSgiLi9saWIvcHJvamVjdGlvbnMva3JvdmFrIiksYSgiLi9saWIvcHJvamVjdGlvbnMvY2FzcyIpLGEoIi4vbGliL3Byb2plY3Rpb25zL2xhZWEiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9hZWEiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9nbm9tIiksYSgiLi9saWIvcHJvamVjdGlvbnMvY2VhIiksYSgiLi9saWIvcHJvamVjdGlvbnMvZXFjIiksYSgiLi9saWIvcHJvamVjdGlvbnMvcG9seSIpLGEoIi4vbGliL3Byb2plY3Rpb25zL256bWciKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9taWxsIiksYSgiLi9saWIvcHJvamVjdGlvbnMvc2ludSIpLGEoIi4vbGliL3Byb2plY3Rpb25zL21vbGwiKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9lcWRjIiksYSgiLi9saWIvcHJvamVjdGlvbnMvdmFuZGciKSxhKCIuL2xpYi9wcm9qZWN0aW9ucy9hZXFkIildO2IuZXhwb3J0cz1mdW5jdGlvbihwcm9qNCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3Byb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGEpfSl9fSx7Ii4vbGliL3Byb2plY3Rpb25zL2FlYSI6NDAsIi4vbGliL3Byb2plY3Rpb25zL2FlcWQiOjQxLCIuL2xpYi9wcm9qZWN0aW9ucy9jYXNzIjo0MiwiLi9saWIvcHJvamVjdGlvbnMvY2VhIjo0MywiLi9saWIvcHJvamVjdGlvbnMvZXFjIjo0NCwiLi9saWIvcHJvamVjdGlvbnMvZXFkYyI6NDUsIi4vbGliL3Byb2plY3Rpb25zL2dub20iOjQ3LCIuL2xpYi9wcm9qZWN0aW9ucy9rcm92YWsiOjQ4LCIuL2xpYi9wcm9qZWN0aW9ucy9sYWVhIjo0OSwiLi9saWIvcHJvamVjdGlvbnMvbGNjIjo1MCwiLi9saWIvcHJvamVjdGlvbnMvbWlsbCI6NTMsIi4vbGliL3Byb2plY3Rpb25zL21vbGwiOjU0LCIuL2xpYi9wcm9qZWN0aW9ucy9uem1nIjo1NSwiLi9saWIvcHJvamVjdGlvbnMvb21lcmMiOjU2LCIuL2xpYi9wcm9qZWN0aW9ucy9wb2x5Ijo1NywiLi9saWIvcHJvamVjdGlvbnMvc2ludSI6NTgsIi4vbGliL3Byb2plY3Rpb25zL3NvbWVyYyI6NTksIi4vbGliL3Byb2plY3Rpb25zL3N0ZXJlIjo2MCwiLi9saWIvcHJvamVjdGlvbnMvc3RlcmVhIjo2MSwiLi9saWIvcHJvamVjdGlvbnMvdG1lcmMiOjYyLCIuL2xpYi9wcm9qZWN0aW9ucy91dG0iOjYzLCIuL2xpYi9wcm9qZWN0aW9ucy92YW5kZyI6NjR9XX0se30sWzM2XSkoMzYpfSk7"></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIChmYWN0b3J5KSB7DQoJdmFyIEwsIHByb2o0Ow0KCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsNCgkJLy8gQU1EDQoJCWRlZmluZShbJ2xlYWZsZXQnLCAncHJvajQnXSwgZmFjdG9yeSk7DQoJfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICJvYmplY3QiKSB7DQoJCS8vIE5vZGUvQ29tbW9uSlMNCgkJTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTsNCgkJcHJvajQgPSByZXF1aXJlKCdwcm9qNCcpOw0KCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoTCwgcHJvajQpOw0KCX0gZWxzZSB7DQoJCS8vIEJyb3dzZXIgZ2xvYmFscw0KCQlpZiAodHlwZW9mIHdpbmRvdy5MID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LnByb2o0ID09PSAndW5kZWZpbmVkJykNCgkJCXRocm93ICdMZWFmbGV0IGFuZCBwcm9qNCBtdXN0IGJlIGxvYWRlZCBmaXJzdCc7DQoJCWZhY3Rvcnkod2luZG93LkwsIHdpbmRvdy5wcm9qNCk7DQoJfQ0KfShmdW5jdGlvbiAoTCwgcHJvajQpIHsNCg0KCUwuUHJvaiA9IHt9Ow0KDQoJTC5Qcm9qLl9pc1Byb2o0T2JqID0gZnVuY3Rpb24oYSkgew0KCQlyZXR1cm4gKHR5cGVvZiBhLmludmVyc2UgIT09ICd1bmRlZmluZWQnICYmDQoJCQl0eXBlb2YgYS5mb3J3YXJkICE9PSAndW5kZWZpbmVkJyk7DQoJfTsNCg0KCUwuUHJvai5Qcm9qZWN0aW9uID0gTC5DbGFzcy5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihjb2RlLCBkZWYsIGJvdW5kcykgew0KCQkJdmFyIGlzUDQgPSBMLlByb2ouX2lzUHJvajRPYmooY29kZSk7DQoJCQl0aGlzLl9wcm9qID0gaXNQNCA/IGNvZGUgOiB0aGlzLl9wcm9qRnJvbUNvZGVEZWYoY29kZSwgZGVmKTsNCgkJCXRoaXMuYm91bmRzID0gaXNQNCA/IGRlZiA6IGJvdW5kczsNCgkJfSwNCg0KCQlwcm9qZWN0OiBmdW5jdGlvbiAobGF0bG5nKSB7DQoJCQl2YXIgcG9pbnQgPSB0aGlzLl9wcm9qLmZvcndhcmQoW2xhdGxuZy5sbmcsIGxhdGxuZy5sYXRdKTsNCgkJCXJldHVybiBuZXcgTC5Qb2ludChwb2ludFswXSwgcG9pbnRbMV0pOw0KCQl9LA0KDQoJCXVucHJvamVjdDogZnVuY3Rpb24gKHBvaW50LCB1bmJvdW5kZWQpIHsNCgkJCXZhciBwb2ludDIgPSB0aGlzLl9wcm9qLmludmVyc2UoW3BvaW50LngsIHBvaW50LnldKTsNCgkJCXJldHVybiBuZXcgTC5MYXRMbmcocG9pbnQyWzFdLCBwb2ludDJbMF0sIHVuYm91bmRlZCk7DQoJCX0sDQoNCgkJX3Byb2pGcm9tQ29kZURlZjogZnVuY3Rpb24oY29kZSwgZGVmKSB7DQoJCQlpZiAoZGVmKSB7DQoJCQkJcHJvajQuZGVmcyhjb2RlLCBkZWYpOw0KCQkJfSBlbHNlIGlmIChwcm9qNC5kZWZzW2NvZGVdID09PSB1bmRlZmluZWQpIHsNCgkJCQl2YXIgdXJuID0gY29kZS5zcGxpdCgnOicpOw0KCQkJCWlmICh1cm4ubGVuZ3RoID4gMykgew0KCQkJCQljb2RlID0gdXJuW3Vybi5sZW5ndGggLSAzXSArICc6JyArIHVyblt1cm4ubGVuZ3RoIC0gMV07DQoJCQkJfQ0KCQkJCWlmIChwcm9qNC5kZWZzW2NvZGVdID09PSB1bmRlZmluZWQpIHsNCgkJCQkJdGhyb3cgJ05vIHByb2plY3Rpb24gZGVmaW5pdGlvbiBmb3IgY29kZSAnICsgY29kZTsNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiBwcm9qNChjb2RlKTsNCgkJfQ0KCX0pOw0KDQoJTC5Qcm9qLkNSUyA9IEwuQ2xhc3MuZXh0ZW5kKHsNCgkJaW5jbHVkZXM6IEwuQ1JTLA0KDQoJCW9wdGlvbnM6IHsNCgkJCXRyYW5zZm9ybWF0aW9uOiBuZXcgTC5UcmFuc2Zvcm1hdGlvbigxLCAwLCAtMSwgMCkNCgkJfSwNCg0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihhLCBiLCBjKSB7DQoJCQl2YXIgY29kZSwNCgkJCSAgICBwcm9qLA0KCQkJICAgIGRlZiwNCgkJCSAgICBvcHRpb25zOw0KDQoJCQlpZiAoTC5Qcm9qLl9pc1Byb2o0T2JqKGEpKSB7DQoJCQkJcHJvaiA9IGE7DQoJCQkJY29kZSA9IHByb2ouc3JzQ29kZTsNCgkJCQlvcHRpb25zID0gYiB8fCB7fTsNCg0KCQkJCXRoaXMucHJvamVjdGlvbiA9IG5ldyBMLlByb2ouUHJvamVjdGlvbihwcm9qLCBvcHRpb25zLmJvdW5kcyk7DQoJCQl9IGVsc2Ugew0KCQkJCWNvZGUgPSBhOw0KCQkJCWRlZiA9IGI7DQoJCQkJb3B0aW9ucyA9IGMgfHwge307DQoJCQkJdGhpcy5wcm9qZWN0aW9uID0gbmV3IEwuUHJvai5Qcm9qZWN0aW9uKGNvZGUsIGRlZiwgb3B0aW9ucy5ib3VuZHMpOw0KCQkJfQ0KDQoJCQlMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTsNCgkJCXRoaXMuY29kZSA9IGNvZGU7DQoJCQl0aGlzLnRyYW5zZm9ybWF0aW9uID0gdGhpcy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uOw0KDQoJCQlpZiAodGhpcy5vcHRpb25zLm9yaWdpbikgew0KCQkJCXRoaXMudHJhbnNmb3JtYXRpb24gPQ0KCQkJCQluZXcgTC5UcmFuc2Zvcm1hdGlvbigxLCAtdGhpcy5vcHRpb25zLm9yaWdpblswXSwNCgkJCQkJCS0xLCB0aGlzLm9wdGlvbnMub3JpZ2luWzFdKTsNCgkJCX0NCg0KCQkJaWYgKHRoaXMub3B0aW9ucy5zY2FsZXMpIHsNCgkJCQl0aGlzLl9zY2FsZXMgPSB0aGlzLm9wdGlvbnMuc2NhbGVzOw0KCQkJfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMucmVzb2x1dGlvbnMpIHsNCgkJCQl0aGlzLl9zY2FsZXMgPSBbXTsNCgkJCQlmb3IgKHZhciBpID0gdGhpcy5vcHRpb25zLnJlc29sdXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQoJCQkJCWlmICh0aGlzLm9wdGlvbnMucmVzb2x1dGlvbnNbaV0pIHsNCgkJCQkJCXRoaXMuX3NjYWxlc1tpXSA9IDEgLyB0aGlzLm9wdGlvbnMucmVzb2x1dGlvbnNbaV07DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCXRoaXMuaW5maW5pdGUgPSAhdGhpcy5vcHRpb25zLmJvdW5kczsNCg0KCQl9LA0KDQoJCXNjYWxlOiBmdW5jdGlvbih6b29tKSB7DQoJCQl2YXIgaVpvb20gPSBNYXRoLmZsb29yKHpvb20pLA0KCQkJCWJhc2VTY2FsZSwNCgkJCQluZXh0U2NhbGUsDQoJCQkJc2NhbGVEaWZmLA0KCQkJCXpEaWZmOw0KCQkJaWYgKHpvb20gPT09IGlab29tKSB7DQoJCQkJcmV0dXJuIHRoaXMuX3NjYWxlc1t6b29tXTsNCgkJCX0gZWxzZSB7DQoJCQkJLy8gTm9uLWludGVnZXIgem9vbSwgaW50ZXJwb2xhdGUNCgkJCQliYXNlU2NhbGUgPSB0aGlzLl9zY2FsZXNbaVpvb21dOw0KCQkJCW5leHRTY2FsZSA9IHRoaXMuX3NjYWxlc1tpWm9vbSArIDFdOw0KCQkJCXNjYWxlRGlmZiA9IG5leHRTY2FsZSAtIGJhc2VTY2FsZTsNCgkJCQl6RGlmZiA9ICh6b29tIC0gaVpvb20pOw0KCQkJCXJldHVybiBiYXNlU2NhbGUgKyBzY2FsZURpZmYgKiB6RGlmZjsNCgkJCX0NCgkJfSwNCg0KCQl6b29tOiBmdW5jdGlvbihzY2FsZSkgew0KCQkJLy8gRmluZCBjbG9zZXN0IG51bWJlciBpbiB0aGlzLl9zY2FsZXMsIGRvd24NCgkJCXZhciBkb3duU2NhbGUgPSB0aGlzLl9jbG9zZXN0RWxlbWVudCh0aGlzLl9zY2FsZXMsIHNjYWxlKSwNCgkJCQlkb3duWm9vbSA9IHRoaXMuX3NjYWxlcy5pbmRleE9mKGRvd25TY2FsZSksDQoJCQkJbmV4dFNjYWxlLA0KCQkJCW5leHRab29tLA0KCQkJCXNjYWxlRGlmZjsNCgkJCS8vIENoZWNrIGlmIHNjYWxlIGlzIGRvd25TY2FsZSA9PiByZXR1cm4gYXJyYXkgaW5kZXgNCgkJCWlmIChzY2FsZSA9PT0gZG93blNjYWxlKSB7DQoJCQkJcmV0dXJuIGRvd25ab29tOw0KCQkJfQ0KCQkJLy8gSW50ZXJwb2xhdGUNCgkJCW5leHRab29tID0gZG93blpvb20gKyAxOw0KCQkJbmV4dFNjYWxlID0gdGhpcy5fc2NhbGVzW25leHRab29tXTsNCgkJCWlmIChuZXh0U2NhbGUgPT09IHVuZGVmaW5lZCkgew0KCQkJCXJldHVybiBJbmZpbml0eTsNCgkJCX0NCgkJCXNjYWxlRGlmZiA9IG5leHRTY2FsZSAtIGRvd25TY2FsZTsNCgkJCXJldHVybiAoc2NhbGUgLSBkb3duU2NhbGUpIC8gc2NhbGVEaWZmICsgZG93blpvb207DQoJCX0sDQoNCgkJZGlzdGFuY2U6IEwuQ1JTLkVhcnRoLmRpc3RhbmNlLA0KDQoJCVI6IEwuQ1JTLkVhcnRoLlIsDQoNCgkJLyogR2V0IHRoZSBjbG9zZXN0IGxvd2VzdCBlbGVtZW50IGluIGFuIGFycmF5ICovDQoJCV9jbG9zZXN0RWxlbWVudDogZnVuY3Rpb24oYXJyYXksIGVsZW1lbnQpIHsNCgkJCXZhciBsb3c7DQoJCQlmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoOyBpLS07KSB7DQoJCQkJaWYgKGFycmF5W2ldIDw9IGVsZW1lbnQgJiYgKGxvdyA9PT0gdW5kZWZpbmVkIHx8IGxvdyA8IGFycmF5W2ldKSkgew0KCQkJCQlsb3cgPSBhcnJheVtpXTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gbG93Ow0KCQl9DQoJfSk7DQoNCglMLlByb2ouR2VvSlNPTiA9IEwuR2VvSlNPTi5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihnZW9qc29uLCBvcHRpb25zKSB7DQoJCQl0aGlzLl9jYWxsTGV2ZWwgPSAwOw0KCQkJTC5HZW9KU09OLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgZ2VvanNvbiwgb3B0aW9ucyk7DQoJCX0sDQoNCgkJYWRkRGF0YTogZnVuY3Rpb24oZ2VvanNvbikgew0KCQkJdmFyIGNyczsNCg0KCQkJaWYgKGdlb2pzb24pIHsNCgkJCQlpZiAoZ2VvanNvbi5jcnMgJiYgZ2VvanNvbi5jcnMudHlwZSA9PT0gJ25hbWUnKSB7DQoJCQkJCWNycyA9IG5ldyBMLlByb2ouQ1JTKGdlb2pzb24uY3JzLnByb3BlcnRpZXMubmFtZSk7DQoJCQkJfSBlbHNlIGlmIChnZW9qc29uLmNycyAmJiBnZW9qc29uLmNycy50eXBlKSB7DQoJCQkJCWNycyA9IG5ldyBMLlByb2ouQ1JTKGdlb2pzb24uY3JzLnR5cGUgKyAnOicgKyBnZW9qc29uLmNycy5wcm9wZXJ0aWVzLmNvZGUpOw0KCQkJCX0NCg0KCQkJCWlmIChjcnMgIT09IHVuZGVmaW5lZCkgew0KCQkJCQl0aGlzLm9wdGlvbnMuY29vcmRzVG9MYXRMbmcgPSBmdW5jdGlvbihjb29yZHMpIHsNCgkJCQkJCXZhciBwb2ludCA9IEwucG9pbnQoY29vcmRzWzBdLCBjb29yZHNbMV0pOw0KCQkJCQkJcmV0dXJuIGNycy5wcm9qZWN0aW9uLnVucHJvamVjdChwb2ludCk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBCYXNlIGNsYXNzJyBhZGREYXRhIG1pZ2h0IGNhbGwgdXMgcmVjdXJzaXZlbHksIGJ1dA0KCQkJLy8gQ1JTIHNob3VsZG4ndCBiZSBjbGVhcmVkIGluIHRoYXQgY2FzZSwgc2luY2UgQ1JTIGFwcGxpZXMNCgkJCS8vIHRvIHRoZSB3aG9sZSBHZW9KU09OLCBpbmx1ZGluZyBzdWItZmVhdHVyZXMuDQoJCQl0aGlzLl9jYWxsTGV2ZWwrKzsNCgkJCXRyeSB7DQoJCQkJTC5HZW9KU09OLnByb3RvdHlwZS5hZGREYXRhLmNhbGwodGhpcywgZ2VvanNvbik7DQoJCQl9IGZpbmFsbHkgew0KCQkJCXRoaXMuX2NhbGxMZXZlbC0tOw0KCQkJCWlmICh0aGlzLl9jYWxsTGV2ZWwgPT09IDApIHsNCgkJCQkJZGVsZXRlIHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZzsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9KTsNCg0KCUwuUHJvai5nZW9Kc29uID0gZnVuY3Rpb24oZ2VvanNvbiwgb3B0aW9ucykgew0KCQlyZXR1cm4gbmV3IEwuUHJvai5HZW9KU09OKGdlb2pzb24sIG9wdGlvbnMpOw0KCX07DQoNCglMLlByb2ouSW1hZ2VPdmVybGF5ID0gTC5JbWFnZU92ZXJsYXkuZXh0ZW5kKHsNCgkJaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHVybCwgYm91bmRzLCBvcHRpb25zKSB7DQoJCQlMLkltYWdlT3ZlcmxheS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHVybCwgbnVsbCwgb3B0aW9ucyk7DQoJCQl0aGlzLl9wcm9qZWN0ZWRCb3VuZHMgPSBib3VuZHM7DQoJCX0sDQoNCgkJLy8gRGFuZ2VyIGFoZWFkOiBPdmVycmlkaW5nIGludGVybmFsIG1ldGhvZHMgaW4gTGVhZmxldC4NCgkJLy8gRGVjaWRlZCB0byBkbyB0aGlzIHJhdGhlciB0aGFuIG1ha2luZyBhIGNvcHkgb2YgTC5JbWFnZU92ZXJsYXkNCgkJLy8gYW5kIGRvaW5nIHZlcnkgdGlueSBtb2RpZmljYXRpb25zIHRvIGl0Lg0KCQkvLyBGdXR1cmUgd2lsbCB0ZWxsIGlmIHRoaXMgd2FzIHdpc2Ugb3Igbm90Lg0KCQlfYW5pbWF0ZVpvb206IGZ1bmN0aW9uIChldmVudCkgew0KCQkJdmFyIHNjYWxlID0gdGhpcy5fbWFwLmdldFpvb21TY2FsZShldmVudC56b29tKTsNCgkJCXZhciBub3J0aFdlc3QgPSBMLnBvaW50KHRoaXMuX3Byb2plY3RlZEJvdW5kcy5taW4ueCwgdGhpcy5fcHJvamVjdGVkQm91bmRzLm1heC55KTsNCgkJCXZhciBvZmZzZXQgPSB0aGlzLl9wcm9qZWN0ZWRUb05ld0xheWVyUG9pbnQobm9ydGhXZXN0LCBldmVudC56b29tLCBldmVudC5jZW50ZXIpOw0KDQoJCQlMLkRvbVV0aWwuc2V0VHJhbnNmb3JtKHRoaXMuX2ltYWdlLCBvZmZzZXQsIHNjYWxlKTsNCgkJfSwNCg0KCQlfcmVzZXQ6IGZ1bmN0aW9uICgpIHsNCgkJCXZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTsNCgkJCXZhciBwaXhlbE9yaWdpbiA9IHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpOw0KCQkJdmFyIGJvdW5kcyA9IEwuYm91bmRzKA0KCQkJCXRoaXMuX3RyYW5zZm9ybSh0aGlzLl9wcm9qZWN0ZWRCb3VuZHMubWluLCB6b29tKS5fc3VidHJhY3QocGl4ZWxPcmlnaW4pLA0KCQkJCXRoaXMuX3RyYW5zZm9ybSh0aGlzLl9wcm9qZWN0ZWRCb3VuZHMubWF4LCB6b29tKS5fc3VidHJhY3QocGl4ZWxPcmlnaW4pDQoJCQkpOw0KCQkJdmFyIHNpemUgPSBib3VuZHMuZ2V0U2l6ZSgpOw0KDQoJCQlMLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5faW1hZ2UsIGJvdW5kcy5taW4pOw0KCQkJdGhpcy5faW1hZ2Uuc3R5bGUud2lkdGggPSBzaXplLnggKyAncHgnOw0KCQkJdGhpcy5faW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gc2l6ZS55ICsgJ3B4JzsNCgkJfSwNCg0KCQlfcHJvamVjdGVkVG9OZXdMYXllclBvaW50OiBmdW5jdGlvbiAocG9pbnQsIHpvb20sIGNlbnRlcikgew0KCQkJdmFyIHZpZXdIYWxmID0gdGhpcy5fbWFwLmdldFNpemUoKS5fZGl2aWRlQnkoMik7DQoJCQl2YXIgbmV3VG9wTGVmdCA9IHRoaXMuX21hcC5wcm9qZWN0KGNlbnRlciwgem9vbSkuX3N1YnRyYWN0KHZpZXdIYWxmKS5fcm91bmQoKTsNCgkJCXZhciB0b3BMZWZ0ID0gbmV3VG9wTGVmdC5hZGQodGhpcy5fbWFwLl9nZXRNYXBQYW5lUG9zKCkpOw0KDQoJCQlyZXR1cm4gdGhpcy5fdHJhbnNmb3JtKHBvaW50LCB6b29tKS5fc3VidHJhY3QodG9wTGVmdCk7DQoJCX0sDQoNCgkJX3RyYW5zZm9ybTogZnVuY3Rpb24gKHBvaW50LCB6b29tKSB7DQoJCQl2YXIgY3JzID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzOw0KCQkJdmFyIHRyYW5zZm9ybWF0aW9uID0gY3JzLnRyYW5zZm9ybWF0aW9uOw0KCQkJdmFyIHNjYWxlID0gY3JzLnNjYWxlKHpvb20pOw0KDQoJCQlyZXR1cm4gdHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKHBvaW50LCBzY2FsZSk7DQoJCX0NCgl9KTsNCg0KCUwuUHJvai5pbWFnZU92ZXJsYXkgPSBmdW5jdGlvbiAodXJsLCBib3VuZHMsIG9wdGlvbnMpIHsNCgkJcmV0dXJuIG5ldyBMLlByb2ouSW1hZ2VPdmVybGF5KHVybCwgYm91bmRzLCBvcHRpb25zKTsNCgl9Ow0KDQoJcmV0dXJuIEwuUHJvajsNCn0pKTsNCg=="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKdmFyIF91dGlsID0gcmVxdWlyZSgiLi91dGlsIik7CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCnZhciBDbHVzdGVyTGF5ZXJTdG9yZSA9IGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBDbHVzdGVyTGF5ZXJTdG9yZShncm91cCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsdXN0ZXJMYXllclN0b3JlKTsKCiAgICB0aGlzLl9sYXllcnMgPSB7fTsKICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7CiAgfQoKICBfY3JlYXRlQ2xhc3MoQ2x1c3RlckxheWVyU3RvcmUsIFt7CiAgICBrZXk6ICJhZGQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChsYXllciwgaWQpIHsKICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInVuZGVmaW5lZCIgJiYgaWQgIT09IG51bGwpIHsKICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2lkXSkgewogICAgICAgICAgdGhpcy5fZ3JvdXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2lkXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xheWVyc1tpZF0gPSBsYXllcjsKICAgICAgfQogICAgICB0aGlzLl9ncm91cC5hZGRMYXllcihsYXllcik7CiAgICB9CiAgfSwgewogICAga2V5OiAicmVtb3ZlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoaWQpIHsKICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gInVuZGVmaW5lZCIgfHwgaWQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlkID0gKDAsIF91dGlsLmFzQXJyYXkpKGlkKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRbaV1dKSB7CiAgICAgICAgICB0aGlzLl9ncm91cC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbaWRbaV1dKTsKICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRbaV1dOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgdGhpcy5fbGF5ZXJzID0ge307CiAgICAgIHRoaXMuX2dyb3VwLmNsZWFyTGF5ZXJzKCk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gQ2x1c3RlckxheWVyU3RvcmU7Cn0oKTsKCmV4cG9ydHMuZGVmYXVsdCA9IENsdXN0ZXJMYXllclN0b3JlOwoKCn0seyIuL3V0aWwiOjE1fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9Cgp2YXIgQ29udHJvbFN0b3JlID0gZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIENvbnRyb2xTdG9yZShtYXApIHsKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sU3RvcmUpOwoKICAgIHRoaXMuX2NvbnRyb2xzTm9JZCA9IFtdOwogICAgdGhpcy5fY29udHJvbHNCeUlkID0ge307CiAgICB0aGlzLl9tYXAgPSBtYXA7CiAgfQoKICBfY3JlYXRlQ2xhc3MoQ29udHJvbFN0b3JlLCBbewogICAga2V5OiAiYWRkIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoY29udHJvbCwgaWQsIGh0bWwpIHsKICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInVuZGVmaW5lZCIgJiYgaWQgIT09IG51bGwpIHsKICAgICAgICBpZiAodGhpcy5fY29udHJvbHNCeUlkW2lkXSkgewogICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUNvbnRyb2wodGhpcy5fY29udHJvbHNCeUlkW2lkXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NvbnRyb2xzQnlJZFtpZF0gPSBjb250cm9sOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX2NvbnRyb2xzTm9JZC5wdXNoKGNvbnRyb2wpOwogICAgICB9CiAgICAgIHRoaXMuX21hcC5hZGRDb250cm9sKGNvbnRyb2wpOwogICAgfQogIH0sIHsKICAgIGtleTogInJlbW92ZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGlkKSB7CiAgICAgIGlmICh0aGlzLl9jb250cm9sc0J5SWRbaWRdKSB7CiAgICAgICAgdmFyIGNvbnRyb2wgPSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwogICAgICAgIGRlbGV0ZSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiY2xlYXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xzTm9JZC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb250cm9sID0gdGhpcy5fY29udHJvbHNOb0lkW2ldOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwogICAgICB9CiAgICAgIHRoaXMuX2NvbnRyb2xzTm9JZCA9IFtdOwoKICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NvbnRyb2xzQnlJZCkgewogICAgICAgIHZhciBfY29udHJvbCA9IHRoaXMuX2NvbnRyb2xzQnlJZFtrZXldOwogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKF9jb250cm9sKTsKICAgICAgfQogICAgICB0aGlzLl9jb250cm9sc0J5SWQgPSB7fTsKICAgIH0KICB9XSk7CgogIHJldHVybiBDb250cm9sU3RvcmU7Cn0oKTsKCmV4cG9ydHMuZGVmYXVsdCA9IENvbnRyb2xTdG9yZTsKCgp9LHt9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmdldENSUyA9IGdldENSUzsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCnZhciBfcHJvajRsZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvcHJvajRsZWFmbGV0Iik7Cgp2YXIgX3Byb2o0bGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9qNGxlYWZsZXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBpbnN0YW5jaWF0ZSBhIElDUlMgaW5zdGFuY2UuCmZ1bmN0aW9uIGdldENSUyhjcnNPcHRpb25zKSB7CiAgdmFyIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzg1NzsgLy8gRGVmYXVsdCBTcGhlcmljYWwgTWVyY2F0b3IKCiAgc3dpdGNoIChjcnNPcHRpb25zLmNyc0NsYXNzKSB7CiAgICBjYXNlICJMLkNSUy5FUFNHMzg1NyI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzg1NzsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5FUFNHNDMyNiI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHNDMyNjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5FUFNHMzM5NSI6CiAgICAgIGNycyA9IF9sZWFmbGV0Mi5kZWZhdWx0LkNSUy5FUFNHMzM5NTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJMLkNSUy5TaW1wbGUiOgogICAgICBjcnMgPSBfbGVhZmxldDIuZGVmYXVsdC5DUlMuU2ltcGxlOwogICAgICBicmVhazsKICAgIGNhc2UgIkwuUHJvai5DUlMiOgogICAgICBpZiAoY3JzT3B0aW9ucy5vcHRpb25zICYmIGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpIHsKICAgICAgICBjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzID0gX2xlYWZsZXQyLmRlZmF1bHQuYm91bmRzKGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpOwogICAgICB9CiAgICAgIGlmIChjcnNPcHRpb25zLm9wdGlvbnMgJiYgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uKSB7CiAgICAgICAgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uID0gX2xlYWZsZXQyLmRlZmF1bHQuVHJhbnNmb3JtYXRpb24oY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzBdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMV0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblsyXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzNdKTsKICAgICAgfQogICAgICBjcnMgPSBuZXcgX3Byb2o0bGVhZmxldDIuZGVmYXVsdC5DUlMoY3JzT3B0aW9ucy5jb2RlLCBjcnNPcHRpb25zLnByb2o0ZGVmLCBjcnNPcHRpb25zLm9wdGlvbnMpOwogICAgICBicmVhazsKICAgIGNhc2UgIkwuUHJvai5DUlMuVE1TIjoKICAgICAgaWYgKGNyc09wdGlvbnMub3B0aW9ucyAmJiBjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzKSB7CiAgICAgICAgY3JzT3B0aW9ucy5vcHRpb25zLmJvdW5kcyA9IF9sZWFmbGV0Mi5kZWZhdWx0LmJvdW5kcyhjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzKTsKICAgICAgfQogICAgICBpZiAoY3JzT3B0aW9ucy5vcHRpb25zICYmIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvbikgewogICAgICAgIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvbiA9IF9sZWFmbGV0Mi5kZWZhdWx0LlRyYW5zZm9ybWF0aW9uKGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblswXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzFdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMl0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblszXSk7CiAgICAgIH0KICAgICAgY3JzID0gbmV3IF9wcm9qNGxlYWZsZXQyLmRlZmF1bHQuQ1JTLlRNUyhjcnNPcHRpb25zLmNvZGUsIGNyc09wdGlvbnMucHJvajRkZWYsIGNyc09wdGlvbnMucHJvamVjdGVkQm91bmRzLCBjcnNPcHRpb25zLm9wdGlvbnMpOwogICAgICBicmVhazsKICB9CiAgcmV0dXJuIGNyczsKfQoKCn0seyIuL2dsb2JhbC9sZWFmbGV0Ijo4LCIuL2dsb2JhbC9wcm9qNGxlYWZsZXQiOjl9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OwoKdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKdmFyIERhdGFGcmFtZSA9IGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBEYXRhRnJhbWUoKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGF0YUZyYW1lKTsKCiAgICB0aGlzLmNvbHVtbnMgPSBbXTsKICAgIHRoaXMuY29sbmFtZXMgPSBbXTsKICAgIHRoaXMuY29sc3RyaWN0ID0gW107CgogICAgdGhpcy5lZmZlY3RpdmVMZW5ndGggPSAwOwogICAgdGhpcy5jb2xpbmRpY2VzID0ge307CiAgfQoKICBfY3JlYXRlQ2xhc3MoRGF0YUZyYW1lLCBbewogICAga2V5OiAiX3VwZGF0ZUNhY2hlZFByb3BlcnRpZXMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVDYWNoZWRQcm9wZXJ0aWVzKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgdGhpcy5lZmZlY3RpdmVMZW5ndGggPSAwOwogICAgICB0aGlzLmNvbGluZGljZXMgPSB7fTsKCiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4sIGkpIHsKICAgICAgICBfdGhpcy5lZmZlY3RpdmVMZW5ndGggPSBNYXRoLm1heChfdGhpcy5lZmZlY3RpdmVMZW5ndGgsIGNvbHVtbi5sZW5ndGgpOwogICAgICAgIF90aGlzLmNvbGluZGljZXNbX3RoaXMuY29sbmFtZXNbaV1dID0gaTsKICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAiX2NvbEluZGV4IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfY29sSW5kZXgoY29sbmFtZSkgewogICAgICB2YXIgaW5kZXggPSB0aGlzLmNvbGluZGljZXNbY29sbmFtZV07CiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICJ1bmRlZmluZWQiKSByZXR1cm4gLTE7CiAgICAgIHJldHVybiBpbmRleDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJjb2wiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNvbChuYW1lLCB2YWx1ZXMsIHN0cmljdCkgewogICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29sdW1uIG5hbWUgXCIiICsgbmFtZSArICJcIiIpOwoKICAgICAgdmFyIGluZGV4ID0gdGhpcy5fY29sSW5kZXgobmFtZSk7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO2Vsc2UgcmV0dXJuICgwLCBfdXRpbC5yZWN5Y2xlKSh0aGlzLmNvbHVtbnNbaW5kZXhdLCB0aGlzLmVmZmVjdGl2ZUxlbmd0aCk7CiAgICAgIH0KCiAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICBpbmRleCA9IHRoaXMuY29sbmFtZXMubGVuZ3RoOwogICAgICAgIHRoaXMuY29sbmFtZXMucHVzaChuYW1lKTsKICAgICAgfQogICAgICB0aGlzLmNvbHVtbnNbaW5kZXhdID0gKDAsIF91dGlsLmFzQXJyYXkpKHZhbHVlcyk7CiAgICAgIHRoaXMuY29sc3RyaWN0W2luZGV4XSA9ICEhc3RyaWN0OwoKICAgICAgLy8gVE9ETzogVmFsaWRhdGUgc3RyaWN0bmVzcyAoZW5zdXJlIGxlbmd0aHMgbWF0Y2ggdXAgd2l0aCBvdGhlciBzdHJpY3RzKQoKICAgICAgdGhpcy5fdXBkYXRlQ2FjaGVkUHJvcGVydGllcygpOwoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfSwgewogICAga2V5OiAiY2JpbmQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNiaW5kKG9iaiwgc3RyaWN0KSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgdmFyIGNvbGRhdGEgPSBvYmpbbmFtZV07CiAgICAgICAgX3RoaXMyLmNvbChuYW1lLCBjb2xkYXRhKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH0sIHsKICAgIGtleTogImdldCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KHJvdywgY29sLCBtaXNzaW5nT0spIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICBpZiAocm93ID4gdGhpcy5lZmZlY3RpdmVMZW5ndGgpIHRocm93IG5ldyBFcnJvcigiUm93IGFyZ3VtZW50IHdhcyBvdXQgb2YgYm91bmRzOiAiICsgcm93ICsgIiA+ICIgKyB0aGlzLmVmZmVjdGl2ZUxlbmd0aCk7CgogICAgICB2YXIgY29sSW5kZXggPSAtMTsKICAgICAgaWYgKHR5cGVvZiBjb2wgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdmFyIF9yZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgcm93RGF0YSA9IHt9OwogICAgICAgICAgX3RoaXMzLmNvbG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUsIGkpIHsKICAgICAgICAgICAgcm93RGF0YVtuYW1lXSA9IF90aGlzMy5jb2x1bW5zW2ldW3JvdyAlIF90aGlzMy5jb2x1bW5zW2ldLmxlbmd0aF07CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHY6IHJvd0RhdGEKICAgICAgICAgIH07CiAgICAgICAgfSgpOwoKICAgICAgICBpZiAoKHR5cGVvZiBfcmV0ID09PSAidW5kZWZpbmVkIiA/ICJ1bmRlZmluZWQiIDogX3R5cGVvZihfcmV0KSkgPT09ICJvYmplY3QiKSByZXR1cm4gX3JldC52OwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2wgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29sSW5kZXggPSB0aGlzLl9jb2xJbmRleChjb2wpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2wgPT09ICJudW1iZXIiKSB7CiAgICAgICAgY29sSW5kZXggPSBjb2w7CiAgICAgIH0KICAgICAgaWYgKGNvbEluZGV4IDwgMCB8fCBjb2xJbmRleCA+IHRoaXMuY29sdW1ucy5sZW5ndGgpIHsKICAgICAgICBpZiAobWlzc2luZ09LKSByZXR1cm4gdm9pZCAwO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbHVtbiBpbmRleDogIiArIGNvbCk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbY29sSW5kZXhdW3JvdyAlIHRoaXMuY29sdW1uc1tjb2xJbmRleF0ubGVuZ3RoXTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJucm93IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBucm93KCkgewogICAgICByZXR1cm4gdGhpcy5lZmZlY3RpdmVMZW5ndGg7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRGF0YUZyYW1lOwp9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBEYXRhRnJhbWU7CgoKfSx7Ii4vdXRpbCI6MTV9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCi8vIEluIFJNYXJrZG93bidzIHNlbGYtY29udGFpbmVkIG1vZGUsIHdlIGRvbid0IGhhdmUgYSB3YXkgdG8gY2FycnkgYXJvdW5kIHRoZQovLyBpbWFnZXMgdGhhdCBMZWFmbGV0IG5lZWRzIGJ1dCBkb2Vzbid0IGxvYWQgaW50byB0aGUgcGFnZS4gSW5zdGVhZCwgd2UnbGwgc2V0Ci8vIGRhdGEgVVJJcyBmb3IgdGhlIGRlZmF1bHQgbWFya2VyLCBhbmQgbGV0IGFueSBvdGhlcnMgYmUgbG9hZGVkIHZpYSBDRE4uCmlmICh0eXBlb2YgX2xlYWZsZXQyLmRlZmF1bHQuSWNvbi5EZWZhdWx0LmltYWdlUGF0aCA9PT0gInVuZGVmaW5lZCIpIHsKICBfbGVhZmxldDIuZGVmYXVsdC5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoID0gIi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC92MS4wLjMvaW1hZ2VzLyI7CiAgLy8gZG9uJ3Qga25vdyBob3cgdG8gbWFrZSB0aGlzIGRhdGFVUkkgd29yayBzaW5jZQogIC8vICB3aWxsIGJlIGFwcGVuZGVkIHRvIERlZmF1bC5pbWFnZVBhdGggYWJvdmUKICAvKg0KICBpZiAoTC5Ccm93c2VyLnJldGluYSkgew0KICAgIEwuSWNvbi5EZWZhdWx0LnByb3RvdHlwZS5vcHRpb25zLmljb25VcmwgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFESUFBQUJTQ0FZQUFBQVd5NGZyQUFBUGlFbEVRVlI0MnQxYkNWQ1U1eGttYmFidFpKSk9PK2wwbWhnVDB5UWUwV1haZ3oyNTcwTkI4STZKNlV6YVRCb09SUkZFcnVWR0RoV1VQUkFRUkZGUkVEblZ4Q3RFQlJiMjREQk5FM1dhYWF0cGttbHVvNG0rZmQ5djk5OW9sR1ZCRHUzT1BMaisvL3MrNy9XOTMvZjkvLzYvRXdBNC9UOWczQWxGT1VlZVVHUjJ1TXF6T3lKazJSMngwcXlPQW1ubWtTM1NyQ1ByWkpsSGxzcXpqeXBjczQ5T1gxSmYvL1A3S2hEODg1QTB1MTBteTJvdlFzY3Z5Ykk2d0VGOGl2STdwRm50QVY2cWt3OVBXU0JLMWJFblpSbHRtMldaN1I4aDRGYkkwVkczM0dQZ1hYZ0NBcmErQTRFSW44S1Q0SkgvRmlnb2lKL0lJejZUWmJWVktMTGFuNXUwUUVTcWxrY2tXVzNwMHN5MmJ4REFnWndPMTNURHl0b0IrTlBlOSt6aWxkMkRFRkd1QjcvTnB6RG9kcmlGNTVvMG83WElSWFhvTnhNYWlDU2o5VlUwOUM4RUVOeHlqMEM0dGh0ZXJoMkVWK3ZldXdPcjZzN0R5M3Nzb085M2szbGx6eEJFNlBUZ2tYY01PRjdFSjlLTXRxalI5SkZEUW5OVjliK1FxbHFxRUVDUVo3VEJndTFuWWRYdUlYZ1ZuZVN3WXRjZ1JGYjFRMWlGR1VMTHpSQ3NNOTBHT3JaZ2h4a2lLdnRoZWMwZ3JMcEZseEN1NmNLaDF3NmNIVVNiY3RQaHg4WWxFRWx1NCtOU1ZmTnBCQkFDdHB5R2xic0dtQk9FbFJoTUJEb2ZnazRHb2JPalFYQzVDUlppVUMvVkR0bjRxTHJCSlozQTJjTmcrbkU0UDMxUGdTREJiSW1xNVVOSmVqTVFGcWk3Y0NpY1ozaVpCVEFBUVZvVEJJNERLS0NWR0JESEg2bnJCUmxXeFdyN3NsalZJaGxUSURMVm9Sa1MxZUgvU05JUGd6eXpGUlpWOU5uRysrTHFRY3lvR1FMUWdmRkVJRllwY3VlQXpjNlNTaU1PdFRZZ0g5Q1hyK1dwVGJ4UkJlS2xxbjlVa3Raa1JvQUNaNVBsTzgxWWdmTU00Ulg5RUtBeFRTakNkdlRqRUxQWVcxN2REOHJzZGlCZkVCY2xTWTJQT3hRSUhubElrbnJvRUFKazZVMndwTUxJU0YvYU5RU2hXQVYvdFdsU0VJSzJWcUJOc3IyMDBnUnlHbUxva3lTMThjVGRGdEE3QW5GTmJjeEFBQ0dNclF0RExBanFCVCsxY1ZKQk5zazIrYkJRMXdPY1g1SzB4czEyQThHeXpYUk5hZmdlQVlGYjNtRWtyQkk0SS9tV0dVZU5RSTFseXAyUG9POWo0YURLY0g0RWJlMEU4ZzN4Z3l5bGNjNndnYmltTmpTU29GdFdLMXNUcUxSaDJCTStTT2dJZkRHTEpMOElHM1paalVYL1ZpeXZHWUxGT3dkWm4vbGpZSTd5enNlZTRUamNzVi9JUjNGcVErdGRBeEVuTlNqRnlRZUJFSzdwZ1JWb2RFblZJUGhzTnpxRVlLMFpsdUZzUm5xM1lqSDIyS0p5QTZ6NHlUbVNwWjV6bEg4UlR2V2t0MUNyQjg1UFlVcWp6eDJCdUc2c1B5ZmVlQUE4c2p0d3BoaGlDRlNid1h1YjBTN0lTUGlPQVp2TzRoMDQ4eFNmQk0rY0RwRGllQ1pPZ2dTejZKSGRCdjVGSjNDTjZMUEpSMVFNZ085MjA0aDJhQUxnZER4empscDRrdzhZYUhLeUJTSkpQaWdXYjZ3SFFpUm1ieGtLTDBRRFhraGdEOTRZeEdLc0dza1RRa3ZmeFZubElIQmNCTmZrZWd6aXdCM0hBbkhEdUd5blJYY3AvdXRYWmhyUkhpV001Q1BMamJkd0hWRFlBaEZ0M0o4clR0b1BicGt0U0RyRTRJTlo4aXcxMmtVWUVwUHM0a296ZU9XMEEzRVFJb3ZiWWNmeElUajc5OHZ3eGJmWDRPcjFIOEI0NlJPbzdmd2J2S1k5YnBOenkyaG1pU09PeU1yQkVlMlJUNXgvN3RqSHhDRksybC80WXlCSis5NUhRQUJtaWJLekVKdlJzOVJnRjRGcUU1TWxlR1MzQXVtTE4rNkQ0bFlqZkllT0QvZTVlUk9nN3N6N29FZzd3SFJrNlkzWWkvMk1Kd1Q3YkNTNzVCdkpCdUdzU3ZxSUQxZ2dhSHllYUFNZVFFUmd5YWpCZzNCRzhTZ3hEQXN2SkZ4VU9jQmtnN2QwTWwzWGpmdWhDeXZnNk9maXgxK0FsNnFCNmZwdWVvdHhzY2tGaDVBOTIrUWJ5ZEh3NHZ5bUdKeEVHK3JXaVJMM2dvSldjU3d2d2JQRUNPNWJEY01pUkdObWNoUzRhMUk5a1A2MkRoT005dFBhZDRucEVoYVVkVFBPc1BKK3U3YkpOODVQcGFxSjZZb1Q2eEtjUklsMXBRand4SXVreFhoeUlZNTdOMVN3aDdEeUFTYnJtMzhNU0hkUlVTdGMrLzRHak9VVFYzMmFjYmhsTmpOTzZwV1I3RlBUazZ4WDNsR21LMHlzMHpyaG4wWmh3aDd3SzNpYm5WeWc2d2UzTFFhN1dGUXh5R1NwaXFSYmUvbzhqUFhUZStFSzR4RGpFQ0hPeGRZUlljOCsrVWh5ZmdYSG1hNXcvWjVtSitINjNUM0NoTjNZNk8vZ3VNY3hqOE5HaWNMRGdZeVEzQ0tjbnNVYk1CdW9hN2o0OFpnRCtlcnFkY3pxYnNZVHB1bGozTFN1MlBPQmZDUTU4cG4wRUgxT3dvVGFmd3ZYMStKVjJWbUl4RXdIbEpsQnNka3dMSHkybVpqY2dqSTlrSjRZbmJoNi9YdTRsMDlZZmhQakNzU0pnN2hwSWJibmcvOTJNNU1qbjBrUGNkbEpHRi83SlFKQ1Nyc2dBc2VlSHpvcUwrNGJGblNlNUVKS3pnSHBlYVRzZzN2OXJDcnRZRnoraFNjWmR6QUdZczhIWDg0SDlKbjBLQVluUWZ5dUlRVDRZNW1vMGFraU1oUWVEaDQ0dEVndVhHY0UwaVA4NDVNdnh4ekVqUnMzUVo1VXgzaEN0blV4YnFxNlBSLzhjUmRBY3VTejFZZnpHRWhObTJCZERmamt2dzBMY1RZS29rQ0srb2FGQW9sSWppREZCWWwwMi9vdWpEbVFDMWMrWnh6QytCb0lwMnQzNUhYSFByRG5BL2xJY3VRejZTS09PQW5XVnFzUmJIc2NqaWRETmYwZ1JXRjdDTlgyTTFsM1ZUT1FibXBkNTVnRHFUMDF4RGhrbUJUaUpNaEdzQitpc2RyUGJHZTZ3clUxNVJqSXprUUV5SEIzR3FZYllDQWlTZUh3Q01CbUk3bUFZaXd0NmdyWDdRVDloNWRISGNRL1Avc0tsRW03R1lkMzdsSEdHYUx1dDJ0YmlyRDVpVDZUcmlDdUtzVkpzTHJDd3lXdWloMllqL3VuTUMyVkZsZnNncjVob2R4c1pISUVaVm9Ua1A3ODdBUHc3VFhIWnkvYWMvMjVySjNwU3BQMjR0UnJabnllVzAxMmJidFpiUzlBZWZLWitiNm1NdGpKUzZWNkdQL3pPUjN3Sytwa1FuN2J6SGJKQ0NSRHNxRmxCcHorZGpIQ1Y3YTJ3TVVyL3gweGlNKyt1Z3BycTQ1Ym5GaGJoZE5vRitNS0xPdDMyQzc1U3ZxSWI3eFVPMy9GZHIvOHVNcURMbXNxd1UzVmlwSDJRekEyazNoVHIxMUlDbnFaSE1uN0YrSENGSWZaUVE1SmZEVlV2VzFtenY3MDgvVjMxNkZWL3dGNEplOWhzZ1N2M0dPTVl6NzFKZzZia2V6UzBDTjVOMVdMaFNPdXNzVzJqUmVzcm56TlpYVUZtNVBuVzBubDJDY2lWTFFIZWJIQkpoOVUwZzFTM0dZUUQ0ZVFqSDJRV0gwQzB1dHcxNURYQUVJeWJEMG54b1VzWVBNWm16NE41OUhZRStLMFN6eUMyTW8zYklIdzR6VFQrS3QzM0VTQVgvRlpDTVdvdlV0TUlNenZIUkZLSkE5RytWQUd2SjdJUHNLR0MzSGREWUk0cW53emhKUVptUTVsMkFPRGNNU1diNm1KNmZnV24rSDRic3hiV3pYOXRtdDJsOVhsN2Z6WWNwd0pHaGw1TUk1WEVTb0w4a2FHS0I5WFd3dzh4T29ZSVhCckQzaHZPZ25LOUJiRVlkeXBIc2N0U0JjR1lMYkorRk12YnVwejJBYW5KMDF1QVBMVkphYjg4QjAzSDF4aWRLSDhXQjBUQ0NxMUtORU00WWdSRG03RlJseXMrbThMNkc2Z0pMbVBrcHVxeGhKVTBzdDhKRjhGTWVWK2R3VGlwRkw5ekRsR2V3bUIxd1lkekpoL3FSbGNjbnRIRGNxZXZCQ3Y2TkJaM3hJeitDR1A1eFlUS0lvTUlNWnpvK1VUSUFLM1dSS2dVTFVCK2VnY3JUcy83QTA2WHBRMjBUbGFpK080bW0wREtMdVNBZ1B3a1dncUljT2trQytCT0JSZFZsY0MrY2lMMGtVTkc0am9kZDN2bktNMTN5SEFLLzhVQkc2blRCckJPVWMvcGZEQlJaSjg4Y2c5RHVRYkwxcnp4ZHczeXg2MWV4UGJPVWF6aTRSZDhWcVlNaEJJd3l1bkY1eXo5Vk1DVVY2dnhRK0VDSmNIOHMwNVNsTXk0dDE0NXhpMWpBa2pmSXU3R0lFU3h6WVBTYWNDMUdma2czZmhHYkQ2ZGRNbFZ2dUNRei8wb0hBZktjbFNtaUFBSzBKTjc1emRDL095OUpNS2FuS3lUeEJ2T0dBSkpFYmQ0ZkF2VnJ4bzlVdWt4TWZad2J1NGh3V2lLRExDWENTZlROQVVUYmE5Q3M1eDFTRDRPQndJbTRxak5RT2tLRTF1QkgrYVFrc3NWWm1icVo4VUNMQXZ5UzVCbkxEZjJodmFFNlArTVpRZnBZbmdzdUJkMkExK1c3RXFCVVo0TVVNL0tYQXZNakdiSHZtMjNnQ1hhSTF5VEQ5UG83S2V6V0JKQjhFWHAwQUNEMHMrSjZOblFrR3pKR2RQbEZESEJkSSs1dC9aK2RHYVFDNGJIcHZPZ2crdXpuSmNJR2VyZWlZVXlrSWpzK1dXMjJtckJpOVdMYnFuSng5d2x1Z2tJbEhpZnZCR2NnTE5LTFBRNEVTQStwQ3pJNGpmd3kyQWpmZjhDQWR1V3p5NHJMam5uV0VHcUZkbXBmZE1DS2dhWkVPWmM1cXJ4ZzNuV00yOGNYbW9oaGV0UGNxcXNuNHZlRzAyTWN6RG1XVm1Xcys0d2ptcjE4WXZXRmZMQlZJM2JrOEh1YnhaNXNwVlJaSFR5UXpKc1Nvdm9QSHhoQUtyUWR5S3JGTmNFRC93bzhwbmp1dnpXcmdIYXlKeUlZNWJ6MklUdzF5Y0pwOVA3UjRYOExEQ0hLL0wybDBzRUg2MHRtcmNIenpqUmV0NHRNOWhWY2sreFF6S054bkdMUkRxTytLVVpaN2dxbkhkWlkxbXhvUThRVWZqbFl3STF0YUNCeTVZQktyS2N5bmQ5d1RxTnd1ZkVmaHJxcTE3S28xNndoNEZwUEZLNDVadEtETk9nbnNoWmpEZkFIOU03cjRueVBPTmpFdWEvaFpYamF2OE56VFRKdlRoVEY2VXBwSnRGK0pxd0EyTkUxNVU2ZUZaZEdnc21KdlJ5emlVZUJYSVg3UFQyaHVhelJQK2xLa2dhdnN6ZU0xOGpXMG9WY2ZCcllDcVlvUm5OM2FQR2x3MWlNTTE3YWkxR3Rxdm5kL1EvSDVTbnZ2RjdmMTJsamtjejBwc1VtV0JwU296MExuUmdLcEJ1Z3E2TDhDdXhTa1FkZTZrUGNBc1dxTjdBbzEreXphVWFjZEFzY2tJMGp3RFBKUFU1VEJtYk94aS9VVzY0cFFPcmpjKzUvMVYvZHRKZlJJYnJ3MEtXRlZXVitIdzZHTkRaRTZhSHA3ZTBPVVE1cVRybVk0OHJ3LzRzUldXM29qU3BrMzZJK1d6bzdZLzdoeWwrWkp0WFZJN1dKKzQ1aHJnYWN6MjlBMzJRVElTckNEcGlKTGJ1V3A4T2l1aDhqR1lpb2Y4ZVRIcURFdFZLa0NHbVpWWnF6STlzY3N1U0laa1pYVGZLbllIdDhOTm1MSzNGYVF4cGI5R0p6NWpWY0hNY2xXaHJEK1ZlSGZRc0pMa1dxb2hUR3JscW5GWjlMcnVrU2w5N1lJWHBVNWtWY0hNU3ZES1RwcG5oTm1ZOFdrSlhYY0ZuU01aU1k2ZTNjTzFydUt4VS83K0NHVVNuYm5DdGk0YldqSGJPQXZsR09BcGRQcko5YmVEanRFNWtoRnNhT2FxOGRIek1hVy92Qy9lNktHTVdtNGZsWU1rdTRjTm5WbXBQZWo4dWR0QTFhQnpybGw0N1JHanMvYUcrdlg3NXRVa3lpaGwxbEtWWm5ERnJJdXkrMkFhT3Y5RXZBWDBuWTdST1plRUpxNGFGK2czelB2cUhTdGVqT1l2bHZHdUExRm1OeHRDTTFQMThBY01nakFMdjlNeFlXYVg5V2NCa3RXdXV1OWVGcVBNNG1idkF6YkVFZzVoOXRIcExJT3RQK2c3SGVNbk5ITFZlRy9Ka3ZGN1lXeGMzM2pEcXF5MFpob0VLb3Z6TTFQMERQU2RqdEZ2RzVaVlhMUDB2bjE5ejNLclZUdklIRjNmWUhIZUN2cnVITi9BYmROTjNQTzY5KzE3aUxnempyUnV4OEVsL1N3SU1nME05UDNIRzlIcXNQditoVXJySlhFdmN6aitBQWJSeCtBY1g4OEYwdjFBdkJuS0FubFRHOFJsbjUvNkx1TEhXNS96b3JUK0Qwd2cxcXE4eTV4ZnU4OENTeUNuSDVoM2RXL1pHWHZlOHVPTVpSV1Awbm84Y0lGWTcrWWZzd1VSclQzNlFMMDlmZnNNcHBIWWVnVy9QN0NCV0h2bE1PR0JlNS85anRkalk3Ujh3a1RiK1I5bWVaQTZuMm9KV0FBQUFBQkpSVTVFcmtKZ2dnPT0iOw0KICB9IGVsc2Ugew0KICAgIEwuSWNvbi5EZWZhdWx0LnByb3RvdHlwZS5vcHRpb25zLmljb25VcmwgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCa0FBQUFwQ0FZQUFBREFrNExPQUFBR21rbEVRVlJZdzdWWGVVeVRaeGp2Tm5mRUxGdXlJek9hYmVybU1aRWVRQy9PY2xrTzQ5Q3BPSFhPTEpsL0NBVVJ1WWJRaTNLTGdFaGJyaFoxYUR3bWFvR3FLSUk2b2RBVG1IL3NjREZiZEM3THZGcU9DYytlOTVzMlZHNTBYL0xMbS9mNC9aN25lWS9uZTE4YUFOQ21BcjVFL3haZjF1RE9rVGNHY1dSNmhsOTI0N3RUNVU3WTZTTnZXc0tUNjNQNThxYmZlTEpHOE01cWNnVGtucnZ2cmREYnNUN01sK3R2ODJYNnZWeEpFMzNhUm1nU3lZdGNXVk1xWDk3WXYySnZXMzlVaFJFMkh1eUJMK3QrZ0sxMTE2bHkwNkVlV0ZObEFtSHhsUUUwT01pVjZtUUNTY3VzS1JsaFMzUUxlVkpkbDErMjNoNWRZNEZOQjN0aHJiWWJvcXB0RUZscGhUQzFoU3BKbmJSdnhQNE5XZ3NFNUp5ejg2UU5OaS81cVNVVEd1RmsxZ3U1NHROOXd1SzJ3YzNvK1djMTNSQ21zb0J3RXF6R2Nac3hzdkNTeS85d0pLZjdVV2YxbUVZOEpXZmV3YzY3VVVvRGJEalFDK0ZxSzRRcUxWTUdHUjlkMnd1ckt6cUJrM25xSVQvOXpMeFJSamdaOWJxUWd1YitEZG9lQ0MwM1E4aiswUWhGaEJIUi9lUDNVL3pDbG43VXUraGloSjErYkJOZmZMSXZta3lQMGdwQlpXWVhoS3Vzc0s2bUJ6NUhUNk0xTnFwY3ArbUJDUFhvc1lRZnJla0d2cmpld2Q1OS9HdktDRTdUYksvMDQvWlY1UVpZVldtRHdIMW1GM3hhMlEzcmEzREJDNXZCVDFvUDdQVGo0QzArQ2NMOGM3QzJDdGVqcWh1Q251SVFIYUtIenZjUmZacG55bEZmWHNZSngzcE5Md2hLelJBd0FoRXFHMFNwdXNCSGZBS2t4dzN3NDYyN01QaG9DSDc5OHo3czBabkJKL01FSmJaU2JYUGhFUjJpaDdwMm9rL3pTajJjRUpEZDRDQWUrNVdZbkJDZ1IydXJ1eUV3NnpSb1c2L0RXSi9PZUFQOHBkL0JHdHpPWktwRzhva2UwU1g2R01tUms2R0ZseUFjNTlLMzJPVEVpbklMUkpSY2hhaDhIUXdORDhONDM1WjlaMEZZMUVxdHhVZyswU082UkovbW1YejRWdVMrRHB4WEMzZ1htWndJTDdkQlNINHpLRTUwd0VTZjhxd1ZnclAxRUlsVE81SlA5SWd1MGFleGRoMjhGMWxtQUVHSkdmaDdqRTZFbHlNNVJ3L0ZEY1lKaldoYmVpQllvWU5JcGMyRlQvU0lMaXZwMEYxaXBEV2s0QklFbzJWdW9kRUpVaWZoYmlsdG5OQklYUFVGQ01wdGh0QXlxd3MvQlBsRUYvVmJhSXhFcmR4UHBoc1U3cmNDcDhEb2hDK0d2QklQSlMvdFcyanR2VG1tQWV1Tk84Qk5PWVFlRzhHLzJPekNKM3Erc29ZQjVpNk5oTWFLcjE3RlNhbDdHSUhoZXVWM3VTQ1k4cVlWdUVtMWNPenFkV3I3a3UvUjBCRG9UVCtEVCtvaENNNi9DQ3ZLTEtPNFJJK2RYUGVBdWFNcWtzYUtyWjdMM0ZFNUZJRmJrSWNlZU9aMk9jSE82d0loVGtObzBmZmdqUkd4RXFvZ1hIWVVQSGZXQUMvbEFEcHdHY0xSWTNhZUs0L29SR0NLWWNaWFBWb2VYL2tlbFZZWThkVUdmOFY1RUJSYmdKWFQ1UUlQaFA5ZVBKaTQyOEpLT2lFWWhZWEZCcW91Mkd1aCtwL21FQjEvUmZNdzZyWTdjeGNqVHJuZUkxRnJEeXV6VVNSbTltaXdFSng4RS9nVW1xbHl2SEdrbmVpd0VyUjIxRjN0Tk9LNVRmMHlYYVQrTzdEZ0N2QUxUVUJYZE00WWhDL0lhd1BVKzJQZHVxTXZ1YVI2ZW94U3dVazc1Z2dxc1lKN1ZpY3Nud0dJa1pCU1hLT1V3dzczV0dYeXFQK0oyL2I5YytnaTFZQWcveHB3Y2szZ0p1dWNOcmg1SnZEUHZRcjBXRlhmMHBpeXQ4ZjgvV0kwaFY0cFJ4eGtRWmRKRGZESk5PQW1NMEFnOGp5VDZoejBXR1hXdVA5NFloMmpjZmptWEFHdkhDTXNsUmltREhZdUh1RHN5MlF0SHVJYXZ6bmhiWVVScTVSNTdLcHpCQlJaS1BKaThlUWc0OGg0ajhTRGRvd2lmZElyRVZkVStnYk82UU52UlJ0NFpCdGhVYVpoVW5qbFlPYk5hZ1Yza2VvZXJ1M3JVN3JjdWNlcVUxbUpCeHkrQldaWWxORUJIKzBlSDR2UmlCK09ZeWJVMmhuYmxZbFR2a0hpbk00bTU0WW54U3lhWllTRjZSM2p3Z1A3dWRLTEdJWDZyL2xiTmE5TjZ5NU1GeW5qV0R0ckhkNzVadlRZQVBPLzZSZ0Ywazc2bVFsYTNGR3E3ZE8rY0g4c0tuMFZvN25EbGx3QWhxd0xQa3hySHdXbUhKT28rQUtKNHJhYjVPZ3JNN3JWdThlV2IyUHUwRGg0ZURnWG9PZnZwN1k3UWVxa25SbXZjVEJFeXE5bS9IUVFTQ1N6NkxIcTN6MHl6c055U1JmTVMyNTN3bDJLeVJEYmNaUGNmSktqWm1TRU9qY3h5aStZOGRVT3RzSUVINlIyd055a2RxcmtZSjBSVjkySDBXNThwa2ZRazdjS2V2c0xLMTBQeThTZE1HZlhOWEFUWStwUGJ5SlIvRVQ2bjluSWZ6dE50WllSVjlYbmlRdTlJQTJ2T1ZneTRpcjdHQ0xWbW1kK3pqa0gwZUFGOVBvNks2MXBtQ1hIeFU1ckhNWWQxZnRjM293andSU1ZSekxqS3ZxWkV0eTZjUlVEN2pHcWlPZHU1SEc2TWRIak5jTllHcWZEbTVZUnpMQkJDQ0RsLzJiazhhOGdkYnFjZndFQ3U2MkZnL0hyZ2dBQUFBQkpSVTVFcmtKZ2dnPT0iOw0KICB9DQogICovCn0KCgp9LHsiLi9nbG9iYWwvbGVhZmxldCI6OH1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsLkhUTUxXaWRnZXRzOwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7CmV4cG9ydHMuZGVmYXVsdCA9IGdsb2JhbC5qUXVlcnk7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0se31dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsLkw7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0se31dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsLkwuUHJvajsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5kZWZhdWx0ID0gZ2xvYmFsLlNoaW55OwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCnZhciBfanF1ZXJ5ID0gcmVxdWlyZSgiLi9nbG9iYWwvanF1ZXJ5Iik7Cgp2YXIgX2pxdWVyeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qcXVlcnkpOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKdmFyIF9zaGlueSA9IHJlcXVpcmUoIi4vZ2xvYmFsL3NoaW55Iik7Cgp2YXIgX3NoaW55MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NoaW55KTsKCnZhciBfaHRtbHdpZGdldHMgPSByZXF1aXJlKCIuL2dsb2JhbC9odG1sd2lkZ2V0cyIpOwoKdmFyIF9odG1sd2lkZ2V0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sd2lkZ2V0cyk7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCnZhciBfY3JzX3V0aWxzID0gcmVxdWlyZSgiLi9jcnNfdXRpbHMiKTsKCnZhciBfY29udHJvbFN0b3JlID0gcmVxdWlyZSgiLi9jb250cm9sLXN0b3JlIik7Cgp2YXIgX2NvbnRyb2xTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250cm9sU3RvcmUpOwoKdmFyIF9sYXllck1hbmFnZXIgPSByZXF1aXJlKCIuL2xheWVyLW1hbmFnZXIiKTsKCnZhciBfbGF5ZXJNYW5hZ2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xheWVyTWFuYWdlcik7Cgp2YXIgX21ldGhvZHMgPSByZXF1aXJlKCIuL21ldGhvZHMiKTsKCnZhciBfbWV0aG9kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tZXRob2RzKTsKCnJlcXVpcmUoIi4vZml4dXAtZGVmYXVsdC1pY29uIik7Cgp2YXIgX2RhdGFmcmFtZSA9IHJlcXVpcmUoIi4vZGF0YWZyYW1lIik7Cgp2YXIgX2RhdGFmcmFtZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kYXRhZnJhbWUpOwoKdmFyIF9jbHVzdGVyTGF5ZXJTdG9yZSA9IHJlcXVpcmUoIi4vY2x1c3Rlci1sYXllci1zdG9yZSIpOwoKdmFyIF9jbHVzdGVyTGF5ZXJTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbHVzdGVyTGF5ZXJTdG9yZSk7CgpmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfQoKd2luZG93LkxlYWZsZXRXaWRnZXQgPSB7fTsKd2luZG93LkxlYWZsZXRXaWRnZXQudXRpbHMgPSB7fTsKdmFyIG1ldGhvZHMgPSB3aW5kb3cuTGVhZmxldFdpZGdldC5tZXRob2RzID0gX2pxdWVyeTIuZGVmYXVsdC5leHRlbmQoe30sIF9tZXRob2RzMi5kZWZhdWx0KTsKd2luZG93LkxlYWZsZXRXaWRnZXQuRGF0YUZyYW1lID0gX2RhdGFmcmFtZTIuZGVmYXVsdDsKd2luZG93LkxlYWZsZXRXaWRnZXQuQ2x1c3RlckxheWVyU3RvcmUgPSBfY2x1c3RlckxheWVyU3RvcmUyLmRlZmF1bHQ7CndpbmRvdy5MZWFmbGV0V2lkZ2V0LnV0aWxzLmdldENSUyA9IF9jcnNfdXRpbHMuZ2V0Q1JTOwoKLy8gU2VuZCB1cGRhdGVkIGJvdW5kcyBiYWNrIHRvIGFwcC4gVGFrZXMgYSBsZWFmbGV0IGV2ZW50IG9iamVjdCBhcyBpbnB1dC4KZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1hcCkgewogIHZhciBpZCA9IG1hcC5nZXRDb250YWluZXIoKS5pZDsKICB2YXIgYm91bmRzID0gbWFwLmdldEJvdW5kcygpOwoKICBfc2hpbnkyLmRlZmF1bHQub25JbnB1dENoYW5nZShpZCArICJfYm91bmRzIiwgewogICAgbm9ydGg6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsCiAgICBlYXN0OiBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkubG5nLAogICAgc291dGg6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sYXQsCiAgICB3ZXN0OiBib3VuZHMuZ2V0U291dGhXZXN0KCkubG5nCiAgfSk7CiAgX3NoaW55Mi5kZWZhdWx0Lm9uSW5wdXRDaGFuZ2UoaWQgKyAiX2NlbnRlciIsIHsKICAgIGxuZzogbWFwLmdldENlbnRlcigpLmxuZywKICAgIGxhdDogbWFwLmdldENlbnRlcigpLmxhdAogIH0pOwogIF9zaGlueTIuZGVmYXVsdC5vbklucHV0Q2hhbmdlKGlkICsgIl96b29tIiwgbWFwLmdldFpvb20oKSk7Cn0KCmZ1bmN0aW9uIHByZXZlbnRVbmludGVuZGVkWm9vbU9uU2Nyb2xsKG1hcCkgewogIC8vIFByZXZlbnQgdW53YW50ZWQgc2Nyb2xsIGNhcHR1cmluZy4gU2ltaWxhciBpbiBwdXJwb3NlIHRvCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0NsaWZmQ2xvdWQvTGVhZmxldC5TbGVlcCBidXQgd2l0aCBhCiAgLy8gZGlmZmVyZW50IHNldCBvZiBoZXVyaXN0aWNzLgoKICAvLyBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHdoZW4gYSBtb3VzZXdoZWVsL0RPTU1vdXNlU2Nyb2xsCiAgLy8gZXZlbnQgaXMgc2Vlbiwgd2UgZGlzYWJsZSBzY3JvbGwgd2hlZWwgem9vbWluZyB1bnRpbCB0aGUKICAvLyB1c2VyIG1vdmVzIHRoZWlyIG1vdXNlIGN1cnNvciBvciBjbGlja3Mgb24gdGhlIG1hcC4gVGhpcwogIC8vIGlzIHNsaWdodGx5IHRyaWNraWVyIHRoYW4ganVzdCBsaXN0ZW5pbmcgZm9yIG1vdXNlbW92ZSwKICAvLyBiZWNhdXNlIG1vdXNlbW92ZSBpcyBmaXJlZCB3aGVuIHRoZSBwYWdlIGlzIHNjcm9sbGVkLAogIC8vIGV2ZW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBwaHlzaWNhbGx5IG1vdmUgdGhlIG1vdXNlLiBXZQogIC8vIGhhbmRsZSB0aGlzIGJ5IGV4YW1pbmluZyB0aGUgbW91c2Vtb3ZlIGV2ZW50J3Mgc2NyZWVuWAogIC8vIGFuZCBzY3JlZW5ZIHByb3BlcnRpZXM7IGlmIHRoZXkgY2hhbmdlLCB3ZSBrbm93IGl0J3MgYQogIC8vICJ0cnVlIiBtb3ZlLgoKICAvLyBsYXN0U2NyZWVuIGNhbiBuZXZlciBiZSBudWxsLCBidXQgaXRzIHggYW5kIHkgY2FuLgogIHZhciBsYXN0U2NyZWVuID0geyB4OiBudWxsLCB5OiBudWxsIH07CiAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGRvY3VtZW50KS5vbigibW91c2V3aGVlbCBET01Nb3VzZVNjcm9sbCIsICIqIiwgZnVuY3Rpb24gKGUpIHsKICAgIC8vIERpc2FibGUgem9vbWluZyAodW50aWwgdGhlIG1vdXNlIG1vdmVzIG9yIGNsaWNrKQogICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7CiAgICAvLyBBbnkgbW91c2Vtb3ZlIGV2ZW50cyBhdCB0aGlzIHNjcmVlbiBwb3NpdGlvbiB3aWxsIGJlIGlnbm9yZWQuCiAgICBsYXN0U2NyZWVuID0geyB4OiBlLm9yaWdpbmFsRXZlbnQuc2NyZWVuWCwgeTogZS5vcmlnaW5hbEV2ZW50LnNjcmVlblkgfTsKICB9KTsKICAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoZG9jdW1lbnQpLm9uKCJtb3VzZW1vdmUiLCAiKiIsIGZ1bmN0aW9uIChlKSB7CiAgICAvLyBEaWQgdGhlIG1vdXNlIHJlYWxseSBtb3ZlPwogICAgaWYgKGxhc3RTY3JlZW4ueCAhPT0gbnVsbCAmJiBlLnNjcmVlblggIT09IGxhc3RTY3JlZW4ueCB8fCBlLnNjcmVlblkgIT09IGxhc3RTY3JlZW4ueSkgewogICAgICAvLyBJdCByZWFsbHkgbW92ZWQuIEVuYWJsZSB6b29taW5nLgogICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpOwogICAgICBsYXN0U2NyZWVuID0geyB4OiBudWxsLCB5OiBudWxsIH07CiAgICB9CiAgfSk7CiAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGRvY3VtZW50KS5vbigibW91c2Vkb3duIiwgIi5sZWFmbGV0IiwgZnVuY3Rpb24gKGUpIHsKICAgIC8vIENsaWNraW5nIGFsd2F5cyBlbmFibGVzIHpvb21pbmcuCiAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpOwogICAgbGFzdFNjcmVlbiA9IHsgeDogbnVsbCwgeTogbnVsbCB9OwogIH0pOwp9CgpfaHRtbHdpZGdldHMyLmRlZmF1bHQud2lkZ2V0KHsKCiAgbmFtZTogImxlYWZsZXQiLAogIHR5cGU6ICJvdXRwdXQiLAogIGZhY3Rvcnk6IGZ1bmN0aW9uIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpIHsKCiAgICB2YXIgbWFwID0gbnVsbDsKCiAgICByZXR1cm4gewoKICAgICAgLy8gd2UgbmVlZCB0byBzdG9yZSBvdXIgbWFwIGluIG91ciByZXR1cm5lZCBvYmplY3QuCiAgICAgIGdldE1hcDogZnVuY3Rpb24gZ2V0TWFwKCkgewogICAgICAgIHJldHVybiBtYXA7CiAgICAgIH0sCgogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24gcmVuZGVyVmFsdWUoZGF0YSkgewoKICAgICAgICAvLyBDcmVhdGUgYW4gYXBwcm9wcmlhdGUgQ1JTIE9iamVjdCBpZiBzcGVjaWZpZWQKCiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5vcHRpb25zICYmIGRhdGEub3B0aW9ucy5jcnMpIHsKICAgICAgICAgIGRhdGEub3B0aW9ucy5jcnMgPSAoMCwgX2Nyc191dGlscy5nZXRDUlMpKGRhdGEub3B0aW9ucy5jcnMpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2xlYWZsZXQvcHVsbC8yOTQjZGlzY3Vzc2lvbl9yNzk1ODQ4MTAKICAgICAgICBpZiAobWFwKSB7CiAgICAgICAgICBtYXAucmVtb3ZlKCk7CiAgICAgICAgICBtYXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0oKTsgLy8gdW5kZWZpbmUgbWFwCiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5vcHRpb25zLm1hcEZhY3RvcnkgJiYgdHlwZW9mIGRhdGEub3B0aW9ucy5tYXBGYWN0b3J5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBtYXAgPSBkYXRhLm9wdGlvbnMubWFwRmFjdG9yeShlbCwgZGF0YS5vcHRpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWFwID0gX2xlYWZsZXQyLmRlZmF1bHQubWFwKGVsLCBkYXRhLm9wdGlvbnMpOwogICAgICAgIH0KCiAgICAgICAgcHJldmVudFVuaW50ZW5kZWRab29tT25TY3JvbGwobWFwKTsKCiAgICAgICAgLy8gU3RvcmUgc29tZSBzdGF0ZSBpbiB0aGUgbWFwIG9iamVjdAogICAgICAgIG1hcC5sZWFmbGV0ciA9IHsKICAgICAgICAgIC8vIEhhcyB0aGUgbWFwIGV2ZXIgcmVuZGVyZWQgc3VjY2Vzc2Z1bGx5PwogICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAogICAgICAgICAgLy8gRGF0YSB0byBiZSByZW5kZXJlZCB3aGVuIHJlc2l6ZSBpcyBjYWxsZWQgd2l0aCBhcmVhICE9IDAKICAgICAgICAgIHBlbmRpbmdSZW5kZXJEYXRhOiBudWxsCiAgICAgICAgfTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1hcCBpcyByZW5kZXJlZCBzdGF0aWNhbGx5IChubyBvdXRwdXQgYmluZGluZykKICAgICAgICBpZiAoX2h0bWx3aWRnZXRzMi5kZWZhdWx0LnNoaW55TW9kZSAmJiAvXGJzaGlueS1ib3VuZC1vdXRwdXRcYi8udGVzdChlbC5jbGFzc05hbWUpKSB7CiAgICAgICAgICAoZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgbWFwLmlkID0gZWwuaWQ7CgogICAgICAgICAgICAvLyBTdG9yZSB0aGUgbWFwIG9uIHRoZSBlbGVtZW50IHNvIHdlIGNhbiBmaW5kIGl0IGxhdGVyIGJ5IElECiAgICAgICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShlbCkuZGF0YSgibGVhZmxldC1tYXAiLCBtYXApOwoKICAgICAgICAgICAgLy8gV2hlbiB0aGUgbWFwIGlzIGNsaWNrZWQsIHNlbmQgdGhlIGNvb3JkaW5hdGVzIGJhY2sgdG8gdGhlIGFwcAogICAgICAgICAgICBtYXAub24oImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBfc2hpbnkyLmRlZmF1bHQub25JbnB1dENoYW5nZShtYXAuaWQgKyAiX2NsaWNrIiwgewogICAgICAgICAgICAgICAgbGF0OiBlLmxhdGxuZy5sYXQsCiAgICAgICAgICAgICAgICBsbmc6IGUubGF0bG5nLmxuZywKICAgICAgICAgICAgICAgICIubm9uY2UiOiBNYXRoLnJhbmRvbSgpIC8vIEZvcmNlIHJlYWN0aXZpdHkgaWYgbGF0L2xuZyBoYXNuJ3QgY2hhbmdlZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBncm91cFRpbWVySWQgPSBudWxsOwoKICAgICAgICAgICAgbWFwLm9uKCJtb3ZlZW5kIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICB1cGRhdGVCb3VuZHMoZS50YXJnZXQpOwogICAgICAgICAgICB9KS5vbigibGF5ZXJhZGQgbGF5ZXJyZW1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIC8vIElmIHRoZSBsYXllciB0aGF0J3MgY29taW5nIG9yIGdvaW5nIGlzIGEgZ3JvdXAgd2UgY3JlYXRlZCwgdGVsbAogICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgICAgaWYgKG1hcC5sYXllck1hbmFnZXIuZ2V0R3JvdXBOYW1lRnJvbUxheWVyR3JvdXAoZS5sYXllcikpIHsKICAgICAgICAgICAgICAgIC8vIEJ1dCB0byBhdm9pZCBjaGF0dGluZXNzLCBjb2FsZXNjZSBldmVudHMKICAgICAgICAgICAgICAgIGlmIChncm91cFRpbWVySWQpIHsKICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGdyb3VwVGltZXJJZCk7CiAgICAgICAgICAgICAgICAgIGdyb3VwVGltZXJJZCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBncm91cFRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgZ3JvdXBUaW1lcklkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgX3NoaW55Mi5kZWZhdWx0Lm9uSW5wdXRDaGFuZ2UobWFwLmlkICsgIl9ncm91cHMiLCBtYXAubGF5ZXJNYW5hZ2VyLmdldFZpc2libGVHcm91cHMoKSk7CiAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRvUmVuZGVyVmFsdWUoZGF0YSwgbWFwKTsKICAgICAgfSwKICAgICAgZG9SZW5kZXJWYWx1ZTogZnVuY3Rpb24gZG9SZW5kZXJWYWx1ZShkYXRhLCBtYXApIHsKICAgICAgICAvLyBMZWFmbGV0IGRvZXMgbm90IGJlaGF2ZSB3ZWxsIHdoZW4geW91IHNldCB1cCBhIGJ1bmNoIG9mIGxheWVycyB3aGVuCiAgICAgICAgLy8gdGhlIG1hcCBpcyBub3QgdmlzaWJsZSAod2lkdGgvaGVpZ2h0ID09IDApLiBQb3B1cHMgZ2V0IG1pc2FsaWduZWQKICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGVpciBvd25pbmcgbWFya2VycywgYW5kIHRoZSBmaXRCb3VuZHMgY2FsY3VsYXRpb25zCiAgICAgICAgLy8gYXJlIG9mZi4gVGhlcmVmb3JlIHdlIHdhaXQgdW50aWwgdGhlIG1hcCBpcyBhY3R1YWxseSBzaG93aW5nIHRvCiAgICAgICAgLy8gcmVuZGVyIHRoZSB2YWx1ZSAod2UgcmVseSBvbiB0aGUgcmVzaXplKCkgY2FsbGJhY2sgYmVpbmcgaW52b2tlZAogICAgICAgIC8vIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lKS4KICAgICAgICAvLwogICAgICAgIC8vIFRoZXJlIG1heSBiZSBhbiBpc3N1ZSB3aXRoIGxlYWZsZXRQcm94eSgpIGNhbGxzIGJlaW5nIG1hZGUgd2hpbGUKICAgICAgICAvLyB0aGUgbWFwIGlzIG5vdCBiZWluZyB2aWV3ZWQtLW5vdCBzdXJlIHdoYXQgdGhlIHJpZ2h0IHNvbHV0aW9uIGlzCiAgICAgICAgLy8gdGhlcmUuCiAgICAgICAgaWYgKGVsLm9mZnNldFdpZHRoID09PSAwIHx8IGVsLm9mZnNldEhlaWdodCA9PT0gMCkgewogICAgICAgICAgbWFwLmxlYWZsZXRyLnBlbmRpbmdSZW5kZXJEYXRhID0gZGF0YTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbWFwLmxlYWZsZXRyLnBlbmRpbmdSZW5kZXJEYXRhID0gbnVsbDsKCiAgICAgICAgLy8gTWVyZ2UgZGF0YSBvcHRpb25zIGludG8gZGVmYXVsdHMKICAgICAgICB2YXIgb3B0aW9ucyA9IF9qcXVlcnkyLmRlZmF1bHQuZXh0ZW5kKHsgem9vbVRvTGltaXRzOiAiYWx3YXlzIiB9LCBkYXRhLm9wdGlvbnMpOwoKICAgICAgICBpZiAoIW1hcC5sYXllck1hbmFnZXIpIHsKICAgICAgICAgIG1hcC5jb250cm9scyA9IG5ldyBfY29udHJvbFN0b3JlMi5kZWZhdWx0KG1hcCk7CiAgICAgICAgICBtYXAubGF5ZXJNYW5hZ2VyID0gbmV3IF9sYXllck1hbmFnZXIyLmRlZmF1bHQobWFwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWFwLmNvbnRyb2xzLmNsZWFyKCk7CiAgICAgICAgICBtYXAubGF5ZXJNYW5hZ2VyLmNsZWFyKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXhwbGljaXRWaWV3ID0gZmFsc2U7CiAgICAgICAgaWYgKGRhdGEuc2V0VmlldykgewogICAgICAgICAgZXhwbGljaXRWaWV3ID0gdHJ1ZTsKICAgICAgICAgIG1hcC5zZXRWaWV3LmFwcGx5KG1hcCwgZGF0YS5zZXRWaWV3KTsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuZml0Qm91bmRzKSB7CiAgICAgICAgICBleHBsaWNpdFZpZXcgPSB0cnVlOwogICAgICAgICAgbWV0aG9kcy5maXRCb3VuZHMuYXBwbHkobWFwLCBkYXRhLmZpdEJvdW5kcyk7CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLm9wdGlvbnMuY2VudGVyKSB7CiAgICAgICAgICBleHBsaWNpdFZpZXcgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB6b29tVG9MaW1pdHMgb3B0aW9uIHNheXMgdGhhdCB0aGUgbWFwIHNob3VsZCBiZQogICAgICAgIC8vIHpvb21lZCB0byBtYXAgZWxlbWVudHMuCiAgICAgICAgZnVuY3Rpb24gbmVlZHNab29tKCkgewogICAgICAgICAgcmV0dXJuIG9wdGlvbnMuem9vbVRvTGltaXRzID09PSAiYWx3YXlzIiB8fCBvcHRpb25zLnpvb21Ub0xpbWl0cyA9PT0gImZpcnN0IiAmJiAhbWFwLmxlYWZsZXRyLmhhc1JlbmRlcmVkOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFleHBsaWNpdFZpZXcgJiYgbmVlZHNab29tKCkgJiYgIW1hcC5nZXRab29tKCkpIHsKICAgICAgICAgIGlmIChkYXRhLmxpbWl0cyAmJiAhX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGRhdGEubGltaXRzKSkgewogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdHVyYWwgbGltaXRzIG9mIHdoYXQncyBiZWluZyBkcmF3biBvbiB0aGUgbWFwCiAgICAgICAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoZSBib3VuZGluZyBib3ggaXMgMCwgbGVhZmxldCBnZXRzIGFsbCB3ZWlyZAogICAgICAgICAgICB2YXIgcGFkID0gMC4wMDY7CiAgICAgICAgICAgIGlmIChkYXRhLmxpbWl0cy5sYXRbMF0gPT09IGRhdGEubGltaXRzLmxhdFsxXSkgewogICAgICAgICAgICAgIGRhdGEubGltaXRzLmxhdFswXSA9IGRhdGEubGltaXRzLmxhdFswXSAtIHBhZDsKICAgICAgICAgICAgICBkYXRhLmxpbWl0cy5sYXRbMV0gPSBkYXRhLmxpbWl0cy5sYXRbMV0gKyBwYWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEubGltaXRzLmxuZ1swXSA9PT0gZGF0YS5saW1pdHMubG5nWzFdKSB7CiAgICAgICAgICAgICAgZGF0YS5saW1pdHMubG5nWzBdID0gZGF0YS5saW1pdHMubG5nWzBdIC0gcGFkOwogICAgICAgICAgICAgIGRhdGEubGltaXRzLmxuZ1sxXSA9IGRhdGEubGltaXRzLmxuZ1sxXSArIHBhZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXAuZml0Qm91bmRzKFtbZGF0YS5saW1pdHMubGF0WzBdLCBkYXRhLmxpbWl0cy5sbmdbMF1dLCBbZGF0YS5saW1pdHMubGF0WzFdLCBkYXRhLmxpbWl0cy5sbmdbMV1dXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXAuZml0V29ybGQoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBkYXRhLmNhbGxzICYmIGkgPCBkYXRhLmNhbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY2FsbCA9IGRhdGEuY2FsbHNbaV07CiAgICAgICAgICBpZiAobWV0aG9kc1tjYWxsLm1ldGhvZF0pIG1ldGhvZHNbY2FsbC5tZXRob2RdLmFwcGx5KG1hcCwgY2FsbC5hcmdzKTtlbHNlICgwLCBfdXRpbC5sb2cpKCJVbmtub3duIG1ldGhvZCAiICsgY2FsbC5tZXRob2QpOwogICAgICAgIH0KCiAgICAgICAgbWFwLmxlYWZsZXRyLmhhc1JlbmRlcmVkID0gdHJ1ZTsKCiAgICAgICAgaWYgKF9odG1sd2lkZ2V0czIuZGVmYXVsdC5zaGlueU1vZGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB1cGRhdGVCb3VuZHMobWFwKTsKICAgICAgICAgIH0sIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbiByZXNpemUod2lkdGgsIGhlaWdodCkgewogICAgICAgIGlmIChtYXApIHsKICAgICAgICAgIG1hcC5pbnZhbGlkYXRlU2l6ZSgpOwogICAgICAgICAgaWYgKG1hcC5sZWFmbGV0ci5wZW5kaW5nUmVuZGVyRGF0YSkgewogICAgICAgICAgICB0aGlzLmRvUmVuZGVyVmFsdWUobWFwLmxlYWZsZXRyLnBlbmRpbmdSZW5kZXJEYXRhLCBtYXApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKaWYgKF9odG1sd2lkZ2V0czIuZGVmYXVsdC5zaGlueU1vZGUpIHsKICBfc2hpbnkyLmRlZmF1bHQuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoImxlYWZsZXQtY2FsbHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgdmFyIGlkID0gZGF0YS5pZDsKICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIHZhciBtYXAgPSBlbCA/ICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShlbCkuZGF0YSgibGVhZmxldC1tYXAiKSA6IG51bGw7CiAgICBpZiAoIW1hcCkgewogICAgICAoMCwgX3V0aWwubG9nKSgiQ291bGRuJ3QgZmluZCBtYXAgd2l0aCBpZCAiICsgaWQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmNhbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjYWxsID0gZGF0YS5jYWxsc1tpXTsKICAgICAgaWYgKGNhbGwuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgX3NoaW55Mi5kZWZhdWx0LnJlbmRlckRlcGVuZGVuY2llcyhjYWxsLmRlcGVuZGVuY2llcyk7CiAgICAgIH0KICAgICAgaWYgKG1ldGhvZHNbY2FsbC5tZXRob2RdKSBtZXRob2RzW2NhbGwubWV0aG9kXS5hcHBseShtYXAsIGNhbGwuYXJncyk7ZWxzZSAoMCwgX3V0aWwubG9nKSgiVW5rbm93biBtZXRob2QgIiArIGNhbGwubWV0aG9kKTsKICAgIH0KICB9KTsKfQoKCn0seyIuL2NsdXN0ZXItbGF5ZXItc3RvcmUiOjEsIi4vY29udHJvbC1zdG9yZSI6MiwiLi9jcnNfdXRpbHMiOjMsIi4vZGF0YWZyYW1lIjo0LCIuL2ZpeHVwLWRlZmF1bHQtaWNvbiI6NSwiLi9nbG9iYWwvaHRtbHdpZGdldHMiOjYsIi4vZ2xvYmFsL2pxdWVyeSI6NywiLi9nbG9iYWwvbGVhZmxldCI6OCwiLi9nbG9iYWwvc2hpbnkiOjEwLCIuL2xheWVyLW1hbmFnZXIiOjEyLCIuL21ldGhvZHMiOjEzLCIuL3V0aWwiOjE1fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKdmFyIF9qcXVlcnkgPSByZXF1aXJlKCIuL2dsb2JhbC9qcXVlcnkiKTsKCnZhciBfanF1ZXJ5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pxdWVyeSk7Cgp2YXIgX2xlYWZsZXQgPSByZXF1aXJlKCIuL2dsb2JhbC9sZWFmbGV0Iik7Cgp2YXIgX2xlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGVhZmxldCk7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCnZhciBMYXllck1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gTGF5ZXJNYW5hZ2VyKG1hcCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExheWVyTWFuYWdlcik7CgogICAgdGhpcy5fbWFwID0gbWFwOwoKICAgIC8vIEJFR0lOIGxheWVyIGluZGljZXMKCiAgICAvLyB7PGdyb3VwbmFtZT46IHs8c3RhbXA+OiBsYXllcn19CiAgICB0aGlzLl9ieUdyb3VwID0ge307CiAgICAvLyB7PGNhdGVnb3J5TmFtZT46IHs8c3RhbXA+OiBsYXllcn19CiAgICB0aGlzLl9ieUNhdGVnb3J5ID0ge307CiAgICAvLyB7PGNhdGVnb3J5TmFtZV9sYXllcklkPjogbGF5ZXJ9CiAgICB0aGlzLl9ieUxheWVySWQgPSB7fTsKICAgIC8vIHs8c3RhbXA+OiB7CiAgICAvLyAgICAgICAgICAgICAiZ3JvdXAiOiA8Z3JvdXBuYW1lPiwKICAgIC8vICAgICAgICAgICAgICJsYXllcklkIjogPGxheWVySWQ+LAogICAgLy8gICAgICAgICAgICAgImNhdGVnb3J5IjogPGNhdGVnb3J5PiwKICAgIC8vICAgICAgICAgICAgICJjb250YWluZXIiOiA8Y29udGFpbmVyPgogICAgLy8gICAgICAgICAgIH0KICAgIC8vIH0KICAgIHRoaXMuX2J5U3RhbXAgPSB7fTsKICAgIC8vIHs8Y3Jvc3N0YWxrR3JvdXBOYW1lPjogezxrZXk+OiBbPHN0YW1wPiwgPHN0YW1wPiwgLi4uXSwgLi4ufX0KICAgIHRoaXMuX2J5Q3Jvc3N0YWxrR3JvdXAgPSB7fTsKCiAgICAvLyBFTkQgbGF5ZXIgaW5kaWNlcwoKICAgIC8vIHs8Y2F0ZWdvcnlOYW1lPjogTC5sYXllckdyb3VwfQogICAgdGhpcy5fY2F0ZWdvcnlDb250YWluZXJzID0ge307CiAgICAvLyB7PGdyb3VwTmFtZT46IEwubGF5ZXJHcm91cH0KICAgIHRoaXMuX2dyb3VwQ29udGFpbmVycyA9IHt9OwogIH0KCiAgX2NyZWF0ZUNsYXNzKExheWVyTWFuYWdlciwgW3sKICAgIGtleTogImFkZExheWVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRMYXllcihsYXllciwgY2F0ZWdvcnksIGxheWVySWQsIGdyb3VwLCBjdEdyb3VwLCBjdEtleSkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgLy8gV2FzIGEgZ3JvdXAgcHJvdmlkZWQ/CiAgICAgIHZhciBoYXNJZCA9IHR5cGVvZiBsYXllcklkID09PSAic3RyaW5nIjsKICAgICAgdmFyIGdyb3VwZWQgPSB0eXBlb2YgZ3JvdXAgPT09ICJzdHJpbmciOwoKICAgICAgdmFyIHN0YW1wID0gX2xlYWZsZXQyLmRlZmF1bHQuVXRpbC5zdGFtcChsYXllcik7CgogICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGRlZmF1bHQgbGF5ZXIgZ3JvdXAgdG8gYWRkIHRoZSBsYXllciB0by4KICAgICAgLy8gV2UgbWF5IG92ZXJ3cml0ZSB0aGlzIGxldCBiZWZvcmUgdXNpbmcgaXQgKGkuZS4gaWYgYSBncm91cCBpcyBhc3NpZ25lZCkuCiAgICAgIC8vIFRoaXMgb25lIGxpbmVyIGNyZWF0ZXMgdGhlIF9jYXRlZ29yeUNvbnRhaW5lcnNbY2F0ZWdvcnldIGVudHJ5IGlmIGl0CiAgICAgIC8vIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NhdGVnb3J5Q29udGFpbmVyc1tjYXRlZ29yeV0gPSB0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnNbY2F0ZWdvcnldIHx8IF9sZWFmbGV0Mi5kZWZhdWx0LmxheWVyR3JvdXAoKS5hZGRUbyh0aGlzLl9tYXApOwoKICAgICAgdmFyIG9sZExheWVyID0gbnVsbDsKICAgICAgaWYgKGhhc0lkKSB7CiAgICAgICAgLy8gRmlyc3QsIHJlbW92ZSBhbnkgbGF5ZXIgd2l0aCB0aGUgc2FtZSBjYXRlZ29yeSBhbmQgbGF5ZXJJZAogICAgICAgIHZhciBwcmVmaXhlZExheWVySWQgPSB0aGlzLl9sYXllcklkS2V5KGNhdGVnb3J5LCBsYXllcklkKTsKICAgICAgICBvbGRMYXllciA9IHRoaXMuX2J5TGF5ZXJJZFtwcmVmaXhlZExheWVySWRdOwogICAgICAgIGlmIChvbGRMYXllcikgewogICAgICAgICAgdGhpcy5fcmVtb3ZlTGF5ZXIob2xkTGF5ZXIpOwogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIGxheWVySWQgaW5kZXgKICAgICAgICB0aGlzLl9ieUxheWVySWRbcHJlZml4ZWRMYXllcklkXSA9IGxheWVyOwogICAgICB9CgogICAgICAvLyBVcGRhdGUgZ3JvdXAgaW5kZXgKICAgICAgaWYgKGdyb3VwZWQpIHsKICAgICAgICB0aGlzLl9ieUdyb3VwW2dyb3VwXSA9IHRoaXMuX2J5R3JvdXBbZ3JvdXBdIHx8IHt9OwogICAgICAgIHRoaXMuX2J5R3JvdXBbZ3JvdXBdW3N0YW1wXSA9IGxheWVyOwoKICAgICAgICAvLyBTaW5jZSBhIGdyb3VwIGlzIGFzc2lnbmVkLCBkb24ndCBhZGQgdGhlIGxheWVyIHRvIHRoZSBjYXRlZ29yeSdzIGxheWVyCiAgICAgICAgLy8gZ3JvdXA7IGluc3RlYWQsIHVzZSB0aGUgZ3JvdXAncyBsYXllciBncm91cC4KICAgICAgICAvLyBUaGlzIG9uZSBsaW5lciBjcmVhdGVzIHRoZSBfZ3JvdXBDb250YWluZXJzW2dyb3VwXSBlbnRyeSBpZiBpdCBkb2Vzbid0CiAgICAgICAgLy8gYWxyZWFkeSBleGlzdC4KICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldExheWVyR3JvdXAoZ3JvdXAsIHRydWUpOwogICAgICB9CgogICAgICAvLyBVcGRhdGUgY2F0ZWdvcnkgaW5kZXgKICAgICAgdGhpcy5fYnlDYXRlZ29yeVtjYXRlZ29yeV0gPSB0aGlzLl9ieUNhdGVnb3J5W2NhdGVnb3J5XSB8fCB7fTsKICAgICAgdGhpcy5fYnlDYXRlZ29yeVtjYXRlZ29yeV1bc3RhbXBdID0gbGF5ZXI7CgogICAgICAvLyBVcGRhdGUgc3RhbXAgaW5kZXgKICAgICAgdmFyIGxheWVySW5mbyA9IHRoaXMuX2J5U3RhbXBbc3RhbXBdID0gewogICAgICAgIGxheWVyOiBsYXllciwKICAgICAgICBncm91cDogZ3JvdXAsCiAgICAgICAgY3RHcm91cDogY3RHcm91cCwKICAgICAgICBjdEtleTogY3RLZXksCiAgICAgICAgbGF5ZXJJZDogbGF5ZXJJZCwKICAgICAgICBjYXRlZ29yeTogY2F0ZWdvcnksCiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsCiAgICAgICAgaGlkZGVuOiBmYWxzZQogICAgICB9OwoKICAgICAgLy8gVXBkYXRlIGNyb3NzdGFsayBncm91cCBpbmRleAogICAgICBpZiAoY3RHcm91cCkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAobGF5ZXIuc2V0U3R5bGUpIHsKICAgICAgICAgICAgLy8gTmVlZCB0byBzYXZlIHRoaXMgaW5mbyBzbyB3ZSBrbm93IHdoYXQgdG8gc2V0IG9wYWNpdHkgdG8gbGF0ZXIKICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5vcmlnT3BhY2l0eSA9IHR5cGVvZiBsYXllci5vcHRpb25zLm9wYWNpdHkgIT09ICJ1bmRlZmluZWQiID8gbGF5ZXIub3B0aW9ucy5vcGFjaXR5IDogMC41OwogICAgICAgICAgICBsYXllci5vcHRpb25zLm9yaWdGaWxsT3BhY2l0eSA9IHR5cGVvZiBsYXllci5vcHRpb25zLmZpbGxPcGFjaXR5ICE9PSAidW5kZWZpbmVkIiA/IGxheWVyLm9wdGlvbnMuZmlsbE9wYWNpdHkgOiAwLjI7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGN0ZyA9IF90aGlzLl9ieUNyb3NzdGFsa0dyb3VwW2N0R3JvdXBdOwogICAgICAgICAgaWYgKCFjdGcpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBjdGcgPSBfdGhpcy5fYnlDcm9zc3RhbGtHcm91cFtjdEdyb3VwXSA9IHt9OwogICAgICAgICAgICAgIHZhciBjcm9zc3RhbGsgPSBnbG9iYWwuY3Jvc3N0YWxrOwoKICAgICAgICAgICAgICB2YXIgaGFuZGxlRmlsdGVyID0gZnVuY3Rpb24gaGFuZGxlRmlsdGVyKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZS52YWx1ZSkgewogICAgICAgICAgICAgICAgICB2YXIgZ3JvdXBLZXlzID0gT2JqZWN0LmtleXMoY3RnKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cEtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBLZXlzW2ldOwogICAgICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJJbmZvID0gX3RoaXMuX2J5U3RhbXBbY3RnW2tleV1dOwogICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZXRWaXNpYmlsaXR5KF9sYXllckluZm8sIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRLZXlzID0ge307CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlLnZhbHVlLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5c1tlLnZhbHVlW19pXV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBLZXlzID0gT2JqZWN0LmtleXMoY3RnKTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgX2dyb3VwS2V5cy5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9rZXkgPSBfZ3JvdXBLZXlzW19pMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIF9sYXllckluZm8yID0gX3RoaXMuX2J5U3RhbXBbY3RnW19rZXldXTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2V0VmlzaWJpbGl0eShfbGF5ZXJJbmZvMiwgc2VsZWN0ZWRLZXlzW19ncm91cEtleXNbX2kyXV0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB2YXIgZmlsdGVySGFuZGxlID0gbmV3IGNyb3NzdGFsay5GaWx0ZXJIYW5kbGUoY3RHcm91cCk7CiAgICAgICAgICAgICAgZmlsdGVySGFuZGxlLm9uKCJjaGFuZ2UiLCBoYW5kbGVGaWx0ZXIpOwoKICAgICAgICAgICAgICB2YXIgaGFuZGxlU2VsZWN0aW9uID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZS52YWx1ZSB8fCAhZS52YWx1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKGN0Zyk7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGdyb3VwS2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgX2xheWVySW5mbzMgPSBfdGhpcy5fYnlTdGFtcFtjdGdba2V5XV07CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldE9wYWNpdHkoX2xheWVySW5mbzMsIDEuMCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEtleXMgPSB7fTsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgZS52YWx1ZS5sZW5ndGg7IF9pMysrKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXlzW2UudmFsdWVbX2kzXV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHZhciBfZ3JvdXBLZXlzMiA9IE9iamVjdC5rZXlzKGN0Zyk7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IF9ncm91cEtleXMyLmxlbmd0aDsgX2k0KyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2tleTIgPSBfZ3JvdXBLZXlzMltfaTRdOwogICAgICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJJbmZvNCA9IF90aGlzLl9ieVN0YW1wW2N0Z1tfa2V5Ml1dOwogICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZXRPcGFjaXR5KF9sYXllckluZm80LCBzZWxlY3RlZEtleXNbX2dyb3VwS2V5czJbX2k0XV0gPyAxLjAgOiAwLjIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB2YXIgc2VsSGFuZGxlID0gbmV3IGNyb3NzdGFsay5TZWxlY3Rpb25IYW5kbGUoY3RHcm91cCk7CiAgICAgICAgICAgICAgc2VsSGFuZGxlLm9uKCJjaGFuZ2UiLCBoYW5kbGVTZWxlY3Rpb24pOwoKICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGhhbmRsZUZpbHRlcih7IHZhbHVlOiBmaWx0ZXJIYW5kbGUuZmlsdGVyZWRLZXlzIH0pOwogICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uKHsgdmFsdWU6IHNlbEhhbmRsZS52YWx1ZSB9KTsKICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICghY3RnW2N0S2V5XSkgY3RnW2N0S2V5XSA9IFtdOwogICAgICAgICAgY3RnW2N0S2V5XS5wdXNoKHN0YW1wKTsKICAgICAgICB9KSgpOwogICAgICB9CgogICAgICAvLyBBZGQgdG8gY29udGFpbmVyCiAgICAgIGlmICghbGF5ZXJJbmZvLmhpZGRlbikgY29udGFpbmVyLmFkZExheWVyKGxheWVyKTsKCiAgICAgIHJldHVybiBvbGRMYXllcjsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJicnVzaCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gYnJ1c2goYm91bmRzLCBleHRyYUluZm8pIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovCgogICAgICAvLyBGb3IgZWFjaCBDcm9zc3RhbGsgZ3JvdXAuLi4KICAgICAgT2JqZWN0LmtleXModGhpcy5fYnlDcm9zc3RhbGtHcm91cCkuZm9yRWFjaChmdW5jdGlvbiAoY3RHcm91cE5hbWUpIHsKICAgICAgICB2YXIgY3RnID0gX3RoaXMyLl9ieUNyb3NzdGFsa0dyb3VwW2N0R3JvdXBOYW1lXTsKICAgICAgICB2YXIgc2VsZWN0aW9uID0gW107CiAgICAgICAgLy8gLi4uaXRlcmF0ZSBvdmVyIGVhY2ggQ3Jvc3N0YWxrIGtleSAoZWFjaCBvZiB3aGljaCBtYXkgaGF2ZSBtdWx0aXBsZQogICAgICAgIC8vIGxheWVycykuLi4KICAgICAgICBPYmplY3Qua2V5cyhjdGcpLmZvckVhY2goZnVuY3Rpb24gKGN0S2V5KSB7CiAgICAgICAgICAvLyAuLi5hbmQgZm9yIGVhY2ggbGF5ZXIuLi4KICAgICAgICAgIGN0Z1tjdEtleV0uZm9yRWFjaChmdW5jdGlvbiAoc3RhbXApIHsKICAgICAgICAgICAgdmFyIGxheWVySW5mbyA9IF90aGlzMi5fYnlTdGFtcFtzdGFtcF07CiAgICAgICAgICAgIC8vIC4uLmlmIGl0J3Mgc29tZXRoaW5nIHdpdGggYSBwb2ludC4uLgogICAgICAgICAgICBpZiAobGF5ZXJJbmZvLmxheWVyLmdldExhdExuZykgewogICAgICAgICAgICAgIC8vIC4uLiBhbmQgaXQncyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBib3VuZHMuLi4KICAgICAgICAgICAgICAvLyBUT0RPOiBVc2UgcGl4ZWwgY29udGFpbm1lbnQsIG5vdCBsYXQvbG5nIGNvbnRhaW5tZW50CiAgICAgICAgICAgICAgaWYgKGJvdW5kcy5jb250YWlucyhsYXllckluZm8ubGF5ZXIuZ2V0TGF0TG5nKCkpKSB7CiAgICAgICAgICAgICAgICAvLyAuLi5hZGQgdGhlIGtleSB0byB0aGUgc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgc2VsZWN0aW9uLnB1c2goY3RLZXkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgbmV3IGdsb2JhbC5jcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKGN0R3JvdXBOYW1lKS5zZXQoc2VsZWN0aW9uLCBleHRyYUluZm8pOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJ1bmJydXNoIiwKICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJydXNoKGV4dHJhSW5mbykgewogICAgICBPYmplY3Qua2V5cyh0aGlzLl9ieUNyb3NzdGFsa0dyb3VwKS5mb3JFYWNoKGZ1bmN0aW9uIChjdEdyb3VwTmFtZSkgewogICAgICAgIG5ldyBnbG9iYWwuY3Jvc3N0YWxrLlNlbGVjdGlvbkhhbmRsZShjdEdyb3VwTmFtZSkuY2xlYXIoZXh0cmFJbmZvKTsKICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAiX3NldFZpc2liaWxpdHkiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRWaXNpYmlsaXR5KGxheWVySW5mbywgdmlzaWJsZSkgewogICAgICBpZiAobGF5ZXJJbmZvLmhpZGRlbiBeIHZpc2libGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAodmlzaWJsZSkgewogICAgICAgIGxheWVySW5mby5jb250YWluZXIuYWRkTGF5ZXIobGF5ZXJJbmZvLmxheWVyKTsKICAgICAgICBsYXllckluZm8uaGlkZGVuID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGF5ZXJJbmZvLmNvbnRhaW5lci5yZW1vdmVMYXllcihsYXllckluZm8ubGF5ZXIpOwogICAgICAgIGxheWVySW5mby5oaWRkZW4gPSB0cnVlOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiX3NldE9wYWNpdHkiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRPcGFjaXR5KGxheWVySW5mbywgb3BhY2l0eSkgewogICAgICBpZiAobGF5ZXJJbmZvLmxheWVyLnNldE9wYWNpdHkpIHsKICAgICAgICBsYXllckluZm8ubGF5ZXIuc2V0T3BhY2l0eShvcGFjaXR5KTsKICAgICAgfSBlbHNlIGlmIChsYXllckluZm8ubGF5ZXIuc2V0U3R5bGUpIHsKICAgICAgICBsYXllckluZm8ubGF5ZXIuc2V0U3R5bGUoewogICAgICAgICAgb3BhY2l0eTogb3BhY2l0eSAqIGxheWVySW5mby5sYXllci5vcHRpb25zLm9yaWdPcGFjaXR5LAogICAgICAgICAgZmlsbE9wYWNpdHk6IG9wYWNpdHkgKiBsYXllckluZm8ubGF5ZXIub3B0aW9ucy5vcmlnRmlsbE9wYWNpdHkKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogImdldExheWVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXllcihjYXRlZ29yeSwgbGF5ZXJJZCkgewogICAgICByZXR1cm4gdGhpcy5fYnlMYXllcklkW3RoaXMuX2xheWVySWRLZXkoY2F0ZWdvcnksIGxheWVySWQpXTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJyZW1vdmVMYXllciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlTGF5ZXIoY2F0ZWdvcnksIGxheWVySWRzKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgICAgLy8gRmluZCBsYXllciBpbmZvCiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkobGF5ZXJJZHMpLCBmdW5jdGlvbiAoaSwgbGF5ZXJJZCkgewogICAgICAgIHZhciBsYXllciA9IF90aGlzMy5fYnlMYXllcklkW190aGlzMy5fbGF5ZXJJZEtleShjYXRlZ29yeSwgbGF5ZXJJZCldOwogICAgICAgIGlmIChsYXllcikgewogICAgICAgICAgX3RoaXMzLl9yZW1vdmVMYXllcihsYXllcik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJjbGVhckxheWVycyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJMYXllcnMoY2F0ZWdvcnkpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CgogICAgICAvLyBGaW5kIGFsbCBsYXllcnMgaW4gX2J5Q2F0ZWdvcnlbY2F0ZWdvcnldCiAgICAgIHZhciBjYXRUYWJsZSA9IHRoaXMuX2J5Q2F0ZWdvcnlbY2F0ZWdvcnldOwogICAgICBpZiAoIWNhdFRhYmxlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBSZW1vdmUgYWxsIGxheWVycy4gTWFrZSBjb3B5IG9mIGtleXMgdG8gYXZvaWQgbXV0YXRpbmcgdGhlIGNvbGxlY3Rpb24KICAgICAgLy8gYmVoaW5kIHRoZSBpdGVyYXRvciB5b3UncmUgYWNjZXNzaW5nLgogICAgICB2YXIgc3RhbXBzID0gW107CiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaChjYXRUYWJsZSwgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgICBzdGFtcHMucHVzaChrKTsKICAgICAgfSk7CiAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaChzdGFtcHMsIGZ1bmN0aW9uIChpLCBzdGFtcCkgewogICAgICAgIF90aGlzNC5fcmVtb3ZlTGF5ZXIoc3RhbXApOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRMYXllckdyb3VwIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXllckdyb3VwKGdyb3VwLCBlbnN1cmVFeGlzdHMpIHsKICAgICAgdmFyIGcgPSB0aGlzLl9ncm91cENvbnRhaW5lcnNbZ3JvdXBdOwogICAgICBpZiAoZW5zdXJlRXhpc3RzICYmICFnKSB7CiAgICAgICAgdGhpcy5fYnlHcm91cFtncm91cF0gPSB0aGlzLl9ieUdyb3VwW2dyb3VwXSB8fCB7fTsKICAgICAgICBnID0gdGhpcy5fZ3JvdXBDb250YWluZXJzW2dyb3VwXSA9IF9sZWFmbGV0Mi5kZWZhdWx0LmZlYXR1cmVHcm91cCgpOwogICAgICAgIGcuZ3JvdXBuYW1lID0gZ3JvdXA7CiAgICAgICAgZy5hZGRUbyh0aGlzLl9tYXApOwogICAgICB9CiAgICAgIHJldHVybiBnOwogICAgfQogIH0sIHsKICAgIGtleTogImdldEdyb3VwTmFtZUZyb21MYXllckdyb3VwIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRHcm91cE5hbWVGcm9tTGF5ZXJHcm91cChsYXllckdyb3VwKSB7CiAgICAgIHJldHVybiBsYXllckdyb3VwLmdyb3VwbmFtZTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRWaXNpYmxlR3JvdXBzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaXNpYmxlR3JvdXBzKCkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKCiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKHRoaXMuX2dyb3VwQ29udGFpbmVycywgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgICBpZiAoX3RoaXM1Ll9tYXAuaGFzTGF5ZXIodikpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGspOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0QWxsR3JvdXBOYW1lcyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWxsR3JvdXBOYW1lcygpIHsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2godGhpcy5fZ3JvdXBDb250YWluZXJzLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgIHJlc3VsdC5wdXNoKGspOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJjbGVhckdyb3VwIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhckdyb3VwKGdyb3VwKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwoKICAgICAgLy8gRmluZCBhbGwgbGF5ZXJzIGluIF9ieUdyb3VwW2dyb3VwXQogICAgICB2YXIgZ3JvdXBUYWJsZSA9IHRoaXMuX2J5R3JvdXBbZ3JvdXBdOwogICAgICBpZiAoIWdyb3VwVGFibGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIFJlbW92ZSBhbGwgbGF5ZXJzLiBNYWtlIGNvcHkgb2Yga2V5cyB0byBhdm9pZCBtdXRhdGluZyB0aGUgY29sbGVjdGlvbgogICAgICAvLyBiZWhpbmQgdGhlIGl0ZXJhdG9yIHlvdSdyZSBhY2Nlc3NpbmcuCiAgICAgIHZhciBzdGFtcHMgPSBbXTsKICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKGdyb3VwVGFibGUsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgc3RhbXBzLnB1c2goayk7CiAgICAgIH0pOwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goc3RhbXBzLCBmdW5jdGlvbiAoaSwgc3RhbXApIHsKICAgICAgICBfdGhpczYuX3JlbW92ZUxheWVyKHN0YW1wKTsKICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAiY2xlYXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICBmdW5jdGlvbiBjbGVhckxheWVyR3JvdXAoa2V5LCBsYXllckdyb3VwKSB7CiAgICAgICAgbGF5ZXJHcm91cC5jbGVhckxheWVycygpOwogICAgICB9CiAgICAgIC8vIENsZWFyIGFsbCBpbmRpY2VzIGFuZCBsYXllckdyb3VwcwogICAgICB0aGlzLl9ieUdyb3VwID0ge307CiAgICAgIHRoaXMuX2J5Q2F0ZWdvcnkgPSB7fTsKICAgICAgdGhpcy5fYnlMYXllcklkID0ge307CiAgICAgIHRoaXMuX2J5U3RhbXAgPSB7fTsKICAgICAgdGhpcy5fYnlDcm9zc3RhbGtHcm91cCA9IHt9OwogICAgICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2godGhpcy5fY2F0ZWdvcnlDb250YWluZXJzLCBjbGVhckxheWVyR3JvdXApOwogICAgICB0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnMgPSB7fTsKICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKHRoaXMuX2dyb3VwQ29udGFpbmVycywgY2xlYXJMYXllckdyb3VwKTsKICAgICAgdGhpcy5fZ3JvdXBDb250YWluZXJzID0ge307CiAgICB9CiAgfSwgewogICAga2V5OiAiX3JlbW92ZUxheWVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVtb3ZlTGF5ZXIobGF5ZXIpIHsKICAgICAgdmFyIHN0YW1wID0gdm9pZCAwOwogICAgICBpZiAodHlwZW9mIGxheWVyID09PSAic3RyaW5nIikgewogICAgICAgIHN0YW1wID0gbGF5ZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhbXAgPSBfbGVhZmxldDIuZGVmYXVsdC5VdGlsLnN0YW1wKGxheWVyKTsKICAgICAgfQoKICAgICAgdmFyIGxheWVySW5mbyA9IHRoaXMuX2J5U3RhbXBbc3RhbXBdOwogICAgICBpZiAoIWxheWVySW5mbykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgbGF5ZXJJbmZvLmNvbnRhaW5lci5yZW1vdmVMYXllcihzdGFtcCk7CiAgICAgIGlmICh0eXBlb2YgbGF5ZXJJbmZvLmdyb3VwID09PSAic3RyaW5nIikgewogICAgICAgIGRlbGV0ZSB0aGlzLl9ieUdyb3VwW2xheWVySW5mby5ncm91cF1bc3RhbXBdOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgbGF5ZXJJbmZvLmxheWVySWQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZGVsZXRlIHRoaXMuX2J5TGF5ZXJJZFt0aGlzLl9sYXllcklkS2V5KGxheWVySW5mby5jYXRlZ29yeSwgbGF5ZXJJbmZvLmxheWVySWQpXTsKICAgICAgfQogICAgICBkZWxldGUgdGhpcy5fYnlDYXRlZ29yeVtsYXllckluZm8uY2F0ZWdvcnldW3N0YW1wXTsKICAgICAgZGVsZXRlIHRoaXMuX2J5U3RhbXBbc3RhbXBdOwogICAgICBpZiAobGF5ZXJJbmZvLmN0R3JvdXApIHsKICAgICAgICB2YXIgY3RHcm91cCA9IHRoaXMuX2J5Q3Jvc3N0YWxrR3JvdXBbbGF5ZXJJbmZvLmN0R3JvdXBdOwogICAgICAgIHZhciBsYXllcnNGb3JLZXkgPSBjdEdyb3VwW2xheWVySW5mby5jdEtleV07CiAgICAgICAgdmFyIGlkeCA9IGxheWVyc0ZvcktleSA/IGxheWVyc0ZvcktleS5pbmRleE9mKHN0YW1wKSA6IC0xOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgaWYgKGxheWVyc0ZvcktleS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgZGVsZXRlIGN0R3JvdXBbbGF5ZXJJbmZvLmN0S2V5XTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxheWVyc0ZvcktleS5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LCB7CiAgICBrZXk6ICJfbGF5ZXJJZEtleSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX2xheWVySWRLZXkoY2F0ZWdvcnksIGxheWVySWQpIHsKICAgICAgcmV0dXJuIGNhdGVnb3J5ICsgIlxuIiArIGxheWVySWQ7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gTGF5ZXJNYW5hZ2VyOwp9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBMYXllck1hbmFnZXI7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0seyIuL2dsb2JhbC9qcXVlcnkiOjcsIi4vZ2xvYmFsL2xlYWZsZXQiOjgsIi4vdXRpbCI6MTV9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OwoKdmFyIF9qcXVlcnkgPSByZXF1aXJlKCIuL2dsb2JhbC9qcXVlcnkiKTsKCnZhciBfanF1ZXJ5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pxdWVyeSk7Cgp2YXIgX2xlYWZsZXQgPSByZXF1aXJlKCIuL2dsb2JhbC9sZWFmbGV0Iik7Cgp2YXIgX2xlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGVhZmxldCk7Cgp2YXIgX3NoaW55ID0gcmVxdWlyZSgiLi9nbG9iYWwvc2hpbnkiKTsKCnZhciBfc2hpbnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hpbnkpOwoKdmFyIF9odG1sd2lkZ2V0cyA9IHJlcXVpcmUoIi4vZ2xvYmFsL2h0bWx3aWRnZXRzIik7Cgp2YXIgX2h0bWx3aWRnZXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWx3aWRnZXRzKTsKCnZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbCIpOwoKdmFyIF9jcnNfdXRpbHMgPSByZXF1aXJlKCIuL2Nyc191dGlscyIpOwoKdmFyIF9kYXRhZnJhbWUgPSByZXF1aXJlKCIuL2RhdGFmcmFtZSIpOwoKdmFyIF9kYXRhZnJhbWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGF0YWZyYW1lKTsKCnZhciBfY2x1c3RlckxheWVyU3RvcmUgPSByZXF1aXJlKCIuL2NsdXN0ZXItbGF5ZXItc3RvcmUiKTsKCnZhciBfY2x1c3RlckxheWVyU3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2x1c3RlckxheWVyU3RvcmUpOwoKdmFyIF9taXBtYXBwZXIgPSByZXF1aXJlKCIuL21pcG1hcHBlciIpOwoKdmFyIF9taXBtYXBwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWlwbWFwcGVyKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9Cgp2YXIgbWV0aG9kcyA9IHt9OwpleHBvcnRzLmRlZmF1bHQgPSBtZXRob2RzOwoKCmZ1bmN0aW9uIG1vdXNlSGFuZGxlcihtYXBJZCwgbGF5ZXJJZCwgZ3JvdXAsIGV2ZW50TmFtZSwgZXh0cmFJbmZvKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIV9odG1sd2lkZ2V0czIuZGVmYXVsdC5zaGlueU1vZGUpIHJldHVybjsKCiAgICB2YXIgZXZlbnRJbmZvID0gX2pxdWVyeTIuZGVmYXVsdC5leHRlbmQoewogICAgICBpZDogbGF5ZXJJZCwKICAgICAgIi5ub25jZSI6IE1hdGgucmFuZG9tKCkgLy8gZm9yY2UgcmVhY3Rpdml0eQogICAgfSwgZ3JvdXAgIT09IG51bGwgPyB7IGdyb3VwOiBncm91cCB9IDogbnVsbCwgZS50YXJnZXQuZ2V0TGF0TG5nID8gZS50YXJnZXQuZ2V0TGF0TG5nKCkgOiBlLmxhdGxuZywgZXh0cmFJbmZvKTsKCiAgICBfc2hpbnkyLmRlZmF1bHQub25JbnB1dENoYW5nZShtYXBJZCArICJfIiArIGV2ZW50TmFtZSwgZXZlbnRJbmZvKTsKICB9Owp9CgptZXRob2RzLm1vdXNlSGFuZGxlciA9IG1vdXNlSGFuZGxlcjsKCm1ldGhvZHMuY2xlYXJHcm91cCA9IGZ1bmN0aW9uIChncm91cCkgewogIHZhciBfdGhpcyA9IHRoaXM7CgogIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoZ3JvdXApLCBmdW5jdGlvbiAoaSwgdikgewogICAgX3RoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyR3JvdXAodik7CiAgfSk7Cn07CgptZXRob2RzLnNldFZpZXcgPSBmdW5jdGlvbiAoY2VudGVyLCB6b29tLCBvcHRpb25zKSB7CiAgdGhpcy5zZXRWaWV3KGNlbnRlciwgem9vbSwgb3B0aW9ucyk7Cn07CgptZXRob2RzLmZpdEJvdW5kcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyKSB7CiAgdGhpcy5maXRCb3VuZHMoW1tsYXQxLCBsbmcxXSwgW2xhdDIsIGxuZzJdXSk7Cn07CgptZXRob2RzLnNldE1heEJvdW5kcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyKSB7CiAgdGhpcy5zZXRNYXhCb3VuZHMoW1tsYXQxLCBsbmcxXSwgW2xhdDIsIGxuZzJdXSk7Cn07CgptZXRob2RzLmFkZFBvcHVwcyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgcG9wdXAsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zKSB7CiAgdmFyIF90aGlzMiA9IHRoaXM7CgogIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJsYXQiLCBsYXQpLmNvbCgibG5nIiwgbG5nKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY2JpbmQob3B0aW9ucyk7CgogIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHsKICAgIGlmIChfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxhdCIpKSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZyIpKSkgewogICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBwb3B1cCA9IF9sZWFmbGV0Mi5kZWZhdWx0LnBvcHVwKGRmLmdldChpKSkuc2V0TGF0TG5nKFtkZi5nZXQoaSwgImxhdCIpLCBkZi5nZXQoaSwgImxuZyIpXSkuc2V0Q29udGVudChkZi5nZXQoaSwgInBvcHVwIikpOwogICAgICAgIHZhciB0aGlzSWQgPSBkZi5nZXQoaSwgImxheWVySWQiKTsKICAgICAgICB2YXIgdGhpc0dyb3VwID0gZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKHBvcHVwLCAicG9wdXAiLCB0aGlzSWQsIHRoaXNHcm91cCk7CiAgICAgIH0pLmNhbGwoX3RoaXMyKTsKICAgIH0KICB9OwoKICBmb3IgKHZhciBpID0gMDsgaSA8IGRmLm5yb3coKTsgaSsrKSB7CiAgICBfbG9vcChpKTsKICB9Cn07CgptZXRob2RzLnJlbW92ZVBvcHVwID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigicG9wdXAiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJQb3B1cHMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoInBvcHVwIik7Cn07CgptZXRob2RzLmFkZFRpbGVzID0gZnVuY3Rpb24gKHVybFRlbXBsYXRlLCBsYXllcklkLCBncm91cCwgb3B0aW9ucykgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKF9sZWFmbGV0Mi5kZWZhdWx0LnRpbGVMYXllcih1cmxUZW1wbGF0ZSwgb3B0aW9ucyksICJ0aWxlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKbWV0aG9kcy5yZW1vdmVUaWxlcyA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoInRpbGUiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJUaWxlcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygidGlsZSIpOwp9OwoKbWV0aG9kcy5hZGRXTVNUaWxlcyA9IGZ1bmN0aW9uIChiYXNlVXJsLCBsYXllcklkLCBncm91cCwgb3B0aW9ucykgewogIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY3JzKSB7CiAgICBvcHRpb25zLmNycyA9ICgwLCBfY3JzX3V0aWxzLmdldENSUykob3B0aW9ucy5jcnMpOwogIH0KICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihfbGVhZmxldDIuZGVmYXVsdC50aWxlTGF5ZXIud21zKGJhc2VVcmwsIG9wdGlvbnMpLCAidGlsZSIsIGxheWVySWQsIGdyb3VwKTsKfTsKCi8vIEdpdmVuOgovLyAgIHtkYXRhOiBbImEiLCAiYiIsICJjIl0sIGluZGV4OiBbMCwgMSwgMCwgMl19Ci8vIHJldHVybnM6Ci8vICAgWyJhIiwgImIiLCAiYSIsICJjIl0KZnVuY3Rpb24gdW5wYWNrU3RyaW5ncyhpY29uc2V0KSB7CiAgaWYgKCFpY29uc2V0KSB7CiAgICByZXR1cm4gaWNvbnNldDsKICB9CiAgaWYgKHR5cGVvZiBpY29uc2V0LmluZGV4ID09PSAidW5kZWZpbmVkIikgewogICAgcmV0dXJuIGljb25zZXQ7CiAgfQoKICBpY29uc2V0LmRhdGEgPSAoMCwgX3V0aWwuYXNBcnJheSkoaWNvbnNldC5kYXRhKTsKICBpY29uc2V0LmluZGV4ID0gKDAsIF91dGlsLmFzQXJyYXkpKGljb25zZXQuaW5kZXgpOwoKICByZXR1cm4gX2pxdWVyeTIuZGVmYXVsdC5tYXAoaWNvbnNldC5pbmRleCwgZnVuY3Rpb24gKGUsIGkpIHsKICAgIHJldHVybiBpY29uc2V0LmRhdGFbZV07CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZE1hcmtlcnMobWFwLCBkZiwgZ3JvdXAsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIG1hcmtlckZ1bmMpIHsKICAoZnVuY3Rpb24gKCkgewogICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgdmFyIGNsdXN0ZXJHcm91cCA9IHRoaXMubGF5ZXJNYW5hZ2VyLmdldExheWVyKCJjbHVzdGVyIiwgY2x1c3RlcklkKSwKICAgICAgICBjbHVzdGVyID0gY2x1c3Rlck9wdGlvbnMgIT09IG51bGw7CiAgICBpZiAoY2x1c3RlciAmJiAhY2x1c3Rlckdyb3VwKSB7CiAgICAgIGNsdXN0ZXJHcm91cCA9IF9sZWFmbGV0Mi5kZWZhdWx0Lm1hcmtlckNsdXN0ZXJHcm91cC5sYXllclN1cHBvcnQoY2x1c3Rlck9wdGlvbnMpOwogICAgICBpZiAoY2x1c3Rlck9wdGlvbnMuZnJlZXplQXRab29tKSB7CiAgICAgICAgdmFyIGZyZWV6ZUF0Wm9vbSA9IGNsdXN0ZXJPcHRpb25zLmZyZWV6ZUF0Wm9vbTsKICAgICAgICBkZWxldGUgY2x1c3Rlck9wdGlvbnMuZnJlZXplQXRab29tOwogICAgICAgIGNsdXN0ZXJHcm91cC5mcmVlemVBdFpvb20oZnJlZXplQXRab29tKTsKICAgICAgfQogICAgICBjbHVzdGVyR3JvdXAuY2x1c3RlckxheWVyU3RvcmUgPSBuZXcgX2NsdXN0ZXJMYXllclN0b3JlMi5kZWZhdWx0KGNsdXN0ZXJHcm91cCk7CiAgICB9CiAgICB2YXIgZXh0cmFJbmZvID0gY2x1c3RlciA/IHsgY2x1c3RlcklkOiBjbHVzdGVySWQgfSA6IHt9OwoKICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoaSkgewogICAgICBpZiAoX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsYXQiKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsbmciKSkpIHsKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIG1hcmtlciA9IG1hcmtlckZ1bmMoZGYsIGkpOwogICAgICAgICAgdmFyIHRoaXNJZCA9IGRmLmdldChpLCAibGF5ZXJJZCIpOwogICAgICAgICAgdmFyIHRoaXNHcm91cCA9IGNsdXN0ZXIgPyBudWxsIDogZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgICAgaWYgKGNsdXN0ZXIpIHsKICAgICAgICAgICAgY2x1c3Rlckdyb3VwLmNsdXN0ZXJMYXllclN0b3JlLmFkZChtYXJrZXIsIHRoaXNJZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihtYXJrZXIsICJtYXJrZXIiLCB0aGlzSWQsIHRoaXNHcm91cCwgZGYuZ2V0KGksICJjdEdyb3VwIiwgdHJ1ZSksIGRmLmdldChpLCAiY3RLZXkiLCB0cnVlKSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcG9wdXAgPSBkZi5nZXQoaSwgInBvcHVwIik7CiAgICAgICAgICB2YXIgcG9wdXBPcHRpb25zID0gZGYuZ2V0KGksICJwb3B1cE9wdGlvbnMiKTsKICAgICAgICAgIGlmIChwb3B1cCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAocG9wdXBPcHRpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgbWFya2VyLmJpbmRQb3B1cChwb3B1cCwgcG9wdXBPcHRpb25zKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtYXJrZXIuYmluZFBvcHVwKHBvcHVwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdmFyIGxhYmVsID0gZGYuZ2V0KGksICJsYWJlbCIpOwogICAgICAgICAgdmFyIGxhYmVsT3B0aW9ucyA9IGRmLmdldChpLCAibGFiZWxPcHRpb25zIik7CiAgICAgICAgICBpZiAobGFiZWwgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGxhYmVsT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGlmIChsYWJlbE9wdGlvbnMucGVybWFuZW50KSB7CiAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobGFiZWwsIGxhYmVsT3B0aW9ucykub3BlblRvb2x0aXAoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWFya2VyLmJpbmRUb29sdGlwKGxhYmVsLCBsYWJlbE9wdGlvbnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBtYXJrZXIub24oImNsaWNrIiwgbW91c2VIYW5kbGVyKHRoaXMuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCAibWFya2VyX2NsaWNrIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgICAgICBtYXJrZXIub24oIm1vdXNlb3ZlciIsIG1vdXNlSGFuZGxlcih0aGlzLmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgIm1hcmtlcl9tb3VzZW92ZXIiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgICAgIG1hcmtlci5vbigibW91c2VvdXQiLCBtb3VzZUhhbmRsZXIodGhpcy5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsICJtYXJrZXJfbW91c2VvdXQiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgICB9KS5jYWxsKF90aGlzMyk7CiAgICAgIH0KICAgIH07CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZi5ucm93KCk7IGkrKykgewogICAgICBfbG9vcDIoaSk7CiAgICB9CgogICAgaWYgKGNsdXN0ZXIpIHsKICAgICAgdGhpcy5sYXllck1hbmFnZXIuYWRkTGF5ZXIoY2x1c3Rlckdyb3VwLCAiY2x1c3RlciIsIGNsdXN0ZXJJZCwgZ3JvdXApOwogICAgfQogIH0pLmNhbGwobWFwKTsKfQoKbWV0aG9kcy5hZGRHZW5lcmljTWFya2VycyA9IGFkZE1hcmtlcnM7CgptZXRob2RzLmFkZE1hcmtlcnMgPSBmdW5jdGlvbiAobGF0LCBsbmcsIGljb24sIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBjcm9zc3RhbGtPcHRpb25zKSB7CiAgdmFyIGljb25kZiA9IHZvaWQgMDsKICB2YXIgZ2V0SWNvbiA9IHZvaWQgMDsKCiAgaWYgKGljb24pIHsKICAgIC8vIFVucGFjayBpY29ucwogICAgaWNvbi5pY29uVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLmljb25VcmwpOwogICAgaWNvbi5pY29uUmV0aW5hVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLmljb25SZXRpbmFVcmwpOwogICAgaWNvbi5zaGFkb3dVcmwgPSB1bnBhY2tTdHJpbmdzKGljb24uc2hhZG93VXJsKTsKICAgIGljb24uc2hhZG93UmV0aW5hVXJsID0gdW5wYWNrU3RyaW5ncyhpY29uLnNoYWRvd1JldGluYVVybCk7CgogICAgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgogICAgaWNvbmRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jYmluZChpY29uKTsKCiAgICAvLyBDb25zdHJ1Y3RzIGFuIGljb24gZnJvbSBhIHNwZWNpZmllZCByb3cgb2YgdGhlIGljb24gZGF0YWZyYW1lLgogICAgZ2V0SWNvbiA9IGZ1bmN0aW9uIGdldEljb24oaSkgewogICAgICB2YXIgb3B0cyA9IGljb25kZi5nZXQoaSk7CiAgICAgIGlmICghb3B0cy5pY29uVXJsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfbGVhZmxldDIuZGVmYXVsdC5JY29uLkRlZmF1bHQoKTsKICAgICAgfQoKICAgICAgLy8gQ29tcG9zaXRlIG9wdGlvbnMgKGxpa2UgcG9pbnRzIG9yIHNpemVzKSBhcmUgcGFzc2VkIGZyb20gUiB3aXRoIGVhY2gKICAgICAgLy8gaW5kaXZpZHVhbCBjb21wb25lbnQgYXMgaXRzIG93biBvcHRpb24uIFdlIG5lZWQgdG8gY29tYmluZSB0aGVtIG5vdwogICAgICAvLyBpbnRvIHRoZWlyIGNvbXBvc2l0ZSBmb3JtLgogICAgICBpZiAob3B0cy5pY29uV2lkdGgpIHsKICAgICAgICBvcHRzLmljb25TaXplID0gW29wdHMuaWNvbldpZHRoLCBvcHRzLmljb25IZWlnaHRdOwogICAgICB9CiAgICAgIGlmIChvcHRzLnNoYWRvd1dpZHRoKSB7CiAgICAgICAgb3B0cy5zaGFkb3dTaXplID0gW29wdHMuc2hhZG93V2lkdGgsIG9wdHMuc2hhZG93SGVpZ2h0XTsKICAgICAgfQogICAgICBpZiAob3B0cy5pY29uQW5jaG9yWCkgewogICAgICAgIG9wdHMuaWNvbkFuY2hvciA9IFtvcHRzLmljb25BbmNob3JYLCBvcHRzLmljb25BbmNob3JZXTsKICAgICAgfQogICAgICBpZiAob3B0cy5zaGFkb3dBbmNob3JYKSB7CiAgICAgICAgb3B0cy5zaGFkb3dBbmNob3IgPSBbb3B0cy5zaGFkb3dBbmNob3JYLCBvcHRzLnNoYWRvd0FuY2hvclldOwogICAgICB9CiAgICAgIGlmIChvcHRzLnBvcHVwQW5jaG9yWCkgewogICAgICAgIG9wdHMucG9wdXBBbmNob3IgPSBbb3B0cy5wb3B1cEFuY2hvclgsIG9wdHMucG9wdXBBbmNob3JZXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBfbGVhZmxldDIuZGVmYXVsdC5JY29uKG9wdHMpOwogICAgfTsKICB9CgogIGlmICghKF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxuZykpIHsKCiAgICB2YXIgZGYgPSBuZXcgX2RhdGFmcmFtZTIuZGVmYXVsdCgpLmNvbCgibGF0IiwgbGF0KS5jb2woImxuZyIsIGxuZykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jYmluZChvcHRpb25zKS5jYmluZChjcm9zc3RhbGtPcHRpb25zIHx8IHt9KTsKCiAgICBpZiAoaWNvbikgaWNvbmRmLmVmZmVjdGl2ZUxlbmd0aCA9IGRmLm5yb3coKTsKCiAgICBhZGRNYXJrZXJzKHRoaXMsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHZhciBvcHRpb25zID0gZGYuZ2V0KGkpOwogICAgICBpZiAoaWNvbikgb3B0aW9ucy5pY29uID0gZ2V0SWNvbihpKTsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0Lm1hcmtlcihbZGYuZ2V0KGksICJsYXQiKSwgZGYuZ2V0KGksICJsbmciKV0sIG9wdGlvbnMpOwogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5hZGRBd2Vzb21lTWFya2VycyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgaWNvbiwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGNyb3NzdGFsa09wdGlvbnMpIHsKICB2YXIgaWNvbmRmID0gdm9pZCAwOwogIHZhciBnZXRJY29uID0gdm9pZCAwOwogIGlmIChpY29uKSB7CgogICAgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgogICAgaWNvbmRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jYmluZChpY29uKTsKCiAgICAvLyBDb25zdHJ1Y3RzIGFuIGljb24gZnJvbSBhIHNwZWNpZmllZCByb3cgb2YgdGhlIGljb24gZGF0YWZyYW1lLgogICAgZ2V0SWNvbiA9IGZ1bmN0aW9uIGdldEljb24oaSkgewogICAgICB2YXIgb3B0cyA9IGljb25kZi5nZXQoaSk7CiAgICAgIGlmICghb3B0cykgewogICAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuQXdlc29tZU1hcmtlcnMuaWNvbigpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zcXVhcmVNYXJrZXIpIHsKICAgICAgICBvcHRzLmNsYXNzTmFtZSA9ICJhd2Vzb21lLW1hcmtlciBhd2Vzb21lLW1hcmtlci1zcXVhcmUiOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuQXdlc29tZU1hcmtlcnMuaWNvbihvcHRzKTsKICAgIH07CiAgfQoKICBpZiAoIShfanF1ZXJ5Mi5kZWZhdWx0LmlzRW1wdHlPYmplY3QobGF0KSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzRW1wdHlPYmplY3QobG5nKSkgfHwgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMobGF0KSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsbmcpKSB7CgogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY29sKCJwb3B1cCIsIHBvcHVwKS5jb2woInBvcHVwT3B0aW9ucyIsIHBvcHVwT3B0aW9ucykuY29sKCJsYWJlbCIsIGxhYmVsKS5jb2woImxhYmVsT3B0aW9ucyIsIGxhYmVsT3B0aW9ucykuY2JpbmQob3B0aW9ucykuY2JpbmQoY3Jvc3N0YWxrT3B0aW9ucyB8fCB7fSk7CgogICAgaWYgKGljb24pIGljb25kZi5lZmZlY3RpdmVMZW5ndGggPSBkZi5ucm93KCk7CgogICAgYWRkTWFya2Vycyh0aGlzLCBkZiwgZ3JvdXAsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICB2YXIgb3B0aW9ucyA9IGRmLmdldChpKTsKICAgICAgaWYgKGljb24pIG9wdGlvbnMuaWNvbiA9IGdldEljb24oaSk7CiAgICAgIHJldHVybiBfbGVhZmxldDIuZGVmYXVsdC5tYXJrZXIoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildLCBvcHRpb25zKTsKICAgIH0pOwogIH0KfTsKCmZ1bmN0aW9uIGFkZExheWVycyhtYXAsIGNhdGVnb3J5LCBkZiwgbGF5ZXJGdW5jKSB7CiAgdmFyIF9sb29wMyA9IGZ1bmN0aW9uIF9sb29wMyhpKSB7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIHZhciBsYXllciA9IGxheWVyRnVuYyhkZiwgaSk7CiAgICAgIGlmICghX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxheWVyKSkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgdGhpc0lkID0gZGYuZ2V0KGksICJsYXllcklkIik7CiAgICAgICAgICB2YXIgdGhpc0dyb3VwID0gZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgICAgX3RoaXM0LmxheWVyTWFuYWdlci5hZGRMYXllcihsYXllciwgY2F0ZWdvcnksIHRoaXNJZCwgdGhpc0dyb3VwLCBkZi5nZXQoaSwgImN0R3JvdXAiLCB0cnVlKSwgZGYuZ2V0KGksICJjdEtleSIsIHRydWUpKTsKICAgICAgICAgIGlmIChsYXllci5iaW5kUG9wdXApIHsKICAgICAgICAgICAgdmFyIHBvcHVwID0gZGYuZ2V0KGksICJwb3B1cCIpOwogICAgICAgICAgICB2YXIgcG9wdXBPcHRpb25zID0gZGYuZ2V0KGksICJwb3B1cE9wdGlvbnMiKTsKICAgICAgICAgICAgaWYgKHBvcHVwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgaWYgKHBvcHVwT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwLCBwb3B1cE9wdGlvbnMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGxheWVyLmJpbmRUb29sdGlwKSB7CiAgICAgICAgICAgIHZhciBsYWJlbCA9IGRmLmdldChpLCAibGFiZWwiKTsKICAgICAgICAgICAgdmFyIGxhYmVsT3B0aW9ucyA9IGRmLmdldChpLCAibGFiZWxPcHRpb25zIik7CiAgICAgICAgICAgIGlmIChsYWJlbCAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGlmIChsYWJlbE9wdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGxheWVyLmJpbmRUb29sdGlwKGxhYmVsLCBsYWJlbE9wdGlvbnMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsYXllci5iaW5kVG9vbHRpcChsYWJlbCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoX3RoaXM0LmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgY2F0ZWdvcnkgKyAiX2NsaWNrIiksIF90aGlzNCk7CiAgICAgICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKF90aGlzNC5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsIGNhdGVnb3J5ICsgIl9tb3VzZW92ZXIiKSwgX3RoaXM0KTsKICAgICAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihfdGhpczQuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCBjYXRlZ29yeSArICJfbW91c2VvdXQiKSwgX3RoaXM0KTsKICAgICAgICAgIHZhciBoaWdobGlnaHRTdHlsZSA9IGRmLmdldChpLCAiaGlnaGxpZ2h0T3B0aW9ucyIpOwoKICAgICAgICAgIGlmICghX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGhpZ2hsaWdodFN0eWxlKSkgewogICAgICAgICAgICAoZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICB2YXIgZGVmYXVsdFN0eWxlID0ge307CiAgICAgICAgICAgICAgX2pxdWVyeTIuZGVmYXVsdC5lYWNoKGhpZ2hsaWdodFN0eWxlLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgICAgICAgICAgaWYgKGsgIT0gImJyaW5nVG9Gcm9udCIgJiYgayAhPSAic2VuZFRvQmFjayIpIHsKICAgICAgICAgICAgICAgICAgaWYgKGRmLmdldChpLCBrKSkgewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHlsZVtrXSA9IGRmLmdldChpLCBrKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBsYXllci5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoaGlnaGxpZ2h0U3R5bGUpOwogICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFN0eWxlLmJyaW5nVG9Gcm9udCkgewogICAgICAgICAgICAgICAgICB0aGlzLmJyaW5nVG9Gcm9udCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKGRlZmF1bHRTdHlsZSk7CiAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0U3R5bGUuc2VuZFRvQmFjaykgewogICAgICAgICAgICAgICAgICB0aGlzLmJyaW5nVG9CYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICB9CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgfSkuY2FsbChtYXApOwogIH07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgZGYubnJvdygpOyBpKyspIHsKICAgIF9sb29wMyhpKTsKICB9Cn0KCm1ldGhvZHMuYWRkR2VuZXJpY0xheWVycyA9IGFkZExheWVyczsKCm1ldGhvZHMuYWRkQ2lyY2xlcyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgcmFkaXVzLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucywgY3Jvc3N0YWxrT3B0aW9ucykgewogIGlmICghKF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxuZykpIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJsYXQiLCBsYXQpLmNvbCgibG5nIiwgbG5nKS5jb2woInJhZGl1cyIsIHJhZGl1cykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKS5jYmluZChjcm9zc3RhbGtPcHRpb25zIHx8IHt9KTsKCiAgICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICBpZiAoX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsYXQiKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsbmciKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJyYWRpdXMiKSkpIHsKICAgICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQuY2lyY2xlKFtkZi5nZXQoaSwgImxhdCIpLCBkZi5nZXQoaSwgImxuZyIpXSwgZGYuZ2V0KGksICJyYWRpdXMiKSwgZGYuZ2V0KGkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5hZGRDaXJjbGVNYXJrZXJzID0gZnVuY3Rpb24gKGxhdCwgbG5nLCByYWRpdXMsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBjcm9zc3RhbGtPcHRpb25zKSB7CiAgaWYgKCEoX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxhdCkgfHwgX2pxdWVyeTIuZGVmYXVsdC5pc0VtcHR5T2JqZWN0KGxuZykpIHx8IF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGxhdCkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMobG5nKSkgewogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgicmFkaXVzIiwgcmFkaXVzKS5jb2woImxheWVySWQiLCBsYXllcklkKS5jb2woImdyb3VwIiwgZ3JvdXApLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJwb3B1cE9wdGlvbnMiLCBwb3B1cE9wdGlvbnMpLmNvbCgibGFiZWwiLCBsYWJlbCkuY29sKCJsYWJlbE9wdGlvbnMiLCBsYWJlbE9wdGlvbnMpLmNiaW5kKGNyb3NzdGFsa09wdGlvbnMgfHwge30pLmNiaW5kKG9wdGlvbnMpOwoKICAgIGFkZE1hcmtlcnModGhpcywgZGYsIGdyb3VwLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBmdW5jdGlvbiAoZGYsIGkpIHsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LmNpcmNsZU1hcmtlcihbZGYuZ2V0KGksICJsYXQiKSwgZGYuZ2V0KGksICJsbmciKV0sIGRmLmdldChpKSk7CiAgICB9KTsKICB9Cn07CgovKg0KICogQHBhcmFtIGxhdCBBcnJheSBvZiBhcnJheXMgb2YgbGF0aXR1ZGUgY29vcmRpbmF0ZXMgZm9yIHBvbHlsaW5lcw0KICogQHBhcmFtIGxuZyBBcnJheSBvZiBhcnJheXMgb2YgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGZvciBwb2x5bGluZXMNCiAqLwptZXRob2RzLmFkZFBvbHlsaW5lcyA9IGZ1bmN0aW9uIChwb2x5Z29ucywgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGhpZ2hsaWdodE9wdGlvbnMpIHsKICBpZiAocG9seWdvbnMubGVuZ3RoID4gMCkgewogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyLmRlZmF1bHQoKS5jb2woInNoYXBlcyIsIHBvbHlnb25zKS5jb2woImxheWVySWQiLCBsYXllcklkKS5jb2woImdyb3VwIiwgZ3JvdXApLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJwb3B1cE9wdGlvbnMiLCBwb3B1cE9wdGlvbnMpLmNvbCgibGFiZWwiLCBsYWJlbCkuY29sKCJsYWJlbE9wdGlvbnMiLCBsYWJlbE9wdGlvbnMpLmNvbCgiaGlnaGxpZ2h0T3B0aW9ucyIsIGhpZ2hsaWdodE9wdGlvbnMpLmNiaW5kKG9wdGlvbnMpOwoKICAgIGFkZExheWVycyh0aGlzLCAic2hhcGUiLCBkZiwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHZhciBzaGFwZXMgPSBkZi5nZXQoaSwgInNoYXBlcyIpOwogICAgICBzaGFwZXMgPSBzaGFwZXMubWFwKGZ1bmN0aW9uIChzaGFwZSkgewogICAgICAgIHJldHVybiBfaHRtbHdpZGdldHMyLmRlZmF1bHQuZGF0YWZyYW1lVG9EMyhzaGFwZVswXSk7CiAgICAgIH0pOwogICAgICBpZiAoc2hhcGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQubXVsdGlQb2x5bGluZShzaGFwZXMsIGRmLmdldChpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LnBvbHlsaW5lKHNoYXBlc1swXSwgZGYuZ2V0KGkpKTsKICAgICAgfQogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5yZW1vdmVNYXJrZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJtYXJrZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJNYXJrZXJzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJtYXJrZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyQ2x1c3RlciA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImNsdXN0ZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyRnJvbUNsdXN0ZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCwgY2x1c3RlcklkKSB7CiAgdmFyIGNsdXN0ZXIgPSB0aGlzLmxheWVyTWFuYWdlci5nZXRMYXllcigiY2x1c3RlciIsIGNsdXN0ZXJJZCk7CiAgaWYgKCFjbHVzdGVyKSByZXR1cm47CiAgY2x1c3Rlci5jbHVzdGVyTGF5ZXJTdG9yZS5yZW1vdmUobGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFyTWFya2VyQ2x1c3RlcnMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoImNsdXN0ZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlU2hhcGUgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJzaGFwZSIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclNoYXBlcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygic2hhcGUiKTsKfTsKCm1ldGhvZHMuYWRkUmVjdGFuZ2xlcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucykgewogIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJsYXQxIiwgbGF0MSkuY29sKCJsbmcxIiwgbG5nMSkuY29sKCJsYXQyIiwgbGF0MikuY29sKCJsbmcyIiwgbG5nMikuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKCiAgYWRkTGF5ZXJzKHRoaXMsICJzaGFwZSIsIGRmLCBmdW5jdGlvbiAoZGYsIGkpIHsKICAgIGlmIChfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxhdDEiKSkgJiYgX2pxdWVyeTIuZGVmYXVsdC5pc051bWVyaWMoZGYuZ2V0KGksICJsbmcxIikpICYmIF9qcXVlcnkyLmRlZmF1bHQuaXNOdW1lcmljKGRmLmdldChpLCAibGF0MiIpKSAmJiBfanF1ZXJ5Mi5kZWZhdWx0LmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZzIiKSkpIHsKICAgICAgcmV0dXJuIF9sZWFmbGV0Mi5kZWZhdWx0LnJlY3RhbmdsZShbW2RmLmdldChpLCAibGF0MSIpLCBkZi5nZXQoaSwgImxuZzEiKV0sIFtkZi5nZXQoaSwgImxhdDIiKSwgZGYuZ2V0KGksICJsbmcyIildXSwgZGYuZ2V0KGkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0pOwp9OwoKLyoNCiAqIEBwYXJhbSBsYXQgQXJyYXkgb2YgYXJyYXlzIG9mIGxhdGl0dWRlIGNvb3JkaW5hdGVzIGZvciBwb2x5Z29ucw0KICogQHBhcmFtIGxuZyBBcnJheSBvZiBhcnJheXMgb2YgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGZvciBwb2x5Z29ucw0KICovCm1ldGhvZHMuYWRkUG9seWdvbnMgPSBmdW5jdGlvbiAocG9seWdvbnMsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBoaWdobGlnaHRPcHRpb25zKSB7CiAgaWYgKHBvbHlnb25zLmxlbmd0aCA+IDApIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMi5kZWZhdWx0KCkuY29sKCJzaGFwZXMiLCBwb2x5Z29ucykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKCiAgICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICAvLyBUaGlzIGNvZGUgdXNlZCB0byB1c2UgTC5tdWx0aVBvbHlnb24sIGJ1dCB0aGF0IGNhdXNlZAogICAgICAvLyBkb3VibGUtY2xpY2sgb24gYSBtdWx0aXBvbHlnb24gdG8gZmFpbCB0byB6b29tIGluIG9uIHRoZQogICAgICAvLyBtYXAuIFN1cnByaXNpbmdseSwgcHV0dGluZyBhbGwgdGhlIHJpbmdzIGluIGEgc2luZ2xlCiAgICAgIC8vIHBvbHlnb24gc2VlbXMgdG8gc3RpbGwgd29yazsgY29tcGxpY2F0ZWQgbXVsdGlwb2x5Z29ucwogICAgICAvLyBhcmUgc3RpbGwgcmVuZGVyZWQgY29ycmVjdGx5LgogICAgICB2YXIgc2hhcGVzID0gZGYuZ2V0KGksICJzaGFwZXMiKS5tYXAoZnVuY3Rpb24gKHBvbHlnb24pIHsKICAgICAgICByZXR1cm4gcG9seWdvbi5tYXAoX2h0bWx3aWRnZXRzMi5kZWZhdWx0LmRhdGFmcmFtZVRvRDMpOwogICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgdmFsKSB7CiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQodmFsKTsKICAgICAgfSwgW10pOwogICAgICByZXR1cm4gX2xlYWZsZXQyLmRlZmF1bHQucG9seWdvbihzaGFwZXMsIGRmLmdldChpKSk7CiAgICB9KTsKICB9Cn07CgptZXRob2RzLmFkZEdlb0pTT04gPSBmdW5jdGlvbiAoZGF0YSwgbGF5ZXJJZCwgZ3JvdXAsIHN0eWxlKSB7CiAgLy8gVGhpcyB0aW1lLCBzZWxmIGlzIGFjdHVhbGx5IG5lZWRlZCBiZWNhdXNlIHRoZSBjYWxsYmFja3MgYmVsb3cgbmVlZAogIC8vIHRvIGFjY2VzcyBib3RoIHRoZSBpbm5lciBhbmQgb3V0ZXIgc2Vuc2VzIG9mICJ0aGlzIgogIHZhciBzZWxmID0gdGhpczsKICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKICB9CgogIHZhciBnbG9iYWxTdHlsZSA9IF9qcXVlcnkyLmRlZmF1bHQuZXh0ZW5kKHt9LCBzdHlsZSwgZGF0YS5zdHlsZSB8fCB7fSk7CgogIHZhciBnamxheWVyID0gX2xlYWZsZXQyLmRlZmF1bHQuZ2VvSnNvbihkYXRhLCB7CiAgICBzdHlsZTogZnVuY3Rpb24gc3R5bGUoZmVhdHVyZSkgewogICAgICBpZiAoZmVhdHVyZS5zdHlsZSB8fCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpIHsKICAgICAgICByZXR1cm4gX2pxdWVyeTIuZGVmYXVsdC5leHRlbmQoe30sIGdsb2JhbFN0eWxlLCBmZWF0dXJlLnN0eWxlLCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnbG9iYWxTdHlsZTsKICAgICAgfQogICAgfSwKICAgIG9uRWFjaEZlYXR1cmU6IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgdmFyIGV4dHJhSW5mbyA9IHsKICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmUuaWQsCiAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzCiAgICAgIH07CiAgICAgIHZhciBwb3B1cCA9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDsKICAgICAgaWYgKHR5cGVvZiBwb3B1cCAhPT0gInVuZGVmaW5lZCIgJiYgcG9wdXAgIT09IG51bGwpIGxheWVyLmJpbmRQb3B1cChwb3B1cCk7CiAgICAgIGxheWVyLm9uKCJjbGljayIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fY2xpY2siLCBleHRyYUluZm8pLCB0aGlzKTsKICAgICAgbGF5ZXIub24oIm1vdXNlb3ZlciIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgImdlb2pzb25fbW91c2VvdXQiLCBleHRyYUluZm8pLCB0aGlzKTsKICAgIH0KICB9KTsKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihnamxheWVyLCAiZ2VvanNvbiIsIGxheWVySWQsIGdyb3VwKTsKfTsKCm1ldGhvZHMucmVtb3ZlR2VvSlNPTiA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImdlb2pzb24iLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJHZW9KU09OID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJnZW9qc29uIik7Cn07CgptZXRob2RzLmFkZFRvcG9KU09OID0gZnVuY3Rpb24gKGRhdGEsIGxheWVySWQsIGdyb3VwLCBzdHlsZSkgewogIC8vIFRoaXMgdGltZSwgc2VsZiBpcyBhY3R1YWxseSBuZWVkZWQgYmVjYXVzZSB0aGUgY2FsbGJhY2tzIGJlbG93IG5lZWQKICAvLyB0byBhY2Nlc3MgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIHNlbnNlcyBvZiAidGhpcyIKICB2YXIgc2VsZiA9IHRoaXM7CiAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgfQoKICB2YXIgZ2xvYmFsU3R5bGUgPSBfanF1ZXJ5Mi5kZWZhdWx0LmV4dGVuZCh7fSwgc3R5bGUsIGRhdGEuc3R5bGUgfHwge30pOwoKICB2YXIgZ2psYXllciA9IF9sZWFmbGV0Mi5kZWZhdWx0Lmdlb0pzb24obnVsbCwgewogICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKGZlYXR1cmUpIHsKICAgICAgaWYgKGZlYXR1cmUuc3R5bGUgfHwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKSB7CiAgICAgICAgcmV0dXJuIF9qcXVlcnkyLmRlZmF1bHQuZXh0ZW5kKHt9LCBnbG9iYWxTdHlsZSwgZmVhdHVyZS5zdHlsZSwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZ2xvYmFsU3R5bGU7CiAgICAgIH0KICAgIH0sCiAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgIHZhciBleHRyYUluZm8gPSB7CiAgICAgICAgZmVhdHVyZUlkOiBmZWF0dXJlLmlkLAogICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcwogICAgICB9OwogICAgICB2YXIgcG9wdXAgPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7CiAgICAgIGlmICh0eXBlb2YgcG9wdXAgIT09ICJ1bmRlZmluZWQiICYmIHBvcHVwICE9PSBudWxsKSBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJ0b3BvanNvbl9jbGljayIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKHNlbGYuaWQsIGxheWVySWQsIGdyb3VwLCAidG9wb2pzb25fbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgInRvcG9qc29uX21vdXNlb3V0IiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICB9CiAgfSk7CiAgZ2xvYmFsLm9tbml2b3JlLnRvcG9qc29uLnBhcnNlKGRhdGEsIG51bGwsIGdqbGF5ZXIpOwogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGdqbGF5ZXIsICJ0b3BvanNvbiIsIGxheWVySWQsIGdyb3VwKTsKfTsKCm1ldGhvZHMucmVtb3ZlVG9wb0pTT04gPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJ0b3BvanNvbiIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclRvcG9KU09OID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJ0b3BvanNvbiIpOwp9OwoKbWV0aG9kcy5hZGRDb250cm9sID0gZnVuY3Rpb24gKGh0bWwsIHBvc2l0aW9uLCBsYXllcklkLCBjbGFzc2VzKSB7CiAgZnVuY3Rpb24gb25BZGQobWFwKSB7CiAgICB2YXIgZGl2ID0gX2xlYWZsZXQyLmRlZmF1bHQuRG9tVXRpbC5jcmVhdGUoImRpdiIsIGNsYXNzZXMpOwogICAgaWYgKHR5cGVvZiBsYXllcklkICE9PSAidW5kZWZpbmVkIiAmJiBsYXllcklkICE9PSBudWxsKSB7CiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoImlkIiwgbGF5ZXJJZCk7CiAgICB9CiAgICB0aGlzLl9kaXYgPSBkaXY7CgogICAgLy8gSXQncyBwb3NzaWJsZSBmb3Igd2luZG93LlNoaW55IHRvIGJlIHRydWUgYnV0IFNoaW55LmluaXRpYWxpemVJbnB1dHMgdG8KICAgIC8vIG5vdCBiZSwgd2hlbiBhIHN0YXRpYyBsZWFmbGV0IHdpZGdldCBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBzaGlueQogICAgLy8gVUkgZGlyZWN0bHkgKG5vdCB0aHJvdWdoIGxlYWZsZXRPdXRwdXQgb3IgdWlPdXRwdXQpLiBJbiB0aGlzIGNhc2Ugd2UKICAgIC8vIGRvbid0IGRvIHRoZSBub3JtYWwgU2hpbnkgc3R1ZmYgYXMgdGhhdCB3aWxsIGFsbCBoYXBwZW4gd2hlbiBTaGlueQogICAgLy8gaXRzZWxmIGxvYWRzIGFuZCBiaW5kcyB0aGUgZW50aXJlIGRvYy4KCiAgICBpZiAod2luZG93LlNoaW55ICYmIF9zaGlueTIuZGVmYXVsdC5pbml0aWFsaXplSW5wdXRzKSB7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5yZW5kZXJIdG1sKGh0bWwsIHRoaXMuX2Rpdik7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5pbml0aWFsaXplSW5wdXRzKHRoaXMuX2Rpdik7CiAgICAgIF9zaGlueTIuZGVmYXVsdC5iaW5kQWxsKHRoaXMuX2Rpdik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9kaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICByZXR1cm4gdGhpcy5fZGl2OwogIH0KICBmdW5jdGlvbiBvblJlbW92ZShtYXApIHsKICAgIGlmICh3aW5kb3cuU2hpbnkgJiYgX3NoaW55Mi5kZWZhdWx0LnVuYmluZEFsbCkgewogICAgICBfc2hpbnkyLmRlZmF1bHQudW5iaW5kQWxsKHRoaXMuX2Rpdik7CiAgICB9CiAgfQogIHZhciBDb250cm9sID0gX2xlYWZsZXQyLmRlZmF1bHQuQ29udHJvbC5leHRlbmQoewogICAgb3B0aW9uczogeyBwb3NpdGlvbjogcG9zaXRpb24gfSwKICAgIG9uQWRkOiBvbkFkZCwKICAgIG9uUmVtb3ZlOiBvblJlbW92ZQogIH0pOwogIHRoaXMuY29udHJvbHMuYWRkKG5ldyBDb250cm9sKCksIGxheWVySWQsIGh0bWwpOwp9OwoKbWV0aG9kcy5hZGRDdXN0b21Db250cm9sID0gZnVuY3Rpb24gKGNvbnRyb2wsIGxheWVySWQpIHsKICB0aGlzLmNvbnRyb2xzLmFkZChjb250cm9sLCBsYXllcklkKTsKfTsKCm1ldGhvZHMucmVtb3ZlQ29udHJvbCA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5jb250cm9scy5yZW1vdmUobGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFyQ29udHJvbHMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5jb250cm9scy5jbGVhcigpOwp9OwoKbWV0aG9kcy5hZGRMZWdlbmQgPSBmdW5jdGlvbiAob3B0aW9ucykgewogIHZhciBsZWdlbmQgPSBfbGVhZmxldDIuZGVmYXVsdC5jb250cm9sKHsgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb24gfSk7CiAgdmFyIGdyYWRTcGFuID0gdm9pZCAwOwoKICBsZWdlbmQub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7CiAgICB2YXIgZGl2ID0gX2xlYWZsZXQyLmRlZmF1bHQuRG9tVXRpbC5jcmVhdGUoImRpdiIsIG9wdGlvbnMuY2xhc3NOYW1lKSwKICAgICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycywKICAgICAgICBsYWJlbHMgPSBvcHRpb25zLmxhYmVscywKICAgICAgICBsZWdlbmRIVE1MID0gIiI7CiAgICBpZiAob3B0aW9ucy50eXBlID09PSAibnVtZXJpYyIpIHsKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyAjIEZvcm1hdHRpbmcgY29uc3RhbnRzLgogICAgICAgIHZhciBzaW5nbGVCaW5IZWlnaHQgPSAyMDsgLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gdGljayBtYXJrcywgaW4gcHgKICAgICAgICB2YXIgdk1hcmdpbiA9IDg7IC8vIElmIDFzdCB0aWNrIG1hcmsgc3RhcnRzIGF0IHRvcCBvZiBncmFkaWVudCwgaG93CiAgICAgICAgLy8gbWFueSBleHRyYSBweCBhcmUgbmVlZGVkIGZvciB0aGUgdG9wIGhhbGYgb2YgdGhlCiAgICAgICAgLy8gMXN0IGxhYmVsPyAoZGl0dG8gZm9yIGxhc3QgdGljayBtYXJrL2xhYmVsKQogICAgICAgIHZhciB0aWNrV2lkdGggPSA0OyAvLyBIb3cgd2lkZSBzaG91bGQgdGljayBtYXJrcyBiZSwgaW4gcHg/CiAgICAgICAgdmFyIGxhYmVsUGFkZGluZyA9IDY7IC8vIEhvdyBtdWNoIGRpc3RhbmNlIHRvIHJlc2VydmUgZm9yIHRpY2sgbWFyaz8KICAgICAgICAvLyAoTXVzdCBiZSA+PSB0aWNrV2lkdGgpCgogICAgICAgIC8vICMgRGVyaXZlZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCgogICAgICAgIC8vIFdoYXQncyB0aGUgaGVpZ2h0IG9mIGEgc2luZ2xlIGJpbiwgaW4gcGVyY2VudGFnZSAob2YgZ3JhZGllbnQgaGVpZ2h0KT8KICAgICAgICAvLyBJdCBtaWdodCBub3QganVzdCBiZSAxLyhuLTEpLCBpZiB0aGUgZ3JhZGllbnQgZXh0ZW5kcyBwYXN0IHRoZSB0aWNrCiAgICAgICAgLy8gbWFya3MgKHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgcHJldHR5IGN1dCBwb2ludHMpLgogICAgICAgIHZhciBzaW5nbGVCaW5QY3QgPSAob3B0aW9ucy5leHRyYS5wX24gLSBvcHRpb25zLmV4dHJhLnBfMSkgLyAobGFiZWxzLmxlbmd0aCAtIDEpOwogICAgICAgIC8vIEVhY2ggYmluIGlzIGBzaW5nbGVCaW5IZWlnaHRgIGhpZ2guIEhvdyB0YWxsIGlzIHRoZSBncmFkaWVudD8KICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSAxIC8gc2luZ2xlQmluUGN0ICogc2luZ2xlQmluSGVpZ2h0ICsgMTsKICAgICAgICAvLyBIb3cgZmFyIHNob3VsZCB0aGUgZmlyc3QgdGljayBiZSBzaGlmdGVkIGRvd24sIHJlbGF0aXZlIHRvIHRoZSB0b3AKICAgICAgICAvLyBvZiB0aGUgZ3JhZGllbnQ/CiAgICAgICAgdmFyIHRpY2tPZmZzZXQgPSBzaW5nbGVCaW5IZWlnaHQgLyBzaW5nbGVCaW5QY3QgKiBvcHRpb25zLmV4dHJhLnBfMTsKCiAgICAgICAgZ3JhZFNwYW4gPSAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxzcGFuLz4iKS5jc3MoewogICAgICAgICAgImJhY2tncm91bmQiOiAibGluZWFyLWdyYWRpZW50KCIgKyBjb2xvcnMgKyAiKSIsCiAgICAgICAgICAib3BhY2l0eSI6IG9wdGlvbnMub3BhY2l0eSwKICAgICAgICAgICJoZWlnaHQiOiB0b3RhbEhlaWdodCArICJweCIsCiAgICAgICAgICAid2lkdGgiOiAiMThweCIsCiAgICAgICAgICAiZGlzcGxheSI6ICJibG9jayIsCiAgICAgICAgICAibWFyZ2luLXRvcCI6IHZNYXJnaW4gKyAicHgiCiAgICAgICAgfSk7CiAgICAgICAgdmFyIGxlZnREaXYgPSAoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxkaXYvPiIpLmNzcygiZmxvYXQiLCAibGVmdCIpLAogICAgICAgICAgICByaWdodERpdiA9ICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KSgiPGRpdi8+IikuY3NzKCJmbG9hdCIsICJsZWZ0Iik7CiAgICAgICAgbGVmdERpdi5hcHBlbmQoZ3JhZFNwYW4pOwogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShkaXYpLmFwcGVuZChsZWZ0RGl2KS5hcHBlbmQocmlnaHREaXYpLmFwcGVuZCgoMCwgX2pxdWVyeTIuZGVmYXVsdCkoIjxiciBjbGVhcj1cImJvdGhcIi8+IikpOwoKICAgICAgICAvLyBIYXZlIHRvIGF0dGFjaCB0aGUgZGl2IHRvIHRoZSBib2R5IGF0IHRoaXMgZWFybHkgcG9pbnQsIHNvIHRoYXQgdGhlCiAgICAgICAgLy8gc3ZnIHRleHQgZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkgYWN0dWFsbHkgd29ya3MsIGJlbG93LgogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKCiAgICAgICAgdmFyIG5zID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKICAgICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAic3ZnIik7CiAgICAgICAgcmlnaHREaXYuYXBwZW5kKHN2Zyk7CiAgICAgICAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMsICJnIik7CiAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGcpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwgIiArIHZNYXJnaW4gKyAiKSIpOwogICAgICAgIHN2Zy5hcHBlbmRDaGlsZChnKTsKCiAgICAgICAgLy8gbWF4IGxhYmVsIHdpZHRoIG5lZWRlZCB0byBzZXQgd2lkdGggb2Ygc3ZnLCBhbmQgcmlnaHQtanVzdGlmeSB0ZXh0CiAgICAgICAgdmFyIG1heExibFdpZHRoID0gMDsKCiAgICAgICAgLy8gQ3JlYXRlIHRpY2sgbWFya3MgYW5kIGxhYmVscwogICAgICAgIF9qcXVlcnkyLmRlZmF1bHQuZWFjaChsYWJlbHMsIGZ1bmN0aW9uIChpLCBsYWJlbCkgewogICAgICAgICAgdmFyIHkgPSB0aWNrT2Zmc2V0ICsgaSAqIHNpbmdsZUJpbkhlaWdodCArIDAuNTsKCiAgICAgICAgICB2YXIgdGhpc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAidGV4dCIpOwogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKHRoaXNMYWJlbCkudGV4dChsYWJlbHNbaV0pLmF0dHIoInkiLCB5KS5hdHRyKCJkeCIsIGxhYmVsUGFkZGluZykuYXR0cigiZHkiLCAiMC41ZXgiKTsKICAgICAgICAgIGcuYXBwZW5kQ2hpbGQodGhpc0xhYmVsKTsKICAgICAgICAgIG1heExibFdpZHRoID0gTWF0aC5tYXgobWF4TGJsV2lkdGgsIHRoaXNMYWJlbC5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSk7CgogICAgICAgICAgdmFyIHRoaXNUaWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLCAibGluZSIpOwogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKHRoaXNUaWNrKS5hdHRyKCJ4MSIsIDApLmF0dHIoIngyIiwgdGlja1dpZHRoKS5hdHRyKCJ5MSIsIHkpLmF0dHIoInkyIiwgeSkuYXR0cigic3Ryb2tlLXdpZHRoIiwgMSk7CiAgICAgICAgICBnLmFwcGVuZENoaWxkKHRoaXNUaWNrKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGUgbWF4IGxhYmVsIHdpZHRoLCB3ZSBjYW4gcmlnaHQtanVzdGlmeQogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShzdmcpLmZpbmQoInRleHQiKS5hdHRyKCJkeCIsIGxhYmVsUGFkZGluZyArIG1heExibFdpZHRoKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKTsKICAgICAgICAvLyBGaW5hbCBzaXplIGZvciA8c3ZnPgogICAgICAgICgwLCBfanF1ZXJ5Mi5kZWZhdWx0KShzdmcpLmNzcyh7CiAgICAgICAgICB3aWR0aDogbWF4TGJsV2lkdGggKyBsYWJlbFBhZGRpbmcgKyAicHgiLAogICAgICAgICAgaGVpZ2h0OiB0b3RhbEhlaWdodCArIHZNYXJnaW4gKiAyICsgInB4IgogICAgICAgIH0pOwoKICAgICAgICBpZiAob3B0aW9ucy5uYV9jb2xvcikgewogICAgICAgICAgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGRpdikuYXBwZW5kKCI8ZGl2PjxpIHN0eWxlPVwiYmFja2dyb3VuZDoiICsgb3B0aW9ucy5uYV9jb2xvciArICJcIj48L2k+ICIgKyBvcHRpb25zLm5hX2xhYmVsICsgIjwvZGl2PiIpOwogICAgICAgIH0KICAgICAgfSkoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChvcHRpb25zLm5hX2NvbG9yKSB7CiAgICAgICAgY29sb3JzLnB1c2gob3B0aW9ucy5uYV9jb2xvcik7CiAgICAgICAgbGFiZWxzLnB1c2gob3B0aW9ucy5uYV9sYWJlbCk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZWdlbmRIVE1MICs9ICI8aSBzdHlsZT1cImJhY2tncm91bmQ6IiArIGNvbG9yc1tpXSArICI7b3BhY2l0eToiICsgb3B0aW9ucy5vcGFjaXR5ICsgIlwiPjwvaT4gIiArIGxhYmVsc1tpXSArICI8YnIvPiI7CiAgICAgIH0KICAgICAgZGl2LmlubmVySFRNTCA9IGxlZ2VuZEhUTUw7CiAgICB9CiAgICBpZiAob3B0aW9ucy50aXRsZSkgKDAsIF9qcXVlcnkyLmRlZmF1bHQpKGRpdikucHJlcGVuZCgiPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206M3B4XCI+PHN0cm9uZz4iICsgb3B0aW9ucy50aXRsZSArICI8L3N0cm9uZz48L2Rpdj4iKTsKICAgIHJldHVybiBkaXY7CiAgfTsKCiAgdGhpcy5jb250cm9scy5hZGQobGVnZW5kLCBvcHRpb25zLmxheWVySWQpOwp9OwoKbWV0aG9kcy5hZGRMYXllcnNDb250cm9sID0gZnVuY3Rpb24gKGJhc2VHcm91cHMsIG92ZXJsYXlHcm91cHMsIG9wdGlvbnMpIHsKICB2YXIgX3RoaXM1ID0gdGhpczsKCiAgLy8gT25seSBhbGxvdyBvbmUgbGF5ZXJzIGNvbnRyb2wgYXQgYSB0aW1lCiAgbWV0aG9kcy5yZW1vdmVMYXllcnNDb250cm9sLmNhbGwodGhpcyk7CgogIHZhciBmaXJzdExheWVyID0gdHJ1ZTsKICB2YXIgYmFzZSA9IHt9OwogIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoYmFzZUdyb3VwcyksIGZ1bmN0aW9uIChpLCBnKSB7CiAgICB2YXIgbGF5ZXIgPSBfdGhpczUubGF5ZXJNYW5hZ2VyLmdldExheWVyR3JvdXAoZywgdHJ1ZSk7CiAgICBpZiAobGF5ZXIpIHsKICAgICAgYmFzZVtnXSA9IGxheWVyOwoKICAgICAgLy8gQ2hlY2sgaWYgPjEgYmFzZSBsYXllcnMgYXJlIHZpc2libGU7IGlmIHNvLCBoaWRlIGFsbCBidXQgdGhlIGZpcnN0IG9uZQogICAgICBpZiAoX3RoaXM1Lmhhc0xheWVyKGxheWVyKSkgewogICAgICAgIGlmIChmaXJzdExheWVyKSB7CiAgICAgICAgICBmaXJzdExheWVyID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzNS5yZW1vdmVMYXllcihsYXllcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CiAgdmFyIG92ZXJsYXkgPSB7fTsKICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKG92ZXJsYXlHcm91cHMpLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM1LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwogICAgaWYgKGxheWVyKSB7CiAgICAgIG92ZXJsYXlbZ10gPSBsYXllcjsKICAgIH0KICB9KTsKCiAgdGhpcy5jdXJyZW50TGF5ZXJzQ29udHJvbCA9IF9sZWFmbGV0Mi5kZWZhdWx0LmNvbnRyb2wubGF5ZXJzKGJhc2UsIG92ZXJsYXksIG9wdGlvbnMpOwogIHRoaXMuYWRkQ29udHJvbCh0aGlzLmN1cnJlbnRMYXllcnNDb250cm9sKTsKfTsKCm1ldGhvZHMucmVtb3ZlTGF5ZXJzQ29udHJvbCA9IGZ1bmN0aW9uICgpIHsKICBpZiAodGhpcy5jdXJyZW50TGF5ZXJzQ29udHJvbCkgewogICAgdGhpcy5yZW1vdmVDb250cm9sKHRoaXMuY3VycmVudExheWVyc0NvbnRyb2wpOwogICAgdGhpcy5jdXJyZW50TGF5ZXJzQ29udHJvbCA9IG51bGw7CiAgfQp9OwoKbWV0aG9kcy5hZGRTY2FsZUJhciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CgogIC8vIE9ubHkgYWxsb3cgb25lIHNjYWxlIGJhciBhdCBhIHRpbWUKICBtZXRob2RzLnJlbW92ZVNjYWxlQmFyLmNhbGwodGhpcyk7CgogIHZhciBzY2FsZUJhciA9IF9sZWFmbGV0Mi5kZWZhdWx0LmNvbnRyb2wuc2NhbGUob3B0aW9ucykuYWRkVG8odGhpcyk7CiAgdGhpcy5jdXJyZW50U2NhbGVCYXIgPSBzY2FsZUJhcjsKfTsKCm1ldGhvZHMucmVtb3ZlU2NhbGVCYXIgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHRoaXMuY3VycmVudFNjYWxlQmFyKSB7CiAgICB0aGlzLmN1cnJlbnRTY2FsZUJhci5yZW1vdmVGcm9tKHRoaXMpOwogICAgdGhpcy5jdXJyZW50U2NhbGVCYXIgPSBudWxsOwogIH0KfTsKCm1ldGhvZHMuaGlkZUdyb3VwID0gZnVuY3Rpb24gKGdyb3VwKSB7CiAgdmFyIF90aGlzNiA9IHRoaXM7CgogIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoZ3JvdXApLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM2LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwogICAgaWYgKGxheWVyKSB7CiAgICAgIF90aGlzNi5yZW1vdmVMYXllcihsYXllcik7CiAgICB9CiAgfSk7Cn07CgptZXRob2RzLnNob3dHcm91cCA9IGZ1bmN0aW9uIChncm91cCkgewogIHZhciBfdGhpczcgPSB0aGlzOwoKICBfanF1ZXJ5Mi5kZWZhdWx0LmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGdyb3VwKSwgZnVuY3Rpb24gKGksIGcpIHsKICAgIHZhciBsYXllciA9IF90aGlzNy5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChnLCB0cnVlKTsKICAgIGlmIChsYXllcikgewogICAgICBfdGhpczcuYWRkTGF5ZXIobGF5ZXIpOwogICAgfQogIH0pOwp9OwoKZnVuY3Rpb24gc2V0dXBTaG93SGlkZUdyb3Vwc09uWm9vbShtYXApIHsKICBpZiAobWFwLmxlYWZsZXRyLl9oYXNJbml0aWFsaXplZFNob3dIaWRlR3JvdXBzKSB7CiAgICByZXR1cm47CiAgfQogIG1hcC5sZWFmbGV0ci5faGFzSW5pdGlhbGl6ZWRTaG93SGlkZUdyb3VwcyA9IHRydWU7CgogIGZ1bmN0aW9uIHNldFZpc2liaWxpdHkobGF5ZXIsIHZpc2libGUpIHsKICAgIGlmICh2aXNpYmxlICE9PSBtYXAuaGFzTGF5ZXIobGF5ZXIpKSB7CiAgICAgIGlmICh2aXNpYmxlKSBtYXAuYWRkTGF5ZXIobGF5ZXIpO2Vsc2UgbWFwLnJlbW92ZUxheWVyKGxheWVyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dIaWRlR3JvdXBzT25ab29tKCkgewogICAgaWYgKCFtYXAubGF5ZXJNYW5hZ2VyKSByZXR1cm47CgogICAgdmFyIHpvb20gPSBtYXAuZ2V0Wm9vbSgpOwogICAgbWFwLmxheWVyTWFuYWdlci5nZXRBbGxHcm91cE5hbWVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHsKICAgICAgdmFyIGxheWVyID0gbWFwLmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGdyb3VwLCBmYWxzZSk7CiAgICAgIGlmIChsYXllciAmJiB0eXBlb2YgbGF5ZXIuem9vbUxldmVscyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBzZXRWaXNpYmlsaXR5KGxheWVyLCBsYXllci56b29tTGV2ZWxzID09PSB0cnVlIHx8IGxheWVyLnpvb21MZXZlbHMuaW5kZXhPZih6b29tKSA+PSAwKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBtYXAuc2hvd0hpZGVHcm91cHNPblpvb20gPSBzaG93SGlkZUdyb3Vwc09uWm9vbTsKICBtYXAub24oInpvb21lbmQiLCBzaG93SGlkZUdyb3Vwc09uWm9vbSk7Cn0KCm1ldGhvZHMuc2V0R3JvdXBPcHRpb25zID0gZnVuY3Rpb24gKGdyb3VwLCBvcHRpb25zKSB7CiAgdmFyIF90aGlzOCA9IHRoaXM7CgogIF9qcXVlcnkyLmRlZmF1bHQuZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoZ3JvdXApLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM4LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwogICAgLy8gVGhpcyBzbGlnaHRseSB0b3J0dXJlZCBjaGVjayBpcyBiZWNhdXNlIDAgaXMgYSB2YWxpZCB2YWx1ZSBmb3Igem9vbUxldmVscwogICAgaWYgKHR5cGVvZiBvcHRpb25zLnpvb21MZXZlbHMgIT09ICJ1bmRlZmluZWQiICYmIG9wdGlvbnMuem9vbUxldmVscyAhPT0gbnVsbCkgewogICAgICBsYXllci56b29tTGV2ZWxzID0gKDAsIF91dGlsLmFzQXJyYXkpKG9wdGlvbnMuem9vbUxldmVscyk7CiAgICB9CiAgfSk7CgogIHNldHVwU2hvd0hpZGVHcm91cHNPblpvb20odGhpcyk7CiAgdGhpcy5zaG93SGlkZUdyb3Vwc09uWm9vbSgpOwp9OwoKbWV0aG9kcy5hZGRSYXN0ZXJJbWFnZSA9IGZ1bmN0aW9uICh1cmksIGJvdW5kcywgb3BhY2l0eSwgYXR0cmlidXRpb24sIGxheWVySWQsIGdyb3VwKSB7CiAgLy8gdXJpIGlzIGEgZGF0YSBVUkkgY29udGFpbmluZyBhbiBpbWFnZS4gV2Ugd2FudCB0byBwYWludCB0aGlzIGltYWdlIGFzIGEKICAvLyBsYXllciBhdCAodG9wLWxlZnQpIGJvdW5kc1swXSB0byAoYm90dG9tLXJpZ2h0KSBib3VuZHNbMV0uCgogIC8vIFdlIGNhbid0IHNpbXBseSB1c2UgSW1hZ2VPdmVybGF5LCBhcyBpdCB1c2VzIGJpbGluZWFyIHNjYWxpbmcgd2hpY2ggbG9va3MKICAvLyBhd2Z1bCBhcyB5b3Ugem9vbSBpbiAoYW5kIHNvbWV0aW1lcyBzaGlmdHMgcG9zaXRpb25zIG9yIGRpc2FwcGVhcnMpLgogIC8vIEluc3RlYWQsIHdlJ2xsIHVzZSBhIFRpbGVMYXllci5DYW52YXMgdG8gZHJhdyBwaWVjZXMgb2YgdGhlIGltYWdlLgoKICAvLyBGaXJzdCwgc29tZSBoZWxwZXIgZnVuY3Rpb25zLgoKICAvLyBkZWdyZWUydGlsZSBjb252ZXJ0cyBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbmQgem9vbSB0byB4IGFuZCB5IHRpbGUKICAvLyBudW1iZXJzLiBUaGUgdGlsZSBudW1iZXJzIHJldHVybmVkIGNhbiBiZSBub24taW50ZWdyYWwsIGFzIHRoZXJlJ3Mgbm8KICAvLyByZWFzb24gdG8gZXhwZWN0IHRoYXQgdGhlIGxhdC9sbmcgaW5wdXRzIGFyZSBleGFjdGx5IG9uIHRoZSBib3JkZXIgb2YgdHdvCiAgLy8gdGlsZXMuCiAgLy8KICAvLyBXZSdsbCB1c2UgdGhpcyB0byBjb252ZXJ0IHRoZSBib3VuZHMgd2UgZ290IGZyb20gdGhlIHNlcnZlciwgaW50byBjb29yZHMKICAvLyBpbiB0aWxlLXNwYWNlIGF0IGEgZ2l2ZW4gem9vbSBsZXZlbC4gTm90ZSB0aGF0IG9uY2Ugd2UgZG8gdGhlIGNvbnZlcnNpb24sCiAgLy8gd2UgZG9uJ3QgdG8gZG8gYW55IG1vcmUgdHJpZ29ub21ldHJ5IHRvIGNvbnZlcnQgYmV0d2VlbiBwaXhlbCBjb29yZGluYXRlcwogIC8vIGFuZCB0aWxlIGNvb3JkaW5hdGVzOyB0aGUgc291cmNlIGltYWdlIHBpeGVsIGNvb3JkcywgZGVzdGluYXRpb24gY2FudmFzCiAgLy8gcGl4ZWwgY29vcmRzLCBhbmQgdGlsZSBjb29yZHMgYWxsIGNhbiBiZSBzY2FsZWQgbGluZWFybHkuCiAgZnVuY3Rpb24gZGVncmVlMnRpbGUobGF0LCBsbmcsIHpvb20pIHsKICAgIC8vIFNlZSBodHRwOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL1NsaXBweV9tYXBfdGlsZW5hbWVzCiAgICB2YXIgbGF0UmFkID0gbGF0ICogTWF0aC5QSSAvIDE4MDsKICAgIHZhciBuID0gTWF0aC5wb3coMiwgem9vbSk7CiAgICB2YXIgeCA9IChsbmcgKyAxODApIC8gMzYwICogbjsKICAgIHZhciB5ID0gKDEgLSBNYXRoLmxvZyhNYXRoLnRhbihsYXRSYWQpICsgMSAvIE1hdGguY29zKGxhdFJhZCkpIC8gTWF0aC5QSSkgLyAyICogbjsKICAgIHJldHVybiB7IHg6IHgsIHk6IHkgfTsKICB9CgogIC8vIEdpdmVuIGEgcmFuZ2UgW2Zyb20sdG8pIGFuZCBlaXRoZXIgb25lIG9yIHR3byBudW1iZXJzLCByZXR1cm5zIHRydWUgaWYKICAvLyB0aGVyZSBpcyBhbnkgb3ZlcmxhcCBiZXR3ZWVuIFt4LHgxKSBhbmQgdGhlIHJhbmdlLS1vciBpZiB4MSBpcyBvbWl0dGVkLAogIC8vIHRoZW4gcmV0dXJucyB0cnVlIGlmIHggaXMgd2l0aGluIFtmcm9tLHRvKS4KICBmdW5jdGlvbiBvdmVybGFwKGZyb20sIHRvLCB4LCAvKiBvcHRpb25hbCAqL3gxKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAzKSB4MSA9IHg7CiAgICByZXR1cm4geCA8IHRvICYmIHgxID49IGZyb207CiAgfQoKICBmdW5jdGlvbiBnZXRDYW52YXNTbW9vdGhpbmdQcm9wZXJ0eShjdHgpIHsKICAgIHZhciBjYW5kaWRhdGVzID0gWyJpbWFnZVNtb290aGluZ0VuYWJsZWQiLCAibW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwgIndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCIsICJtc0ltYWdlU21vb3RoaW5nRW5hYmxlZCJdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0eXBlb2YgY3R4W2NhbmRpZGF0ZXNbaV1dICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybiBjYW5kaWRhdGVzW2ldOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIE91ciBnZW5lcmFsIHN0cmF0ZWd5IGlzIHRvOgogIC8vIDEuIExvYWQgdGhlIGRhdGEgVVJJIGluIGFuIEltYWdlKCkgb2JqZWN0LCBzbyB3ZSBjYW4gZ2V0IGl0cyBwaXhlbAogIC8vICAgIGRpbWVuc2lvbnMgYW5kIHRoZSB1bmRlcmx5aW5nIGltYWdlIGRhdGEuIChXZSBjb3VsZCBoYXZlIGRvbmUgdGhpcwogIC8vICAgIGJ5IG5vdCBlbmNvZGluZyBhcyBQTkcgYXQgYWxsIGJ1dCBqdXN0IHNlbmQgYW4gYXJyYXkgb2YgUkdCQSB2YWx1ZXMKICAvLyAgICBmcm9tIHRoZSBzZXJ2ZXIsIGJ1dCB0aGF0IHdvdWxkIGluZmxhdGUgdGhlIEpTT04gdG9vIG11Y2guKQogIC8vIDIuIENyZWF0ZSBhIGhpZGRlbiBjYW52YXMgdGhhdCB3ZSB1c2UganVzdCB0byBleHRyYWN0IHRoZSBpbWFnZSBkYXRhCiAgLy8gICAgZnJvbSB0aGUgSW1hZ2UgKHVzaW5nIENvbnRleHQyRC5nZXRJbWFnZURhdGEoKSkuCiAgLy8gMy4gQ3JlYXRlIGEgVGlsZUxheWVyLkNhbnZhcyBhbmQgYWRkIGl0IHRvIHRoZSBtYXAuCgogIC8vIFdlIHdhbnQgdG8gc3luY2hyb25vdXNseSBjcmVhdGUgYW5kIGF0dGFjaCB0aGUgVGlsZUxheWVyLkNhbnZhcyAoc28gYW4KICAvLyBpbW1lZGlhdGUgY2FsbCB0byBjbGVhclJhc3RlcnMoKSB3aWxsIGJlIHJlc3BlY3RlZCwgZm9yIGV4YW1wbGUpLCBidXQKICAvLyBJbWFnZSBsb2FkcyBpdHMgZGF0YSBhc3luY2hyb25vdXNseS4gRm9ydHVuYXRlbHkgd2UgY2FuIHJlc29sdmUgdGhpcwogIC8vIGJ5IHB1dHRpbmcgVGlsZUxheWVyLkNhbnZhcyBpbnRvIGFzeW5jIG1vZGUsIHdoaWNoIHdpbGwgbGV0IHVzIGNyZWF0ZQogIC8vIGFuZCBhdHRhY2ggdGhlIGxheWVyIGJ1dCBoYXZlIGl0IHdhaXQgdW50aWwgdGhlIGltYWdlIGlzIGxvYWRlZCBiZWZvcmUKICAvLyBpdCBhY3R1YWxseSBkcmF3cyBhbnl0aGluZy4KCiAgLy8gVGhlc2UgYXJlIHRoZSB2YXJpYWJsZXMgdGhhdCB3ZSB3aWxsIHBvcHVsYXRlIG9uY2UgdGhlIGltYWdlIGlzIGxvYWRlZC4KICB2YXIgaW1nRGF0YSA9IG51bGw7IC8vIDFkIHJvdy1tYWpvciBhcnJheSwgZm91ciBbMC0yNTVdIGludGVnZXJzIHBlciBwaXhlbAogIHZhciBpbWdEYXRhTWlwTWFwcGVyID0gbnVsbDsKICB2YXIgdyA9IG51bGw7IC8vIGltYWdlIHdpZHRoIGluIHBpeGVscwogIHZhciBoID0gbnVsbDsgLy8gaW1hZ2UgaGVpZ2h0IGluIHBpeGVscwoKICAvLyBXZSdsbCB1c2UgdGhpcyBhcnJheSB0byBzdG9yZSBjYWxsYmFja3MgdGhhdCBuZWVkIHRvIGJlIGludm9rZWQgb25jZQogIC8vIGltZ0RhdGEsIHcsIGFuZCBoIGhhdmUgYmVlbiByZXNvbHZlZC4KICB2YXIgaW1nRGF0YUNhbGxiYWNrcyA9IFtdOwoKICAvLyBDb25zdW1lcnMgb2YgaW1nRGF0YSwgdywgYW5kIGggY2FuIGNhbGwgdGhpcyB0byBiZSBub3RpZmllZCB3aGVuIGRhdGEKICAvLyBpcyBhdmFpbGFibGUuIFVubGlrZSBtb3N0IGFzeW5jL3Byb21pc2UtYmFzZWQgQVBJcywgdGhlIGNhbGxiYWNrIHdpbGwKICAvLyBiZSBpbnZva2VkIGltbWVkaWF0ZWx5L3N5bmNocm9ub3VzbHkgaWYgdGhlIGRhdGEgaXMgYWxyZWFkeSBhdmFpbGFibGUuCiAgZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhKGNhbGxiYWNrKSB7CiAgICBpZiAoaW1nRGF0YSAhPSBudWxsKSB7CiAgICAgIGNhbGxiYWNrKGltZ0RhdGEsIHcsIGgsIGltZ0RhdGFNaXBNYXBwZXIpOwogICAgfSBlbHNlIHsKICAgICAgaW1nRGF0YUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9CgogIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgLy8gU2F2ZSBzaXplCiAgICB3ID0gaW1nLndpZHRoOwogICAgaCA9IGltZy5oZWlnaHQ7CgogICAgLy8gQ3JlYXRlIGEgZHVtbXkgY2FudmFzIHRvIGV4dHJhY3QgdGhlIGltYWdlIGRhdGEKICAgIHZhciBpbWdEYXRhQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBpbWdEYXRhQ2FudmFzLndpZHRoID0gdzsKICAgIGltZ0RhdGFDYW52YXMuaGVpZ2h0ID0gaDsKICAgIGltZ0RhdGFDYW52YXMuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1nRGF0YUNhbnZhcyk7CgogICAgdmFyIGltZ0RhdGFDdHggPSBpbWdEYXRhQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBpbWdEYXRhQ3R4LmRyYXdJbWFnZShpbWcsIDAsIDApOwoKICAgIC8vIFNhdmUgdGhlIGltYWdlIGRhdGEuCiAgICBpbWdEYXRhID0gaW1nRGF0YUN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTsKICAgIGltZ0RhdGFNaXBNYXBwZXIgPSBuZXcgX21pcG1hcHBlcjIuZGVmYXVsdChpbWcpOwoKICAgIC8vIERvbmUgd2l0aCB0aGUgY2FudmFzLCByZW1vdmUgaXQgZnJvbSB0aGUgcGFnZSBzbyBpdCBjYW4gYmUgZ2MnZC4KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW1nRGF0YUNhbnZhcyk7CgogICAgLy8gQWxlcnQgYW55IGdldEltYWdlRGF0YSBjYWxsZXJzIHdobyBhcmUgd2FpdGluZy4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1nRGF0YUNhbGxiYWNrcy5sZW5ndGg7IGkrKykgewogICAgICBpbWdEYXRhQ2FsbGJhY2tzW2ldKGltZ0RhdGEsIHcsIGgsIGltZ0RhdGFNaXBNYXBwZXIpOwogICAgfQogICAgaW1nRGF0YUNhbGxiYWNrcyA9IFtdOwogIH07CiAgaW1nLnNyYyA9IHVyaTsKCiAgdmFyIGNhbnZhc1RpbGVzID0gX2xlYWZsZXQyLmRlZmF1bHQuZ3JpZExheWVyKHsKICAgIG9wYWNpdHk6IG9wYWNpdHksCiAgICBhdHRyaWJ1dGlvbjogYXR0cmlidXRpb24sCiAgICBkZXRlY3RSZXRpbmE6IHRydWUsCiAgICBhc3luYzogdHJ1ZQogIH0pOwoKICBjYW52YXNUaWxlcy5jcmVhdGVUaWxlID0gZnVuY3Rpb24gKHRpbGVQb2ludCwgZG9uZSkgewogICAgdmFyIHpvb20gPSB0aWxlUG9pbnQuejsKICAgIHZhciBjYW52YXMgPSBfbGVhZmxldDIuZGVmYXVsdC5Eb21VdGlsLmNyZWF0ZSgiY2FudmFzIiwgImxlYWZsZXQtdGlsZSIpOwogICAgdmFyIGVycm9yID0gdm9pZCAwOwoKICAgIC8vIHNldHVwIHRpbGUgd2lkdGggYW5kIGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMKICAgIHZhciBzaXplID0gdGhpcy5nZXRUaWxlU2l6ZSgpOwogICAgY2FudmFzLndpZHRoID0gc2l6ZS54OwogICAgY2FudmFzLmhlaWdodCA9IHNpemUueTsKCiAgICBnZXRJbWFnZURhdGEoZnVuY3Rpb24gKGltZ0RhdGEsIHcsIGgsIG1pcG1hcHBlcikgewogICAgICB0cnkgewogICAgICAgIHZhciBfcmV0NyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIC8vIFRoZSBDb250ZXh0MkQgd2UnbGwgYmVpbmcgZHJhd2luZyBvbnRvLiBJdCdzIGFsd2F5cyAyNTZ4MjU2LgogICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoKICAgICAgICAgIC8vIENvbnZlcnQgb3VyIGltYWdlIGRhdGEncyB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IGxvY2F0aW9ucyBpbnRvCiAgICAgICAgICAvLyB4L3kgdGlsZSBjb29yZGluYXRlcy4gVGhpcyBpcyBlc3NlbnRpYWxseSBkb2luZyBhIHNwaGVyaWNhbCBtZXJjYXRvcgogICAgICAgICAgLy8gcHJvamVjdGlvbiwgdGhlbiBtdWx0aXBseWluZyBieSAyXnpvb20uCiAgICAgICAgICB2YXIgdG9wTGVmdCA9IGRlZ3JlZTJ0aWxlKGJvdW5kc1swXVswXSwgYm91bmRzWzBdWzFdLCB6b29tKTsKICAgICAgICAgIHZhciBib3R0b21SaWdodCA9IGRlZ3JlZTJ0aWxlKGJvdW5kc1sxXVswXSwgYm91bmRzWzFdWzFdLCB6b29tKTsKICAgICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBpbWFnZSBpbiB4L3kgdGlsZSBjb29yZGluYXRlcy4KICAgICAgICAgIHZhciBleHRlbnQgPSB7IHg6IGJvdHRvbVJpZ2h0LnggLSB0b3BMZWZ0LngsIHk6IGJvdHRvbVJpZ2h0LnkgLSB0b3BMZWZ0LnkgfTsKCiAgICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIHRpbGUgaXMgdG90YWxseSBkaXNqb2ludCBmcm9tIGltYWdlLgogICAgICAgICAgaWYgKCFvdmVybGFwKHRpbGVQb2ludC54LCB0aWxlUG9pbnQueCArIDEsIHRvcExlZnQueCwgYm90dG9tUmlnaHQueCkpIHJldHVybiB7CiAgICAgICAgICAgICAgdjogdm9pZCAwCiAgICAgICAgICAgIH07CiAgICAgICAgICBpZiAoIW92ZXJsYXAodGlsZVBvaW50LnksIHRpbGVQb2ludC55ICsgMSwgdG9wTGVmdC55LCBib3R0b21SaWdodC55KSkgcmV0dXJuIHsKICAgICAgICAgICAgICB2OiB2b2lkIDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAvLyBUaGUgbGluZWFyIHJlc29sdXRpb24gb2YgdGhlIHRpbGUgd2UncmUgZHJhd2luZyBpcyBhbHdheXMgMjU2cHggcGVyIHRpbGUgdW5pdC4KICAgICAgICAgIC8vIElmIHRoZSBsaW5lYXIgcmVzb2x1dGlvbiAoaW4gZWl0aGVyIGRpcmVjdGlvbikgb2YgdGhlIGltYWdlIGlzIGxlc3MgdGhhbiAyNTZweAogICAgICAgICAgLy8gcGVyIHRpbGUgdW5pdCwgdGhlbiB1c2UgbmVhcmVzdCBuZWlnaGJvcjsgb3RoZXJ3aXNlLCB1c2UgdGhlIGNhbnZhcydzIGJ1aWx0LWluCiAgICAgICAgICAvLyBzY2FsaW5nLgogICAgICAgICAgdmFyIGltZ1JlcyA9IHsKICAgICAgICAgICAgeDogdyAvIGV4dGVudC54LAogICAgICAgICAgICB5OiBoIC8gZXh0ZW50LnkKICAgICAgICAgIH07CgogICAgICAgICAgLy8gV2UgY2FuIGRvIHRoZSBhY3R1YWwgZHJhd2luZyBpbiBvbmUgb2YgdGhyZWUgd2F5czoKICAgICAgICAgIC8vIC0gQ2FsbCBkcmF3SW1hZ2UoKS4gVGhpcyBpcyBlYXN5IGFuZCBmYXN0LCBhbmQgcmVzdWx0cyBpbiBzbW9vdGgKICAgICAgICAgIC8vICAgaW50ZXJwb2xhdGlvbiAoYmlsaW5lYXI/KS4gVGhpcyBpcyB3aGF0IHdlIHdhbnQgd2hlbiB3ZSBhcmUKICAgICAgICAgIC8vICAgcmVkdWNpbmcgdGhlIGltYWdlIGZyb20gaXRzIG5hdGl2ZSBzaXplLgogICAgICAgICAgLy8gLSBDYWxsIGRyYXdJbWFnZSgpIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlLiBUaGlzIGlzIGVhc3kKICAgICAgICAgIC8vICAgYW5kIGZhc3QgYW5kIGdpdmVzIHVzIG5lYXJlc3QtbmVpZ2hib3IgaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgd2hhdAogICAgICAgICAgLy8gICB3ZSB3YW50IHdoZW4gZW5sYXJnaW5nIHRoZSBpbWFnZS4gSG93ZXZlciwgaXQncyB1bnN1cHBvcnRlZCBvbiBtYW55CiAgICAgICAgICAvLyAgIGJyb3dzZXJzIChpbmNsdWRpbmcgUXRXZWJraXQpLgogICAgICAgICAgLy8gLSBEbyBhIG1hbnVhbCBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24uIFRoaXMgaXMgd2hhdCB3ZSdsbCBmYWxsCiAgICAgICAgICAvLyAgIGJhY2sgdG8gd2hlbiBlbmxhcmdpbmcsIGFuZCBpbWFnZVNtb290aGluZ0VuYWJsZWQgaXNuJ3Qgc3VwcG9ydGVkLgogICAgICAgICAgLy8gICBJbiB0aGVvcnkgaXQncyBzbG93ZXIsIGJ1dCBzdGlsbCBwcmV0dHkgZmFzdCBvbiBteSBtYWNoaW5lLCBhbmQgdGhlCiAgICAgICAgICAvLyAgIHJlc3VsdHMgbG9vayB0aGUgc2FtZSBBRkFJQ1QuCgogICAgICAgICAgLy8gSXMgaW1hZ2VTbW9vdGhpbmdFbmFibGVkIHN1cHBvcnRlZD8gSWYgc28sIHdlIGNhbiBsZXQgY2FudmFzIGRvCiAgICAgICAgICAvLyBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24gZm9yIHVzLgogICAgICAgICAgdmFyIHNtb290aGluZ1Byb3BlcnR5ID0gZ2V0Q2FudmFzU21vb3RoaW5nUHJvcGVydHkoY3R4KTsKCiAgICAgICAgICBpZiAoc21vb3RoaW5nUHJvcGVydHkgfHwgaW1nUmVzLnggPj0gMjU2ICYmIGltZ1Jlcy55ID49IDI1NikgewogICAgICAgICAgICAvLyBVc2UgYnVpbHQtaW4gc2NhbGluZwoKICAgICAgICAgICAgLy8gVHVybiBvZmYgYW50aS1hbGlhc2luZyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgaWYgKHNtb290aGluZ1Byb3BlcnR5KSB7CiAgICAgICAgICAgICAgY3R4W3Ntb290aGluZ1Byb3BlcnR5XSA9IGltZ1Jlcy54ID49IDI1NiAmJiBpbWdSZXMueSA+PSAyNTY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERvbid0IG5lY2Vzc2FyaWx5IGRyYXcgd2l0aCB0aGUgZnVsbC1zaXplIGltYWdlOyBpZiB3ZSdyZQogICAgICAgICAgICAvLyBkb3duc2NhbGluZywgdXNlIHRoZSBtaXBtYXBwZXIgdG8gZ2V0IGEgcHJlLWRvd25zY2FsZWQgaW1hZ2UKICAgICAgICAgICAgLy8gKHNlZSBjb21tZW50cyBvbiBNaXBtYXBwZXIgY2xhc3MgZm9yIHdoeSB0aGlzIG1hdHRlcnMpLgogICAgICAgICAgICBtaXBtYXBwZXIuZ2V0QnlTaXplKGV4dGVudC54ICogMjU2LCBleHRlbnQueSAqIDI1NiwgZnVuY3Rpb24gKG1pcCkgewogICAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgaW1hZ2Ugd2lsbCBnbyBvZmYgdGhlIGVkZ2Ugb2YgdGhlIGNhbnZhcy0tCiAgICAgICAgICAgICAgLy8gdGhhdCdzIE9LLCB0aGUgY2FudmFzIHNob3VsZCBjbGlwIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShtaXAsCiAgICAgICAgICAgICAgLy8gQ29udmVydCBhYnMgdGlsZSBjb29yZHMgdG8gcmVsIHRpbGUgY29vcmRzLCB0aGVuICoyNTYgdG8gY29udmVydAogICAgICAgICAgICAgIC8vIHRvIHJlbCBwaXhlbCBjb29yZHMKICAgICAgICAgICAgICAodG9wTGVmdC54IC0gdGlsZVBvaW50LngpICogMjU2LCAodG9wTGVmdC55IC0gdGlsZVBvaW50LnkpICogMjU2LAogICAgICAgICAgICAgIC8vIEFsd2F5cyBkcmF3IHRoZSB3aG9sZSB0aGluZyBhbmQgbGV0IGNhbnZhcyBjbGlwOyBzbyB3ZSBjYW4ganVzdAogICAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBzaXplIGluIHRpbGUgY29vcmRzIHN0cmFpZ2h0IHRvIHBpeGVscwogICAgICAgICAgICAgIGV4dGVudC54ICogMjU2LCBleHRlbnQueSAqIDI1Nik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVXNlIG1hbnVhbCBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24KCiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc291cmNlIGltYWdlIHBpeGVsIGNvb3JkaW5hdGVzIHRoYXQgY29ycmVzcG9uZCB3aXRoCiAgICAgICAgICAgIC8vIHRoZSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IG9mIHRoaXMgdGlsZS4gKElmIHRoZSBzb3VyY2UgaW1hZ2UKICAgICAgICAgICAgLy8gb25seSBwYXJ0aWFsbHkgb3ZlcmxhcHMgdGhlIHRpbGUsIHdlIHVzZSBtYXgvbWluIHRvIGxpbWl0IHRoZQogICAgICAgICAgICAvLyBzb3VyY2VTdGFydC9FbmQgdG8gb25seSByZWZsZWN0IHRoZSBvdmVybGFwcGluZyBwb3J0aW9uLikKICAgICAgICAgICAgdmFyIHNvdXJjZVN0YXJ0ID0gewogICAgICAgICAgICAgIHg6IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRpbGVQb2ludC54IC0gdG9wTGVmdC54KSAqIGltZ1Jlcy54KSksCiAgICAgICAgICAgICAgeTogTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGlsZVBvaW50LnkgLSB0b3BMZWZ0LnkpICogaW1nUmVzLnkpKQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc291cmNlRW5kID0gewogICAgICAgICAgICAgIHg6IE1hdGgubWluKHcsIE1hdGguY2VpbCgodGlsZVBvaW50LnggKyAxIC0gdG9wTGVmdC54KSAqIGltZ1Jlcy54KSksCiAgICAgICAgICAgICAgeTogTWF0aC5taW4oaCwgTWF0aC5jZWlsKCh0aWxlUG9pbnQueSArIDEgLSB0b3BMZWZ0LnkpICogaW1nUmVzLnkpKQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gVGhlIHNpemUsIGluIGRlc3QgcGl4ZWxzLCB0aGF0IGVhY2ggc291cmNlIHBpeGVsIHNob3VsZCBvY2N1cHkuCiAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gMSAoZS5nLiBpZiB4IGFuZCB5IHJlc29sdXRpb24KICAgICAgICAgICAgLy8gYXJlIHZlcnkgZGlmZmVyZW50KS4KICAgICAgICAgICAgdmFyIHBpeGVsU2l6ZSA9IHsKICAgICAgICAgICAgICB4OiAyNTYgLyBpbWdSZXMueCwKICAgICAgICAgICAgICB5OiAyNTYgLyBpbWdSZXMueQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gRm9yIGVhY2ggcGl4ZWwgaW4gdGhlIHNvdXJjZSBpbWFnZSB0aGF0IG92ZXJsYXBzIHRoZSB0aWxlLi4uCiAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IHNvdXJjZVN0YXJ0Lnk7IHJvdyA8IHNvdXJjZUVuZC55OyByb3crKykgewogICAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IHNvdXJjZVN0YXJ0Lng7IGNvbCA8IHNvdXJjZUVuZC54OyBjb2wrKykgewogICAgICAgICAgICAgICAgLy8gLi4uZXh0cmFjdCB0aGUgcGl4ZWwgZGF0YS4uLgogICAgICAgICAgICAgICAgdmFyIGkgPSAocm93ICogdyArIGNvbCkgKiA0OwogICAgICAgICAgICAgICAgdmFyIHIgPSBpbWdEYXRhW2ldOwogICAgICAgICAgICAgICAgdmFyIGcgPSBpbWdEYXRhW2kgKyAxXTsKICAgICAgICAgICAgICAgIHZhciBiID0gaW1nRGF0YVtpICsgMl07CiAgICAgICAgICAgICAgICB2YXIgYSA9IGltZ0RhdGFbaSArIDNdOwogICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKCIgKyBbciwgZywgYiwgYSAvIDI1NV0uam9pbigiLCIpICsgIikiOwoKICAgICAgICAgICAgICAgIC8vIC4uLmNhbGN1bGF0ZSB0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBjb29yZCBpbiB0aGUgZGVzdCBpbWFnZQogICAgICAgICAgICAgICAgLy8gd2hlcmUgaXQgc2hvdWxkIGJlIGRyYXduLi4uCiAgICAgICAgICAgICAgICB2YXIgcGl4ZWxQb3MgPSB7CiAgICAgICAgICAgICAgICAgIHg6IChjb2wgLyBpbWdSZXMueCArIHRvcExlZnQueCAtIHRpbGVQb2ludC54KSAqIDI1NiwKICAgICAgICAgICAgICAgICAgeTogKHJvdyAvIGltZ1Jlcy55ICsgdG9wTGVmdC55IC0gdGlsZVBvaW50LnkpICogMjU2CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBkcmF3IGEgcmVjdGFuZ2xlIHRoZXJlLgogICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KE1hdGgucm91bmQocGl4ZWxQb3MueCksIE1hdGgucm91bmQocGl4ZWxQb3MueSksCiAgICAgICAgICAgICAgICAvLyBMb29rcyBjcmF6eSwgYnV0IHRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgcm91bmRpbmcgZnJvbQogICAgICAgICAgICAgICAgLy8gY2F1c2luZyBvdmVybGFwIGJldHdlZW4gdGhpcyByZWN0IGFuZCBpdHMgbmVpZ2hib3JzLiBUaGUKICAgICAgICAgICAgICAgIC8vIG1pbnVlbmQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXh0IHBpeGVsLCB3aGlsZSB0aGUKICAgICAgICAgICAgICAgIC8vIHN1YnRyYWhlbmQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHBpeGVsICh0byB0dXJuIGFuCiAgICAgICAgICAgICAgICAvLyBhYnNvbHV0ZSBjb29yZGluYXRlIHRvIGEgd2lkdGgvaGVpZ2h0KS4gWWVzLCBJIGhhZCB0byBsb29rCiAgICAgICAgICAgICAgICAvLyB1cCBtaW51ZW5kIGFuZCBzdWJ0cmFoZW5kLgogICAgICAgICAgICAgICAgTWF0aC5yb3VuZChwaXhlbFBvcy54ICsgcGl4ZWxTaXplLngpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy54KSwgTWF0aC5yb3VuZChwaXhlbFBvcy55ICsgcGl4ZWxTaXplLnkpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy55KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSgpOwoKICAgICAgICBpZiAoKHR5cGVvZiBfcmV0NyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoX3JldDcpKSA9PT0gIm9iamVjdCIpIHJldHVybiBfcmV0Ny52OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGRvbmUoZXJyb3IsIGNhbnZhcyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNhbnZhczsKICB9OwoKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihjYW52YXNUaWxlcywgImltYWdlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKbWV0aG9kcy5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImltYWdlIiwgbGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFySW1hZ2VzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJpbWFnZSIpOwp9OwoKbWV0aG9kcy5hZGRNZWFzdXJlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAvLyBpZiBhIG1lYXN1cmVDb250cm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdCBhbmQKICAvLyAgIHJlcGxhY2Ugd2l0aCBhIG5ldyBvbmUKICBtZXRob2RzLnJlbW92ZU1lYXN1cmUuY2FsbCh0aGlzKTsKICB0aGlzLm1lYXN1cmVDb250cm9sID0gX2xlYWZsZXQyLmRlZmF1bHQuY29udHJvbC5tZWFzdXJlKG9wdGlvbnMpOwogIHRoaXMuYWRkQ29udHJvbCh0aGlzLm1lYXN1cmVDb250cm9sKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWVhc3VyZSA9IGZ1bmN0aW9uICgpIHsKICBpZiAodGhpcy5tZWFzdXJlQ29udHJvbCkgewogICAgdGhpcy5yZW1vdmVDb250cm9sKHRoaXMubWVhc3VyZUNvbnRyb2wpOwogICAgdGhpcy5tZWFzdXJlQ29udHJvbCA9IG51bGw7CiAgfQp9OwoKbWV0aG9kcy5hZGRTZWxlY3QgPSBmdW5jdGlvbiAoY3RHcm91cCkgewogIHZhciBfdGhpczkgPSB0aGlzOwoKICBtZXRob2RzLnJlbW92ZVNlbGVjdC5jYWxsKHRoaXMpOwoKICB0aGlzLl9zZWxlY3RCdXR0b24gPSBfbGVhZmxldDIuZGVmYXVsdC5lYXN5QnV0dG9uKHsKICAgIHN0YXRlczogW3sKICAgICAgc3RhdGVOYW1lOiAic2VsZWN0LWluYWN0aXZlIiwKICAgICAgaWNvbjogImlvbi1xci1zY2FubmVyIiwKICAgICAgdGl0bGU6ICJNYWtlIGEgc2VsZWN0aW9uIiwKICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhidG4sIG1hcCkgewogICAgICAgIGJ0bi5zdGF0ZSgic2VsZWN0LWFjdGl2ZSIpOwogICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIgPSBuZXcgX2xlYWZsZXQyLmRlZmF1bHQuTG9jYXRpb25GaWx0ZXIyKCk7CgogICAgICAgIGlmIChjdEdyb3VwKSB7CiAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9uSGFuZGxlID0gbmV3IGdsb2JhbC5jcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKGN0R3JvdXApOwogICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGUub24oImNoYW5nZSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgaWYgKGUuc2VuZGVyICE9PSBzZWxlY3Rpb25IYW5kbGUpIHsKICAgICAgICAgICAgICAgIGlmIChfdGhpczkuX2xvY2F0aW9uRmlsdGVyKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1pbmFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihlKSB7CiAgICAgICAgICAgICAgX3RoaXM5LmxheWVyTWFuYWdlci5icnVzaChfdGhpczkuX2xvY2F0aW9uRmlsdGVyLmdldEJvdW5kcygpLCB7IHNlbmRlcjogc2VsZWN0aW9uSGFuZGxlIH0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyLm9uKCJlbmFibGVkIiwgaGFuZGxlcik7CiAgICAgICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIub24oImNoYW5nZSIsIGhhbmRsZXIpOwogICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyLm9uKCJkaXNhYmxlZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGUuY2xvc2UoKTsKICAgICAgICAgICAgICBfdGhpczkuX2xvY2F0aW9uRmlsdGVyID0gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSgpOwogICAgICAgIH0KCiAgICAgICAgX3RoaXM5Ll9sb2NhdGlvbkZpbHRlci5hZGRUbyhtYXApOwogICAgICB9CiAgICB9LCB7CiAgICAgIHN0YXRlTmFtZTogInNlbGVjdC1hY3RpdmUiLAogICAgICBpY29uOiAiaW9uLWNsb3NlLXJvdW5kIiwKICAgICAgdGl0bGU6ICJEaXNtaXNzIHNlbGVjdGlvbiIsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soYnRuLCBtYXApIHsKICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1pbmFjdGl2ZSIpOwogICAgICAgIF90aGlzOS5fbG9jYXRpb25GaWx0ZXIuZGlzYWJsZSgpOwogICAgICAgIC8vIElmIGV4cGxpY2l0bHkgZGlzbWlzc2VkLCBjbGVhciB0aGUgY3Jvc3N0YWxrIHNlbGVjdGlvbnMKICAgICAgICBfdGhpczkubGF5ZXJNYW5hZ2VyLnVuYnJ1c2goKTsKICAgICAgfQogICAgfV0KICB9KTsKCiAgdGhpcy5fc2VsZWN0QnV0dG9uLmFkZFRvKHRoaXMpOwp9OwoKbWV0aG9kcy5yZW1vdmVTZWxlY3QgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHRoaXMuX2xvY2F0aW9uRmlsdGVyKSB7CiAgICB0aGlzLl9sb2NhdGlvbkZpbHRlci5kaXNhYmxlKCk7CiAgfQoKICBpZiAodGhpcy5fc2VsZWN0QnV0dG9uKSB7CiAgICB0aGlzLnJlbW92ZUNvbnRyb2wodGhpcy5fc2VsZWN0QnV0dG9uKTsKICAgIHRoaXMuX3NlbGVjdEJ1dHRvbiA9IG51bGw7CiAgfQp9OwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHsiLi9jbHVzdGVyLWxheWVyLXN0b3JlIjoxLCIuL2Nyc191dGlscyI6MywiLi9kYXRhZnJhbWUiOjQsIi4vZ2xvYmFsL2h0bWx3aWRnZXRzIjo2LCIuL2dsb2JhbC9qcXVlcnkiOjcsIi4vZ2xvYmFsL2xlYWZsZXQiOjgsIi4vZ2xvYmFsL3NoaW55IjoxMCwiLi9taXBtYXBwZXIiOjE0LCIuL3V0aWwiOjE1fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKLy8gVGhpcyBjbGFzcyBzaW11bGF0ZXMgYSBtaXBtYXAsIHdoaWNoIHNocmlua3MgaW1hZ2VzIGJ5IHBvd2VycyBvZiB0d28uIFRoaXMKLy8gc3RlcHdpc2UgcmVkdWN0aW9uIHJlc3VsdHMgaW4gInBpeGVsLXBlcmZlY3QgZG93bnNjYWxpbmciICh3aGVyZSBldmVyeQovLyBwaXhlbCBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgaGFzIHNvbWUgY29udHJpYnV0aW9uIHRvIHRoZSBkb3duc2NhbGVkIGltYWdlKQovLyBhcyBvcHBvc2VkIHRvIGEgc2luZ2xlLXN0ZXAgZG93bnNjYWxpbmcgd2hpY2ggd2lsbCBkaXNjYXJkIGEgbG90IG9mIGRhdGEKLy8gKGFuZCB3aXRoIHNwYXJzZSBpbWFnZXMgYXQgc21hbGwgc2NhbGVzIGNhbiBnaXZlIHZlcnkgc3VycHJpc2luZyByZXN1bHRzKS4KCnZhciBNaXBtYXBwZXIgPSBmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gTWlwbWFwcGVyKGltZykgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1pcG1hcHBlcik7CgogICAgdGhpcy5fbGF5ZXJzID0gW2ltZ107CiAgfQoKICAvLyBUaGUgdmFyaW91cyBmdW5jdGlvbnMgb24gdGhpcyBjbGFzcyB0YWtlIGEgY2FsbGJhY2sgZnVuY3Rpb24gQlVUIE1BWSBPUiBNQVkKICAvLyBOT1QgYWN0dWFsbHkgYmVoYXZlIGFzeW5jaHJvbm91c2x5LgoKCiAgX2NyZWF0ZUNsYXNzKE1pcG1hcHBlciwgW3sKICAgIGtleTogImdldEJ5U2l6ZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlTaXplKGRlc2lyZWRXaWR0aCwgZGVzaXJlZEhlaWdodCwgY2FsbGJhY2spIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIHZhciBpID0gMDsKICAgICAgdmFyIGxhc3RJbWcgPSB0aGlzLl9sYXllcnNbMF07CiAgICAgIHZhciB0ZXN0TmV4dCA9IGZ1bmN0aW9uIHRlc3ROZXh0KCkgewogICAgICAgIF90aGlzLmdldEJ5SW5kZXgoaSwgZnVuY3Rpb24gKGltZykgewogICAgICAgICAgLy8gSWYgY3VycmVudCBpbWFnZSBpcyBpbnZhbGlkIChpLmUuIHRvbyBzbWFsbCB0byBiZSByZW5kZXJlZCkgb3IKICAgICAgICAgIC8vIGl0J3Mgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudGVkLCByZXR1cm4gdGhlIGxhc3Qga25vd24gZ29vZCBpbWFnZS4KICAgICAgICAgIGlmICghaW1nIHx8IGltZy53aWR0aCA8IGRlc2lyZWRXaWR0aCB8fCBpbWcuaGVpZ2h0IDwgZGVzaXJlZEhlaWdodCkgewogICAgICAgICAgICBjYWxsYmFjayhsYXN0SW1nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGFzdEltZyA9IGltZzsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB0ZXN0TmV4dCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIHRlc3ROZXh0KCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0QnlJbmRleCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnlJbmRleChpLCBjYWxsYmFjaykgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIGlmICh0aGlzLl9sYXllcnNbaV0pIHsKICAgICAgICBjYWxsYmFjayh0aGlzLl9sYXllcnNbaV0pOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5nZXRCeUluZGV4KGkgLSAxLCBmdW5jdGlvbiAocHJldkltZykgewogICAgICAgIGlmICghcHJldkltZykgewogICAgICAgICAgLy8gcHJldkltZyBjb3VsZCBub3QgYmUgY2FsY3VsYXRlZCAodG9vIHNtYWxsLCBwb3NzaWJseSkKICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocHJldkltZy53aWR0aCA8IDIgfHwgcHJldkltZy5oZWlnaHQgPCAyKSB7CiAgICAgICAgICAvLyBDYW4ndCByZWR1Y2UgdGhpcyBpbWFnZSBhbnkgZnVydGhlcgogICAgICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIElmIHJlZHVjZSBldmVyIGJlY29tZXMgdHJ1bHkgYXN5bmNocm9ub3VzLCB3ZSBzaG91bGQgc3R1ZmYgYSBwcm9taXNlIG9yCiAgICAgICAgLy8gc29tZXRoaW5nIGludG8gdGhpcy5fbGF5ZXJzW2ldIGJlZm9yZSBjYWxsaW5nIHRoaXMucmVkdWNlKCksIHRvIHByZXZlbnQKICAgICAgICAvLyByZWR1bmRhbnQgcmVkdWNlIG9wZXJhdGlvbnMgZnJvbSBoYXBwZW5pbmcuCiAgICAgICAgX3RoaXMyLnJlZHVjZShwcmV2SW1nLCBmdW5jdGlvbiAocmVkdWNlZEltZykgewogICAgICAgICAgX3RoaXMyLl9sYXllcnNbaV0gPSByZWR1Y2VkSW1nOwogICAgICAgICAgY2FsbGJhY2socmVkdWNlZEltZyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogInJlZHVjZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVkdWNlKGltZywgY2FsbGJhY2spIHsKICAgICAgdmFyIGltZ0RhdGFDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgaW1nRGF0YUNhbnZhcy53aWR0aCA9IE1hdGguY2VpbChpbWcud2lkdGggLyAyKTsKICAgICAgaW1nRGF0YUNhbnZhcy5oZWlnaHQgPSBNYXRoLmNlaWwoaW1nLmhlaWdodCAvIDIpOwogICAgICBpbWdEYXRhQ2FudmFzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1nRGF0YUNhbnZhcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGltZ0RhdGFDdHggPSBpbWdEYXRhQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgaW1nRGF0YUN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGggLyAyLCBpbWcuaGVpZ2h0IC8gMik7CiAgICAgICAgY2FsbGJhY2soaW1nRGF0YUNhbnZhcyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbWdEYXRhQ2FudmFzKTsKICAgICAgfQogICAgfQogIH1dKTsKCiAgcmV0dXJuIE1pcG1hcHBlcjsKfSgpOwoKZXhwb3J0cy5kZWZhdWx0ID0gTWlwbWFwcGVyOwoKCn0se31dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmxvZyA9IGxvZzsKZXhwb3J0cy5yZWN5Y2xlID0gcmVjeWNsZTsKZXhwb3J0cy5hc0FycmF5ID0gYXNBcnJheTsKZnVuY3Rpb24gbG9nKG1lc3NhZ2UpIHsKICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovCiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5sb2cpIGNvbnNvbGUubG9nKG1lc3NhZ2UpOwogIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqLwp9CgpmdW5jdGlvbiByZWN5Y2xlKHZhbHVlcywgbGVuZ3RoLCBpblBsYWNlKSB7CiAgaWYgKGxlbmd0aCA9PT0gMCAmJiAhaW5QbGFjZSkgcmV0dXJuIFtdOwoKICBpZiAoISh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkpIHsKICAgIGlmIChpblBsYWNlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuJ3QgZG8gaW4tcGxhY2UgcmVjeWNsaW5nIG9mIGEgbm9uLUFycmF5IHZhbHVlIik7CiAgICB9CiAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICB9CiAgaWYgKHR5cGVvZiBsZW5ndGggPT09ICJ1bmRlZmluZWQiKSBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOwoKICB2YXIgZGVzdCA9IGluUGxhY2UgPyB2YWx1ZXMgOiBbXTsKICB2YXIgb3JpZ0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CiAgd2hpbGUgKGRlc3QubGVuZ3RoIDwgbGVuZ3RoKSB7CiAgICBkZXN0LnB1c2godmFsdWVzW2Rlc3QubGVuZ3RoICUgb3JpZ0xlbmd0aF0pOwogIH0KICBpZiAoZGVzdC5sZW5ndGggPiBsZW5ndGgpIHsKICAgIGRlc3Quc3BsaWNlKGxlbmd0aCwgZGVzdC5sZW5ndGggLSBsZW5ndGgpOwogIH0KICByZXR1cm4gZGVzdDsKfQoKZnVuY3Rpb24gYXNBcnJheSh2YWx1ZSkgewogIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gdmFsdWU7ZWxzZSByZXR1cm4gW3ZhbHVlXTsKfQoKCn0se31dfSx7fSxbMTFdKTsK"></script>
<link href="data:text/css;charset=utf-8,%0Aslide%3Anot%28%2Ecurrent%29%20%2Eplotly%2Ehtml%2Dwidget%7B%0Adisplay%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqCiogcGxvdGx5LmpzIHYxLjIzLjEKKiBDb3B5cmlnaHQgMjAxMi0yMDE3LCBQbG90bHksIEluYy4KKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQoqLwohZnVuY3Rpb24odCl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciBlO2U9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGUuUGxvdGx5PXQoKX19KGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIGkobyxzKXtpZighcltvXSl7aWYoIWVbb10pe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZsKXJldHVybiBsKG8sITApO2lmKGEpcmV0dXJuIGEobywhMCk7dmFyIHU9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IHUuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsdX12YXIgYz1yW29dPXtleHBvcnRzOnt9fTtlW29dWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciByPWVbb11bMV1bdF07cmV0dXJuIGkocj9yOnQpfSxjLGMuZXhwb3J0cyx0LGUscixuKX1yZXR1cm4gcltvXS5leHBvcnRzfWZvcih2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxvPTA7bzxuLmxlbmd0aDtvKyspaShuW29dKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vc3JjL2xpYiIpLGk9eyJYLFggZGl2IjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmO21hcmdpbjowO3BhZGRpbmc6MDsiLCJYIGlucHV0LFggYnV0dG9uIjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyIsIlggaW5wdXQ6Zm9jdXMsWCBidXR0b246Zm9jdXMiOiJvdXRsaW5lOm5vbmU7IiwiWCBhIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCBhOmhvdmVyIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCAuY3Jpc3AiOiJzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczsiLCJYIC51c2VyLXNlbGVjdC1ub25lIjoiLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstby11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7IiwiWCBzdmciOiJvdmVyZmxvdzpoaWRkZW47IiwiWCBzdmcgYSI6ImZpbGw6IzQ0N2FkYjsiLCJYIHN2ZyBhOmhvdmVyIjoiZmlsbDojM2M2ZGM1OyIsIlggLm1haW4tc3ZnIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BvaW50ZXItZXZlbnRzOm5vbmU7IiwiWCAubWFpbi1zdmcgLmRyYWdsYXllciI6InBvaW50ZXItZXZlbnRzOmFsbDsiLCJYIC5jdXJzb3ItcG9pbnRlciI6ImN1cnNvcjpwb2ludGVyOyIsIlggLmN1cnNvci1jcm9zc2hhaXIiOiJjdXJzb3I6Y3Jvc3NoYWlyOyIsIlggLmN1cnNvci1tb3ZlIjoiY3Vyc29yOm1vdmU7IiwiWCAuY3Vyc29yLWNvbC1yZXNpemUiOiJjdXJzb3I6Y29sLXJlc2l6ZTsiLCJYIC5jdXJzb3Itcm93LXJlc2l6ZSI6ImN1cnNvcjpyb3ctcmVzaXplOyIsIlggLmN1cnNvci1ucy1yZXNpemUiOiJjdXJzb3I6bnMtcmVzaXplOyIsIlggLmN1cnNvci1ldy1yZXNpemUiOiJjdXJzb3I6ZXctcmVzaXplOyIsIlggLmN1cnNvci1zdy1yZXNpemUiOiJjdXJzb3I6c3ctcmVzaXplOyIsIlggLmN1cnNvci1zLXJlc2l6ZSI6ImN1cnNvcjpzLXJlc2l6ZTsiLCJYIC5jdXJzb3Itc2UtcmVzaXplIjoiY3Vyc29yOnNlLXJlc2l6ZTsiLCJYIC5jdXJzb3Itdy1yZXNpemUiOiJjdXJzb3I6dy1yZXNpemU7IiwiWCAuY3Vyc29yLWUtcmVzaXplIjoiY3Vyc29yOmUtcmVzaXplOyIsIlggLmN1cnNvci1udy1yZXNpemUiOiJjdXJzb3I6bnctcmVzaXplOyIsIlggLmN1cnNvci1uLXJlc2l6ZSI6ImN1cnNvcjpuLXJlc2l6ZTsiLCJYIC5jdXJzb3ItbmUtcmVzaXplIjoiY3Vyc29yOm5lLXJlc2l6ZTsiLCJYIC5tb2RlYmFyIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtyaWdodDoycHg7ei1pbmRleDoxMDAxO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjcpOyIsIlggLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczstbW96LXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczt0cmFuc2l0aW9uOm9wYWNpdHkgMC4zcyBlYXNlIDBzOyIsIlg6aG92ZXIgLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eToxOyIsIlggLm1vZGViYXItZ3JvdXAiOiJmbG9hdDpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW4tbGVmdDo4cHg7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDsiLCJYIC5tb2RlYmFyLWdyb3VwOmZpcnN0LWNoaWxkIjoibWFyZ2luLWxlZnQ6MHB4OyIsIlggLm1vZGViYXItYnRuIjoicG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjE2cHg7cGFkZGluZzozcHggNHB4O2N1cnNvcjpwb2ludGVyO2xpbmUtaGVpZ2h0Om5vcm1hbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7IiwiWCAubW9kZWJhci1idG4gc3ZnIjoicG9zaXRpb246cmVsYXRpdmU7dG9wOjJweDsiLCJYIC5tb2RlYmFyLWJ0biBwYXRoIjoiZmlsbDpyZ2JhKDAsMzEsOTUsMC4zKTsiLCJYIC5tb2RlYmFyLWJ0bi5hY3RpdmUgcGF0aCxYIC5tb2RlYmFyLWJ0bjpob3ZlciBwYXRoIjoiZmlsbDpyZ2JhKDAsMjIsNzIsMC41KTsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyI6InBhZGRpbmc6M3B4IDFweDsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyBwYXRoIjoiZmlsbDojNDQ3YWRiICFpbXBvcnRhbnQ7IiwiWCBbZGF0YS10aXRsZV06YmVmb3JlLFggW2RhdGEtdGl0bGVdOmFmdGVyIjoicG9zaXRpb246YWJzb2x1dGU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTstby10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO2Rpc3BsYXk6bm9uZTtvcGFjaXR5OjA7ei1pbmRleDoxMDAxO3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjExMCU7cmlnaHQ6NTAlOyIsIlggW2RhdGEtdGl0bGVdOmhvdmVyOmJlZm9yZSxYIFtkYXRhLXRpdGxlXTpob3ZlcjphZnRlciI6ImRpc3BsYXk6YmxvY2s7b3BhY2l0eToxOyIsIlggW2RhdGEtdGl0bGVdOmJlZm9yZSI6ImNvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6NnB4IHNvbGlkIHRyYW5zcGFyZW50O3otaW5kZXg6MTAwMjttYXJnaW4tdG9wOi0xMnB4O2JvcmRlci1ib3R0b20tY29sb3I6IzY5NzM4YTttYXJnaW4tcmlnaHQ6LTZweDsiLCJYIFtkYXRhLXRpdGxlXTphZnRlciI6ImNvbnRlbnQ6YXR0cihkYXRhLXRpdGxlKTtiYWNrZ3JvdW5kOiM2OTczOGE7Y29sb3I6d2hpdGU7cGFkZGluZzo4cHggMTBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxMnB4O3doaXRlLXNwYWNlOm5vd3JhcDttYXJnaW4tcmlnaHQ6LTE4cHg7Ym9yZGVyLXJhZGl1czoycHg7IiwiWCAuc2VsZWN0LW91dGxpbmUiOiJmaWxsOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7IiwiWCAuc2VsZWN0LW91dGxpbmUtMSI6InN0cm9rZTp3aGl0ZTsiLCJYIC5zZWxlY3Qtb3V0bGluZS0yIjoic3Ryb2tlOmJsYWNrO3N0cm9rZS1kYXNoYXJyYXk6MnB4IDJweDsiLFk6ImZvbnQtZmFtaWx5OidPcGVuIFNhbnMnO3Bvc2l0aW9uOmZpeGVkO3RvcDo1MHB4O3JpZ2h0OjIwcHg7ei1pbmRleDoxMDAwMDtmb250LXNpemU6MTBwdDttYXgtd2lkdGg6MTgwcHg7IiwiWSBwIjoibWFyZ2luOjA7IiwiWSAubm90aWZpZXItbm90ZSI6Im1pbi13aWR0aDoxODBweDttYXgtd2lkdGg6MjUwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO3otaW5kZXg6MzAwMDttYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiM4Yzk3YWY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE0MCwxNTEsMTc1LDAuOSk7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7IiwiWSAubm90aWZpZXItY2xvc2UiOiJjb2xvcjojZmZmO29wYWNpdHk6MC44O2Zsb2F0OnJpZ2h0O3BhZGRpbmc6MCA1cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MjBweDsiLCJZIC5ub3RpZmllci1jbG9zZTpob3ZlciI6ImNvbG9yOiM0NDQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7In07Zm9yKHZhciBhIGluIGkpe3ZhciBvPWEucmVwbGFjZSgvXiwvLCIgLCIpLnJlcGxhY2UoL1gvZywiLmpzLXBsb3RseS1wbG90IC5wbG90bHkiKS5yZXBsYWNlKC9ZL2csIi5wbG90bHktbm90aWZpZXIiKTtuLmFkZFN0eWxlUnVsZShvLGlbYV0pfX0seyIuLi9zcmMvbGliIjo2NjB9XSwyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dW5kbzp7d2lkdGg6ODU3LjEscGF0aDoibTg1NyAzNTBxMC04Ny0zNC0xNjZ0LTkxLTEzNy0xMzctOTItMTY2LTM0cS05NiAwLTE4MyA0MXQtMTQ3IDExNHEtNCA2LTQgMTN0NSAxMWw3NiA3N3E2IDUgMTQgNSA5LTEgMTMtNyA0MS01MyAxMDAtODJ0MTI2LTI5cTU4IDAgMTEwIDIzdDkyIDYxIDYxIDkxIDIyIDExMS0yMiAxMTEtNjEgOTEtOTIgNjEtMTEwIDIzcS01NSAwLTEwNS0yMHQtOTAtNTdsNzctNzdxMTctMTYgOC0zOC0xMC0yMy0zMy0yM2gtMjUwcS0xNSAwLTI1IDExdC0xMSAyNXYyNTBxMCAyNCAyMiAzMyAyMiAxMCAzOS04bDcyLTcycTYwIDU3IDEzNyA4OHQxNTkgMzFxODcgMCAxNjYtMzR0MTM3LTkyIDkxLTEzNyAzNC0xNjZ6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0saG9tZTp7d2lkdGg6OTI4LjYscGF0aDoibTc4NiAyOTZ2LTI2N3EwLTE1LTExLTI2dC0yNS0xMGgtMjE0djIxNGgtMTQzdi0yMTRoLTIxNHEtMTUgMC0yNSAxMHQtMTEgMjZ2MjY3cTAgMSAwIDJ0MCAybDMyMSAyNjQgMzIxLTI2NHExLTEgMS00eiBtMTI0IDM5bC0zNC00MXEtNS01LTEyLTZoLTJxLTcgMC0xMiAzbC0zODYgMzIyLTM4Ni0zMjJxLTctNC0xMy00LTcgMi0xMiA3bC0zNSA0MXEtNCA1LTMgMTN0NiAxMmw0MDEgMzM0cTE4IDE1IDQyIDE1dDQzLTE1bDEzNi0xMTR2MTA5cTAgOCA1IDEzdDEzIDVoMTA3cTggMCAxMy01dDUtMTN2LTIyN2wxMjItMTAycTUtNSA2LTEydC00LTEzeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCJjYW1lcmEtcmV0cm8iOnt3aWR0aDoxZTMscGF0aDoibTUxOCAzODZxMCA4LTUgMTN0LTEzIDVxLTM3IDAtNjMtMjd0LTI2LTYzcTAtOCA1LTEzdDEzLTUgMTIgNSA1IDEzcTAgMjMgMTYgMzh0MzggMTZxOCAwIDEzIDV0NSAxM3ogbTEyNS03M3EwLTU5LTQyLTEwMXQtMTAxLTQyLTEwMSA0Mi00MiAxMDEgNDIgMTAxIDEwMSA0MiAxMDEtNDIgNDItMTAxeiBtLTU3Mi0zMjBoODU4djcxaC04NTh2LTcxeiBtNjQzIDMyMHEwIDg5LTYyIDE1MnQtMTUyIDYyLTE1MS02Mi02My0xNTIgNjMtMTUxIDE1MS02MyAxNTIgNjMgNjIgMTUxeiBtLTU3MSAzNThoMjE0djcyaC0yMTR2LTcyeiBtLTcyLTEwN2g4NTh2MTQzaC00NjJsLTM2LTcxaC0zNjB2LTcyeiBtOTI5IDE0M3YtNzE0cTAtMzAtMjEtNTF0LTUwLTIxaC04NThxLTI5IDAtNTAgMjF0LTIxIDUxdjcxNHEwIDMwIDIxIDUxdDUwIDIxaDg1OHEyOSAwIDUwLTIxdDIxLTUxeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHpvb21ib3g6e3dpZHRoOjFlMyxwYXRoOiJtMTAwMC0yNWwtMjUwIDI1MWM0MCA2MyA2MyAxMzggNjMgMjE4IDAgMjI0LTE4MiA0MDYtNDA3IDQwNi0yMjQgMC00MDYtMTgyLTQwNi00MDZzMTgzLTQwNiA0MDctNDA2YzgwIDAgMTU1IDIyIDIxOCA2MmwyNTAtMjUwIDEyNSAxMjV6IG0tODEyIDI1MGwwIDQzOCA0MzcgMCAwLTQzOC00MzcgMHogbTYyIDM3NWwzMTMgMCAwLTMxMi0zMTMgMCAwIDMxMnoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxwYW46e3dpZHRoOjFlMyxwYXRoOiJtMTAwMCAzNTBsLTE4NyAxODggMC0xMjUtMjUwIDAgMCAyNTAgMTI1IDAtMTg4IDE4Ny0xODctMTg3IDEyNSAwIDAtMjUwLTI1MCAwIDAgMTI1LTE4OC0xODggMTg2LTE4NyAwIDEyNSAyNTIgMCAwLTI1MC0xMjUgMCAxODctMTg4IDE4OCAxODgtMTI1IDAgMCAyNTAgMjUwIDAgMC0xMjYgMTg3IDE4OHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX3BsdXM6e3dpZHRoOjFlMyxwYXRoOiJtMSA3ODdsMC04NzUgODc1IDAgMCA4NzUtODc1IDB6IG02ODctNTAwbC0xODcgMCAwLTE4Ny0xMjUgMCAwIDE4Ny0xODggMCAwIDEyNSAxODggMCAwIDE4NyAxMjUgMCAwLTE4NyAxODcgMCAwLTEyNXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX21pbnVzOnt3aWR0aDoxZTMscGF0aDoibTAgNzg4bDAtODc2IDg3NSAwIDAgODc2LTg3NSAweiBtNjg4LTUwMGwtNTAwIDAgMCAxMjUgNTAwIDAgMC0xMjV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sYXV0b3NjYWxlOnt3aWR0aDoxZTMscGF0aDoibTI1MCA4NTBsLTE4NyAwLTYzIDAgMC02MiAwLTE4OCA2MyAwIDAgMTg4IDE4NyAwIDAgNjJ6IG02ODggMGwtMTg4IDAgMC02MiAxODggMCAwLTE4OCA2MiAwIDAgMTg4IDAgNjItNjIgMHogbS04NzUtOTM4bDAgMTg4LTYzIDAgMC0xODggMC02MiA2MyAwIDE4NyAwIDAgNjItMTg3IDB6IG04NzUgMTg4bDAtMTg4LTE4OCAwIDAtNjIgMTg4IDAgNjIgMCAwIDYyIDAgMTg4LTYyIDB6IG0tMTI1IDE4OGwtMSAwLTkzLTk0LTE1NiAxNTYgMTU2IDE1NiA5Mi05MyAyIDAgMCAyNTAtMjUwIDAgMC0yIDkzLTkyLTE1Ni0xNTYtMTU2IDE1NiA5NCA5MiAwIDItMjUwIDAgMC0yNTAgMCAwIDkzIDkzIDE1Ny0xNTYtMTU3LTE1Ni05MyA5NCAwIDAgMC0yNTAgMjUwIDAgMCAwLTk0IDkzIDE1NiAxNTcgMTU2LTE1Ny05My05MyAwIDAgMjUwIDAgMCAyNTB6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sdG9vbHRpcF9iYXNpYzp7d2lkdGg6MTUwMCxwYXRoOiJtMzc1IDcyNWwwIDAtMzc1LTM3NSAzNzUtMzc0IDAtMSAxMTI1IDAgMCA3NTAtMTEyNSAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHRvb2x0aXBfY29tcGFyZTp7d2lkdGg6MTEyNSxwYXRoOiJtMTg3IDc4NmwwIDItMTg3LTE4OCAxODgtMTg3IDAgMCA5MzcgMCAwIDM3My05MzggMHogbTAtNDk5bDAgMS0xODctMTg4IDE4OC0xODggMCAwIDkzNyAwIDAgMzc2LTkzOC0xeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHBsb3RseWxvZ286e3dpZHRoOjE1NDIscGF0aDoibTAtMTBoMTgydi0xNDBoLTE4MnYxNDB6IG0yMjggMTQ2aDE4M3YtMjg2aC0xODN2Mjg2eiBtMjI1IDcxNGgxODJ2LTEwMDBoLTE4MnYxMDAweiBtMjI1LTI4NWgxODJ2LTcxNWgtMTgydjcxNXogbTIyNSAxNDJoMTgzdi04NTdoLTE4M3Y4NTd6IG0yMzEtNDI4aDE4MnYtNDI5aC0xODJ2NDI5eiBtMjI1LTI5MWgxODN2LTEzOGgtMTgzdjEzOHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSwiei1heGlzIjp7d2lkdGg6MWUzLHBhdGg6Im04MzMgNWwtMTcgMTA4djQxbC0xMzAtNjUgMTMwLTY2YzAgMCAwIDM4IDAgMzkgMC0xIDM2LTE0IDM5LTI1IDQtMTUtNi0yMi0xNi0zMC0xNS0xMi0zOS0xNi01Ni0yMC05MC0yMi0xODctMjMtMjc5LTIzLTI2MSAwLTM0MSAzNC0zNTMgNTkgMyA2MCAyMjggMTEwIDIyOCAxMTAtMTQwLTgtMzUxLTM1LTM1MS0xMTYgMC0xMjAgMjkzLTE0MiA0NzQtMTQyIDE1NSAwIDQ3NyAyMiA0NzcgMTQyIDAgNTAtNzQgNzktMTYzIDk2eiBtLTM3NCA5NGMtNTgtNS05OS0yMS05OS00MCAwLTI0IDY1LTQzIDE0NC00MyA3OSAwIDE0MyAxOSAxNDMgNDMgMCAxOS00MiAzNC05OCA0MHYyMTZoODdsLTEzMiAxMzUtMTMzLTEzNWg4OHYtMjE2eiBtMTY3IDUxNWgtMTM2djFjMTYgMTYgMzEgMzQgNDYgNTJsODQgMTA5djU0aC0yMzB2LTcxaDEyNHYtMWMtMTYtMTctMjgtMzItNDQtNTFsLTg5LTExNHYtNTFoMjQ1djcyeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCIzZF9yb3RhdGUiOnt3aWR0aDoxZTMscGF0aDoibTkyMiA2NjBjLTUgNC05IDctMTQgMTEtMzU5IDI2My01ODAtMzEtNTgwLTMxbC0xMDIgMjggNTgtNDAwYzAgMSAxIDEgMiAyIDExOCAxMDggMzUxIDI0OSAzNTEgMjQ5cy02MiAyNy0xMDAgNDJjODggODMgMjIyIDE4MyAzNDcgMTIyIDE2LTggMzAtMTcgNDQtMjctMiAxLTQgMi02IDR6IG0zNi0zMjljMCAwIDY0IDIyOS04OCAyOTYtNjIgMjctMTI0IDE0LTE3NS0xMSAxNTctNzggMjI1LTIwOCAyNDktMjY2IDgtMTkgMTEtMzEgMTEtMzEgMiA1IDYgMTUgMTEgMzItNS0xMy04LTIwLTgtMjB6IG0tNzc1LTIzOWM3MC0zMSAxMTctNTAgMTk4LTMyLTEyMSA4MC0xOTkgMzQ2LTE5OSAzNDZsLTk2LTE1LTU4LTEyYzAgMCA1NS0yMjYgMTU1LTI4N3ogbTYwMyAxMzNsLTMxNy0xMzljMCAwIDQtNCAxOS0xNCA3LTUgMjQtMTUgMjQtMTVzLTE3Ny0xNDctMzg5IDRjMjM1LTI4NyA1MzYtMTEyIDUzNi0xMTJsMzEtMjIgMTAwIDI5OS00LTF6IG0tMjk4LTE1M2M2LTQgMTQtOSAyNC0xNSAwIDAtMTcgMTAtMjQgMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sY2FtZXJhOnt3aWR0aDoxZTMscGF0aDoibTUwMCA0NTBjLTgzIDAtMTUwLTY3LTE1MC0xNTAgMC04MyA2Ny0xNTAgMTUwLTE1MCA4MyAwIDE1MCA2NyAxNTAgMTUwIDAgODMtNjcgMTUwLTE1MCAxNTB6IG00MDAgMTUwaC0xMjBjLTE2IDAtMzQgMTMtMzkgMjlsLTMxIDkzYy02IDE1LTIzIDI4LTQwIDI4aC0zNDBjLTE2IDAtMzQtMTMtMzktMjhsLTMxLTk0Yy02LTE1LTIzLTI4LTQwLTI4aC0xMjBjLTU1IDAtMTAwLTQ1LTEwMC0xMDB2LTQ1MGMwLTU1IDQ1LTEwMCAxMDAtMTAwaDgwMGM1NSAwIDEwMCA0NSAxMDAgMTAwdjQ1MGMwIDU1LTQ1IDEwMC0xMDAgMTAweiBtLTQwMC01NTBjLTEzOCAwLTI1MCAxMTItMjUwIDI1MCAwIDEzOCAxMTIgMjUwIDI1MCAyNTAgMTM4IDAgMjUwLTExMiAyNTAtMjUwIDAtMTM4LTExMi0yNTAtMjUwLTI1MHogbTM2NSAzODBjLTE5IDAtMzUgMTYtMzUgMzUgMCAxOSAxNiAzNSAzNSAzNSAxOSAwIDM1LTE2IDM1LTM1IDAtMTktMTYtMzUtMzUtMzV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sbW92aWU6e3dpZHRoOjFlMyxwYXRoOiJtOTM4IDQxM2wtMTg4LTEyNWMwIDM3LTE3IDcxLTQ0IDk0IDY0IDM4IDEwNyAxMDcgMTA3IDE4NyAwIDEyMS05OCAyMTktMjE5IDIxOS0xMjEgMC0yMTktOTgtMjE5LTIxOSAwLTYxIDI1LTExNyA2Ni0xNTZoLTExNWMzMCAzMyA0OSA3NiA0OSAxMjUgMCAxMDMtODQgMTg3LTE4NyAxODdzLTE4OC04NC0xODgtMTg3YzAtNTcgMjYtMTA3IDY1LTE0MS0zOC0yMi02NS02Mi02NS0xMDl2LTI1MGMwLTcwIDU2LTEyNiAxMjUtMTI2aDUwMGM2OSAwIDEyNSA1NiAxMjUgMTI2bDE4OC0xMjZjMzQgMCA2MiAyOCA2MiA2M3YzNzVjMCAzNS0yOCA2My02MiA2M3ogbS03NTAgMGMtNjkgMC0xMjUgNTYtMTI1IDEyNXM1NiAxMjUgMTI1IDEyNSAxMjUtNTYgMTI1LTEyNS01Ni0xMjUtMTI1LTEyNXogbTQwNi0xYy04NyAwLTE1NyA3MC0xNTcgMTU3IDAgODYgNzAgMTU2IDE1NyAxNTZzMTU2LTcwIDE1Ni0xNTYtNzAtMTU3LTE1Ni0xNTd6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0scXVlc3Rpb246e3dpZHRoOjg1Ny4xLHBhdGg6Im01MDAgODJ2MTA3cTAgOC01IDEzdC0xMyA1aC0xMDdxLTggMC0xMy01dC01LTEzdi0xMDdxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3ogbTE0MyAzNzVxMCA0OS0zMSA5MXQtNzcgNjUtOTUgMjNxLTEzNiAwLTIwNy0xMTktOS0xNCA0LTI0bDc0LTU1cTQtNCAxMC00IDkgMCAxNCA3IDMwIDM4IDQ4IDUxIDE5IDE0IDQ4IDE0IDI3IDAgNDgtMTV0MjEtMzNxMC0yMS0xMS0zNHQtMzgtMjVxLTM1LTE2LTY1LTQ4dC0yOS03MHYtMjBxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3EwIDEwIDEyIDI3dDMwIDI4cTE4IDEwIDI4IDE2dDI1IDE5IDI1IDI3IDE2IDM0IDcgNDV6IG0yMTQtMTA3cTAtMTE3LTU3LTIxNXQtMTU2LTE1Ni0yMTUtNTgtMjE2IDU4LTE1NSAxNTYtNTggMjE1IDU4IDIxNSAxNTUgMTU2IDIxNiA1OCAyMTUtNTggMTU2LTE1NiA1Ny0yMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sZGlzazp7d2lkdGg6ODU3LjEscGF0aDoibTIxNC03aDQyOXYyMTRoLTQyOXYtMjE0eiBtNTAwIDBoNzJ2NTAwcTAgOC02IDIxdC0xMSAyMGwtMTU3IDE1NnEtNSA2LTE5IDEydC0yMiA1di0yMzJxMC0yMi0xNS0zOHQtMzgtMTZoLTMyMnEtMjIgMC0zNyAxNnQtMTYgMzh2MjMyaC03MnYtNzE0aDcydjIzMnEwIDIyIDE2IDM4dDM3IDE2aDQ2NXEyMiAwIDM4LTE2dDE1LTM4di0yMzJ6IG0tMjE0IDUxOHYxNzhxMCA4LTUgMTN0LTEzIDVoLTEwN3EtNyAwLTEzLTV0LTUtMTN2LTE3OHEwLTggNS0xM3QxMy01aDEwN3E3IDAgMTMgNXQ1IDEzeiBtMzU3LTE4di01MThxMC0yMi0xNS0zOHQtMzgtMTZoLTc1MHEtMjMgMC0zOCAxNnQtMTYgMzh2NzUwcTAgMjIgMTYgMzh0MzggMTZoNTE3cTIzIDAgNTAtMTJ0NDItMjZsMTU2LTE1N3ExNi0xNSAyNy00MnQxMS00OXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxsYXNzbzp7d2lkdGg6MTAzMSxwYXRoOiJtMTAxOCA1MzhjLTM2IDIwNy0yOTAgMzM2LTU2OCAyODYtMjc3LTQ4LTQ3My0yNTYtNDM2LTQ2MyAxMC01NyAzNi0xMDggNzYtMTUxLTEzLTY2IDExLTEzNyA2OC0xODMgMzQtMjggNzUtNDEgMTE0LTQybC01NS03MCAwIDBjLTItMS0zLTItNC0zLTEwLTE0LTgtMzQgNS00NSAxNC0xMSAzNC04IDQ1IDQgMSAxIDIgMyAyIDVsMCAwIDExMyAxNDBjMTYgMTEgMzEgMjQgNDUgNDAgNCAzIDYgNyA4IDExIDQ4LTMgMTAwIDAgMTUxIDkgMjc4IDQ4IDQ3MyAyNTUgNDM2IDQ2MnogbS02MjQtMzc5Yy04MCAxNC0xNDkgNDgtMTk3IDk2IDQyIDQyIDEwOSA0NyAxNTYgOSAzMy0yNiA0Ny02NiA0MS0xMDV6IG0tMTg3LTc0Yy0xOSAxNi0zMyAzNy0zOSA2MCA1MC0zMiAxMDktNTUgMTc0LTY4LTQyLTI1LTk1LTI0LTEzNSA4eiBtMzYwIDc1Yy0zNC03LTY5LTktMTAyLTggOCA2Mi0xNiAxMjgtNjggMTcwLTczIDU5LTE3NSA1NC0yNDQtNS05IDIwLTE2IDQwLTIwIDYxLTI4IDE1OSAxMjEgMzE3IDMzMyAzNTRzNDA3LTYwIDQzNC0yMTdjMjgtMTU5LTEyMS0zMTgtMzMzLTM1NXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxzZWxlY3Rib3g6e3dpZHRoOjFlMyxwYXRoOiJtMCA4NTBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODYgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NSAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0tODU3LTI4NmwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTg1NyAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtLTg1Ny0yODVsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG04NTcgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbS04NTctMjg2bDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODUgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NiAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9fX0se31dLDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYmFyIil9LHsiLi4vc3JjL3RyYWNlcy9iYXIiOjc4Mn1dLDQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYm94Iil9LHsiLi4vc3JjL3RyYWNlcy9ib3giOjc5NH1dLDU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy9jb21wb25lbnRzL2NhbGVuZGFycyIpfSx7Ii4uL3NyYy9jb21wb25lbnRzL2NhbGVuZGFycyI6NTU2fV0sNjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9jYW5kbGVzdGljayIpfSx7Ii4uL3NyYy90cmFjZXMvY2FuZGxlc3RpY2siOjgwMn1dLDc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY2hvcm9wbGV0aCIpfSx7Ii4uL3NyYy90cmFjZXMvY2hvcm9wbGV0aCI6ODA3fV0sODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9jb250b3VyIil9LHsiLi4vc3JjL3RyYWNlcy9jb250b3VyIjo4MTd9XSw5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvY29yZSIpfSx7Ii4uL3NyYy9jb3JlIjo2NDZ9XSwxMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIil9LHsiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIjo5NDh9XSwxMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZ3JvdXBieSIpfSx7Ii4uL3NyYy90cmFuc2Zvcm1zL2dyb3VwYnkiOjk0OX1dLDEyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiKX0seyIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiOjgzMn1dLDEzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hlYXRtYXBnbCIpfSx7Ii4uL3NyYy90cmFjZXMvaGVhdG1hcGdsIjo4NDF9XSwxNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0iKX0seyIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbSI6ODQ5fV0sMTU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmQiKX0seyIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbTJkIjo4NTR9XSwxNjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0yZGNvbnRvdXIiKX0seyIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbTJkY29udG91ciI6ODU4fV0sMTc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9jb3JlIik7bi5yZWdpc3RlcihbdCgiLi9iYXIiKSx0KCIuL2JveCIpLHQoIi4vaGVhdG1hcCIpLHQoIi4vaGlzdG9ncmFtIiksdCgiLi9oaXN0b2dyYW0yZCIpLHQoIi4vaGlzdG9ncmFtMmRjb250b3VyIiksdCgiLi9waWUiKSx0KCIuL2NvbnRvdXIiKSx0KCIuL3NjYXR0ZXJ0ZXJuYXJ5IiksdCgiLi9zY2F0dGVyM2QiKSx0KCIuL3N1cmZhY2UiKSx0KCIuL21lc2gzZCIpLHQoIi4vc2NhdHRlcmdlbyIpLHQoIi4vY2hvcm9wbGV0aCIpLHQoIi4vc2NhdHRlcmdsIiksdCgiLi9wb2ludGNsb3VkIiksdCgiLi9oZWF0bWFwZ2wiKSx0KCIuL3NjYXR0ZXJtYXBib3giKSx0KCIuL29obGMiKSx0KCIuL2NhbmRsZXN0aWNrIildKSxuLnJlZ2lzdGVyKFt0KCIuL2ZpbHRlciIpLHQoIi4vZ3JvdXBieSIpXSksbi5yZWdpc3RlcihbdCgiLi9jYWxlbmRhcnMiKV0pLGUuZXhwb3J0cz1ufSx7Ii4vYmFyIjozLCIuL2JveCI6NCwiLi9jYWxlbmRhcnMiOjUsIi4vY2FuZGxlc3RpY2siOjYsIi4vY2hvcm9wbGV0aCI6NywiLi9jb250b3VyIjo4LCIuL2NvcmUiOjksIi4vZmlsdGVyIjoxMCwiLi9ncm91cGJ5IjoxMSwiLi9oZWF0bWFwIjoxMiwiLi9oZWF0bWFwZ2wiOjEzLCIuL2hpc3RvZ3JhbSI6MTQsIi4vaGlzdG9ncmFtMmQiOjE1LCIuL2hpc3RvZ3JhbTJkY29udG91ciI6MTYsIi4vbWVzaDNkIjoxOCwiLi9vaGxjIjoxOSwiLi9waWUiOjIwLCIuL3BvaW50Y2xvdWQiOjIxLCIuL3NjYXR0ZXIzZCI6MjIsIi4vc2NhdHRlcmdlbyI6MjMsIi4vc2NhdHRlcmdsIjoyNCwiLi9zY2F0dGVybWFwYm94IjoyNSwiLi9zY2F0dGVydGVybmFyeSI6MjYsIi4vc3VyZmFjZSI6Mjd9XSwxODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9tZXNoM2QiKX0seyIuLi9zcmMvdHJhY2VzL21lc2gzZCI6ODYyfV0sMTk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvb2hsYyIpfSx7Ii4uL3NyYy90cmFjZXMvb2hsYyI6ODY3fV0sMjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvcGllIil9LHsiLi4vc3JjL3RyYWNlcy9waWUiOjg3NX1dLDIxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3BvaW50Y2xvdWQiKX0seyIuLi9zcmMvdHJhY2VzL3BvaW50Y2xvdWQiOjg4NH1dLDIyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXIzZCIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcjNkIjo5MTR9XSwyMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2VvIil9LHsiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2VvIjo5MjB9XSwyNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2wiKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJnbCI6OTI1fV0sMjU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcm1hcGJveCIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcm1hcGJveCI6OTMyfV0sMjY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcnRlcm5hcnkiKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJ0ZXJuYXJ5Ijo5Mzh9XSwyNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zdXJmYWNlIil9LHsiLi4vc3JjL3RyYWNlcy9zdXJmYWNlIjo5NDd9XSwyODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dD10fHxkb2N1bWVudC5ib2R5LGU9ZXx8e307dmFyIHI9Wy4wMSwxLzBdOyJkaXN0YW5jZUxpbWl0cyJpbiBlJiYoclswXT1lLmRpc3RhbmNlTGltaXRzWzBdLHJbMV09ZS5kaXN0YW5jZUxpbWl0c1sxXSksInpvb21NaW4iaW4gZSYmKHJbMF09ZS56b29tTWluKSwiem9vbU1heCJpbiBlJiYoclsxXT1lLnpvb21NYXgpO3ZhciBuPWEoe2NlbnRlcjplLmNlbnRlcnx8WzAsMCwwXSx1cDplLnVwfHxbMCwxLDBdLGV5ZTplLmV5ZXx8WzAsMCwxMF0sbW9kZTplLm1vZGV8fCJvcmJpdCIsZGlzdGFuY2VMaW1pdHM6cn0pLGw9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLHU9MCxjPXQuY2xpZW50V2lkdGgsaD10LmNsaWVudEhlaWdodCxmPXt2aWV3Om4sZWxlbWVudDp0LGRlbGF5OmUuZGVsYXl8fDE2LHJvdGF0ZVNwZWVkOmUucm90YXRlU3BlZWR8fDEsem9vbVNwZWVkOmUuem9vbVNwZWVkfHwxLHRyYW5zbGF0ZVNwZWVkOmUudHJhbnNsYXRlU3BlZWR8fDEsZmxpcFg6ISFlLmZsaXBYLGZsaXBZOiEhZS5mbGlwWSxtb2RlczpuLm1vZGVzLHRpY2s6ZnVuY3Rpb24oKXt2YXIgZT1pKCkscj10aGlzLmRlbGF5O24uaWRsZShlLXIpLG4uZmx1c2goZS0oMTAwKzIqcikpO3ZhciBhPWUtMipyO24ucmVjYWxjTWF0cml4KGEpO2Zvcih2YXIgbz0hMCxzPW4uY29tcHV0ZWRNYXRyaXgsZj0wO2Y8MTY7KytmKW89byYmbFtmXT09PXNbZl0sbFtmXT1zW2ZdO3ZhciBkPXQuY2xpZW50V2lkdGg9PT1jJiZ0LmNsaWVudEhlaWdodD09PWg7cmV0dXJuIGM9dC5jbGllbnRXaWR0aCxoPXQuY2xpZW50SGVpZ2h0LG8/IWQ6KHU9TWF0aC5leHAobi5jb21wdXRlZFJhZGl1c1swXSksITApfSxsb29rQXQ6ZnVuY3Rpb24odCxlLHIpe24ubG9va0F0KG4ubGFzdFQoKSx0LGUscil9LHJvdGF0ZTpmdW5jdGlvbih0LGUscil7bi5yb3RhdGUobi5sYXN0VCgpLHQsZSxyKX0scGFuOmZ1bmN0aW9uKHQsZSxyKXtuLnBhbihuLmxhc3RUKCksdCxlLHIpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlLHIpe24udHJhbnNsYXRlKG4ubGFzdFQoKSx0LGUscil9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmLHttYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBuLmNvbXB1dGVkTWF0cml4fSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0TWF0cml4KG4ubGFzdFQoKSx0KSxuLmNvbXB1dGVkTWF0cml4fSxlbnVtZXJhYmxlOiEwfSxtb2RlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXRNb2RlKCl9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gbi5zZXRNb2RlKHQpLG4uZ2V0TW9kZSgpfSxlbnVtZXJhYmxlOiEwfSxjZW50ZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBuLmNvbXB1dGVkQ2VudGVyfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4ubG9va0F0KG4ubGFzdFQoKSx0KSxuLmNvbXB1dGVkQ2VudGVyfSxlbnVtZXJhYmxlOiEwfSxleWU6e2dldDpmdW5jdGlvbigpe3JldHVybiBuLmNvbXB1dGVkRXllfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4ubG9va0F0KG4ubGFzdFQoKSxudWxsLHQpLG4uY29tcHV0ZWRFeWV9LGVudW1lcmFibGU6ITB9LHVwOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZFVwfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4ubG9va0F0KG4ubGFzdFQoKSxudWxsLG51bGwsdCksbi5jb21wdXRlZFVwfSxlbnVtZXJhYmxlOiEwfSxkaXN0YW5jZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gbi5zZXREaXN0YW5jZShuLmxhc3RUKCksdCksdH0sZW51bWVyYWJsZTohMH0sZGlzdGFuY2VMaW1pdHM6e2dldDpmdW5jdGlvbigpe3JldHVybiBuLmdldERpc3RhbmNlTGltaXRzKHIpfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0RGlzdGFuY2VMaW1pdHModCksdH0sZW51bWVyYWJsZTohMH19KSx0LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCExfSk7dmFyIGQ9MCxwPTA7cmV0dXJuIG8odCxmdW5jdGlvbihlLHIsYSxvKXt2YXIgcz0xL3QuY2xpZW50SGVpZ2h0LGw9cyooci1kKSxjPXMqKGEtcCksaD1mLmZsaXBYPzE6LTEsbT1mLmZsaXBZPzE6LTEsZz1NYXRoLlBJKmYucm90YXRlU3BlZWQsdj1pKCk7aWYoMSZlKW8uc2hpZnQ/bi5yb3RhdGUodiwwLDAsLWwqZyk6bi5yb3RhdGUodixoKmcqbCwtbSpnKmMsMCk7ZWxzZSBpZigyJmUpbi5wYW4odiwtZi50cmFuc2xhdGVTcGVlZCpsKnUsZi50cmFuc2xhdGVTcGVlZCpjKnUsMCk7ZWxzZSBpZig0JmUpe3ZhciB5PWYuem9vbVNwZWVkKmMvd2luZG93LmlubmVySGVpZ2h0Kih2LW4ubGFzdFQoKSkqNTA7bi5wYW4odiwwLDAsdSooTWF0aC5leHAoeSktMSkpfWQ9cixwPWF9KSxzKHQsZnVuY3Rpb24odCxlLHIpe3ZhciBhPWYuZmxpcFg/MTotMSxvPWYuZmxpcFk/MTotMSxzPWkoKTtpZihNYXRoLmFicyh0KT5NYXRoLmFicyhlKSluLnJvdGF0ZShzLDAsMCwtdCphKk1hdGguUEkqZi5yb3RhdGVTcGVlZC93aW5kb3cuaW5uZXJXaWR0aCk7ZWxzZXt2YXIgbD1mLnpvb21TcGVlZCpvKmUvd2luZG93LmlubmVySGVpZ2h0KihzLW4ubGFzdFQoKSkvMTAwO24ucGFuKHMsMCwwLHUqKE1hdGguZXhwKGwpLTEpKX19LCEwKSxmfWUuZXhwb3J0cz1uO3ZhciBpPXQoInJpZ2h0LW5vdyIpLGE9dCgiM2QtdmlldyIpLG89dCgibW91c2UtY2hhbmdlIikscz10KCJtb3VzZS13aGVlbCIpfSx7IjNkLXZpZXciOjI5LCJtb3VzZS1jaGFuZ2UiOjQxOCwibW91c2Utd2hlZWwiOjQyMCwicmlnaHQtbm93Ijo0NjV9XSwyOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5fY29udHJvbGxlck5hbWVzPU9iamVjdC5rZXlzKHQpLHRoaXMuX2NvbnRyb2xsZXJMaXN0PXRoaXMuX2NvbnRyb2xsZXJOYW1lcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSx0aGlzLl9tb2RlPWUsdGhpcy5fYWN0aXZlPXRbZV0sdGhpcy5fYWN0aXZlfHwodGhpcy5fbW9kZT0idHVybnRhYmxlIix0aGlzLl9hY3RpdmU9dC50dXJudGFibGUpLHRoaXMubW9kZXM9dGhpcy5fY29udHJvbGxlck5hbWVzLHRoaXMuY29tcHV0ZWRNYXRyaXg9dGhpcy5fYWN0aXZlLmNvbXB1dGVkTWF0cml4LHRoaXMuY29tcHV0ZWRFeWU9dGhpcy5fYWN0aXZlLmNvbXB1dGVkRXllLHRoaXMuY29tcHV0ZWRVcD10aGlzLl9hY3RpdmUuY29tcHV0ZWRVcCx0aGlzLmNvbXB1dGVkQ2VudGVyPXRoaXMuX2FjdGl2ZS5jb21wdXRlZENlbnRlcix0aGlzLmNvbXB1dGVkUmFkaXVzPXRoaXMuX2FjdGl2ZS5jb21wdXRlZFJhZGl1c31mdW5jdGlvbiBpKHQpe3Q9dHx8e307dmFyIGU9dC5leWV8fFswLDAsMV0scj10LmNlbnRlcnx8WzAsMCwwXSxpPXQudXB8fFswLDEsMF0sbD10LmRpc3RhbmNlTGltaXRzfHxbMCwxLzBdLHU9dC5tb2RlfHwidHVybnRhYmxlIixjPWEoKSxoPW8oKSxmPXMoKTtyZXR1cm4gYy5zZXREaXN0YW5jZUxpbWl0cyhsWzBdLGxbMV0pLGMubG9va0F0KDAsZSxyLGkpLGguc2V0RGlzdGFuY2VMaW1pdHMobFswXSxsWzFdKSxoLmxvb2tBdCgwLGUscixpKSxmLnNldERpc3RhbmNlTGltaXRzKGxbMF0sbFsxXSksZi5sb29rQXQoMCxlLHIsaSksbmV3IG4oe3R1cm50YWJsZTpjLG9yYml0OmgsbWF0cml4OmZ9LHUpfWUuZXhwb3J0cz1pO3ZhciBhPXQoInR1cm50YWJsZS1jYW1lcmEtY29udHJvbGxlciIpLG89dCgib3JiaXQtY2FtZXJhLWNvbnRyb2xsZXIiKSxzPXQoIm1hdHJpeC1jYW1lcmEtY29udHJvbGxlciIpLGw9bi5wcm90b3R5cGUsdT1bWyJmbHVzaCIsMV0sWyJpZGxlIiwxXSxbImxvb2tBdCIsNF0sWyJyb3RhdGUiLDRdLFsicGFuIiw0XSxbInRyYW5zbGF0ZSIsNF0sWyJzZXRNYXRyaXgiLDJdLFsic2V0RGlzdGFuY2VMaW1pdHMiLDJdLFsic2V0RGlzdGFuY2UiLDJdXTt1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0scj1bXSxuPTA7bjx0WzFdOysrbilyLnB1c2goImEiK24pO3ZhciBpPSJ2YXIgY2M9dGhpcy5fY29udHJvbGxlckxpc3Q7Zm9yKHZhciBpPTA7aTxjYy5sZW5ndGg7KytpKXtjY1tpXS4iK3RbMF0rIigiK3Iuam9pbigpKyIpfSI7bFtlXT1GdW5jdGlvbi5hcHBseShudWxsLHIuY29uY2F0KGkpKX0pLGwucmVjYWxjTWF0cml4PWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZS5yZWNhbGNNYXRyaXgodCl9LGwuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5nZXREaXN0YW5jZSh0KX0sbC5nZXREaXN0YW5jZUxpbWl0cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWN0aXZlLmdldERpc3RhbmNlTGltaXRzKHQpfSxsLmxhc3RUPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5sYXN0VCgpfSxsLnNldE1vZGU9ZnVuY3Rpb24odCl7aWYodCE9PXRoaXMuX21vZGUpe3ZhciBlPXRoaXMuX2NvbnRyb2xsZXJOYW1lcy5pbmRleE9mKHQpO2lmKCEoZTwwKSl7dmFyIHI9dGhpcy5fYWN0aXZlLG49dGhpcy5fY29udHJvbGxlckxpc3RbZV0saT1NYXRoLm1heChyLmxhc3RUKCksbi5sYXN0VCgpKTtyLnJlY2FsY01hdHJpeChpKSxuLnNldE1hdHJpeChpLHIuY29tcHV0ZWRNYXRyaXgpLHRoaXMuX2FjdGl2ZT1uLHRoaXMuX21vZGU9dCx0aGlzLmNvbXB1dGVkTWF0cml4PXRoaXMuX2FjdGl2ZS5jb21wdXRlZE1hdHJpeCx0aGlzLmNvbXB1dGVkRXllPXRoaXMuX2FjdGl2ZS5jb21wdXRlZEV5ZSx0aGlzLmNvbXB1dGVkVXA9dGhpcy5fYWN0aXZlLmNvbXB1dGVkVXAsdGhpcy5jb21wdXRlZENlbnRlcj10aGlzLl9hY3RpdmUuY29tcHV0ZWRDZW50ZXIsdGhpcy5jb21wdXRlZFJhZGl1cz10aGlzLl9hY3RpdmUuY29tcHV0ZWRSYWRpdXN9fX0sbC5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGV9fSx7Im1hdHJpeC1jYW1lcmEtY29udHJvbGxlciI6NDE2LCJvcmJpdC1jYW1lcmEtY29udHJvbGxlciI6NDM3LCJ0dXJudGFibGUtY2FtZXJhLWNvbnRyb2xsZXIiOjQ5OX1dLDMwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9cy5nZXQodCk7aWYoIWV8fCF0LmlzQnVmZmVyKGUuX3RyaWFuZ2xlQnVmZmVyLmJ1ZmZlcikpe3ZhciByPWEodCxuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwtMSw0LDQsLTFdKSk7ZT1vKHQsW3tidWZmZXI6cix0eXBlOnQuRkxPQVQsc2l6ZToyfV0pLGUuX3RyaWFuZ2xlQnVmZmVyPXIscy5zZXQodCxlKX1lLmJpbmQoKSx0LmRyYXdBcnJheXModC5UUklBTkdMRVMsMCwzKSxlLnVuYmluZCgpfXZhciBpPSJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha01hcD90KCJ3ZWFrLW1hcCIpOldlYWtNYXAsYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXZhbyIpLHM9bmV3IGk7ZS5leHBvcnRzPW59LHsiZ2wtYnVmZmVyIjoxMzAsImdsLXZhbyI6MjQxLCJ3ZWFrLW1hcCI6NTIwfV0sMzE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXtlPSJudW1iZXIiPT10eXBlb2YgZT9lOjEscj1yfHwiOiAiO3ZhciBuPXQuc3BsaXQoL1xyP1xuLyksYT1TdHJpbmcobi5sZW5ndGgrZS0xKS5sZW5ndGg7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKHQsbil7dmFyIG89bitlLHM9U3RyaW5nKG8pLmxlbmd0aCxsPWkobyxhLXMpO3JldHVybiBsK3IrdH0pLmpvaW4oIlxuIil9dmFyIGk9dCgicGFkLWxlZnQiKTtlLmV4cG9ydHM9bn0seyJwYWQtbGVmdCI6NDM4fV0sMzI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZSsxKSxuPTA7bjx0Lmxlbmd0aDsrK24pcltuXT10W25dO2Zvcih2YXIgbj0wO248PXQubGVuZ3RoOysrbil7Zm9yKHZhciBpPXQubGVuZ3RoO2k8PWU7KytpKXtmb3IodmFyIG89bmV3IEFycmF5KGUpLHM9MDtzPGU7KytzKW9bc109TWF0aC5wb3coaSsxLW4scyk7cltpXT1vfXZhciBsPWEuYXBwbHkodm9pZCAwLHIpO2lmKGwpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtpZigwPT09ZSlyZXR1cm5bXTtpZigxPT09ZSlyZXR1cm5bMF07Zm9yKHZhciByPXRbMF0ubGVuZ3RoLGk9W3RbMF1dLGE9WzBdLG89MTtvPGU7KytvKWlmKGkucHVzaCh0W29dKSxuKGkscikpe2lmKGEucHVzaChvKSxhLmxlbmd0aD09PXIrMSlyZXR1cm4gYX1lbHNlIGkucG9wKCk7cmV0dXJuIGF9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LW9yaWVudGF0aW9uIil9LHsicm9idXN0LW9yaWVudGF0aW9uIjo0NzF9XSwzMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkoZSkuZmlsdGVyKGZ1bmN0aW9uKHIpe2Zvcih2YXIgbj1uZXcgQXJyYXkoci5sZW5ndGgpLGk9MDtpPHIubGVuZ3RoOysraSluW2ldPWVbcltpXV07cmV0dXJuIGEobikqdDwxfSl9ZS5leHBvcnRzPW47dmFyIGk9dCgiZGVsYXVuYXktdHJpYW5ndWxhdGUiKSxhPXQoImNpcmN1bXJhZGl1cyIpfSx7Y2lyY3VtcmFkaXVzOjc3LCJkZWxhdW5heS10cmlhbmd1bGF0ZSI6OTh9XSwzNDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gYShpKHQsZSkpfWUuZXhwb3J0cz1uO3ZhciBpPXQoImFscGhhLWNvbXBsZXgiKSxhPXQoInNpbXBsaWNpYWwtY29tcGxleC1ib3VuZGFyeSIpfSx7ImFscGhhLWNvbXBsZXgiOjMzLCJzaW1wbGljaWFsLWNvbXBsZXgtYm91bmRhcnkiOjQ3OX1dLDM1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4hQXJyYXkuaXNBcnJheSh0KSYmbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdH1mdW5jdGlvbiBlKHQsZSxyKXtmb3IodmFyIG49KGUtdCkvTWF0aC5tYXgoci0xLDEpLGk9W10sYT0wO2E8cjthKyspaS5wdXNoKHQrYSpuKTtyZXR1cm4gaX1mdW5jdGlvbiByKCl7Zm9yKHZhciB0PVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxlPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aH0pLHI9TWF0aC5taW4uYXBwbHkobnVsbCxlKSxuPVtdLGk9MDtpPHI7aSsrKXtuW2ldPVtdO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7KythKW5baV1bYV09dFthXVtpXX1yZXR1cm4gbn1mdW5jdGlvbiBuKHQsZSxyKXtmb3IodmFyIG49TWF0aC5taW4uYXBwbHkobnVsbCxbdC5sZW5ndGgsZS5sZW5ndGgsci5sZW5ndGhdKSxpPVtdLGE9MDthPG47YSsrKWkucHVzaChbdFthXSxlW2FdLHJbYV1dKTtyZXR1cm4gaX1mdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGUodCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspQXJyYXkuaXNBcnJheSh0W25dKT9lKHRbbl0scik6cis9dFtuXX12YXIgcj0wO3JldHVybiBlKHQscikscn1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe2Vbcl09W107Zm9yKHZhciBuPTA7bjx0W3JdLmxlbmd0aDsrK24pZVtyXVtuXT10W3JdW25dfXJldHVybiBlfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcillW3JdPXRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gcyh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYodFtyXSE9PWVbcl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbCh0LGUpe3ZhciByLG47aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0O2lmKHI9W10sIiMiPT09dFswXT8odD10LnN1YnN0cigxKSwzPT09dC5sZW5ndGgmJih0Kz10KSxuPXBhcnNlSW50KHQsMTYpLHJbMF09bj4+MTYmMjU1LHJbMV09bj4+OCYyNTUsclsyXT0yNTUmbik6aC50ZXN0KHQpJiYobj10Lm1hdGNoKGYpLHJbMF09cGFyc2VJbnQoblsxXSksclsxXT1wYXJzZUludChuWzJdKSxyWzJdPXBhcnNlSW50KG5bM10pKSwhZSlmb3IodmFyIGk9MDtpPDM7KytpKXJbaV09cltpXS8yNTU7cmV0dXJuIHJ9ZnVuY3Rpb24gdSh0LGUpe3ZhciByLG47aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0O2lmKHI9W10sIiMiPT09dFswXT8odD10LnN1YnN0cigxKSwzPT09dC5sZW5ndGgmJih0Kz10KSxuPXBhcnNlSW50KHQsMTYpLHJbMF09bj4+MTYmMjU1LHJbMV09bj4+OCYyNTUsclsyXT0yNTUmbik6aC50ZXN0KHQpJiYobj10Lm1hdGNoKGYpLHJbMF09cGFyc2VJbnQoblsxXSksclsxXT1wYXJzZUludChuWzJdKSxyWzJdPXBhcnNlSW50KG5bM10pLG5bNF0/clszXT1wYXJzZUZsb2F0KG5bNF0pOnJbM109MSksIWUpZm9yKHZhciBpPTA7aTwzOysraSlyW2ldPXJbaV0vMjU1O3JldHVybiByfXZhciBjPXt9LGg9L15yZ2JhP1woXHMqXGR7MSwzfVxzKixccypcZHsxLDN9XHMqLFxzKlxkezEsM31ccyooLC4qKT9cKSQvLGY9L15yZ2JhP1woXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyosP1xzKiguKik/XCkkLztyZXR1cm4gYy5pc1BsYWluT2JqZWN0PXQsYy5saW5zcGFjZT1lLGMuemlwMz1uLGMuc3VtPWksYy56aXA9cixjLmlzRXF1YWw9cyxjLmNvcHkyRD1hLGMuY29weTFEPW8sYy5zdHIyUmdiQXJyYXk9bCxjLnN0cjJSZ2JhQXJyYXk9dSxjfTtlLmV4cG9ydHM9bigpfSx7fV0sMzY6W2Z1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24ocil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsYT1NYXRoLm1pbihyLG4pO2k8YTsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHIuQnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2Ygci5CdWZmZXIuaXNCdWZmZXI/ci5CdWZmZXIuaXNCdWZmZXIodCk6IShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBvKHQpe3JldHVybiFpKHQpJiYoImZ1bmN0aW9uIj09dHlwZW9mIHIuQXJyYXlCdWZmZXImJigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyh0KTohIXQmJih0IGluc3RhbmNlb2YgRGF0YVZpZXd8fCEhKHQuYnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkpKX1mdW5jdGlvbiBzKHQpe2lmKHguaXNGdW5jdGlvbih0KSl7aWYoTSlyZXR1cm4gdC5uYW1lO3ZhciBlPXQudG9TdHJpbmcoKSxyPWUubWF0Y2goayk7cmV0dXJuIHImJnJbMV19fWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dC5sZW5ndGg8ZT90OnQuc2xpY2UoMCxlKTp0fWZ1bmN0aW9uIHUodCl7aWYoTXx8IXguaXNGdW5jdGlvbih0KSlyZXR1cm4geC5pbnNwZWN0KHQpO3ZhciBlPXModCkscj1lPyI6ICIrZToiIjtyZXR1cm4iW0Z1bmN0aW9uIityKyJdIn1mdW5jdGlvbiBjKHQpe3JldHVybiBsKHUodC5hY3R1YWwpLDEyOCkrIiAiK3Qub3BlcmF0b3IrIiAiK2wodSh0LmV4cGVjdGVkKSwxMjgpfWZ1bmN0aW9uIGgodCxlLHIsbixpKXt0aHJvdyBuZXcgQS5Bc3NlcnRpb25FcnJvcih7bWVzc2FnZTpyLGFjdHVhbDp0LGV4cGVjdGVkOmUsb3BlcmF0b3I6bixzdGFja1N0YXJ0RnVuY3Rpb246aX0pfWZ1bmN0aW9uIGYodCxlKXt0fHxoKHQsITAsZSwiPT0iLEEub2spfWZ1bmN0aW9uIGQodCxlLHIscyl7aWYodD09PWUpcmV0dXJuITA7aWYoaSh0KSYmaShlKSlyZXR1cm4gMD09PW4odCxlKTtpZih4LmlzRGF0ZSh0KSYmeC5pc0RhdGUoZSkpcmV0dXJuIHQuZ2V0VGltZSgpPT09ZS5nZXRUaW1lKCk7aWYoeC5pc1JlZ0V4cCh0KSYmeC5pc1JlZ0V4cChlKSlyZXR1cm4gdC5zb3VyY2U9PT1lLnNvdXJjZSYmdC5nbG9iYWw9PT1lLmdsb2JhbCYmdC5tdWx0aWxpbmU9PT1lLm11bHRpbGluZSYmdC5sYXN0SW5kZXg9PT1lLmxhc3RJbmRleCYmdC5pZ25vcmVDYXNlPT09ZS5pZ25vcmVDYXNlO2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUpe2lmKG8odCkmJm8oZSkmJmEodCk9PT1hKGUpJiYhKHQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKXJldHVybiAwPT09bihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtpZihpKHQpIT09aShlKSlyZXR1cm4hMTtzPXN8fHthY3R1YWw6W10sZXhwZWN0ZWQ6W119O3ZhciBsPXMuYWN0dWFsLmluZGV4T2YodCk7cmV0dXJuIGwhPT0tMSYmbD09PXMuZXhwZWN0ZWQuaW5kZXhPZihlKXx8KHMuYWN0dWFsLnB1c2godCkscy5leHBlY3RlZC5wdXNoKGUpLG0odCxlLHIscykpfXJldHVybiByP3Q9PT1lOnQ9PWV9ZnVuY3Rpb24gcCh0KXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIG0odCxlLHIsbil7aWYobnVsbD09PXR8fHZvaWQgMD09PXR8fG51bGw9PT1lfHx2b2lkIDA9PT1lKXJldHVybiExO2lmKHguaXNQcmltaXRpdmUodCl8fHguaXNQcmltaXRpdmUoZSkpcmV0dXJuIHQ9PT1lO2lmKHImJk9iamVjdC5nZXRQcm90b3R5cGVPZih0KSE9PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKSlyZXR1cm4hMTt2YXIgaT1wKHQpLGE9cChlKTtpZihpJiYhYXx8IWkmJmEpcmV0dXJuITE7aWYoaSlyZXR1cm4gdD13LmNhbGwodCksZT13LmNhbGwoZSksZCh0LGUscik7dmFyIG8scyxsPVQodCksdT1UKGUpO2lmKGwubGVuZ3RoIT09dS5sZW5ndGgpcmV0dXJuITE7Zm9yKGwuc29ydCgpLHUuc29ydCgpLHM9bC5sZW5ndGgtMTtzPj0wO3MtLSlpZihsW3NdIT09dVtzXSlyZXR1cm4hMTtmb3Iocz1sLmxlbmd0aC0xO3M+PTA7cy0tKWlmKG89bFtzXSwhZCh0W29dLGVbb10scixuKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBnKHQsZSxyKXtkKHQsZSwhMCkmJmgodCxlLHIsIm5vdERlZXBTdHJpY3RFcXVhbCIsZyl9ZnVuY3Rpb24gdih0LGUpe2lmKCF0fHwhZSlyZXR1cm4hMTtpZigiW29iamVjdCBSZWdFeHBdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiBlLnRlc3QodCk7dHJ5e2lmKHQgaW5zdGFuY2VvZiBlKXJldHVybiEwfWNhdGNoKHQpe31yZXR1cm4hRXJyb3IuaXNQcm90b3R5cGVPZihlKSYmZS5jYWxsKHt9LHQpPT09ITB9ZnVuY3Rpb24geSh0KXt2YXIgZTt0cnl7dCgpfWNhdGNoKHQpe2U9dH1yZXR1cm4gZX1mdW5jdGlvbiBiKHQsZSxyLG4pe3ZhciBpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJibG9jayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9bnVsbCksaT15KGUpLG49KHImJnIubmFtZT8iICgiK3IubmFtZSsiKS4iOiIuIikrKG4/IiAiK246Ii4iKSx0JiYhaSYmaChpLHIsIk1pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uIituKTt2YXIgYT0ic3RyaW5nIj09dHlwZW9mIG4sbz0hdCYmeC5pc0Vycm9yKGkpLHM9IXQmJmkmJiFyO2lmKChvJiZhJiZ2KGkscil8fHMpJiZoKGksciwiR290IHVud2FudGVkIGV4Y2VwdGlvbiIrbiksdCYmaSYmciYmIXYoaSxyKXx8IXQmJmkpdGhyb3cgaX12YXIgeD10KCJ1dGlsLyIpLF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3PUFycmF5LnByb3RvdHlwZS5zbGljZSxNPWZ1bmN0aW9uKCl7cmV0dXJuImZvbyI9PT1mdW5jdGlvbigpe30ubmFtZX0oKSxBPWUuZXhwb3J0cz1mLGs9L1xzKmZ1bmN0aW9uXHMrKFteXChcc10qKVxzKi87QS5Bc3NlcnRpb25FcnJvcj1mdW5jdGlvbih0KXt0aGlzLm5hbWU9IkFzc2VydGlvbkVycm9yIix0aGlzLmFjdHVhbD10LmFjdHVhbCx0aGlzLmV4cGVjdGVkPXQuZXhwZWN0ZWQsdGhpcy5vcGVyYXRvcj10Lm9wZXJhdG9yLHQubWVzc2FnZT8odGhpcy5tZXNzYWdlPXQubWVzc2FnZSx0aGlzLmdlbmVyYXRlZE1lc3NhZ2U9ITEpOih0aGlzLm1lc3NhZ2U9Yyh0aGlzKSx0aGlzLmdlbmVyYXRlZE1lc3NhZ2U9ITApO3ZhciBlPXQuc3RhY2tTdGFydEZ1bmN0aW9ufHxoO2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSk7ZWxzZXt2YXIgcj1uZXcgRXJyb3I7aWYoci5zdGFjayl7dmFyIG49ci5zdGFjayxpPXMoZSksYT1uLmluZGV4T2YoIlxuIitpKTtpZihhPj0wKXt2YXIgbz1uLmluZGV4T2YoIlxuIixhKzEpO249bi5zdWJzdHJpbmcobysxKX10aGlzLnN0YWNrPW59fX0seC5pbmhlcml0cyhBLkFzc2VydGlvbkVycm9yLEVycm9yKSxBLmZhaWw9aCxBLm9rPWYsQS5lcXVhbD1mdW5jdGlvbih0LGUscil7dCE9ZSYmaCh0LGUsciwiPT0iLEEuZXF1YWwpfSxBLm5vdEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXt0PT1lJiZoKHQsZSxyLCIhPSIsQS5ub3RFcXVhbCl9LEEuZGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtkKHQsZSwhMSl8fGgodCxlLHIsImRlZXBFcXVhbCIsQS5kZWVwRXF1YWwpfSxBLmRlZXBTdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7ZCh0LGUsITApfHxoKHQsZSxyLCJkZWVwU3RyaWN0RXF1YWwiLEEuZGVlcFN0cmljdEVxdWFsKX0sQS5ub3REZWVwRXF1YWw9ZnVuY3Rpb24odCxlLHIpe2QodCxlLCExKSYmaCh0LGUsciwibm90RGVlcEVxdWFsIixBLm5vdERlZXBFcXVhbCl9LEEubm90RGVlcFN0cmljdEVxdWFsPWcsQS5zdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dCE9PWUmJmgodCxlLHIsIj09PSIsQS5zdHJpY3RFcXVhbCl9LEEubm90U3RyaWN0RXF1YWw9ZnVuY3Rpb24odCxlLHIpe3Q9PT1lJiZoKHQsZSxyLCIhPT0iLEEubm90U3RyaWN0RXF1YWwpfSxBLnRocm93cz1mdW5jdGlvbih0LGUscil7YighMCx0LGUscil9LEEuZG9lc05vdFRocm93PWZ1bmN0aW9uKHQsZSxyKXtiKCExLHQsZSxyKX0sQS5pZkVycm9yPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgdH07dmFyIFQ9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KV8uY2FsbCh0LHIpJiZlLnB1c2gocik7cmV0dXJuIGV9fSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7InV0aWwvIjo1MTB9XSwzNzpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gYXRvYih0KX19LHt9XSwzODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkocisxKSxvPTA7bzxyOysrbyl7Zm9yKHZhciBzPW5ldyBBcnJheShyKzEpLGw9MDtsPD1yOysrbClzW2xdPXRbbF1bb107aVtvXT1zfWlbcl09bmV3IEFycmF5KHIrMSk7Zm9yKHZhciBvPTA7bzw9cjsrK28paVtyXVtvXT0xO2Zvcih2YXIgdT1uZXcgQXJyYXkocisxKSxvPTA7bzxyOysrbyl1W29dPWVbb107dVtyXT0xO3ZhciBjPWEoaSx1KSxoPW4oY1tyKzFdKTswPT09aCYmKGg9MSk7Zm9yKHZhciBmPW5ldyBBcnJheShyKzEpLG89MDtvPD1yOysrbylmW29dPW4oY1tvXSkvaDtyZXR1cm4gZn1lLmV4cG9ydHM9aTt2YXIgYT10KCJyb2J1c3QtbGluZWFyLXNvbHZlIil9LHsicm9idXN0LWxpbmVhci1zb2x2ZSI6NDcwfV0sMzk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKHRbMF0ubXVsKGVbMV0pLmFkZChlWzBdLm11bCh0WzFdKSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7ZS5leHBvcnRzPW59LHsiLi9saWIvcmF0aW9uYWxpemUiOjQ5fV0sNDA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0WzBdLm11bChlWzFdKS5jbXAoZVswXS5tdWwodFsxXSkpfWUuZXhwb3J0cz1ufSx7fV0sNDE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKHRbMF0ubXVsKGVbMV0pLHRbMV0ubXVsKGVbMF0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0OX1dLDQyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtpZihpKHQpKXJldHVybiBlP3UodCxuKGUpKTpbdFswXS5jbG9uZSgpLHRbMV0uY2xvbmUoKV07dmFyIHIsYyxoPTA7aWYoYSh0KSlyPXQuY2xvbmUoKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgdClyPXModCk7ZWxzZXtpZigwPT09dClyZXR1cm5bbygwKSxvKDEpXTtpZih0PT09TWF0aC5mbG9vcih0KSlyPW8odCk7ZWxzZXtmb3IoO3QhPT1NYXRoLmZsb29yKHQpOyl0Kj1NYXRoLnBvdygyLDI1NiksaC09MjU2O3I9byh0KX19aWYoaShlKSlyLm11bChlWzFdKSxjPWVbMF0uY2xvbmUoKTtlbHNlIGlmKGEoZSkpYz1lLmNsb25lKCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpYz1zKGUpO2Vsc2UgaWYoZSlpZihlPT09TWF0aC5mbG9vcihlKSljPW8oZSk7ZWxzZXtmb3IoO2UhPT1NYXRoLmZsb29yKGUpOyllKj1NYXRoLnBvdygyLDI1NiksaCs9MjU2O2M9byhlKX1lbHNlIGM9bygxKTtyZXR1cm4gaD4wP3I9ci5zaGxuKGgpOmg8MCYmKGM9Yy5zaGxuKC1oKSksbChyLGMpfXZhciBpPXQoIi4vaXMtcmF0IiksYT10KCIuL2xpYi9pcy1ibiIpLG89dCgiLi9saWIvbnVtLXRvLWJuIikscz10KCIuL2xpYi9zdHItdG8tYm4iKSxsPXQoIi4vbGliL3JhdGlvbmFsaXplIiksdT10KCIuL2RpdiIpO2UuZXhwb3J0cz1ufSx7Ii4vZGl2Ijo0MSwiLi9pcy1yYXQiOjQzLCIuL2xpYi9pcy1ibiI6NDcsIi4vbGliL251bS10by1ibiI6NDgsIi4vbGliL3JhdGlvbmFsaXplIjo0OSwiLi9saWIvc3RyLXRvLWJuIjo1MH1dLDQzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjI9PT10Lmxlbmd0aCYmaSh0WzBdKSYmaSh0WzFdKX12YXIgaT10KCIuL2xpYi9pcy1ibiIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL2lzLWJuIjo0N31dLDQ0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQuY21wKG5ldyBpKDApKX12YXIgaT10KCJibi5qcyIpO2UuZXhwb3J0cz1ufSx7ImJuLmpzIjo1N31dLDQ1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGgscj10LndvcmRzLG49MDtpZigxPT09ZSluPXJbMF07ZWxzZSBpZigyPT09ZSluPXJbMF0rNjcxMDg4NjQqclsxXTtlbHNlIGZvcih2YXIgbj0wLGk9MDtpPGU7aSsrKXt2YXIgYT1yW2ldO24rPWEqTWF0aC5wb3coNjcxMDg4NjQsaSl9cmV0dXJuIHQuc2lnbj8tbjpufWUuZXhwb3J0cz1ufSx7fV0sNDY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1hKGkubG8odCkpO2lmKGU8MzIpcmV0dXJuIGU7dmFyIHI9YShpLmhpKHQpKTtyZXR1cm4gcj4yMD81MjpyKzMyfXZhciBpPXQoImRvdWJsZS1iaXRzIiksYT10KCJiaXQtdHdpZGRsZSIpLmNvdW50VHJhaWxpbmdaZXJvcztlLmV4cG9ydHM9bn0seyJiaXQtdHdpZGRsZSI6NTYsImRvdWJsZS1iaXRzIjo5OX1dLDQ3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmQm9vbGVhbih0LndvcmRzKX10KCJibi5qcyIpO2UuZXhwb3J0cz1ufSx7ImJuLmpzIjo1N31dLDQ4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9YS5leHBvbmVudCh0KTtyZXR1cm4gZTw1Mj9uZXcgaSh0KTpuZXcgaSh0Kk1hdGgucG93KDIsNTItZSkpLnNobG4oZS01Mil9dmFyIGk9dCgiYm4uanMiKSxhPXQoImRvdWJsZS1iaXRzIik7ZS5leHBvcnRzPW59LHsiYm4uanMiOjU3LCJkb3VibGUtYml0cyI6OTl9XSw0OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9YSh0KSxuPWEoZSk7aWYoMD09PXIpcmV0dXJuW2koMCksaSgxKV07aWYoMD09PW4pcmV0dXJuW2koMCksaSgwKV07bjwwJiYodD10Lm5lZygpLGU9ZS5uZWcoKSk7dmFyIG89dC5nY2QoZSk7cmV0dXJuIG8uY21wbigxKT9bdC5kaXYobyksZS5kaXYobyldOlt0LGVdfXZhciBpPXQoIi4vbnVtLXRvLWJuIiksYT10KCIuL2JuLXNpZ24iKTtlLmV4cG9ydHM9bn0seyIuL2JuLXNpZ24iOjQ0LCIuL251bS10by1ibiI6NDh9XSw1MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgaSh0KX12YXIgaT10KCJibi5qcyIpO2UuZXhwb3J0cz1ufSx7ImJuLmpzIjo1N31dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzBdKSx0WzFdLm11bChlWzFdKSl9dmFyIGk9dCgiLi9saWIvcmF0aW9uYWxpemUiKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9yYXRpb25hbGl6ZSI6NDl9XSw1MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBpKHRbMF0pKmkodFsxXSl9dmFyIGk9dCgiLi9saWIvYm4tc2lnbiIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL2JuLXNpZ24iOjQ0fV0sNTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKHRbMF0ubXVsKGVbMV0pLnN1Yih0WzFdLm11bChlWzBdKSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7CmUuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0OX1dLDU0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dFswXSxyPXRbMV07aWYoMD09PWUuY21wbigwKSlyZXR1cm4gMDt2YXIgbj1lLmRpdm1vZChyKSxvPW4uZGl2LHM9aShvKSxsPW4ubW9kO2lmKDA9PT1sLmNtcG4oMCkpcmV0dXJuIHM7aWYocyl7dmFyIHU9YShzKSs0LGM9aShsLnNobG4odSkuZGl2Um91bmQocikpO3JldHVybiBzPDAmJihjPS1jKSxzK2MqTWF0aC5wb3coMiwtdSl9dmFyIGg9ci5iaXRMZW5ndGgoKS1sLmJpdExlbmd0aCgpKzUzLGM9aShsLnNobG4oaCkuZGl2Um91bmQocikpO3JldHVybiBoPDEwMjM/YypNYXRoLnBvdygyLC1oKTooYyo9TWF0aC5wb3coMiwtMTAyMyksYypNYXRoLnBvdygyLDEwMjMtaCkpfXZhciBpPXQoIi4vbGliL2JuLXRvLW51bSIpLGE9dCgiLi9saWIvY3R6Iik7ZS5leHBvcnRzPW59LHsiLi9saWIvYm4tdG8tbnVtIjo0NSwiLi9saWIvY3R6Ijo0Nn1dLDU1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3ZhciBvPVsiZnVuY3Rpb24gIix0LCIoYSxsLGgsIixuLmpvaW4oIiwiKSwiKXsiLGE/IiI6InZhciBpPSIscj8ibC0xIjoiaCsxIiwiO3doaWxlKGw8PWgpe3ZhciBtPShsK2gpPj4+MSx4PWEiLGk/Ii5nZXQobSkiOiJbbV0iXTtyZXR1cm4gYT9lLmluZGV4T2YoImMiKTwwP28ucHVzaCgiO2lmKHg9PT15KXtyZXR1cm4gbX1lbHNlIGlmKHg8PXkpeyIpOm8ucHVzaCgiO3ZhciBwPWMoeCx5KTtpZihwPT09MCl7cmV0dXJuIG19ZWxzZSBpZihwPD0wKXsiKTpvLnB1c2goIjtpZigiLGUsIil7aT1tOyIpLHI/by5wdXNoKCJsPW0rMX1lbHNle2g9bS0xfSIpOm8ucHVzaCgiaD1tLTF9ZWxzZXtsPW0rMX0iKSxvLnB1c2goIn0iKSxhP28ucHVzaCgicmV0dXJuIC0xfTsiKTpvLnB1c2goInJldHVybiBpfTsiKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9bmV3IEZ1bmN0aW9uKFtuKCJBIiwieCIrdCsieSIsZSxbInkiXSwhMSxpKSxuKCJCIiwieCIrdCsieSIsZSxbInkiXSwhMCxpKSxuKCJQIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMSxpKSxuKCJRIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMCxpKSwiZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoIixyLCIoYSx5LGMsbCxoKXtpZihhLnNoYXBlKXtpZih0eXBlb2YoYyk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gUShhLChsPT09dW5kZWZpbmVkKT8wOmx8MCwoaD09PXVuZGVmaW5lZCk/YS5zaGFwZVswXS0xOmh8MCx5LGMpfWVsc2V7cmV0dXJuIEIoYSwoYz09PXVuZGVmaW5lZCk/MDpjfDAsKGw9PT11bmRlZmluZWQpP2Euc2hhcGVbMF0tMTpsfDAseSl9fWVsc2V7aWYodHlwZW9mKGMpPT09J2Z1bmN0aW9uJyl7cmV0dXJuIFAoYSwobD09PXVuZGVmaW5lZCk/MDpsfDAsKGg9PT11bmRlZmluZWQpP2EubGVuZ3RoLTE6aHwwLHksYyl9ZWxzZXtyZXR1cm4gQShhLChjPT09dW5kZWZpbmVkKT8wOmN8MCwobD09PXVuZGVmaW5lZCk/YS5sZW5ndGgtMTpsfDAseSl9fX1yZXR1cm4gZGlzcGF0Y2hCc2VhcmNoIixyXS5qb2luKCIiKSk7cmV0dXJuIGEoKX1lLmV4cG9ydHM9e2dlOmkoIj49IiwhMSwiR0UiKSxndDppKCI+IiwhMSwiR1QiKSxsdDppKCI8IiwhMCwiTFQiKSxsZTppKCI8PSIsITAsIkxFIiksZXE6aSgiLSIsITAsIkVRIiwhMCl9fSx7fV0sNTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7InVzZSByZXN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT0zMjtyZXR1cm4gdCY9LXQsdCYmZS0tLDY1NTM1JnQmJihlLT0xNiksMTY3MTE5MzUmdCYmKGUtPTgpLDI1MjY0NTEzNSZ0JiYoZS09NCksODU4OTkzNDU5JnQmJihlLT0yKSwxNDMxNjU1NzY1JnQmJihlLT0xKSxlfXZhciBpPTMyO3IuSU5UX0JJVFM9aSxyLklOVF9NQVg9MjE0NzQ4MzY0NyxyLklOVF9NSU49LTE8PGktMSxyLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuKHQ+MCktKHQ8MCl9LHIuYWJzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ+PmktMTtyZXR1cm4odF5lKS1lfSxyLm1pbj1mdW5jdGlvbih0LGUpe3JldHVybiBlXih0XmUpJi0odDxlKX0sci5tYXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdF4odF5lKSYtKHQ8ZSl9LHIuaXNQb3cyPWZ1bmN0aW9uKHQpe3JldHVybiEodCZ0LTF8fCF0KX0sci5sb2cyPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIGU9KHQ+NjU1MzUpPDw0LHQ+Pj49ZSxyPSh0PjI1NSk8PDMsdD4+Pj1yLGV8PXIscj0odD4xNSk8PDIsdD4+Pj1yLGV8PXIscj0odD4zKTw8MSx0Pj4+PXIsZXw9cixlfHQ+PjF9LHIubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTFlOT85OnQ+PTFlOD84OnQ+PTFlNz83OnQ+PTFlNj82OnQ+PTFlNT81OnQ+PTFlND80OnQ+PTFlMz8zOnQ+PTEwMD8yOnQ+PTEwPzE6MH0sci5wb3BDb3VudD1mdW5jdGlvbih0KXtyZXR1cm4gdC09dD4+PjEmMTQzMTY1NTc2NSx0PSg4NTg5OTM0NTkmdCkrKHQ+Pj4yJjg1ODk5MzQ1OSksMTY4NDMwMDkqKHQrKHQ+Pj40KSYyNTI2NDUxMzUpPj4+MjR9LHIuY291bnRUcmFpbGluZ1plcm9zPW4sci5uZXh0UG93Mj1mdW5jdGlvbih0KXtyZXR1cm4gdCs9MD09PXQsLS10LHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KzF9LHIucHJldlBvdzI9ZnVuY3Rpb24odCl7cmV0dXJuIHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0LSh0Pj4+MSl9LHIucGFyaXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0Xj10Pj4+MTYsdF49dD4+PjgsdF49dD4+PjQsdCY9MTUsMjcwMzA+Pj50JjF9O3ZhciBhPW5ldyBBcnJheSgyNTYpOyFmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPDI1NjsrK2Upe3ZhciByPWUsbj1lLGk9Nztmb3Iocj4+Pj0xO3I7cj4+Pj0xKW48PD0xLG58PTEmciwtLWk7dFtlXT1uPDxpJjI1NX19KGEpLHIucmV2ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gYVsyNTUmdF08PDI0fGFbdD4+PjgmMjU1XTw8MTZ8YVt0Pj4+MTYmMjU1XTw8OHxhW3Q+Pj4yNCYyNTVdfSxyLmludGVybGVhdmUyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmPTY1NTM1LHQ9MTY3MTE5MzUmKHR8dDw8OCksdD0yNTI2NDUxMzUmKHR8dDw8NCksdD04NTg5OTM0NTkmKHR8dDw8MiksdD0xNDMxNjU1NzY1Jih0fHQ8PDEpLGUmPTY1NTM1LGU9MTY3MTE5MzUmKGV8ZTw8OCksZT0yNTI2NDUxMzUmKGV8ZTw8NCksZT04NTg5OTM0NTkmKGV8ZTw8MiksZT0xNDMxNjU1NzY1JihlfGU8PDEpLHR8ZTw8MX0sci5kZWludGVybGVhdmUyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dD4+PmUmMTQzMTY1NTc2NSx0PTg1ODk5MzQ1OSYodHx0Pj4+MSksdD0yNTI2NDUxMzUmKHR8dD4+PjIpLHQ9MTY3MTE5MzUmKHR8dD4+PjQpLHQ9NjU1MzUmKHR8dD4+PjE2KSx0PDwxNj4+MTZ9LHIuaW50ZXJsZWF2ZTM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0Jj0xMDIzLHQ9NDI3ODE5MDMzNSYodHx0PDwxNiksdD0yNTE3MTk2OTUmKHR8dDw8OCksdD0zMjcyMzU2MDM1Jih0fHQ8PDQpLHQ9MTIyNzEzMzUxMyYodHx0PDwyKSxlJj0xMDIzLGU9NDI3ODE5MDMzNSYoZXxlPDwxNiksZT0yNTE3MTk2OTUmKGV8ZTw8OCksZT0zMjcyMzU2MDM1JihlfGU8PDQpLGU9MTIyNzEzMzUxMyYoZXxlPDwyKSx0fD1lPDwxLHImPTEwMjMscj00Mjc4MTkwMzM1JihyfHI8PDE2KSxyPTI1MTcxOTY5NSYocnxyPDw4KSxyPTMyNzIzNTYwMzUmKHJ8cjw8NCkscj0xMjI3MTMzNTEzJihyfHI8PDIpLHR8cjw8Mn0sci5kZWludGVybGVhdmUzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dD4+PmUmMTIyNzEzMzUxMyx0PTMyNzIzNTYwMzUmKHR8dD4+PjIpLHQ9MjUxNzE5Njk1Jih0fHQ+Pj40KSx0PTQyNzgxOTAzMzUmKHR8dD4+PjgpLHQ9MTAyMyYodHx0Pj4+MTYpLHQ8PDIyPj4yMn0sci5uZXh0Q29tYmluYXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dHx0LTE7cmV0dXJuIGUrMXwofmUmLX5lKS0xPj4+bih0KSsxfX0se31dLDU3OltmdW5jdGlvbih0LGUscil7IWZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZXx8IkFzc2VydGlvbiBmYWlsZWQiKX1mdW5jdGlvbiBuKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiBpKHQsZSxyKXtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0LndvcmRzKT90Oih0aGlzLnNpZ249ITEsdGhpcy53b3Jkcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5yZWQ9bnVsbCwibGUiIT09ZSYmImJlIiE9PWV8fChyPWUsZT0xMCksdm9pZChudWxsIT09dCYmdGhpcy5faW5pdCh0fHwwLGV8fDEwLHJ8fCJiZSIpKSl9ZnVuY3Rpb24gYSh0LGUscil7Zm9yKHZhciBuPTAsaT1NYXRoLm1pbih0Lmxlbmd0aCxyKSxhPWU7YTxpO2ErKyl7dmFyIG89dC5jaGFyQ29kZUF0KGEpLTQ4O248PD00LG58PW8+PTQ5JiZvPD01ND9vLTQ5KzEwOm8+PTE3JiZvPD0yMj9vLTE3KzEwOjE1Jm99cmV0dXJuIG59ZnVuY3Rpb24gbyh0LGUscixuKXtmb3IodmFyIGk9MCxhPU1hdGgubWluKHQubGVuZ3RoLHIpLG89ZTtvPGE7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyktNDg7aSo9bixpKz1zPj00OT9zLTQ5KzEwOnM+PTE3P3MtMTcrMTA6c31yZXR1cm4gaX1mdW5jdGlvbiBzKHQsZSl7dGhpcy5uYW1lPXQsdGhpcy5wPW5ldyBpKGUsMTYpLHRoaXMubj10aGlzLnAuYml0TGVuZ3RoKCksdGhpcy5rPW5ldyBpKDEpLmlzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLHRoaXMudG1wPXRoaXMuX3RtcCgpfWZ1bmN0aW9uIGwoKXtzLmNhbGwodGhpcywiazI1NiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIil9ZnVuY3Rpb24gdSgpe3MuY2FsbCh0aGlzLCJwMjI0IiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiKX1mdW5jdGlvbiBjKCl7cy5jYWxsKHRoaXMsInAxOTIiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIpfWZ1bmN0aW9uIGgoKXtzLmNhbGwodGhpcywiMjU1MTkiLCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIil9ZnVuY3Rpb24gZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPWkuX3ByaW1lKHQpO3RoaXMubT1lLnAsdGhpcy5wcmltZT1lfWVsc2UgdGhpcy5tPXQsdGhpcy5wcmltZT1udWxsfWZ1bmN0aW9uIGQodCl7Zi5jYWxsKHRoaXMsdCksdGhpcy5zaGlmdD10aGlzLm0uYml0TGVuZ3RoKCksdGhpcy5zaGlmdCUyNiE9PTAmJih0aGlzLnNoaWZ0Kz0yNi10aGlzLnNoaWZ0JTI2KSx0aGlzLnI9bmV3IGkoMSkuaXNobG4odGhpcy5zaGlmdCksdGhpcy5yMj10aGlzLmltb2QodGhpcy5yLnNxcigpKSx0aGlzLnJpbnY9dGhpcy5yLl9pbnZtcCh0aGlzLm0pLHRoaXMubWludj10aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksdGhpcy5taW52LnNpZ249ITAsdGhpcy5taW52PXRoaXMubWludi5tb2QodGhpcy5yKX0ib2JqZWN0Ij09dHlwZW9mIHQ/dC5leHBvcnRzPWk6ZS5CTj1pLGkuQk49aSxpLndvcmRTaXplPTI2LGkucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXROdW1iZXIodCxlLG4pO2lmKCJvYmplY3QiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxuKTsiaGV4Ij09PWUmJihlPTE2KSxyKGU9PT0oMHxlKSYmZT49MiYmZTw9MzYpLHQ9dC50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKTt2YXIgaT0wOyItIj09PXRbMF0mJmkrKywxNj09PWU/dGhpcy5fcGFyc2VIZXgodCxpKTp0aGlzLl9wYXJzZUJhc2UodCxlLGkpLCItIj09PXRbMF0mJih0aGlzLnNpZ249ITApLHRoaXMuc3RyaXAoKSwibGUiPT09biYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUsbil9LGkucHJvdG90eXBlLl9pbml0TnVtYmVyPWZ1bmN0aW9uKHQsZSxuKXt0PDAmJih0aGlzLnNpZ249ITAsdD0tdCksdDw2NzEwODg2ND8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdF0sdGhpcy5sZW5ndGg9MSk6dDw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihyKHQ8OTAwNzE5OTI1NDc0MDk5MiksdGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLCJsZSI9PT1uJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxuKX0saS5wcm90b3R5cGUuX2luaXRBcnJheT1mdW5jdGlvbih0LGUsbil7aWYocigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBhPTA7aWYoImJlIj09PW4pZm9yKHZhciBpPXQubGVuZ3RoLTEsbz0wO2k+PTA7aS09Myl7dmFyIHM9dFtpXXx0W2ktMV08PDh8dFtpLTJdPDwxNjt0aGlzLndvcmRzW29dfD1zPDxhJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1zPj4+MjYtYSY2NzEwODg2MyxhKz0yNCxhPj0yNiYmKGEtPTI2LG8rKyl9ZWxzZSBpZigibGUiPT09bilmb3IodmFyIGk9MCxvPTA7aTx0Lmxlbmd0aDtpKz0zKXt2YXIgcz10W2ldfHRbaSsxXTw8OHx0W2krMl08PDE2O3RoaXMud29yZHNbb118PXM8PGEmNjcxMDg4NjMsdGhpcy53b3Jkc1tvKzFdPXM+Pj4yNi1hJjY3MTA4ODYzLGErPTI0LGE+PTI2JiYoYS09MjYsbysrKX1yZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5fcGFyc2VIZXg9ZnVuY3Rpb24odCxlKXt0aGlzLmxlbmd0aD1NYXRoLmNlaWwoKHQubGVuZ3RoLWUpLzYpLHRoaXMud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPTA7Zm9yKHZhciBuPTAscj10Lmxlbmd0aC02LGk9MDtyPj1lO3ItPTYpe3ZhciBvPWEodCxyLHIrNik7dGhpcy53b3Jkc1tpXXw9bzw8biY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PW8+Pj4yNi1uJjQxOTQzMDMsbis9MjQsbj49MjYmJihuLT0yNixpKyspfWlmKHIrNiE9PWUpe3ZhciBvPWEodCxlLHIrNik7dGhpcy53b3Jkc1tpXXw9bzw8biY2NzEwODg2Myx0aGlzLndvcmRzW2krMV18PW8+Pj4yNi1uJjQxOTQzMDN9dGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5fcGFyc2VCYXNlPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLndvcmRzPVswXSx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgbj0wLGk9MTtpPD02NzEwODg2MztpKj1lKW4rKztuLS0saT1pL2V8MDtmb3IodmFyIGE9dC5sZW5ndGgtcixzPWElbixsPU1hdGgubWluKGEsYS1zKStyLHU9MCxjPXI7YzxsO2MrPW4pdT1vKHQsYyxjK24sZSksdGhpcy5pbXVsbihpKSx0aGlzLndvcmRzWzBdK3U8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9dTp0aGlzLl9pYWRkbih1KTtpZigwIT09cyl7Zm9yKHZhciBoPTEsdT1vKHQsYyx0Lmxlbmd0aCxlKSxjPTA7YzxzO2MrKyloKj1lO3RoaXMuaW11bG4oaCksdGhpcy53b3Jkc1swXSt1PDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXU6dGhpcy5faWFkZG4odSl9fSxpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQpe3Qud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl0LndvcmRzW2VdPXRoaXMud29yZHNbZV07dC5sZW5ndGg9dGhpcy5sZW5ndGgsdC5zaWduPXRoaXMuc2lnbix0LnJlZD10aGlzLnJlZH0saS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgaShudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9LGkucHJvdG90eXBlLnN0cmlwPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aD4xJiYwPT09dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXTspdGhpcy5sZW5ndGgtLTtyZXR1cm4gdGhpcy5fbm9ybVNpZ24oKX0saS5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF0mJih0aGlzLnNpZ249ITEpLHRoaXN9LGkucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In07dmFyIHA9WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sbT1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxnPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO2kucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYodD10fHwxMCwxNj09PXR8fCJoZXgiPT09dCl7Zm9yKHZhciBuPSIiLGk9MCxlPTB8ZXx8MSxhPTAsbz0wO288dGhpcy5sZW5ndGg7bysrKXt2YXIgcz10aGlzLndvcmRzW29dLGw9KDE2Nzc3MjE1JihzPDxpfGEpKS50b1N0cmluZygxNik7YT1zPj4+MjQtaSYxNjc3NzIxNSxuPTAhPT1hfHxvIT09dGhpcy5sZW5ndGgtMT9wWzYtbC5sZW5ndGhdK2wrbjpsK24saSs9MixpPj0yNiYmKGktPTI2LG8tLSl9Zm9yKDAhPT1hJiYobj1hLnRvU3RyaW5nKDE2KStuKTtuLmxlbmd0aCVlIT09MDspbj0iMCIrbjtyZXR1cm4gdGhpcy5zaWduJiYobj0iLSIrbiksbn1pZih0PT09KDB8dCkmJnQ+PTImJnQ8PTM2KXt2YXIgdT1tW3RdLGM9Z1t0XSxuPSIiLGg9dGhpcy5jbG9uZSgpO2ZvcihoLnNpZ249ITE7MCE9PWguY21wbigwKTspe3ZhciBmPWgubW9kbihjKS50b1N0cmluZyh0KTtoPWguaWRpdm4oYyksbj0wIT09aC5jbXBuKDApP3BbdS1mLmxlbmd0aF0rZituOmYrbn1yZXR1cm4gMD09PXRoaXMuY21wbigwKSYmKG49IjAiK24pLHRoaXMuc2lnbiYmKG49Ii0iK24pLG59cighMSwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpfSxpLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygxNil9LGkucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24odCl7dGhpcy5zdHJpcCgpO3ZhciBlPW5ldyBBcnJheSh0aGlzLmJ5dGVMZW5ndGgoKSk7ZVswXT0wO3ZhciByPXRoaXMuY2xvbmUoKTtpZigibGUiIT09dClmb3IodmFyIG49MDswIT09ci5jbXBuKDApO24rKyl7dmFyIGk9ci5hbmRsbigyNTUpO3IuaXNocm4oOCksZVtlLmxlbmd0aC1uLTFdPWl9ZWxzZSBmb3IodmFyIG49MDswIT09ci5jbXBuKDApO24rKyl7dmFyIGk9ci5hbmRsbigyNTUpO3IuaXNocm4oOCksZVtuXT1pfXJldHVybiBlfSxNYXRoLmNsejMyP2kucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDMyLU1hdGguY2x6MzIodCl9OmkucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9dCxyPTA7cmV0dXJuIGU+PTQwOTYmJihyKz0xMyxlPj4+PTEzKSxlPj02NCYmKHIrPTcsZT4+Pj03KSxlPj04JiYocis9NCxlPj4+PTQpLGU+PTImJihyKz0yLGU+Pj49MikscitlfSxpLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIDI2O3ZhciBlPXQscj0wO3JldHVybiAwPT09KDgxOTEmZSkmJihyKz0xMyxlPj4+PTEzKSwwPT09KDEyNyZlKSYmKHIrPTcsZT4+Pj03KSwwPT09KDE1JmUpJiYocis9NCxlPj4+PTQpLDA9PT0oMyZlKSYmKHIrPTIsZT4+Pj0yKSwwPT09KDEmZSkmJnIrKyxyfSxpLnByb3RvdHlwZS5iaXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSx0PXRoaXMuX2NvdW50Qml0cyhlKTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK3R9LGkucHJvdG90eXBlLnplcm9CaXRzPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuY21wbigwKSlyZXR1cm4gMDtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciByPXRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbZV0pO2lmKHQrPXIsMjYhPT1yKWJyZWFrfXJldHVybiB0fSxpLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpLzgpfSxpLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5jbXBuKDApKXJldHVybiB0aGlzLmNsb25lKCk7dmFyIHQ9dGhpcy5jbG9uZSgpO3JldHVybiB0LnNpZ249IXRoaXMuc2lnbix0fSxpLnByb3RvdHlwZS5pb3I9ZnVuY3Rpb24odCl7Zm9yKHRoaXMuc2lnbj10aGlzLnNpZ258fHQuc2lnbjt0aGlzLmxlbmd0aDx0Lmxlbmd0aDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMud29yZHNbZV09dGhpcy53b3Jkc1tlXXx0LndvcmRzW2VdO3JldHVybiB0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaW9yKHQpOnQuY2xvbmUoKS5pb3IodGhpcyl9LGkucHJvdG90eXBlLmlhbmQ9ZnVuY3Rpb24odCl7dGhpcy5zaWduPXRoaXMuc2lnbiYmdC5zaWduO3ZhciBlO2U9dGhpcy5sZW5ndGg+dC5sZW5ndGg/dDp0aGlzO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXSZ0LndvcmRzW3JdO3JldHVybiB0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQodCk6dC5jbG9uZSgpLmlhbmQodGhpcyl9LGkucHJvdG90eXBlLml4b3I9ZnVuY3Rpb24odCl7dGhpcy5zaWduPXRoaXMuc2lnbnx8dC5zaWduO3ZhciBlLHI7dGhpcy5sZW5ndGg+dC5sZW5ndGg/KGU9dGhpcyxyPXQpOihlPXQscj10aGlzKTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl1eci53b3Jkc1tuXTtpZih0aGlzIT09ZSlmb3IoO248ZS5sZW5ndGg7bisrKXRoaXMud29yZHNbbl09ZS53b3Jkc1tuXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5peG9yKHQpOnQuY2xvbmUoKS5peG9yKHRoaXMpfSxpLnByb3RvdHlwZS5zZXRuPWZ1bmN0aW9uKHQsZSl7cigibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO2Zvcih2YXIgbj10LzI2fDAsaT10JTI2O3RoaXMubGVuZ3RoPD1uOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIGU/dGhpcy53b3Jkc1tuXT10aGlzLndvcmRzW25dfDE8PGk6dGhpcy53b3Jkc1tuXT10aGlzLndvcmRzW25dJn4oMTw8aSksdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuc2lnbiYmIXQuc2lnbil7dGhpcy5zaWduPSExO3ZhciBlPXRoaXMuaXN1Yih0KTtyZXR1cm4gdGhpcy5zaWduPSF0aGlzLnNpZ24sdGhpcy5fbm9ybVNpZ24oKX1pZighdGhpcy5zaWduJiZ0LnNpZ24pe3Quc2lnbj0hMTt2YXIgZT10aGlzLmlzdWIodCk7cmV0dXJuIHQuc2lnbj0hMCxlLl9ub3JtU2lnbigpfXZhciByLG47dGhpcy5sZW5ndGg+dC5sZW5ndGg/KHI9dGhpcyxuPXQpOihyPXQsbj10aGlzKTtmb3IodmFyIGk9MCxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBlPXIud29yZHNbYV0rbi53b3Jkc1thXStpO3RoaXMud29yZHNbYV09NjcxMDg4NjMmZSxpPWU+Pj4yNn1mb3IoOzAhPT1pJiZhPHIubGVuZ3RoO2ErKyl7dmFyIGU9ci53b3Jkc1thXStpO3RoaXMud29yZHNbYV09NjcxMDg4NjMmZSxpPWU+Pj4yNn1pZih0aGlzLmxlbmd0aD1yLmxlbmd0aCwwIT09aSl0aGlzLndvcmRzW3RoaXMubGVuZ3RoXT1pLHRoaXMubGVuZ3RoKys7ZWxzZSBpZihyIT09dGhpcylmb3IoO2E8ci5sZW5ndGg7YSsrKXRoaXMud29yZHNbYV09ci53b3Jkc1thXTtyZXR1cm4gdGhpc30saS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHQuc2lnbiYmIXRoaXMuc2lnbil7dC5zaWduPSExO3ZhciBlPXRoaXMuc3ViKHQpO3JldHVybiB0LnNpZ249ITAsZX1pZighdC5zaWduJiZ0aGlzLnNpZ24pe3RoaXMuc2lnbj0hMTt2YXIgZT10LnN1Yih0aGlzKTtyZXR1cm4gdGhpcy5zaWduPSEwLGV9cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxpLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKHQuc2lnbil7dC5zaWduPSExO3ZhciBlPXRoaXMuaWFkZCh0KTtyZXR1cm4gdC5zaWduPSEwLGUuX25vcm1TaWduKCl9aWYodGhpcy5zaWduKXJldHVybiB0aGlzLnNpZ249ITEsdGhpcy5pYWRkKHQpLHRoaXMuc2lnbj0hMCx0aGlzLl9ub3JtU2lnbigpO3ZhciByPXRoaXMuY21wKHQpO2lmKDA9PT1yKXJldHVybiB0aGlzLnNpZ249ITEsdGhpcy5sZW5ndGg9MSx0aGlzLndvcmRzWzBdPTAsdGhpczt2YXIgbixpO3I+MD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgYT0wLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGU9bi53b3Jkc1tvXS1pLndvcmRzW29dK2E7YT1lPj4yNix0aGlzLndvcmRzW29dPTY3MTA4ODYzJmV9Zm9yKDswIT09YSYmbzxuLmxlbmd0aDtvKyspe3ZhciBlPW4ud29yZHNbb10rYTthPWU+PjI2LHRoaXMud29yZHNbb109NjcxMDg4NjMmZX1pZigwPT09YSYmbzxuLmxlbmd0aCYmbiE9PXRoaXMpZm9yKDtvPG4ubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPW4ud29yZHNbb107cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLG8pLG4hPT10aGlzJiYodGhpcy5zaWduPSEwKSx0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIodCl9LGkucHJvdG90eXBlLl9zbWFsbE11bFRvPWZ1bmN0aW9uKHQsZSl7ZS5zaWduPXQuc2lnbiE9PXRoaXMuc2lnbixlLmxlbmd0aD10aGlzLmxlbmd0aCt0Lmxlbmd0aDtmb3IodmFyIHI9MCxuPTA7bjxlLmxlbmd0aC0xO24rKyl7Zm9yKHZhciBpPXI+Pj4yNixhPTY3MTA4ODYzJnIsbz1NYXRoLm1pbihuLHQubGVuZ3RoLTEpLHM9TWF0aC5tYXgoMCxuLXRoaXMubGVuZ3RoKzEpO3M8PW87cysrKXt2YXIgbD1uLXMsdT0wfHRoaXMud29yZHNbbF0sYz0wfHQud29yZHNbc10saD11KmMsZj02NzEwODg2MyZoO2k9aSsoaC82NzEwODg2NHwwKXwwLGY9ZithfDAsYT02NzEwODg2MyZmLGk9aSsoZj4+PjI2KXwwfWUud29yZHNbbl09YSxyPWl9cmV0dXJuIDAhPT1yP2Uud29yZHNbbl09cjplLmxlbmd0aC0tLGUuc3RyaXAoKX0saS5wcm90b3R5cGUuX2JpZ011bFRvPWZ1bmN0aW9uKHQsZSl7ZS5zaWduPXQuc2lnbiE9PXRoaXMuc2lnbixlLmxlbmd0aD10aGlzLmxlbmd0aCt0Lmxlbmd0aDtmb3IodmFyIHI9MCxuPTAsaT0wO2k8ZS5sZW5ndGgtMTtpKyspe3ZhciBhPW47bj0wO2Zvcih2YXIgbz02NzEwODg2MyZyLHM9TWF0aC5taW4oaSx0Lmxlbmd0aC0xKSxsPU1hdGgubWF4KDAsaS10aGlzLmxlbmd0aCsxKTtsPD1zO2wrKyl7dmFyIHU9aS1sLGM9MHx0aGlzLndvcmRzW3VdLGg9MHx0LndvcmRzW2xdLGY9YypoLGQ9NjcxMDg4NjMmZjthPWErKGYvNjcxMDg4NjR8MCl8MCxkPWQrb3wwLG89NjcxMDg4NjMmZCxhPWErKGQ+Pj4yNil8MCxuKz1hPj4+MjYsYSY9NjcxMDg4NjN9ZS53b3Jkc1tpXT1vLHI9YSxhPW59cmV0dXJuIDAhPT1yP2Uud29yZHNbaV09cjplLmxlbmd0aC0tLGUuc3RyaXAoKX0saS5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj10aGlzLmxlbmd0aCt0Lmxlbmd0aDw2Mz90aGlzLl9zbWFsbE11bFRvKHQsZSk6dGhpcy5fYmlnTXVsVG8odCxlKX0saS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpKG51bGwpO3JldHVybiBlLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCt0Lmxlbmd0aCksdGhpcy5tdWxUbyh0LGUpfSxpLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmNtcG4oMCl8fDA9PT10LmNtcG4oMCkpcmV0dXJuIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xLHRoaXM7dmFyIGU9dGhpcy5sZW5ndGgscj10Lmxlbmd0aDt0aGlzLnNpZ249dC5zaWduIT09dGhpcy5zaWduLHRoaXMubGVuZ3RoPXRoaXMubGVuZ3RoK3QubGVuZ3RoLHRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV09MDtmb3IodmFyIG49dGhpcy5sZW5ndGgtMjtuPj0wO24tLSl7Zm9yKHZhciBpPTAsYT0wLG89TWF0aC5taW4obixyLTEpLHM9TWF0aC5tYXgoMCxuLWUrMSk7czw9bztzKyspe3ZhciBsPW4tcyx1PXRoaXMud29yZHNbbF0sYz10LndvcmRzW3NdLGg9dSpjLGY9NjcxMDg4NjMmaDtpKz1oLzY3MTA4ODY0fDAsZis9YSxhPTY3MTA4ODYzJmYsaSs9Zj4+PjI2fXRoaXMud29yZHNbbl09YSx0aGlzLndvcmRzW24rMV0rPWksaT0wfWZvcih2YXIgaT0wLGw9MTtsPHRoaXMubGVuZ3RoO2wrKyl7dmFyIGQ9dGhpcy53b3Jkc1tsXStpO3RoaXMud29yZHNbbF09NjcxMDg4NjMmZCxpPWQ+Pj4yNn1yZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5pbXVsbj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCk7Zm9yKHZhciBlPTAsbj0wO248dGhpcy5sZW5ndGg7bisrKXt2YXIgaT10aGlzLndvcmRzW25dKnQsYT0oNjcxMDg4NjMmaSkrKDY3MTA4ODYzJmUpO2U+Pj0yNixlKz1pLzY3MTA4ODY0fDAsZSs9YT4+PjI2LHRoaXMud29yZHNbbl09NjcxMDg4NjMmYX1yZXR1cm4gMCE9PWUmJih0aGlzLndvcmRzW25dPWUsdGhpcy5sZW5ndGgrKyksdGhpc30saS5wcm90b3R5cGUubXVsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKHQpfSxpLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWwodGhpcyl9LGkucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWwodGhpcyl9LGkucHJvdG90eXBlLmlzaGxuPWZ1bmN0aW9uKHQpe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT10JTI2LG49KHQtZSkvMjYsaT02NzEwODg2Mz4+PjI2LWU8PDI2LWU7aWYoMCE9PWUpe2Zvcih2YXIgYT0wLG89MDtvPHRoaXMubGVuZ3RoO28rKyl7dmFyIHM9dGhpcy53b3Jkc1tvXSZpLGw9dGhpcy53b3Jkc1tvXS1zPDxlO3RoaXMud29yZHNbb109bHxhLGE9cz4+PjI2LWV9YSYmKHRoaXMud29yZHNbb109YSx0aGlzLmxlbmd0aCsrKX1pZigwIT09bil7Zm9yKHZhciBvPXRoaXMubGVuZ3RoLTE7bz49MDtvLS0pdGhpcy53b3Jkc1tvK25dPXRoaXMud29yZHNbb107Zm9yKHZhciBvPTA7bzxuO28rKyl0aGlzLndvcmRzW29dPTA7dGhpcy5sZW5ndGgrPW59cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24odCxlLG4pe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgaTtpPWU/KGUtZSUyNikvMjY6MDt2YXIgYT10JTI2LG89TWF0aC5taW4oKHQtYSkvMjYsdGhpcy5sZW5ndGgpLHM9NjcxMDg4NjNeNjcxMDg4NjM+Pj5hPDxhLGw9bjtpZihpLT1vLGk9TWF0aC5tYXgoMCxpKSxsKXtmb3IodmFyIHU9MDt1PG87dSsrKWwud29yZHNbdV09dGhpcy53b3Jkc1t1XTtsLmxlbmd0aD1vfWlmKDA9PT1vKTtlbHNlIGlmKHRoaXMubGVuZ3RoPm8pe3RoaXMubGVuZ3RoLT1vO2Zvcih2YXIgdT0wO3U8dGhpcy5sZW5ndGg7dSsrKXRoaXMud29yZHNbdV09dGhpcy53b3Jkc1t1K29dfWVsc2UgdGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTE7Zm9yKHZhciBjPTAsdT10aGlzLmxlbmd0aC0xO3U+PTAmJigwIT09Y3x8dT49aSk7dS0tKXt2YXIgaD10aGlzLndvcmRzW3VdO3RoaXMud29yZHNbdV09Yzw8MjYtYXxoPj4+YSxjPWgmc31yZXR1cm4gbCYmMCE9PWMmJihsLndvcmRzW2wubGVuZ3RoKytdPWMpLDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLnN0cmlwKCksdGhpc30saS5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKHQpfSxpLnByb3RvdHlwZS5zaHJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXNocm4odCl9LGkucHJvdG90eXBlLnRlc3RuPWZ1bmN0aW9uKHQpe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT10JTI2LG49KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1uKXJldHVybiExO3ZhciBhPXRoaXMud29yZHNbbl07cmV0dXJuISEoYSZpKX0saS5wcm90b3R5cGUuaW1hc2tuPWZ1bmN0aW9uKHQpe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT10JTI2LG49KHQtZSkvMjY7aWYocighdGhpcy5zaWduLCJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMiKSwwIT09ZSYmbisrLHRoaXMubGVuZ3RoPU1hdGgubWluKG4sdGhpcy5sZW5ndGgpLDAhPT1lKXt2YXIgaT02NzEwODg2M142NzEwODg2Mz4+PmU8PGU7dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSY9aX1yZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5tYXNrbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbih0KX0saS5wcm90b3R5cGUuaWFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHIoIm51bWJlciI9PXR5cGVvZiB0KSx0PDA/dGhpcy5pc3VibigtdCk6dGhpcy5zaWduPzE9PT10aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1swXTx0Pyh0aGlzLndvcmRzWzBdPXQtdGhpcy53b3Jkc1swXSx0aGlzLnNpZ249ITEsdGhpcyk6KHRoaXMuc2lnbj0hMSx0aGlzLmlzdWJuKHQpLHRoaXMuc2lnbj0hMCx0aGlzKTp0aGlzLl9pYWRkbih0KX0saS5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uKHQpe3RoaXMud29yZHNbMF0rPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXT49NjcxMDg4NjQ7ZSsrKXRoaXMud29yZHNbZV0tPTY3MTA4ODY0LGU9PT10aGlzLmxlbmd0aC0xP3RoaXMud29yZHNbZSsxXT0xOnRoaXMud29yZHNbZSsxXSsrO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxlKzEpLHRoaXN9LGkucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uKHQpe2lmKHIoIm51bWJlciI9PXR5cGVvZiB0KSx0PDApcmV0dXJuIHRoaXMuaWFkZG4oLXQpO2lmKHRoaXMuc2lnbilyZXR1cm4gdGhpcy5zaWduPSExLHRoaXMuaWFkZG4odCksdGhpcy5zaWduPSEwLHRoaXM7dGhpcy53b3Jkc1swXS09dDtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2VdPDA7ZSsrKXRoaXMud29yZHNbZV0rPTY3MTA4ODY0LHRoaXMud29yZHNbZSsxXS09MTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5hZGRuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWFkZG4odCl9LGkucHJvdG90eXBlLnN1Ym49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3Vibih0KX0saS5wcm90b3R5cGUuaWFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpZ249ITEsdGhpc30saS5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCl9LGkucHJvdG90eXBlLl9pc2hsbnN1Ym11bD1mdW5jdGlvbih0LGUsbil7dmFyIGksYT10Lmxlbmd0aCtuO2lmKHRoaXMud29yZHMubGVuZ3RoPGEpe2Zvcih2YXIgbz1uZXcgQXJyYXkoYSksaT0wO2k8dGhpcy5sZW5ndGg7aSsrKW9baV09dGhpcy53b3Jkc1tpXTt0aGlzLndvcmRzPW99ZWxzZSBpPXRoaXMubGVuZ3RoO2Zvcih0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxhKTtpPHRoaXMubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPTA7Zm9yKHZhciBzPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbD10aGlzLndvcmRzW2krbl0rcyx1PXQud29yZHNbaV0qZTtsLT02NzEwODg2MyZ1LHM9KGw+PjI2KS0odS82NzEwODg2NHwwKSx0aGlzLndvcmRzW2krbl09NjcxMDg4NjMmbH1mb3IoO2k8dGhpcy5sZW5ndGgtbjtpKyspe3ZhciBsPXRoaXMud29yZHNbaStuXStzO3M9bD4+MjYsdGhpcy53b3Jkc1tpK25dPTY3MTA4ODYzJmx9aWYoMD09PXMpcmV0dXJuIHRoaXMuc3RyaXAoKTtyKHM9PT0tMSkscz0wO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgbD0tdGhpcy53b3Jkc1tpXStzO3M9bD4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZsfXJldHVybiB0aGlzLnNpZ249ITAsdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5fd29yZERpdj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMubGVuZ3RoLXQubGVuZ3RoLG49dGhpcy5jbG9uZSgpLGE9dCxvPWEud29yZHNbYS5sZW5ndGgtMV0scz10aGlzLl9jb3VudEJpdHMobyk7cj0yNi1zLDAhPT1yJiYoYT1hLnNobG4ociksbi5pc2hsbihyKSxvPWEud29yZHNbYS5sZW5ndGgtMV0pO3ZhciBsLHU9bi5sZW5ndGgtYS5sZW5ndGg7aWYoIm1vZCIhPT1lKXtsPW5ldyBpKG51bGwpLGwubGVuZ3RoPXUrMSxsLndvcmRzPW5ldyBBcnJheShsLmxlbmd0aCk7Zm9yKHZhciBjPTA7YzxsLmxlbmd0aDtjKyspbC53b3Jkc1tjXT0wfXZhciBoPW4uY2xvbmUoKS5faXNobG5zdWJtdWwoYSwxLHUpO2guc2lnbnx8KG49aCxsJiYobC53b3Jkc1t1XT0xKSk7Zm9yKHZhciBmPXUtMTtmPj0wO2YtLSl7dmFyIGQ9NjcxMDg4NjQqbi53b3Jkc1thLmxlbmd0aCtmXStuLndvcmRzW2EubGVuZ3RoK2YtMV07Zm9yKGQ9TWF0aC5taW4oZC9vfDAsNjcxMDg4NjMpLG4uX2lzaGxuc3VibXVsKGEsZCxmKTtuLnNpZ247KWQtLSxuLnNpZ249ITEsbi5faXNobG5zdWJtdWwoYSwxLGYpLDAhPT1uLmNtcG4oMCkmJihuLnNpZ249IW4uc2lnbik7bCYmKGwud29yZHNbZl09ZCl9cmV0dXJuIGwmJmwuc3RyaXAoKSxuLnN0cmlwKCksImRpdiIhPT1lJiYwIT09ciYmbi5pc2hybihyKSx7ZGl2Omw/bDpudWxsLG1vZDpufX0saS5wcm90b3R5cGUuZGl2bW9kPWZ1bmN0aW9uKHQsZSl7aWYocigwIT09dC5jbXBuKDApKSx0aGlzLnNpZ24mJiF0LnNpZ24pe3ZhciBuLGEsbz10aGlzLm5lZygpLmRpdm1vZCh0LGUpO3JldHVybiJtb2QiIT09ZSYmKG49by5kaXYubmVnKCkpLCJkaXYiIT09ZSYmKGE9MD09PW8ubW9kLmNtcG4oMCk/by5tb2Q6dC5zdWIoby5tb2QpKSx7ZGl2Om4sbW9kOmF9fWlmKCF0aGlzLnNpZ24mJnQuc2lnbil7dmFyIG4sbz10aGlzLmRpdm1vZCh0Lm5lZygpLGUpO3JldHVybiJtb2QiIT09ZSYmKG49by5kaXYubmVnKCkpLHtkaXY6bixtb2Q6by5tb2R9fXJldHVybiB0aGlzLnNpZ24mJnQuc2lnbj90aGlzLm5lZygpLmRpdm1vZCh0Lm5lZygpLGUpOnQubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcCh0KTwwP3tkaXY6bmV3IGkoMCksbW9kOnRoaXN9OjE9PT10Lmxlbmd0aD8iZGl2Ij09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OiJtb2QiPT09ZT97ZGl2Om51bGwsbW9kOm5ldyBpKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpuZXcgaSh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp0aGlzLl93b3JkRGl2KHQsZSl9LGkucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCwiZGl2IikuZGl2fSxpLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsIm1vZCIpLm1vZH0saS5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kaXZtb2QodCk7aWYoMD09PWUubW9kLmNtcG4oMCkpcmV0dXJuIGUuZGl2O3ZhciByPWUuZGl2LnNpZ24/ZS5tb2QuaXN1Yih0KTplLm1vZCxuPXQuc2hybigxKSxpPXQuYW5kbG4oMSksYT1yLmNtcChuKTtyZXR1cm4gYTwwfHwxPT09aSYmMD09PWE/ZS5kaXY6ZS5kaXYuc2lnbj9lLmRpdi5pc3VibigxKTplLmRpdi5pYWRkbigxKX0saS5wcm90b3R5cGUubW9kbj1mdW5jdGlvbih0KXtyKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9KDE8PDI2KSV0LG49MCxpPXRoaXMubGVuZ3RoLTE7aT49MDtpLS0pbj0oZSpuK3RoaXMud29yZHNbaV0pJXQ7cmV0dXJuIG59LGkucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uKHQpe3IodDw9NjcxMDg4NjMpO2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGk9dGhpcy53b3Jkc1tuXSs2NzEwODg2NCplO3RoaXMud29yZHNbbl09aS90fDAsZT1pJXR9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuZGl2bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKHQpfSxpLnByb3RvdHlwZS5lZ2NkPWZ1bmN0aW9uKHQpe3IoIXQuc2lnbikscigwIT09dC5jbXBuKDApKTt2YXIgZT10aGlzLG49dC5jbG9uZSgpO2U9ZS5zaWduP2UubW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIGE9bmV3IGkoMSksbz1uZXcgaSgwKSxzPW5ldyBpKDApLGw9bmV3IGkoMSksdT0wO2UuaXNFdmVuKCkmJm4uaXNFdmVuKCk7KWUuaXNocm4oMSksbi5pc2hybigxKSwrK3U7Zm9yKHZhciBjPW4uY2xvbmUoKSxoPWUuY2xvbmUoKTswIT09ZS5jbXBuKDApOyl7Zm9yKDtlLmlzRXZlbigpOyllLmlzaHJuKDEpLGEuaXNFdmVuKCkmJm8uaXNFdmVuKCk/KGEuaXNocm4oMSksby5pc2hybigxKSk6KGEuaWFkZChjKS5pc2hybigxKSxvLmlzdWIoaCkuaXNocm4oMSkpO2Zvcig7bi5pc0V2ZW4oKTspbi5pc2hybigxKSxzLmlzRXZlbigpJiZsLmlzRXZlbigpPyhzLmlzaHJuKDEpLGwuaXNocm4oMSkpOihzLmlhZGQoYykuaXNocm4oMSksbC5pc3ViKGgpLmlzaHJuKDEpKTtlLmNtcChuKT49MD8oZS5pc3ViKG4pLGEuaXN1YihzKSxvLmlzdWIobCkpOihuLmlzdWIoZSkscy5pc3ViKGEpLGwuaXN1YihvKSl9cmV0dXJue2E6cyxiOmwsZ2NkOm4uaXNobG4odSl9fSxpLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7cighdC5zaWduKSxyKDAhPT10LmNtcG4oMCkpO3ZhciBlPXRoaXMsbj10LmNsb25lKCk7ZT1lLnNpZ24/ZS5tb2QodCk6ZS5jbG9uZSgpO2Zvcih2YXIgYT1uZXcgaSgxKSxvPW5ldyBpKDApLHM9bi5jbG9uZSgpO2UuY21wbigxKT4wJiZuLmNtcG4oMSk+MDspe2Zvcig7ZS5pc0V2ZW4oKTspZS5pc2hybigxKSxhLmlzRXZlbigpP2EuaXNocm4oMSk6YS5pYWRkKHMpLmlzaHJuKDEpO2Zvcig7bi5pc0V2ZW4oKTspbi5pc2hybigxKSxvLmlzRXZlbigpP28uaXNocm4oMSk6by5pYWRkKHMpLmlzaHJuKDEpO2UuY21wKG4pPj0wPyhlLmlzdWIobiksYS5pc3ViKG8pKToobi5pc3ViKGUpLG8uaXN1YihhKSl9cmV0dXJuIDA9PT1lLmNtcG4oMSk/YTpvfSxpLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMuY21wbigwKSlyZXR1cm4gdC5jbG9uZSgpO2lmKDA9PT10LmNtcG4oMCkpcmV0dXJuIHRoaXMuY2xvbmUoKTt2YXIgZT10aGlzLmNsb25lKCkscj10LmNsb25lKCk7ZS5zaWduPSExLHIuc2lnbj0hMTtmb3IodmFyIG49MDtlLmlzRXZlbigpJiZyLmlzRXZlbigpO24rKyllLmlzaHJuKDEpLHIuaXNocm4oMSk7Zm9yKDs7KXtmb3IoO2UuaXNFdmVuKCk7KWUuaXNocm4oMSk7Zm9yKDtyLmlzRXZlbigpOylyLmlzaHJuKDEpO3ZhciBpPWUuY21wKHIpO2lmKGk8MCl7dmFyIGE9ZTtlPXIscj1hfWVsc2UgaWYoMD09PWl8fDA9PT1yLmNtcG4oMSkpYnJlYWs7ZS5pc3ViKHIpfXJldHVybiByLmlzaGxuKG4pfSxpLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVnY2QodCkuYS5tb2QodCl9LGkucHJvdG90eXBlLmlzRXZlbj1mdW5jdGlvbigpe3JldHVybiAwPT09KDEmdGhpcy53b3Jkc1swXSl9LGkucHJvdG90eXBlLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT0oMSZ0aGlzLndvcmRzWzBdKX0saS5wcm90b3R5cGUuYW5kbG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud29yZHNbMF0mdH0saS5wcm90b3R5cGUuYmluY249ZnVuY3Rpb24odCl7cigibnVtYmVyIj09dHlwZW9mIHQpO3ZhciBlPXQlMjYsbj0odC1lKS8yNixpPTE8PGU7aWYodGhpcy5sZW5ndGg8PW4pe2Zvcih2YXIgYT10aGlzLmxlbmd0aDthPG4rMTthKyspdGhpcy53b3Jkc1thXT0wO3JldHVybiB0aGlzLndvcmRzW25dfD1pLHRoaXMubGVuZ3RoPW4rMSx0aGlzfWZvcih2YXIgbz1pLGE9bjswIT09byYmYTx0aGlzLmxlbmd0aDthKyspe3ZhciBzPXRoaXMud29yZHNbYV07cys9byxvPXM+Pj4yNixzJj02NzEwODg2Myx0aGlzLndvcmRzW2FdPXN9cmV0dXJuIDAhPT1vJiYodGhpcy53b3Jkc1thXT1vLHRoaXMubGVuZ3RoKyspLHRoaXN9LGkucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24odCl7dmFyIGU9dDwwO2lmKGUmJih0PS10KSx0aGlzLnNpZ24mJiFlKXJldHVybi0xO2lmKCF0aGlzLnNpZ24mJmUpcmV0dXJuIDE7dCY9NjcxMDg4NjMsdGhpcy5zdHJpcCgpO3ZhciByO2lmKHRoaXMubGVuZ3RoPjEpcj0xO2Vsc2V7dmFyIG49dGhpcy53b3Jkc1swXTtyPW49PT10PzA6bjx0Py0xOjF9cmV0dXJuIHRoaXMuc2lnbiYmKHI9LXIpLHJ9LGkucHJvdG90eXBlLmNtcD1mdW5jdGlvbih0KXtpZih0aGlzLnNpZ24mJiF0LnNpZ24pcmV0dXJuLTE7aWYoIXRoaXMuc2lnbiYmdC5zaWduKXJldHVybiAxO3ZhciBlPXRoaXMudWNtcCh0KTtyZXR1cm4gdGhpcy5zaWduPy1lOmV9LGkucHJvdG90eXBlLnVjbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg+dC5sZW5ndGgpcmV0dXJuIDE7aWYodGhpcy5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLTE7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aC0xO3I+PTA7ci0tKXt2YXIgbj10aGlzLndvcmRzW3JdLGk9dC53b3Jkc1tyXTtpZihuIT09aSl7bjxpP2U9LTE6bj5pJiYoZT0xKTticmVha319cmV0dXJuIGV9LGkucmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZih0KX0saS5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIoIXRoaXMucmVkLCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IikscighdGhpcy5zaWduLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLHQuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZCh0KX0saS5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbigpe3JldHVybiByKHRoaXMucmVkLCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5yZWQuY29udmVydEZyb20odGhpcyl9LGkucHJvdG90eXBlLl9mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZWQ9dCx0aGlzfSxpLnByb3RvdHlwZS5mb3JjZVJlZD1mdW5jdGlvbih0KXtyZXR1cm4gcighdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLl9mb3JjZVJlZCh0KX0saS5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuYWRkKHRoaXMsdCl9LGkucHJvdG90eXBlLnJlZElBZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaWFkZCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0saS5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pc3ViKHRoaXMsdCl9LGkucHJvdG90eXBlLnJlZFNobD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnNobCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRNdWw9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5pbXVsKHRoaXMsdCl9LGkucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbigpe3JldHVybiByKHRoaXMucmVkLCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FyKHRoaXMpfSxpLnByb3RvdHlwZS5yZWRJU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0saS5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiByKHRoaXMucmVkLCJyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcnQodGhpcyl9LGkucHJvdG90eXBlLnJlZEludm09ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pbnZtKHRoaXMpfSxpLnByb3RvdHlwZS5yZWROZWc9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0saS5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkJiYhdC5yZWQsInJlZFBvdyhub3JtYWxOdW0pIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsdCl9O3ZhciB2PXtrMjU2Om51bGwscDIyNDpudWxsLHAxOTI6bnVsbCxwMjU1MTk6bnVsbH07cy5wcm90b3R5cGUuX3RtcD1mdW5jdGlvbigpe3ZhciB0PW5ldyBpKG51bGwpO3JldHVybiB0LndvcmRzPW5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uLzEzKSksdH0scy5wcm90b3R5cGUuaXJlZHVjZT1mdW5jdGlvbih0KXt2YXIgZSxyPXQ7ZG8gdGhpcy5zcGxpdChyLHRoaXMudG1wKSxyPXRoaXMuaW11bEsocikscj1yLmlhZGQodGhpcy50bXApLGU9ci5iaXRMZW5ndGgoKTt3aGlsZShlPnRoaXMubik7dmFyIG49ZTx0aGlzLm4/LTE6ci51Y21wKHRoaXMucCk7cmV0dXJuIDA9PT1uPyhyLndvcmRzWzBdPTAsci5sZW5ndGg9MSk6bj4wP3IuaXN1Yih0aGlzLnApOnIuc3RyaXAoKSxyfSxzLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe3QuaXNocm4odGhpcy5uLDAsZSl9LHMucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3JldHVybiB0LmltdWwodGhpcy5rKX0sbihsLHMpLGwucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTQxOTQzMDMsbj1NYXRoLm1pbih0Lmxlbmd0aCw5KSxpPTA7aTxuO2krKyllLndvcmRzW2ldPXQud29yZHNbaV07aWYoZS5sZW5ndGg9bix0Lmxlbmd0aDw9OSlyZXR1cm4gdC53b3Jkc1swXT0wLHZvaWQodC5sZW5ndGg9MSk7dmFyIGE9dC53b3Jkc1s5XTtlLndvcmRzW2UubGVuZ3RoKytdPWEmcjtmb3IodmFyIGk9MTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXQud29yZHNbaV07dC53b3Jkc1tpLTEwXT0obyZyKTw8NHxhPj4+MjIsYT1vfXQud29yZHNbaS0xMF09YT4+PjIyLHQubGVuZ3RoLT05fSxsLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXt0LndvcmRzW3QubGVuZ3RoXT0wLHQud29yZHNbdC5sZW5ndGgrMV09MCx0Lmxlbmd0aCs9Mjtmb3IodmFyIGUscj0wLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dC53b3Jkc1tuXTtlPTY0Kmkscis9OTc3KmksZSs9ci82NzEwODg2NHwwLHImPTY3MTA4ODYzLHQud29yZHNbbl09cixyPWV9cmV0dXJuIDA9PT10LndvcmRzW3QubGVuZ3RoLTFdJiYodC5sZW5ndGgtLSwwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmdC5sZW5ndGgtLSksdH0sbih1LHMpLG4oYyxzKSxuKGgscyksaC5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj0xOSp0LndvcmRzW3JdK2UsaT02NzEwODg2MyZuO24+Pj49MjYsdC53b3Jkc1tyXT1pLGU9bn1yZXR1cm4gMCE9PWUmJih0LndvcmRzW3QubGVuZ3RoKytdPWUpLHR9LGkuX3ByaW1lPWZ1bmN0aW9uIHQoZSl7aWYodltlXSlyZXR1cm4gdltlXTt2YXIgdDtpZigiazI1NiI9PT1lKXQ9bmV3IGw7ZWxzZSBpZigicDIyNCI9PT1lKXQ9bmV3IHU7ZWxzZSBpZigicDE5MiI9PT1lKXQ9bmV3IGM7ZWxzZXtpZigicDI1NTE5IiE9PWUpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHByaW1lICIrZSk7dD1uZXcgaH1yZXR1cm4gdltlXT10LHR9LGYucHJvdG90eXBlLl92ZXJpZnkxPWZ1bmN0aW9uKHQpe3IoIXQuc2lnbiwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxyKHQucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LGYucHJvdG90eXBlLl92ZXJpZnkyPWZ1bmN0aW9uKHQsZSl7cighdC5zaWduJiYhZS5zaWduLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLHIodC5yZWQmJnQucmVkPT09ZS5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0sZi5wcm90b3R5cGUuaW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UodCkuX2ZvcmNlUmVkKHRoaXMpOnQubW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxmLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZSgpO3JldHVybiBlLnNpZ249IWUuc2lnbixlLmlhZGQodGhpcy5tKS5fZm9yY2VSZWQodGhpcyl9LGYucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LGYucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pYWRkKGUpO3JldHVybiByLmNtcCh0aGlzLm0pPj0wJiZyLmlzdWIodGhpcy5tKSxyfSxmLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5zdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyLl9mb3JjZVJlZCh0aGlzKX0sZi5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmlzdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyfSxmLnByb3RvdHlwZS5zaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MSh0KSx0aGlzLmltb2QodC5zaGxuKGUpKX0sZi5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQuaW11bChlKSl9LGYucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQubXVsKGUpKX0sZi5wcm90b3R5cGUuaXNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbXVsKHQsdCl9LGYucHJvdG90eXBlLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tdWwodCx0KX0sZi5wcm90b3R5cGUuc3FydD1mdW5jdGlvbih0KXtpZigwPT09dC5jbXBuKDApKXJldHVybiB0LmNsb25lKCk7dmFyIGU9dGhpcy5tLmFuZGxuKDMpO2lmKHIoZSUyPT09MSksMz09PWUpe3ZhciBuPXRoaXMubS5hZGQobmV3IGkoMSkpLmlzaHJuKDIpLGE9dGhpcy5wb3codCxuKTtyZXR1cm4gYX1mb3IodmFyIG89dGhpcy5tLnN1Ym4oMSkscz0wOzAhPT1vLmNtcG4oMCkmJjA9PT1vLmFuZGxuKDEpOylzKyssby5pc2hybigxKTtyKDAhPT1vLmNtcG4oMCkpO3ZhciBsPW5ldyBpKDEpLnRvUmVkKHRoaXMpLHU9bC5yZWROZWcoKSxjPXRoaXMubS5zdWJuKDEpLmlzaHJuKDEpLGg9dGhpcy5tLmJpdExlbmd0aCgpO2ZvcihoPW5ldyBpKDIqaCpoKS50b1JlZCh0aGlzKTswIT09dGhpcy5wb3coaCxjKS5jbXAodSk7KWgucmVkSUFkZCh1KTtmb3IodmFyIGY9dGhpcy5wb3coaCxvKSxhPXRoaXMucG93KHQsby5hZGRuKDEpLmlzaHJuKDEpKSxkPXRoaXMucG93KHQsbykscD1zOzAhPT1kLmNtcChsKTspe2Zvcih2YXIgbT1kLGc9MDswIT09bS5jbXAobCk7ZysrKW09bS5yZWRTcXIoKTtyKGc8cCk7dmFyIHY9dGhpcy5wb3coZixuZXcgaSgxKS5pc2hsbihwLWctMSkpO2E9YS5yZWRNdWwodiksZj12LnJlZFNxcigpLGQ9ZC5yZWRNdWwoZikscD1nfXJldHVybiBhfSxmLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX2ludm1wKHRoaXMubSk7cmV0dXJuIGUuc2lnbj8oZS5zaWduPSExLHRoaXMuaW1vZChlKS5yZWROZWcoKSk6dGhpcy5pbW9kKGUpfSxmLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCxlKXt2YXIgcj1bXTtpZigwPT09ZS5jbXBuKDApKXJldHVybiBuZXcgaSgxKTtmb3IodmFyIG49ZS5jbG9uZSgpOzAhPT1uLmNtcG4oMCk7KXIucHVzaChuLmFuZGxuKDEpKSxuLmlzaHJuKDEpO2Zvcih2YXIgYT10LG89MDtvPHIubGVuZ3RoJiYwPT09cltvXTtvKyssYT10aGlzLnNxcihhKSk7aWYoKytvPHIubGVuZ3RoKWZvcih2YXIgbj10aGlzLnNxcihhKTtvPHIubGVuZ3RoO28rKyxuPXRoaXMuc3FyKG4pKTAhPT1yW29dJiYoYT10aGlzLm11bChhLG4pKTtyZXR1cm4gYX0sZi5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQubW9kKHRoaXMubSk7cmV0dXJuIGU9PT10P2UuY2xvbmUoKTplfSxmLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10LmNsb25lKCk7cmV0dXJuIGUucmVkPW51bGwsZX0saS5tb250PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZCh0KX0sbihkLGYpLGQucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbW9kKHQuc2hsbih0aGlzLnNoaWZ0KSl9LGQucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Lm11bCh0aGlzLnJpbnYpKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxkLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7aWYoMD09PXQuY21wbigwKXx8MD09PWUuY21wbigwKSlyZXR1cm4gdC53b3Jkc1swXT0wLHQubGVuZ3RoPTEsdDt2YXIgcj10LmltdWwoZSksbj1yLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxpPXIuaXN1YihuKS5pc2hybih0aGlzLnNoaWZ0KSxhPWk7cmV0dXJuIGkuY21wKHRoaXMubSk+PTA/YT1pLmlzdWIodGhpcy5tKTppLmNtcG4oMCk8MCYmKGE9aS5pYWRkKHRoaXMubSkpLGEuX2ZvcmNlUmVkKHRoaXMpfSxkLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtpZigwPT09dC5jbXBuKDApfHwwPT09ZS5jbXBuKDApKXJldHVybiBuZXcgaSgwKS5fZm9yY2VSZWQodGhpcyk7dmFyIHI9dC5tdWwoZSksbj1yLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxhPXIuaXN1YihuKS5pc2hybih0aGlzLnNoaWZ0KSxvPWE7cmV0dXJuIGEuY21wKHRoaXMubSk+PTA/bz1hLmlzdWIodGhpcy5tKTphLmNtcG4oMCk8MCYmKG89YS5pYWRkKHRoaXMubSkpLG8uX2ZvcmNlUmVkKHRoaXMpfSxkLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Ll9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7cmV0dXJuIGUuX2ZvcmNlUmVkKHRoaXMpfX0oInVuZGVmaW5lZCI9PXR5cGVvZiBlfHxlLHRoaXMpfSx7fV0sNTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZSxyLG4saT10Lmxlbmd0aCxhPTA7Zm9yKGU9MDtlPGk7KytlKWErPXRbZV0ubGVuZ3RoO3ZhciBvPW5ldyBBcnJheShhKSxzPTA7Zm9yKGU9MDtlPGk7KytlKXt2YXIgbD10W2VdLHU9bC5sZW5ndGg7Zm9yKHI9MDtyPHU7KytyKXt2YXIgYz1vW3MrK109bmV3IEFycmF5KHUtMSksaD0wO2ZvcihuPTA7bjx1OysrbiluIT09ciYmKGNbaCsrXT1sW25dKTtpZigxJnIpe3ZhciBmPWNbMV07Y1sxXT1jWzBdLGNbMF09Zn19fXJldHVybiBvfWUuZXhwb3J0cz1ufSx7fV0sNTk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj0wO3I8dDsrK3IpaWYoIShlW3JdPD1lW3IrdF0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGkodCxlLHIsaSl7Zm9yKHZhciBhPTAsbz0wLHM9MCxsPXQubGVuZ3RoO3M8bDsrK3Mpe3ZhciB1PXRbc107aWYoIW4oZSx1KSl7Zm9yKHZhciBjPTA7YzwyKmU7KytjKXJbYSsrXT11W2NdO2lbbysrXT1zfX1yZXR1cm4gb31mdW5jdGlvbiBhKHQsZSxyLG4pe3ZhciBhPXQubGVuZ3RoLG89ZS5sZW5ndGg7aWYoIShhPD0wfHxvPD0wKSl7dmFyIHM9dFswXS5sZW5ndGg+Pj4xO2lmKCEoczw9MCkpe3ZhciBsLHU9aC5tYWxsb2NEb3VibGUoMipzKmEpLGM9aC5tYWxsb2NJbnQzMihhKTtpZihhPWkodCxzLHUsYyksYT4wKXtpZigxPT09cyYmbilmLmluaXQoYSksbD1mLnN3ZWVwQ29tcGxldGUocyxyLDAsYSx1LGMsMCxhLHUsYyk7ZWxzZXt2YXIgcD1oLm1hbGxvY0RvdWJsZSgyKnMqbyksbT1oLm1hbGxvY0ludDMyKG8pO289aShlLHMscCxtKSxvPjAmJihmLmluaXQoYStvKSxsPTE9PT1zP2Yuc3dlZXBCaXBhcnRpdGUocyxyLDAsYSx1LGMsMCxvLHAsbSk6ZChzLHIsbixhLHUsYyxvLHAsbSksaC5mcmVlKHApLGguZnJlZShtKSl9aC5mcmVlKHUpLGguZnJlZShjKX1yZXR1cm4gbH19fWZ1bmN0aW9uIG8odCxlKXtjLnB1c2goW3QsZV0pfWZ1bmN0aW9uIHModCl7cmV0dXJuIGM9W10sYSh0LHQsbywhMCksY31mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIGM9W10sYSh0LGUsbywhMSksY31mdW5jdGlvbiB1KHQsZSxyKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBzKHQpO2Nhc2UgMjpyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9hKHQsdCxlLCEwKTpsKHQsZSk7Y2FzZSAzOnJldHVybiBhKHQsZSxyLCExKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiYm94LWludGVyc2VjdDogSW52YWxpZCBhcmd1bWVudHMiKX19ZS5leHBvcnRzPXU7dmFyIGMsaD10KCJ0eXBlZGFycmF5LXBvb2wiKSxmPXQoIi4vbGliL3N3ZWVwIiksZD10KCIuL2xpYi9pbnRlcnNlY3QiKTsKfSx7Ii4vbGliL2ludGVyc2VjdCI6NjEsIi4vbGliL3N3ZWVwIjo2NSwidHlwZWRhcnJheS1wb29sIjo1MDJ9XSw2MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj0iYnJ1dGVGb3JjZSIrKHQ/IlJlZCI6IkJsdWUiKSsoZT8iRmxpcCI6IiIpKyhyPyJGdWxsIjoiIiksaT1bImZ1bmN0aW9uICIsbiwiKCIsdy5qb2luKCksIil7IiwidmFyICIsdSwiPTIqIixhLCI7Il0sbD0iZm9yKHZhciBpPSIrYysiLCIrcCsiPSIrdSsiKiIrYysiO2k8IitoKyI7KytpLCIrcCsiKz0iK3UrIil7dmFyIHgwPSIrZisiWyIrbysiKyIrcCsiXSx4MT0iK2YrIlsiK28rIisiK3ArIisiK2ErIl0seGk9IitkKyJbaV07IixNPSJmb3IodmFyIGo9IittKyIsIitiKyI9Iit1KyIqIittKyI7ajwiK2crIjsrK2osIitiKyIrPSIrdSsiKXt2YXIgeTA9Iit2KyJbIitvKyIrIitiKyJdLCIrKHI/InkxPSIrdisiWyIrbysiKyIrYisiKyIrYSsiXSwiOiIiKSsieWk9Iit5KyJbal07IjtyZXR1cm4gdD9pLnB1c2gobCxfLCI6IixNKTppLnB1c2goTSxfLCI6IixsKSxyP2kucHVzaCgiaWYoeTE8eDB8fHgxPHkwKWNvbnRpbnVlOyIpOmU/aS5wdXNoKCJpZih5MDw9eDB8fHgxPHkwKWNvbnRpbnVlOyIpOmkucHVzaCgiaWYoeTA8eDB8fHgxPHkwKWNvbnRpbnVlOyIpLGkucHVzaCgiZm9yKHZhciBrPSIrbysiKzE7azwiK2ErIjsrK2spe3ZhciByMD0iK2YrIltrKyIrcCsiXSxyMT0iK2YrIltrKyIrYSsiKyIrcCsiXSxiMD0iK3YrIltrKyIrYisiXSxiMT0iK3YrIltrKyIrYSsiKyIrYisiXTtpZihyMTxiMHx8YjE8cjApY29udGludWUgIitfKyI7fXZhciAiK3grIj0iK3MrIigiKSxlP2kucHVzaCgieWkseGkiKTppLnB1c2goInhpLHlpIiksaS5wdXNoKCIpO2lmKCIreCsiIT09dm9pZCAwKXJldHVybiAiK3grIjt9fX0iKSx7bmFtZTpuLGNvZGU6aS5qb2luKCIiKX19ZnVuY3Rpb24gaSh0KXtmdW5jdGlvbiBlKGUscil7dmFyIGE9bihlLHIsdCk7aS5wdXNoKGEuY29kZSksby5wdXNoKCJyZXR1cm4gIithLm5hbWUrIigiK3cuam9pbigpKyIpOyIpfXZhciByPSJicnV0ZUZvcmNlIisodD8iRnVsbCI6IlBhcnRpYWwiKSxpPVtdLGE9dy5zbGljZSgpO3R8fGEuc3BsaWNlKDMsMCxsKTt2YXIgbz1bImZ1bmN0aW9uICIrcisiKCIrYS5qb2luKCkrIil7Il07by5wdXNoKCJpZigiK2grIi0iK2MrIj4iK2crIi0iK20rIil7IiksdD8oZSghMCwhMSksby5wdXNoKCJ9ZWxzZXsiKSxlKCExLCExKSk6KG8ucHVzaCgiaWYoIitsKyIpeyIpLGUoITAsITApLG8ucHVzaCgifWVsc2V7IiksZSghMCwhMSksby5wdXNoKCJ9fWVsc2V7aWYoIitsKyIpeyIpLGUoITEsITApLG8ucHVzaCgifWVsc2V7IiksZSghMSwhMSksby5wdXNoKCJ9IikpLG8ucHVzaCgifX1yZXR1cm4gIityKTt2YXIgcz1pLmpvaW4oIiIpK28uam9pbigiIiksdT1uZXcgRnVuY3Rpb24ocyk7cmV0dXJuIHUoKX12YXIgYT0iZCIsbz0iYXgiLHM9InZ2IixsPSJmcCIsdT0iZXMiLGM9InJzIixoPSJyZSIsZj0icmIiLGQ9InJpIixwPSJycCIsbT0iYnMiLGc9ImJlIix2PSJiYiIseT0iYmkiLGI9ImJwIix4PSJydiIsXz0iUSIsdz1bYSxvLHMsYyxoLGYsZCxtLGcsdix5XTtyLnBhcnRpYWw9aSghMSksci5mdWxsPWkoITApfSx7fV0sNjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPTgqdS5sb2cyKGUrMSkqKHQrMSl8MCxuPXUubmV4dFBvdzIoaypyKTtTLmxlbmd0aDxuJiYobC5mcmVlKFMpLFM9bC5tYWxsb2NJbnQzMihuKSk7dmFyIGk9dS5uZXh0UG93MihUKnIpO0w8aSYmKGwuZnJlZShMKSxMPWwubWFsbG9jRG91YmxlKGkpKX1mdW5jdGlvbiBpKHQsZSxyLG4saSxhLG8scyxsKXt2YXIgdT1rKnQ7U1t1XT1lLFNbdSsxXT1yLFNbdSsyXT1uLFNbdSszXT1pLFNbdSs0XT1hLFNbdSs1XT1vO3ZhciBjPVQqdDtMW2NdPXMsTFtjKzFdPWx9ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMsbCx1LGMpe3ZhciBoPTIqdCxmPWwqaCxkPXVbZitlXTt0OmZvcih2YXIgcD1pLG09aSpoO3A8YTsrK3AsbSs9aCl7dmFyIGc9b1ttK2VdLHY9b1ttK2UrdF07aWYoIShkPGd8fHY8ZHx8biYmZD09PWcpKXtmb3IodmFyIHk9c1twXSxiPWUrMTtiPHQ7KytiKXt2YXIgZz1vW20rYl0sdj1vW20rYit0XSx4PXVbZitiXSxfPXVbZitiK3RdO2lmKHY8eHx8XzxnKWNvbnRpbnVlIHR9dmFyIHc7aWYodz1uP3IoYyx5KTpyKHksYyksdm9pZCAwIT09dylyZXR1cm4gd319fWZ1bmN0aW9uIG8odCxlLHIsbixpLGEsbyxzLGwsdSl7dmFyIGM9Mip0LGg9cypjLGY9bFtoK2VdO3Q6Zm9yKHZhciBkPW4scD1uKmM7ZDxpOysrZCxwKz1jKXt2YXIgbT1vW2RdO2lmKG0hPT11KXt2YXIgZz1hW3ArZV0sdj1hW3ArZSt0XTtpZighKGY8Z3x8djxmKSl7Zm9yKHZhciB5PWUrMTt5PHQ7Kyt5KXt2YXIgZz1hW3AreV0sdj1hW3AreSt0XSxiPWxbaCt5XSx4PWxbaCt5K3RdO2lmKHY8Ynx8eDxnKWNvbnRpbnVlIHR9dmFyIF89cihtLHUpO2lmKHZvaWQgMCE9PV8pcmV0dXJuIF99fX19ZnVuY3Rpb24gcyh0LGUscixzLGwsdSxjLG0sRSl7bih0LHMrYyk7dmFyIEMsST0wLHo9Mip0O2ZvcihpKEkrKywwLDAscywwLGMscj8xNjowLC0oMS8wKSwxLzApLHJ8fGkoSSsrLDAsMCxjLDAscywxLC0oMS8wKSwxLzApO0k+MDspe0ktPTE7dmFyIEQ9SSprLFA9U1tEXSxPPVNbRCsxXSxSPVNbRCsyXSxGPVNbRCszXSxqPVNbRCs0XSxOPVNbRCs1XSxCPUkqVCxVPUxbQl0sVj1MW0IrMV0scT0xJk4sSD0hISgxNiZOKSxZPWwsRz11LFg9bSxXPUU7aWYocSYmKFk9bSxHPUUsWD1sLFc9dSksISgyJk4mJihSPV8odCxQLE8sUixZLEcsViksTz49Uil8fDQmTiYmKE89dyh0LFAsTyxSLFksRyxVKSxPPj1SKSkpe3ZhciBaPVItTyxKPWotRjtpZihIKXtpZih0KloqKForSik8eSl7aWYoQz1kLnNjYW5Db21wbGV0ZSh0LFAsZSxPLFIsWSxHLEYsaixYLFcpLHZvaWQgMCE9PUMpcmV0dXJuIEM7Y29udGludWV9fWVsc2V7aWYodCpNYXRoLm1pbihaLEopPGcpe2lmKEM9aCh0LFAsZSxxLE8sUixZLEcsRixqLFgsVyksdm9pZCAwIT09QylyZXR1cm4gQztjb250aW51ZX1pZih0KloqSjx2KXtpZihDPWQuc2NhbkJpcGFydGl0ZSh0LFAsZSxxLE8sUixZLEcsRixqLFgsVyksdm9pZCAwIT09QylyZXR1cm4gQztjb250aW51ZX19dmFyIEs9Yih0LFAsTyxSLFksRyxVLFYpO2lmKE88SylpZih0KihLLU8pPGcpe2lmKEM9Zih0LFArMSxlLE8sSyxZLEcsRixqLFgsVyksdm9pZCAwIT09QylyZXR1cm4gQ31lbHNlIGlmKFA9PT10LTIpe2lmKEM9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxGLGosWCxXLE8sSyxZLEcpOmQuc3dlZXBCaXBhcnRpdGUodCxlLE8sSyxZLEcsRixqLFgsVyksdm9pZCAwIT09QylyZXR1cm4gQ31lbHNlIGkoSSsrLFArMSxPLEssRixqLHEsLSgxLzApLDEvMCksaShJKyssUCsxLEYsaixPLEssMV5xLC0oMS8wKSwxLzApO2lmKEs8Uil7dmFyIFE9cCh0LFAsRixqLFgsVyksJD1YW3oqUStQXSx0dD14KHQsUCxRLGosWCxXLCQpO2lmKHR0PGomJmkoSSsrLFAsSyxSLHR0LGosKDR8cSkrKEg/MTY6MCksJCxWKSxGPFEmJmkoSSsrLFAsSyxSLEYsUSwoMnxxKSsoSD8xNjowKSxVLCQpLFErMT09PXR0KXtpZihDPUg/byh0LFAsZSxLLFIsWSxHLFEsWCxXW1FdKTphKHQsUCxlLHEsSyxSLFksRyxRLFgsV1tRXSksdm9pZCAwIT09QylyZXR1cm4gQ31lbHNlIGlmKFE8dHQpe3ZhciBldDtpZihIKXtpZihldD1NKHQsUCxLLFIsWSxHLCQpLEs8ZXQpe3ZhciBydD14KHQsUCxLLGV0LFksRywkKTtpZihQPT09dC0yKXtpZihLPHJ0JiYoQz1kLnN3ZWVwQ29tcGxldGUodCxlLEsscnQsWSxHLFEsdHQsWCxXKSx2b2lkIDAhPT1DKSlyZXR1cm4gQztpZihydDxldCYmKEM9ZC5zd2VlcEJpcGFydGl0ZSh0LGUscnQsZXQsWSxHLFEsdHQsWCxXKSx2b2lkIDAhPT1DKSlyZXR1cm4gQ31lbHNlIEs8cnQmJmkoSSsrLFArMSxLLHJ0LFEsdHQsMTYsLSgxLzApLDEvMCkscnQ8ZXQmJihpKEkrKyxQKzEscnQsZXQsUSx0dCwwLC0oMS8wKSwxLzApLGkoSSsrLFArMSxRLHR0LHJ0LGV0LDEsLSgxLzApLDEvMCkpfX1lbHNlIGV0PXE/QSh0LFAsSyxSLFksRywkKTpNKHQsUCxLLFIsWSxHLCQpLEs8ZXQmJihQPT09dC0yP0M9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxRLHR0LFgsVyxLLGV0LFksRyk6ZC5zd2VlcEJpcGFydGl0ZSh0LGUsSyxldCxZLEcsUSx0dCxYLFcpOihpKEkrKyxQKzEsSyxldCxRLHR0LHEsLSgxLzApLDEvMCksaShJKyssUCsxLFEsdHQsSyxldCwxXnEsLSgxLzApLDEvMCkpKX19fX19ZS5leHBvcnRzPXM7dmFyIGw9dCgidHlwZWRhcnJheS1wb29sIiksdT10KCJiaXQtdHdpZGRsZSIpLGM9dCgiLi9icnV0ZSIpLGg9Yy5wYXJ0aWFsLGY9Yy5mdWxsLGQ9dCgiLi9zd2VlcCIpLHA9dCgiLi9tZWRpYW4iKSxtPXQoIi4vcGFydGl0aW9uIiksZz0xMjgsdj0xPDwyMix5PTE8PDIyLGI9bSgiIShsbz49cDApJiYhKHAxPj1oaSkiLFsicDAiLCJwMSJdKSx4PW0oImxvPT09cDAiLFsicDAiXSksXz1tKCJsbzxwMCIsWyJwMCJdKSx3PW0oImhpPD1wMCIsWyJwMCJdKSxNPW0oImxvPD1wMCYmcDA8PWhpIixbInAwIl0pLEE9bSgibG88cDAmJnAwPD1oaSIsWyJwMCJdKSxrPTYsVD0yLEU9MTAyNCxTPWwubWFsbG9jSW50MzIoRSksTD1sLm1hbGxvY0RvdWJsZShFKX0seyIuL2JydXRlIjo2MCwiLi9tZWRpYW4iOjYyLCIuL3BhcnRpdGlvbiI6NjMsIi4vc3dlZXAiOjY1LCJiaXQtdHdpZGRsZSI6NTYsInR5cGVkYXJyYXktcG9vbCI6NTAyfV0sNjI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSl7Zm9yKHZhciBvPTIqdCxzPW8qKHIrMSkrZSxsPXIrMTtsPG47KytsLHMrPW8pZm9yKHZhciB1PWlbc10sYz1sLGg9byoobC0xKTtjPnImJmlbaCtlXT51Oy0tYyxoLT1vKXtmb3IodmFyIGY9aCxkPWgrbyxwPTA7cDxvOysrcCwrK2YsKytkKXt2YXIgbT1pW2ZdO2lbZl09aVtkXSxpW2RdPW19dmFyIGc9YVtjXTthW2NdPWFbYy0xXSxhW2MtMV09Z319ZnVuY3Rpb24gaSh0LGUscixpLGEsbCl7aWYoaTw9cisxKXJldHVybiByO2Zvcih2YXIgdT1yLGM9aSxoPWkrcj4+PjEsZj0yKnQsZD1oLHA9YVtmKmgrZV07dTxjOyl7aWYoYy11PHMpe24odCxlLHUsYyxhLGwpLHA9YVtmKmgrZV07YnJlYWt9dmFyIG09Yy11LGc9TWF0aC5yYW5kb20oKSptK3V8MCx2PWFbZipnK2VdLHk9TWF0aC5yYW5kb20oKSptK3V8MCxiPWFbZip5K2VdLHg9TWF0aC5yYW5kb20oKSptK3V8MCxfPWFbZip4K2VdO3Y8PWI/Xz49Yj8oZD15LHA9Yik6dj49Xz8oZD1nLHA9dik6KGQ9eCxwPV8pOmI+PV8/KGQ9eSxwPWIpOl8+PXY/KGQ9ZyxwPXYpOihkPXgscD1fKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2xbYy0xXT1sW2RdLGxbZF09VCxkPW8odCxlLHUsYy0xLGEsbCxwKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2lmKGxbYy0xXT1sW2RdLGxbZF09VCxoPGQpe2ZvcihjPWQtMTt1PGMmJmFbZiooYy0xKStlXT09PXA7KWMtPTE7Yys9MX1lbHNle2lmKCEoZDxoKSlicmVhaztmb3IodT1kKzE7dTxjJiZhW2YqdStlXT09PXA7KXUrPTF9fXJldHVybiBvKHQsZSxyLGgsYSxsLGFbZipoK2VdKX1lLmV4cG9ydHM9aTt2YXIgYT10KCIuL3BhcnRpdGlvbiIpLG89YSgibG88cDAiLFsicDAiXSkscz04fSx7Ii4vcGFydGl0aW9uIjo2M31dLDYzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj0iYWJjZGVmIi5zcGxpdCgiIikuY29uY2F0KGUpLG49W107cmV0dXJuIHQuaW5kZXhPZigibG8iKT49MCYmbi5wdXNoKCJsbz1lW2srbl0iKSx0LmluZGV4T2YoImhpIik+PTAmJm4ucHVzaCgiaGk9ZVtrK29dIiksci5wdXNoKGkucmVwbGFjZSgiXyIsbi5qb2luKCkpLnJlcGxhY2UoIiQiLHQpKSxGdW5jdGlvbi5hcHBseSh2b2lkIDAscil9ZS5leHBvcnRzPW47dmFyIGk9ImZvcih2YXIgaj0yKmEsaz1qKmMsbD1rLG09YyxuPWIsbz1hK2IscD1jO2Q+cDsrK3Asays9ail7dmFyIF87aWYoJClpZihtPT09cCltKz0xLGwrPWo7ZWxzZXtmb3IodmFyIHM9MDtqPnM7KytzKXt2YXIgdD1lW2src107ZVtrK3NdPWVbbF0sZVtsKytdPXR9dmFyIHU9ZltwXTtmW3BdPWZbbV0sZlttKytdPXV9fXJldHVybiBtIn0se31dLDY0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtlPD00KmY/aSgwLGUtMSx0KTpoKDAsZS0xLHQpfWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0yKih0KzEpLGk9dCsxO2k8PWU7KytpKXtmb3IodmFyIGE9cltuKytdLG89cltuKytdLHM9aSxsPW4tMjtzLS0gPnQ7KXt2YXIgdT1yW2wtMl0sYz1yW2wtMV07aWYodTxhKWJyZWFrO2lmKHU9PT1hJiZjPG8pYnJlYWs7cltsXT11LHJbbCsxXT1jLGwtPTJ9cltsXT1hLHJbbCsxXT1vfX1mdW5jdGlvbiBhKHQsZSxyKXt0Kj0yLGUqPTI7dmFyIG49clt0XSxpPXJbdCsxXTtyW3RdPXJbZV0sclt0KzFdPXJbZSsxXSxyW2VdPW4scltlKzFdPWl9ZnVuY3Rpb24gbyh0LGUscil7dCo9MixlKj0yLHJbdF09cltlXSxyW3QrMV09cltlKzFdfWZ1bmN0aW9uIHModCxlLHIsbil7dCo9MixlKj0yLHIqPTI7dmFyIGk9blt0XSxhPW5bdCsxXTtuW3RdPW5bZV0sblt0KzFdPW5bZSsxXSxuW2VdPW5bcl0sbltlKzFdPW5bcisxXSxuW3JdPWksbltyKzFdPWF9ZnVuY3Rpb24gbCh0LGUscixuLGkpe3QqPTIsZSo9MixpW3RdPWlbZV0saVtlXT1yLGlbdCsxXT1pW2UrMV0saVtlKzFdPW59ZnVuY3Rpb24gdSh0LGUscil7dCo9MixlKj0yO3ZhciBuPXJbdF0saT1yW2VdO3JldHVybiEobjxpKSYmKG4hPT1pfHxyW3QrMV0+cltlKzFdKX1mdW5jdGlvbiBjKHQsZSxyLG4pe3QqPTI7dmFyIGk9blt0XTtyZXR1cm4gaTxlfHxpPT09ZSYmblt0KzFdPHJ9ZnVuY3Rpb24gaCh0LGUscil7dmFyIG49KGUtdCsxKS82fDAsZD10K24scD1lLW4sbT10K2U+PjEsZz1tLW4sdj1tK24seT1kLGI9Zyx4PW0sXz12LHc9cCxNPXQrMSxBPWUtMSxrPTA7dSh5LGIscikmJihrPXkseT1iLGI9ayksdShfLHcscikmJihrPV8sXz13LHc9ayksdSh5LHgscikmJihrPXkseT14LHg9ayksdShiLHgscikmJihrPWIsYj14LHg9ayksdSh5LF8scikmJihrPXkseT1fLF89ayksdSh4LF8scikmJihrPXgseD1fLF89ayksdShiLHcscikmJihrPWIsYj13LHc9ayksdShiLHgscikmJihrPWIsYj14LHg9ayksdShfLHcscikmJihrPV8sXz13LHc9ayk7Zm9yKHZhciBUPXJbMipiXSxFPXJbMipiKzFdLFM9clsyKl9dLEw9clsyKl8rMV0sQz0yKnksST0yKngsej0yKncsRD0yKmQsUD0yKm0sTz0yKnAsUj0wO1I8MjsrK1Ipe3ZhciBGPXJbQytSXSxqPXJbSStSXSxOPXJbeitSXTtyW0QrUl09RixyW1ArUl09aixyW08rUl09Tn1vKGcsdCxyKSxvKHYsZSxyKTtmb3IodmFyIEI9TTtCPD1BOysrQilpZihjKEIsVCxFLHIpKUIhPT1NJiZhKEIsTSxyKSwrK007ZWxzZSBpZighYyhCLFMsTCxyKSlmb3IoOzspe2lmKGMoQSxTLEwscikpe2MoQSxULEUscik/KHMoQixNLEEsciksKytNLC0tQSk6KGEoQixBLHIpLC0tQSk7YnJlYWt9aWYoLS1BPEIpYnJlYWt9bCh0LE0tMSxULEUsciksbChlLEErMSxTLEwsciksTS0yLXQ8PWY/aSh0LE0tMixyKTpoKHQsTS0yLHIpLGUtKEErMik8PWY/aShBKzIsZSxyKTpoKEErMixlLHIpLEEtTTw9Zj9pKE0sQSxyKTpoKE0sQSxyKX1lLmV4cG9ydHM9bjt2YXIgZj0zMn0se31dLDY1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aC5uZXh0UG93Mih0KTttLmxlbmd0aDxlJiYoYy5mcmVlKG0pLG09Yy5tYWxsb2NJbnQzMihlKSksZy5sZW5ndGg8ZSYmKGMuZnJlZShnKSxnPWMubWFsbG9jSW50MzIoZSkpLHYubGVuZ3RoPGUmJihjLmZyZWUodiksdj1jLm1hbGxvY0ludDMyKGUpKSx5Lmxlbmd0aDxlJiYoYy5mcmVlKHkpLHk9Yy5tYWxsb2NJbnQzMihlKSksYi5sZW5ndGg8ZSYmKGMuZnJlZShiKSxiPWMubWFsbG9jSW50MzIoZSkpLHgubGVuZ3RoPGUmJihjLmZyZWUoeCkseD1jLm1hbGxvY0ludDMyKGUpKTt2YXIgcj04KmU7Xy5sZW5ndGg8ciYmKGMuZnJlZShfKSxfPWMubWFsbG9jRG91YmxlKHIpKX1mdW5jdGlvbiBpKHQsZSxyLG4pe3ZhciBpPWVbbl0sYT10W3ItMV07dFtpXT1hLGVbYV09aX1mdW5jdGlvbiBhKHQsZSxyLG4pe3Rbcl09bixlW25dPXJ9ZnVuY3Rpb24gbyh0LGUscixuLG8scyxsLHUsYyxoKXtmb3IodmFyIHA9MCxiPTIqdCx4PXQtMSx3PWItMSxNPXI7TTxuOysrTSl7dmFyIEE9c1tNXSxrPWIqTTtfW3ArK109b1trK3hdLF9bcCsrXT0tKEErMSksX1twKytdPW9bayt3XSxfW3ArK109QX1mb3IodmFyIE09bDtNPHU7KytNKXt2YXIgQT1oW01dK2QsVD1iKk07X1twKytdPWNbVCt4XSxfW3ArK109LUEsX1twKytdPWNbVCt3XSxfW3ArK109QX12YXIgRT1wPj4+MTtmKF8sRSk7Zm9yKHZhciBTPTAsTD0wLE09MDtNPEU7KytNKXt2YXIgQz0wfF9bMipNKzFdO2lmKEM+PWQpQz1DLWR8MCxpKHYseSxMLS0sQyk7ZWxzZSBpZihDPj0wKWkobSxnLFMtLSxDKTtlbHNlIGlmKEM8PS1kKXtDPS1DLWR8MDtmb3IodmFyIEk9MDtJPFM7KytJKXt2YXIgej1lKG1bSV0sQyk7aWYodm9pZCAwIT09eilyZXR1cm4gen1hKHYseSxMKyssQyl9ZWxzZXtDPS1DLTF8MDtmb3IodmFyIEk9MDtJPEw7KytJKXt2YXIgej1lKEMsdltJXSk7aWYodm9pZCAwIT09eilyZXR1cm4gen1hKG0sZyxTKyssQyl9fX1mdW5jdGlvbiBzKHQsZSxyLG4sbyxzLGwsdSxjLGgpe2Zvcih2YXIgZD0wLHA9Mip0LHc9dC0xLE09cC0xLEE9cjtBPG47KytBKXt2YXIgaz1zW0FdKzE8PDEsVD1wKkE7X1tkKytdPW9bVCt3XSxfW2QrK109LWssX1tkKytdPW9bVCtNXSxfW2QrK109a31mb3IodmFyIEE9bDtBPHU7KytBKXt2YXIgaz1oW0FdKzE8PDEsRT1wKkE7X1tkKytdPWNbRSt3XSxfW2QrK109MXwtayxfW2QrK109Y1tFK01dLF9bZCsrXT0xfGt9dmFyIFM9ZD4+PjE7ZihfLFMpO2Zvcih2YXIgTD0wLEM9MCxJPTAsQT0wO0E8UzsrK0Epe3ZhciB6PTB8X1syKkErMV0sRD0xJno7aWYoQTxTLTEmJno+PjE9PT1fWzIqQSszXT4+MSYmKEQ9MixBKz0xKSx6PDApe2Zvcih2YXIgUD0tKHo+PjEpLTEsTz0wO088STsrK08pe3ZhciBSPWUoYltPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDAhPT1EKWZvcih2YXIgTz0wO088TDsrK08pe3ZhciBSPWUobVtPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDEhPT1EKWZvcih2YXIgTz0wO088QzsrK08pe3ZhciBSPWUodltPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfTA9PT1EP2EobSxnLEwrKyxQKToxPT09RD9hKHYseSxDKyssUCk6Mj09PUQmJmEoYix4LEkrKyxQKX1lbHNle3ZhciBQPSh6Pj4xKS0xOzA9PT1EP2kobSxnLEwtLSxQKToxPT09RD9pKHYseSxDLS0sUCk6Mj09PUQmJmkoYix4LEktLSxQKX19fWZ1bmN0aW9uIGwodCxlLHIsbixvLHMsbCx1LGMsaCxwLHYpe3ZhciB5PTAsYj0yKnQseD1lLHc9ZSt0LE09MSxBPTE7bj9BPWQ6TT1kO2Zvcih2YXIgaz1vO2s8czsrK2spe3ZhciBUPWsrTSxFPWIqaztfW3krK109bFtFK3hdLF9beSsrXT0tVCxfW3krK109bFtFK3ddLF9beSsrXT1UfWZvcih2YXIgaz1jO2s8aDsrK2spe3ZhciBUPWsrQSxTPWIqaztfW3krK109cFtTK3hdLF9beSsrXT0tVH12YXIgTD15Pj4+MTtmKF8sTCk7Zm9yKHZhciBDPTAsaz0wO2s8TDsrK2spe3ZhciBJPTB8X1syKmsrMV07aWYoSTwwKXt2YXIgVD0tSSx6PSExO2lmKFQ+PWQ/KHo9IW4sVC09ZCk6KHo9ISFuLFQtPTEpLHopYShtLGcsQysrLFQpO2Vsc2V7dmFyIEQ9dltUXSxQPWIqVCxPPXBbUCtlKzFdLFI9cFtQK2UrMSt0XTt0OmZvcih2YXIgRj0wO0Y8QzsrK0Ype3ZhciBqPW1bRl0sTj1iKmo7aWYoIShSPGxbTitlKzFdfHxsW04rZSsxK3RdPE8pKXtmb3IodmFyIEI9ZSsyO0I8dDsrK0IpaWYocFtQK0IrdF08bFtOK0JdfHxsW04rQit0XTxwW1ArQl0pY29udGludWUgdDt2YXIgVSxWPXVbal07aWYoVT1uP3IoRCxWKTpyKFYsRCksdm9pZCAwIT09VSlyZXR1cm4gVX19fX1lbHNlIGkobSxnLEMtLSxJLU0pfX1mdW5jdGlvbiB1KHQsZSxyLG4saSxhLG8scyxsLHUsYyl7Zm9yKHZhciBoPTAscD0yKnQsZz1lLHY9ZSt0LHk9bjt5PGk7Kyt5KXt2YXIgYj15K2QseD1wKnk7X1toKytdPWFbeCtnXSxfW2grK109LWIsX1toKytdPWFbeCt2XSxfW2grK109Yn1mb3IodmFyIHk9czt5PGw7Kyt5KXt2YXIgYj15KzEsdz1wKnk7X1toKytdPXVbdytnXSxfW2grK109LWJ9dmFyIE09aD4+PjE7ZihfLE0pO2Zvcih2YXIgQT0wLHk9MDt5PE07Kyt5KXt2YXIgaz0wfF9bMip5KzFdO2lmKGs8MCl7dmFyIGI9LWs7aWYoYj49ZCltW0ErK109Yi1kO2Vsc2V7Yi09MTt2YXIgVD1jW2JdLEU9cCpiLFM9dVtFK2UrMV0sTD11W0UrZSsxK3RdO3Q6Zm9yKHZhciBDPTA7QzxBOysrQyl7dmFyIEk9bVtDXSx6PW9bSV07aWYoej09PVQpYnJlYWs7dmFyIEQ9cCpJO2lmKCEoTDxhW0QrZSsxXXx8YVtEK2UrMSt0XTxTKSl7Zm9yKHZhciBQPWUrMjtQPHQ7KytQKWlmKHVbRStQK3RdPGFbRCtQXXx8YVtEK1ArdF08dVtFK1BdKWNvbnRpbnVlIHQ7dmFyIE89cih6LFQpO2lmKHZvaWQgMCE9PU8pcmV0dXJuIE99fX19ZWxzZXtmb3IodmFyIGI9ay1kLEM9QS0xO0M+PTA7LS1DKWlmKG1bQ109PT1iKXtmb3IodmFyIFA9QysxO1A8QTsrK1ApbVtQLTFdPW1bUF07YnJlYWt9LS1BfX19ZS5leHBvcnRzPXtpbml0Om4sc3dlZXBCaXBhcnRpdGU6byxzd2VlcENvbXBsZXRlOnMsc2NhbkJpcGFydGl0ZTpsLHNjYW5Db21wbGV0ZTp1fTt2YXIgYz10KCJ0eXBlZGFycmF5LXBvb2wiKSxoPXQoImJpdC10d2lkZGxlIiksZj10KCIuL3NvcnQiKSxkPTE8PDI4LHA9MTAyNCxtPWMubWFsbG9jSW50MzIocCksZz1jLm1hbGxvY0ludDMyKHApLHY9Yy5tYWxsb2NJbnQzMihwKSx5PWMubWFsbG9jSW50MzIocCksYj1jLm1hbGxvY0ludDMyKHApLHg9Yy5tYWxsb2NJbnQzMihwKSxfPWMubWFsbG9jRG91YmxlKDgqcCl9LHsiLi9zb3J0Ijo2NCwiYml0LXR3aWRkbGUiOjU2LCJ0eXBlZGFycmF5LXBvb2wiOjUwMn1dLDY2OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19ZnVuY3Rpb24gaSgpe3JldHVybiBvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEodCxlKXtpZihpKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpLHQuX19wcm90b19fPW8ucHJvdG90eXBlKToobnVsbD09PXQmJih0PW5ldyBvKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIG8odCxlLHIpe2lmKCEoby5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGModGhpcyx0KX1yZXR1cm4gcyh0aGlzLHQsZSxyKX1mdW5jdGlvbiBzKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2QodCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2godCxlLHIpOnAodCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gdSh0LGUscixuKXtyZXR1cm4gbChlKSxlPD0wP2EodCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9hKHQsZSkuZmlsbChyLG4pOmEodCxlKS5maWxsKHIpOmEodCxlKX1mdW5jdGlvbiBjKHQsZSl7aWYobChlKSx0PWEodCxlPDA/MDowfG0oZSkpLCFvLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjxlOysrcil0W3JdPTA7cmV0dXJuIHR9ZnVuY3Rpb24gaCh0LGUscil7aWYoInN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4IiksIW8uaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfHYoZSxyKTt0PWEodCxuKTt2YXIgaT10LndyaXRlKGUscik7cmV0dXJuIGkhPT1uJiYodD10LnNsaWNlKDAsaSkpLHR9ZnVuY3Rpb24gZih0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfG0oZS5sZW5ndGgpO3Q9YSh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gZCh0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiBlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSx0Ll9fcHJvdG9fXz1vLnByb3RvdHlwZSk6dD1mKHQsZSksdH1mdW5jdGlvbiBwKHQsZSl7aWYoby5pc0J1ZmZlcihlKSl7dmFyIHI9MHxtKGUubGVuZ3RoKTtyZXR1cm4gdD1hKHQsciksMD09PXQubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxyKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8SihlLmxlbmd0aCk/YSh0LDApOmYodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmJChlLmRhdGEpKXJldHVybiBmKHQsZS5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9ZnVuY3Rpb24gbSh0KXtpZih0Pj1pKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2koKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gZyh0KXtyZXR1cm4rdCE9dCYmKHQ9MCksby5hbGxvYygrdCl9ZnVuY3Rpb24gdih0LGUpe2lmKG8uaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIFkodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBXKHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIFkodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24geSh0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZihyPj4+PTAsZT4+Pj0wLHI8PWUpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBEKHRoaXMsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBMKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSSh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4geih0aGlzLGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFAodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gYih0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIHgodCxlLHIsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6dC5sZW5ndGgtMSkscjwwJiYocj10Lmxlbmd0aCtyKSxyPj10Lmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPXQubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPW8uZnJvbShlLG4pKSxvLmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg/LTE6Xyh0LGUscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LG8uVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOl8odCxbZV0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIF8odCxlLHIsbixpKXtmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDE9PT1vP3RbZV06dC5yZWFkVUludDE2QkUoZSpvKX12YXIgbz0xLHM9dC5sZW5ndGgsbD1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYobj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSwidWNzMiI9PT1ufHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGwvPTIsci89Mn12YXIgdTtpZihpKXt2YXIgYz0tMTtmb3IodT1yO3U8czt1KyspaWYoYSh0LHUpPT09YShlLGM9PT0tMT8wOnUtYykpe2lmKGM9PT0tMSYmKGM9dSksdS1jKzE9PT1sKXJldHVybiBjKm99ZWxzZSBjIT09LTEmJih1LT11LWMpLGM9LTF9ZWxzZSBmb3IocitsPnMmJihyPXMtbCksdT1yO3U+PTA7dS0tKXtmb3IodmFyIGg9ITAsZj0wO2Y8bDtmKyspaWYoYSh0LHUrZikhPT1hKGUsZikpe2g9ITE7YnJlYWt9aWYoaClyZXR1cm4gdX1yZXR1cm4tMX1mdW5jdGlvbiB3KHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobiksbj5pJiYobj1pKSk6bj1pO3ZhciBhPWUubGVuZ3RoO2lmKGElMiE9PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5hLzImJihuPWEvMik7Zm9yKHZhciBvPTA7bzxuOysrbyl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMipvLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gbzt0W3Irb109c31yZXR1cm4gb31mdW5jdGlvbiBNKHQsZSxyLG4pe3JldHVybiBaKFkoZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gQSh0LGUscixuKXtyZXR1cm4gWihHKGUpLHQscixuKX1mdW5jdGlvbiBrKHQsZSxyLG4pe3JldHVybiBBKHQsZSxyLG4pfWZ1bmN0aW9uIFQodCxlLHIsbil7cmV0dXJuIFooVyhlKSx0LHIsbil9ZnVuY3Rpb24gRSh0LGUscixuKXtyZXR1cm4gWihYKGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIFModCxlLHIpe3JldHVybiAwPT09ZSYmcj09PXQubGVuZ3RoP0suZnJvbUJ5dGVBcnJheSh0KTpLLmZyb21CeXRlQXJyYXkodC5zbGljZShlLHIpKX1mdW5jdGlvbiBMKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIGE9dFtpXSxvPW51bGwscz1hPjIzOT80OmE+MjIzPzM6YT4xOTE/MjoxO2lmKGkrczw9cil7dmFyIGwsdSxjLGg7c3dpdGNoKHMpe2Nhc2UgMTphPDEyOCYmKG89YSk7YnJlYWs7Y2FzZSAyOmw9dFtpKzFdLDEyOD09PSgxOTImbCkmJihoPSgzMSZhKTw8Nnw2MyZsLGg+MTI3JiYobz1oKSk7YnJlYWs7Y2FzZSAzOmw9dFtpKzFdLHU9dFtpKzJdLDEyOD09PSgxOTImbCkmJjEyOD09PSgxOTImdSkmJihoPSgxNSZhKTw8MTJ8KDYzJmwpPDw2fDYzJnUsaD4yMDQ3JiYoaDw1NTI5Nnx8aD41NzM0MykmJihvPWgpKTticmVhaztjYXNlIDQ6bD10W2krMV0sdT10W2krMl0sYz10W2krM10sMTI4PT09KDE5MiZsKSYmMTI4PT09KDE5MiZ1KSYmMTI4PT09KDE5MiZjKSYmKGg9KDE1JmEpPDwxOHwoNjMmbCk8PDEyfCg2MyZ1KTw8Nnw2MyZjLGg+NjU1MzUmJmg8MTExNDExMiYmKG89aCkpfX1udWxsPT09bz8obz02NTUzMyxzPTEpOm8+NjU1MzUmJihvLT02NTUzNixuLnB1c2gobz4+PjEwJjEwMjN8NTUyOTYpLG89NTYzMjB8MTAyMyZvKSxuLnB1c2gobyksaSs9c31yZXR1cm4gQyhuKX1mdW5jdGlvbiBDKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PXR0KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTtmb3IodmFyIHI9IiIsbj0wO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPXR0KSk7cmV0dXJuIHJ9ZnVuY3Rpb24gSSh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIHoodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEQodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixhPWU7YTxyOysrYSlpKz1IKHRbYV0pO3JldHVybiBpfWZ1bmN0aW9uIFAodCxlLHIpe2Zvcih2YXIgbj10LnNsaWNlKGUsciksaT0iIixhPTA7YTxuLmxlbmd0aDthKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoblthXSsyNTYqblthKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBPKHQsZSxyKXtpZih0JTEhPT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gUih0LGUscixuLGksYSl7aWYoIW8uaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxhKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEYodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLGE9TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPGE7KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIGoodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsYT1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8YTsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gTih0LGUscixuLGksYSl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEIodCxlLHIsbixpKXtyZXR1cm4gaXx8Tih0LGUsciw0LDMuNDAyODIzNDY2Mzg1Mjg4NmUzOCwtMy40MDI4MjM0NjYzODUyODg2ZTM4KSxRLndyaXRlKHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFUodCxlLHIsbixpKXtyZXR1cm4gaXx8Tih0LGUsciw4LDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsLTEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpLFEud3JpdGUodCxlLHIsbiw1Miw4KSxyKzh9ZnVuY3Rpb24gVih0KXtpZih0PXEodCkucmVwbGFjZShldCwiIiksdC5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPT0wOyl0Kz0iPSI7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFkodCxlKXtlPWV8fDEvMDtmb3IodmFyIHIsbj10Lmxlbmd0aCxpPW51bGwsYT1bXSxvPTA7bzxuOysrbyl7aWYocj10LmNoYXJDb2RlQXQobykscj41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihvKzE9PT1uKXsoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj0oaS01NTI5Njw8MTB8ci01NjMyMCkrNjU1MzZ9ZWxzZSBpJiYoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhazthLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2EucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhazthLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2EucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGF9ZnVuY3Rpb24gRyh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX1mdW5jdGlvbiBYKHQsZSl7Zm9yKHZhciByLG4saSxhPVtdLG89MDtvPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK28pcj10LmNoYXJDb2RlQXQobyksbj1yPj44LGk9ciUyNTYsYS5wdXNoKGkpLGEucHVzaChuKTtyZXR1cm4gYX1mdW5jdGlvbiBXKHQpe3JldHVybiBLLnRvQnl0ZUFycmF5KFYodCkpfWZ1bmN0aW9uIFoodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gSih0KXtyZXR1cm4gdCE9PXR9dmFyIEs9dCgiYmFzZTY0LWpzIiksUT10KCJpZWVlNzU0IiksJD10KCJpc2FycmF5Iik7ci5CdWZmZXI9byxyLlNsb3dCdWZmZXI9ZyxyLklOU1BFQ1RfTUFYX0JZVEVTPTUwLG8uVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/ZS5UWVBFRF9BUlJBWV9TVVBQT1JUOm4oKSxyLmtNYXhMZW5ndGg9aSgpLG8ucG9vbFNpemU9ODE5MixvLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1vLnByb3RvdHlwZSx0fSxvLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBzKG51bGwsdCxlLHIpfSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihvLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsby5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJm9bU3ltYm9sLnNwZWNpZXNdPT09byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLG8uYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB1KG51bGwsdCxlLHIpfSxvLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBjKG51bGwsdCl9LG8uYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBjKG51bGwsdCl9LG8uaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfSxvLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighby5pc0J1ZmZlcih0KXx8IW8uaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxhPU1hdGgubWluKHIsbik7aTxhOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LG8uaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sby5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighJCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBvLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49by5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIGE9dFtyXTtpZighby5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KG4saSksaSs9YS5sZW5ndGh9cmV0dXJuIG59LG8uYnl0ZUxlbmd0aD12LG8ucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxvLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKWIodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpYih0aGlzLGUsZSszKSxiKHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpYih0aGlzLGUsZSs3KSxiKHRoaXMsZSsxLGUrNiksYih0aGlzLGUrMixlKzUpLGIodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9MKHRoaXMsMCx0KTp5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFvLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1vLmNvbXBhcmUodGhpcyx0KX0sby5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLGU9ci5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLGUpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5lJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LG8ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighby5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKGU+Pj49MCxyPj4+PTAsbj4+Pj0wLGk+Pj49MCx0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGE9aS1uLHM9ci1lLGw9TWF0aC5taW4oYSxzKSx1PXRoaXMuc2xpY2UobixpKSxjPXQuc2xpY2UoZSxyKSxoPTA7aDxsOysraClpZih1W2hdIT09Y1toXSl7YT11W2hdLHM9Y1toXTticmVha31yZXR1cm4gYTxzPy0xOnM8YT8xOjB9LG8ucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdGhpcy5pbmRleE9mKHQsZSxyKSE9PS0xfSxvLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geCh0aGlzLHQsZSxyLCEwKX0sby5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB4KHRoaXMsdCxlLHIsITEpfSxvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBhPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdyh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBBKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGE9ITB9fSxvLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB0dD00MDk2O28ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGg7dD1+fnQsZT12b2lkIDA9PT1lP3I6fn5lLHQ8MD8odCs9cix0PDAmJih0PTApKTp0PnImJih0PXIpLGU8MD8oZSs9cixlPDAmJihlPTApKTplPnImJihlPXIpLGU8dCYmKGU9dCk7dmFyIG47aWYoby5UWVBFRF9BUlJBWV9TVVBQT1JUKW49dGhpcy5zdWJhcnJheSh0LGUpLG4uX19wcm90b19fPW8ucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O249bmV3IG8oaSx2b2lkIDApO2Zvcih2YXIgYT0wO2E8aTsrK2EpblthXT10aGlzW2ErdF19cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxPKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLGE9MDsrK2E8ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCthXSppO3JldHVybiBufSxvLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Tyh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sby5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxvLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxvLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxvLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LG8ucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxPKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sby5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Tyh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxhPTA7KythPGUmJihpKj0yNTYpOyluKz10aGlzW3QrYV0qaTtyZXR1cm4gaSo9MTI4LG4+PWkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LG8ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fE8odCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsYT10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylhKz10aGlzW3QrLS1uXSppO3JldHVybiBpKj0xMjgsYT49aSYmKGEtPU1hdGgucG93KDIsOCplKSksYX0sby5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPygyNTUtdGhpc1t0XSsxKSotMTp0aGlzW3RdfSxvLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fE8odCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sby5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxPKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LG8ucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LG8ucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LG8ucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSxRLnJlYWQodGhpcyx0LCEwLDIzLDQpfSxvLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxPKHQsNCx0aGlzLmxlbmd0aCksUS5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sby5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw4LHRoaXMubGVuZ3RoKSxRLnJlYWQodGhpcyx0LCEwLDUyLDgpfSxvLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDgsdGhpcy5sZW5ndGgpLFEucmVhZCh0aGlzLHQsITEsNTIsOCl9LG8ucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCxyfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqciktMTtSKHRoaXMsdCxlLHIsaSwwKX12YXIgYT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGEqPTI1Nik7KXRoaXNbZStvXT10L2EmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCxyfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqciktMTtSKHRoaXMsdCxlLHIsaSwwKX12YXIgYT1yLTEsbz0xO2Zvcih0aGlzW2UrYV09MjU1JnQ7LS1hPj0wJiYobyo9MjU2KTspdGhpc1tlK2FdPXQvbyYyNTU7cmV0dXJuIGUrcn0sby5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDEsMjU1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LG8ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSwyLDY1NTM1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkYodGhpcyx0LGUsITApLGUrMn0sby5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDIsNjU1MzUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6Rih0aGlzLHQsZSwhMSksZSsyfSxvLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpqKHRoaXMsdCxlLCEwKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOmoodGhpcyx0LGUsITEpLGUrNH0sby5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1IodGhpcyx0LGUscixpLTEsLWkpfXZhciBhPTAsbz0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2E8ciYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYS0xXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtSKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgYT1yLTEsbz0xLHM9MDtmb3IodGhpc1tlK2FdPTI1NSZ0Oy0tYT49MCYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYSsxXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDEsMTI3LC0xMjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sby5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkYodGhpcyx0LGUsITApLGUrMn0sby5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkYodGhpcyx0LGUsITEpLGUrMn0sby5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6aih0aGlzLHQsZSwhMCksZSs0fSxvLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpqKHRoaXMsdCxlLCExKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITAscil9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITEscil9LG8ucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLCEwLHIpfSxvLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxyKX0sby5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLGE9bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1hLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKGE8MWUzfHwhby5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxhOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscithKSxlKTtyZXR1cm4gYX0sby5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhby5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO2U+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCk7dmFyIGE7aWYoIm51bWJlciI9PXR5cGVvZiB0KWZvcihhPWU7YTxyOysrYSl0aGlzW2FdPXQ7ZWxzZXt2YXIgcz1vLmlzQnVmZmVyKHQpP3Q6WShuZXcgbyh0LG4pLnRvU3RyaW5nKCkpLGw9cy5sZW5ndGg7Zm9yKGE9MDthPHItZTsrK2EpdGhpc1thK2VdPXNbYSVsXX1yZXR1cm4gdGhpc307dmFyIGV0PS9bXitcLzAtOUEtWmEtei1fXS9nfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7ImJhc2U2NC1qcyI6NjcsaWVlZTc1NDoyNTgsaXNhcnJheTo2OH1dLDY3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7cmV0dXJuIj0iPT09dFtlLTJdPzI6Ij0iPT09dFtlLTFdPzE6MH1mdW5jdGlvbiBpKHQpe3JldHVybiAzKnQubGVuZ3RoLzQtbih0KX1mdW5jdGlvbiBhKHQpe3ZhciBlLHIsaSxhLG8scyxsPXQubGVuZ3RoO289bih0KSxzPW5ldyBoKDMqbC80LW8pLGk9bz4wP2wtNDpsO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxpO2UrPTQscis9MylhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTh8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGNbdC5jaGFyQ29kZUF0KGUrMildPDw2fGNbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1hPj4xNiYyNTUsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYTtyZXR1cm4gMj09PW8/KGE9Y1t0LmNoYXJDb2RlQXQoZSldPDwyfGNbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmYSk6MT09PW8mJihhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTB8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDR8Y1t0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYSksc31mdW5jdGlvbiBvKHQpe3JldHVybiB1W3Q+PjE4JjYzXSt1W3Q+PjEyJjYzXSt1W3Q+PjYmNjNdK3VbNjMmdF19ZnVuY3Rpb24gcyh0LGUscil7Zm9yKHZhciBuLGk9W10sYT1lO2E8cjthKz0zKW49KHRbYV08PDE2KSsodFthKzFdPDw4KSt0W2ErMl0saS5wdXNoKG8obikpOwpyZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBsKHQpe2Zvcih2YXIgZSxyPXQubGVuZ3RoLG49ciUzLGk9IiIsYT1bXSxvPTE2MzgzLGw9MCxjPXItbjtsPGM7bCs9bylhLnB1c2gocyh0LGwsbCtvPmM/YzpsK28pKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLGEucHVzaChpKSxhLmpvaW4oIiIpfXIuYnl0ZUxlbmd0aD1pLHIudG9CeXRlQXJyYXk9YSxyLmZyb21CeXRlQXJyYXk9bDtmb3IodmFyIHU9W10sYz1bXSxoPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGY9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGQ9MCxwPWYubGVuZ3RoO2Q8cDsrK2QpdVtkXT1mW2RdLGNbZi5jaGFyQ29kZUF0KGQpXT1kO2NbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGNbIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sNjg6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj17fS50b1N0cmluZztlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0se31dLDY5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuW01hdGgubWluKHRbMF0sdFsxXSksTWF0aC5tYXgodFswXSx0WzFdKV19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXX1mdW5jdGlvbiBhKHQpe3JldHVybiB0Lm1hcChuKS5zb3J0KGkpfWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybiBlIGluIHQ/dFtlXTpyfWZ1bmN0aW9uIHModCxlLHIpe0FycmF5LmlzQXJyYXkoZSk/KHI9cnx8e30sZT1lfHxbXSk6KHI9ZXx8e30sZT1bXSk7dmFyIG49ISFvKHIsImRlbGF1bmF5IiwhMCksaT0hIW8ociwiaW50ZXJpb3IiLCEwKSxzPSEhbyhyLCJleHRlcmlvciIsITApLGY9ISFvKHIsImluZmluaXR5IiwhMSk7aWYoIWkmJiFzfHwwPT09dC5sZW5ndGgpcmV0dXJuW107dmFyIGQ9bCh0LGUpO2lmKG58fGkhPT1zfHxmKXtmb3IodmFyIHA9dSh0Lmxlbmd0aCxhKGUpKSxtPTA7bTxkLmxlbmd0aDsrK20pe3ZhciBnPWRbbV07cC5hZGRUcmlhbmdsZShnWzBdLGdbMV0sZ1syXSl9cmV0dXJuIG4mJmModCxwKSxzP2k/Zj9oKHAsMCxmKTpwLmNlbGxzKCk6aChwLDEsZik6aChwLC0xKX1yZXR1cm4gZH12YXIgbD10KCIuL2xpYi9tb25vdG9uZSIpLHU9dCgiLi9saWIvdHJpYW5ndWxhdGlvbiIpLGM9dCgiLi9saWIvZGVsYXVuYXkiKSxoPXQoIi4vbGliL2ZpbHRlciIpO2UuZXhwb3J0cz1zfSx7Ii4vbGliL2RlbGF1bmF5Ijo3MCwiLi9saWIvZmlsdGVyIjo3MSwiLi9saWIvbW9ub3RvbmUiOjcyLCIuL2xpYi90cmlhbmd1bGF0aW9uIjo3M31dLDcwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLG8pe3ZhciBzPWUub3Bwb3NpdGUobixpKTtpZighKHM8MCkpe2lmKGk8bil7dmFyIGw9bjtuPWksaT1sLGw9byxvPXMscz1sfWUuaXNDb25zdHJhaW50KG4saSl8fGEodFtuXSx0W2ldLHRbb10sdFtzXSk8MCYmci5wdXNoKG4saSl9fWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9W10saT10Lmxlbmd0aCxvPWUuc3RhcnMscz0wO3M8aTsrK3MpZm9yKHZhciBsPW9bc10sdT0xO3U8bC5sZW5ndGg7dSs9Mil7dmFyIGM9bFt1XTtpZighKGM8c3x8ZS5pc0NvbnN0cmFpbnQocyxjKSkpe2Zvcih2YXIgaD1sW3UtMV0sZj0tMSxkPTE7ZDxsLmxlbmd0aDtkKz0yKWlmKGxbZC0xXT09PWMpe2Y9bFtkXTticmVha31mPDB8fGEodFtzXSx0W2NdLHRbaF0sdFtmXSk8MCYmci5wdXNoKHMsYyl9fWZvcig7ci5sZW5ndGg+MDspe2Zvcih2YXIgYz1yLnBvcCgpLHM9ci5wb3AoKSxoPS0xLGY9LTEsbD1vW3NdLHA9MTtwPGwubGVuZ3RoO3ArPTIpe3ZhciBtPWxbcC0xXSxnPWxbcF07bT09PWM/Zj1nOmc9PT1jJiYoaD1tKX1oPDB8fGY8MHx8YSh0W3NdLHRbY10sdFtoXSx0W2ZdKT49MHx8KGUuZmxpcChzLGMpLG4odCxlLHIsaCxzLGYpLG4odCxlLHIscyxmLGgpLG4odCxlLHIsZixjLGgpLG4odCxlLHIsYyxoLGYpKX19dmFyIGE9dCgicm9idXN0LWluLXNwaGVyZSIpWzRdO3QoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPWl9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjc0LCJyb2J1c3QtaW4tc3BoZXJlIjo0Njl9XSw3MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8pe3RoaXMuY2VsbHM9dCx0aGlzLm5laWdoYm9yPWUsdGhpcy5mbGFncz1uLHRoaXMuY29uc3RyYWludD1yLHRoaXMuYWN0aXZlPWksdGhpcy5uZXh0PWEsdGhpcy5ib3VuZGFyeT1vfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV18fHRbMl0tZVsyXX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPXQuY2VsbHMoKSxhPXIubGVuZ3RoLG89MDtvPGE7KytvKXt2YXIgcz1yW29dLGw9c1swXSx1PXNbMV0sYz1zWzJdO3U8Yz91PGwmJihzWzBdPXUsc1sxXT1jLHNbMl09bCk6YzxsJiYoc1swXT1jLHNbMV09bCxzWzJdPXUpfXIuc29ydChpKTtmb3IodmFyIGg9bmV3IEFycmF5KGEpLG89MDtvPGgubGVuZ3RoOysrbyloW29dPTA7dmFyIGY9W10sZD1bXSxwPW5ldyBBcnJheSgzKmEpLG09bmV3IEFycmF5KDMqYSksZz1udWxsO2UmJihnPVtdKTtmb3IodmFyIHY9bmV3IG4ocixwLG0saCxmLGQsZyksbz0wO288YTsrK28pZm9yKHZhciBzPXJbb10seT0wO3k8MzsrK3kpe3ZhciBsPXNbeV0sdT1zWyh5KzEpJTNdLGI9cFszKm8reV09di5sb2NhdGUodSxsLHQub3Bwb3NpdGUodSxsKSkseD1tWzMqbyt5XT10LmlzQ29uc3RyYWludChsLHUpO2I8MCYmKHg/ZC5wdXNoKG8pOihmLnB1c2gobyksaFtvXT0xKSxlJiZnLnB1c2goW3UsbCwtMV0pKX1yZXR1cm4gdn1mdW5jdGlvbiBvKHQsZSxyKXtmb3IodmFyIG49MCxpPTA7aTx0Lmxlbmd0aDsrK2kpZVtpXT09PXImJih0W24rK109dFtpXSk7cmV0dXJuIHQubGVuZ3RoPW4sdH1mdW5jdGlvbiBzKHQsZSxyKXt2YXIgbj1hKHQscik7aWYoMD09PWUpcmV0dXJuIHI/bi5jZWxscy5jb25jYXQobi5ib3VuZGFyeSk6bi5jZWxscztmb3IodmFyIGk9MSxzPW4uYWN0aXZlLGw9bi5uZXh0LHU9bi5mbGFncyxjPW4uY2VsbHMsaD1uLmNvbnN0cmFpbnQsZj1uLm5laWdoYm9yO3MubGVuZ3RoPjB8fGwubGVuZ3RoPjA7KXtmb3IoO3MubGVuZ3RoPjA7KXt2YXIgZD1zLnBvcCgpO2lmKHVbZF0hPT0taSl7dVtkXT1pO2Zvcih2YXIgcD0oY1tkXSwwKTtwPDM7KytwKXt2YXIgbT1mWzMqZCtwXTttPj0wJiYwPT09dVttXSYmKGhbMypkK3BdP2wucHVzaChtKToocy5wdXNoKG0pLHVbbV09aSkpfX19dmFyIGc9bDtsPXMscz1nLGwubGVuZ3RoPTAsaT0taX12YXIgdj1vKGMsdSxlKTtyZXR1cm4gcj92LmNvbmNhdChuLmJvdW5kYXJ5KTp2fXZhciBsPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPXM7dmFyIHU9bi5wcm90b3R5cGU7dS5sb2NhdGU9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwLDBdO3JldHVybiBmdW5jdGlvbihlLHIsbil7dmFyIGE9ZSxvPXIscz1uO3JldHVybiByPG4/cjxlJiYoYT1yLG89bixzPWUpOm48ZSYmKGE9bixvPWUscz1yKSxhPDA/LTE6KHRbMF09YSx0WzFdPW8sdFsyXT1zLGwuZXEodGhpcy5jZWxscyx0LGkpKX19KCl9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjc0fV0sNzI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuaWR4PXIsdGhpcy5sb3dlcklkcz1uLHRoaXMudXBwZXJJZHM9aX1mdW5jdGlvbiBpKHQsZSxyLG4pe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMudHlwZT1yLHRoaXMuaWR4PW59ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuYVswXS1lLmFbMF18fHQuYVsxXS1lLmFbMV18fHQudHlwZS1lLnR5cGU7cmV0dXJuIHI/cjp0LnR5cGUhPT1wJiYocj1kKHQuYSx0LmIsZS5iKSk/cjp0LmlkeC1lLmlkeH1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIGQodC5hLHQuYixlKX1mdW5jdGlvbiBzKHQsZSxyLG4saSl7Zm9yKHZhciBhPWYubHQoZSxuLG8pLHM9Zi5ndChlLG4sbyksbD1hO2w8czsrK2wpe2Zvcih2YXIgdT1lW2xdLGM9dS5sb3dlcklkcyxoPWMubGVuZ3RoO2g+MSYmZChyW2NbaC0yXV0scltjW2gtMV1dLG4pPjA7KXQucHVzaChbY1toLTFdLGNbaC0yXSxpXSksaC09MTtjLmxlbmd0aD1oLGMucHVzaChpKTtmb3IodmFyIHA9dS51cHBlcklkcyxoPXAubGVuZ3RoO2g+MSYmZChyW3BbaC0yXV0scltwW2gtMV1dLG4pPDA7KXQucHVzaChbcFtoLTJdLHBbaC0xXSxpXSksaC09MTtwLmxlbmd0aD1oLHAucHVzaChpKX19ZnVuY3Rpb24gbCh0LGUpe3ZhciByO3JldHVybihyPXQuYVswXTxlLmFbMF0/ZCh0LmEsdC5iLGUuYSk6ZChlLmIsZS5hLHQuYSkpP3I6KHI9ZS5iWzBdPHQuYlswXT9kKHQuYSx0LmIsZS5iKTpkKGUuYixlLmEsdC5iKSxyfHx0LmlkeC1lLmlkeCl9ZnVuY3Rpb24gdSh0LGUscil7dmFyIGk9Zi5sZSh0LHIsbCksYT10W2ldLG89YS51cHBlcklkcyxzPW9bby5sZW5ndGgtMV07YS51cHBlcklkcz1bc10sdC5zcGxpY2UoaSsxLDAsbmV3IG4oci5hLHIuYixyLmlkeCxbc10sbykpfWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPXIuYTtyLmE9ci5iLHIuYj1uO3ZhciBpPWYuZXEodCxyLGwpLGE9dFtpXSxvPXRbaS0xXTtvLnVwcGVySWRzPWEudXBwZXJJZHMsdC5zcGxpY2UoaSwxKX1mdW5jdGlvbiBoKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLG89ZS5sZW5ndGgsbD1bXSxoPTA7aDxyOysraClsLnB1c2gobmV3IGkodFtoXSxudWxsLHAsaCkpO2Zvcih2YXIgaD0wO2g8bzsrK2gpe3ZhciBmPWVbaF0sZD10W2ZbMF1dLHY9dFtmWzFdXTtkWzBdPHZbMF0/bC5wdXNoKG5ldyBpKGQsdixnLGgpLG5ldyBpKHYsZCxtLGgpKTpkWzBdPnZbMF0mJmwucHVzaChuZXcgaSh2LGQsZyxoKSxuZXcgaShkLHYsbSxoKSl9bC5zb3J0KGEpO2Zvcih2YXIgeT1sWzBdLmFbMF0tKDErTWF0aC5hYnMobFswXS5hWzBdKSkqTWF0aC5wb3coMiwtNTIpLGI9W25ldyBuKFt5LDFdLFt5LDBdLC0xLFtdLFtdLFtdLFtdKV0seD1bXSxoPTAsXz1sLmxlbmd0aDtoPF87KytoKXt2YXIgdz1sW2hdLE09dy50eXBlO009PT1wP3MoeCxiLHQsdy5hLHcuaWR4KTpNPT09Zz91KGIsdCx3KTpjKGIsdCx3KX1yZXR1cm4geH12YXIgZj10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLGQ9dCgicm9idXN0LW9yaWVudGF0aW9uIilbM10scD0wLG09MSxnPTI7ZS5leHBvcnRzPWh9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjc0LCJyb2J1c3Qtb3JpZW50YXRpb24iOjQ3MX1dLDczOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLnN0YXJzPXQsdGhpcy5lZGdlcz1lfWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0xLGk9dC5sZW5ndGg7bjxpO24rPTIpaWYodFtuLTFdPT09ZSYmdFtuXT09PXIpcmV0dXJuIHRbbi0xXT10W2ktMl0sdFtuXT10W2ktMV0sdm9pZCh0Lmxlbmd0aD1pLTIpfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQpLGk9MDtpPHQ7KytpKXJbaV09W107cmV0dXJuIG5ldyBuKHIsZSl9dmFyIG89dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKTtlLmV4cG9ydHM9YTt2YXIgcz1uLnByb3RvdHlwZTtzLmlzQ29uc3RyYWludD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19dmFyIGU9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKHIsbil7cmV0dXJuIGVbMF09TWF0aC5taW4ocixuKSxlWzFdPU1hdGgubWF4KHIsbiksby5lcSh0aGlzLmVkZ2VzLGUsdCk+PTB9fSgpLHMucmVtb3ZlVHJpYW5nbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuc3RhcnM7aShuW3RdLGUsciksaShuW2VdLHIsdCksaShuW3JdLHQsZSl9LHMuYWRkVHJpYW5nbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuc3RhcnM7blt0XS5wdXNoKGUsciksbltlXS5wdXNoKHIsdCksbltyXS5wdXNoKHQsZSl9LHMub3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5zdGFyc1tlXSxuPTEsaT1yLmxlbmd0aDtuPGk7bis9MilpZihyW25dPT09dClyZXR1cm4gcltuLTFdO3JldHVybi0xfSxzLmZsaXA9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLm9wcG9zaXRlKHQsZSksbj10aGlzLm9wcG9zaXRlKGUsdCk7dGhpcy5yZW1vdmVUcmlhbmdsZSh0LGUsciksdGhpcy5yZW1vdmVUcmlhbmdsZShlLHQsbiksdGhpcy5hZGRUcmlhbmdsZSh0LG4sciksdGhpcy5hZGRUcmlhbmdsZShlLHIsbil9LHMuZWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5zdGFycyxlPVtdLHI9MCxuPXQubGVuZ3RoO3I8bjsrK3IpZm9yKHZhciBpPXRbcl0sYT0wLG89aS5sZW5ndGg7YTxvO2ErPTIpZS5wdXNoKFtpW2FdLGlbYSsxXV0pO3JldHVybiBlfSxzLmNlbGxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc3RhcnMsZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWZvcih2YXIgaT10W3JdLGE9MCxvPWkubGVuZ3RoO2E8bzthKz0yKXt2YXIgcz1pW2FdLGw9aVthKzFdO3I8TWF0aC5taW4ocyxsKSYmZS5wdXNoKFtyLHMsbF0pfXJldHVybiBlfX0seyJiaW5hcnktc2VhcmNoLWJvdW5kcyI6NzR9XSw3NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dmFyIGE9WyJmdW5jdGlvbiAiLHQsIihhLGwsaCwiLG4uam9pbigiLCIpLCIpeyIsaT8iIjoidmFyIGk9IixyPyJsLTEiOiJoKzEiLCI7d2hpbGUobDw9aCl7dmFyIG09KGwraCk+Pj4xLHg9YVttXSJdO3JldHVybiBpP2UuaW5kZXhPZigiYyIpPDA/YS5wdXNoKCI7aWYoeD09PXkpe3JldHVybiBtfWVsc2UgaWYoeDw9eSl7Iik6YS5wdXNoKCI7dmFyIHA9Yyh4LHkpO2lmKHA9PT0wKXtyZXR1cm4gbX1lbHNlIGlmKHA8PTApeyIpOmEucHVzaCgiO2lmKCIsZSwiKXtpPW07Iikscj9hLnB1c2goImw9bSsxfWVsc2V7aD1tLTF9Iik6YS5wdXNoKCJoPW0tMX1lbHNle2w9bSsxfSIpLGEucHVzaCgifSIpLGk/YS5wdXNoKCJyZXR1cm4gLTF9OyIpOmEucHVzaCgicmV0dXJuIGl9OyIpLGEuam9pbigiIil9ZnVuY3Rpb24gaSh0LGUscixpKXt2YXIgYT1uZXcgRnVuY3Rpb24oW24oIkEiLCJ4Iit0KyJ5IixlLFsieSJdLGkpLG4oIlAiLCJjKHgseSkiK3QrIjAiLGUsWyJ5IiwiYyJdLGkpLCJmdW5jdGlvbiBkaXNwYXRjaEJzZWFyY2giLHIsIihhLHksYyxsLGgpe2lmKHR5cGVvZihjKT09PSdmdW5jdGlvbicpe3JldHVybiBQKGEsKGw9PT12b2lkIDApPzA6bHwwLChoPT09dm9pZCAwKT9hLmxlbmd0aC0xOmh8MCx5LGMpfWVsc2V7cmV0dXJuIEEoYSwoYz09PXZvaWQgMCk/MDpjfDAsKGw9PT12b2lkIDApP2EubGVuZ3RoLTE6bHwwLHkpfX1yZXR1cm4gZGlzcGF0Y2hCc2VhcmNoIixyXS5qb2luKCIiKSk7cmV0dXJuIGEoKX1lLmV4cG9ydHM9e2dlOmkoIj49IiwhMSwiR0UiKSxndDppKCI+IiwhMSwiR1QiKSxsdDppKCI8IiwhMCwiTFQiKSxsZTppKCI8PSIsITAsIkxFIiksZXE6aSgiLSIsITAsIkVRIiwhMCl9fSx7fV0sNzU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MSxyPTE7cjx0Lmxlbmd0aDsrK3IpZm9yKHZhciBuPTA7bjxyOysrbilpZih0W3JdPHRbbl0pZT0tZTtlbHNlIGlmKHRbbl09PT10W3JdKXJldHVybiAwO3JldHVybiBlfWUuZXhwb3J0cz1ufSx7fV0sNzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGgsaT0wO2k8bjsrK2kpcis9dFtpXSplW2ldO3JldHVybiByfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107dmFyIHI9KHRbMF0ubGVuZ3RoLG8oW3QubGVuZ3RoKzEsdC5sZW5ndGgrMV0sMSkpLGk9byhbdC5sZW5ndGgrMV0sMSk7cltlXVtlXT0wO2Zvcih2YXIgYT0wO2E8ZTsrK2Epe2Zvcih2YXIgbD0wO2w8PWE7KytsKXJbbF1bYV09clthXVtsXT0yKm4odFthXSx0W2xdKTtpW2FdPW4odFthXSx0W2FdKX1mb3IodmFyIHU9cyhyLGkpLGM9MCxoPXVbZSsxXSxhPTA7YTxoLmxlbmd0aDsrK2EpYys9aFthXTtmb3IodmFyIGY9bmV3IEFycmF5KGUpLGE9MDthPGU7KythKXtmb3IodmFyIGg9dVthXSxkPTAsbD0wO2w8aC5sZW5ndGg7KytsKWQrPWhbbF07ZlthXT1kL2N9cmV0dXJuIGZ9ZnVuY3Rpb24gYSh0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBlPXRbMF0ubGVuZ3RoLHI9byhbZV0pLG49aSh0KSxhPTA7YTx0Lmxlbmd0aDsrK2EpZm9yKHZhciBzPTA7czxlOysrcylyW3NdKz10W2FdW3NdKm5bYV07cmV0dXJuIHJ9dmFyIG89dCgiZHVwIikscz10KCJyb2J1c3QtbGluZWFyLXNvbHZlIik7YS5iYXJ5Y2VuZXRyaWM9aSxlLmV4cG9ydHM9YX0se2R1cDoxMDAsInJvYnVzdC1saW5lYXItc29sdmUiOjQ3MH1dLDc3OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9aSh0KSxyPTAsbj0wO248dC5sZW5ndGg7KytuKWZvcih2YXIgYT10W25dLG89MDtvPGUubGVuZ3RoOysrbylyKz1NYXRoLnBvdyhhW29dLWVbb10sMik7cmV0dXJuIE1hdGguc3FydChyL3QubGVuZ3RoKX1lLmV4cG9ydHM9bjt2YXIgaT10KCJjaXJjdW1jZW50ZXIiKX0se2NpcmN1bWNlbnRlcjo3Nn1dLDc4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9eCh0KSxyPWIoeShlKSx0KTtyZXR1cm4gcjwwP1tlLHcoZSwxLzApXTpyPjA/W3coZSwtKDEvMCkpLGVdOltlLGVdfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBpPWVbbl0sYT10W2lbMF1dLG89dFtpWzFdXTtyW25dPVtNYXRoLm1pbihhWzBdLG9bMF0pLE1hdGgubWluKGFbMV0sb1sxXSksTWF0aC5tYXgoYVswXSxvWzBdKSxNYXRoLm1heChhWzFdLG9bMV0pXX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG49dFtyXTtlW3JdPVtuWzBdLG5bMV0sblswXSxuWzFdXX1yZXR1cm4gZX1mdW5jdGlvbiBvKHQsZSxyKXt2YXIgbj1bXTtyZXR1cm4gZyhyLGZ1bmN0aW9uKHIsaSl7dmFyIGE9ZVtyXSxvPWVbaV07aWYoYVswXSE9PW9bMF0mJmFbMF0hPT1vWzFdJiZhWzFdIT09b1swXSYmYVsxXSE9PW9bMV0pe3ZhciBzPXRbYVswXV0sbD10W2FbMV1dLHU9dFtvWzBdXSxjPXRbb1sxXV07dihzLGwsdSxjKSYmbi5wdXNoKFtyLGldKX19KSxufWZ1bmN0aW9uIHModCxlLHIsbil7dmFyIGk9W107cmV0dXJuIGcocixuLGZ1bmN0aW9uKHIsbil7dmFyIGE9ZVtyXTtpZihhWzBdIT09biYmYVsxXSE9PW4pe3ZhciBvPXRbbl0scz10W2FbMF1dLGw9dFthWzFdXTt2KHMsbCxvLG8pJiZpLnB1c2goW3Isbl0pfX0pLGl9ZnVuY3Rpb24gbCh0LGUscixuLGkpe2Z1bmN0aW9uIGEoZSl7aWYoZT49dC5sZW5ndGgpcmV0dXJuIG9bZS10Lmxlbmd0aF07dmFyIHI9dFtlXTtyZXR1cm5beShyWzBdKSx5KHJbMV0pXX1mb3IodmFyIG89W10scz0wO3M8ci5sZW5ndGg7KytzKXt2YXIgbD1yW3NdLHU9bFswXSxjPWxbMV0saD1lW3VdLGY9ZVtjXSxkPU0oXyh0W2hbMF1dKSxfKHRbaFsxXV0pLF8odFtmWzBdXSksXyh0W2ZbMV1dKSk7aWYoZCl7dmFyIHA9by5sZW5ndGgrdC5sZW5ndGg7by5wdXNoKGQpLG4ucHVzaChbdSxwXSxbYyxwXSl9fW4uc29ydChmdW5jdGlvbih0LGUpe2lmKHRbMF0hPT1lWzBdKXJldHVybiB0WzBdLWVbMF07dmFyIHI9YSh0WzFdKSxuPWEoZVsxXSk7cmV0dXJuIGIoclswXSxuWzBdKXx8YihyWzFdLG5bMV0pfSk7Zm9yKHZhciBzPW4ubGVuZ3RoLTE7cz49MDstLXMpe3ZhciBtPW5bc10sdT1tWzBdLGc9ZVt1XSx2PWdbMF0seD1nWzFdLHc9dFt2XSxBPXRbeF07aWYoKHdbMF0tQVswXXx8d1sxXS1BWzFdKTwwKXt2YXIgaz12O3Y9eCx4PWt9Z1swXT12O3ZhciBULEU9Z1sxXT1tWzFdO2ZvcihpJiYoVD1nWzJdKTtzPjAmJm5bcy0xXVswXT09PXU7KXt2YXIgbT1uWy0tc10sUz1tWzFdO2k/ZS5wdXNoKFtFLFMsVF0pOmUucHVzaChbRSxTXSksRT1TfWk/ZS5wdXNoKFtFLHgsVF0pOmUucHVzaChbRSx4XSl9cmV0dXJuIG99ZnVuY3Rpb24gdSh0LGUscil7Zm9yKHZhciBpPXQubGVuZ3RoK2UubGVuZ3RoLGE9bmV3IG0oaSksbz1yLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZVtzXSx1PW4obFswXSksYz1uKGxbMV0pO28ucHVzaChbdVswXSxjWzBdLHVbMV0sY1sxXV0pLHQucHVzaChbeChsWzBdKSx4KGxbMV0pXSl9ZyhvLGZ1bmN0aW9uKHQsZSl7YS5saW5rKHQsZSl9KTtmb3IodmFyIGg9MCxmPSEwLGQ9bmV3IEFycmF5KGkpLHM9MDtzPGk7KytzKXt2YXIgcD1hLmZpbmQocyk7cD09PXM/KGRbc109aCx0W2grK109dFtzXSk6KGY9ITEsZFtzXT0tMSl9aWYodC5sZW5ndGg9aCxmKXJldHVybiBudWxsO2Zvcih2YXIgcz0wO3M8aTsrK3MpZFtzXTwwJiYoZFtzXT1kW2EuZmluZChzKV0pO3JldHVybiBkfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19ZnVuY3Rpb24gaCh0LGUpe3ZhciByPXRbMF0tZVswXXx8dFsxXS1lWzFdO3JldHVybiByP3I6dFsyXTxlWzJdPy0xOnRbMl0+ZVsyXT8xOjB9ZnVuY3Rpb24gZih0LGUscil7aWYoMCE9PXQubGVuZ3RoKXtpZihlKWZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9ZVtpWzBdXSxvPWVbaVsxXV07aVswXT1NYXRoLm1pbihhLG8pLGlbMV09TWF0aC5tYXgoYSxvKX1lbHNlIGZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9aVswXSxvPWlbMV07aVswXT1NYXRoLm1pbihhLG8pLGlbMV09TWF0aC5tYXgoYSxvKX1yP3Quc29ydChoKTp0LnNvcnQoYyk7Zm9yKHZhciBzPTEsbj0xO248dC5sZW5ndGg7KytuKXt2YXIgbD10W24tMV0sdT10W25dOyh1WzBdIT09bFswXXx8dVsxXSE9PWxbMV18fHImJnVbMl0hPT1sWzJdKSYmKHRbcysrXT11KX10Lmxlbmd0aD1zfX1mdW5jdGlvbiBkKHQsZSxyKXt2YXIgbj1pKHQsZSksYz1vKHQsZSxuKSxoPWEodCksZD1zKHQsZSxuLGgpLHA9bCh0LGUsYyxkLHIpLG09dSh0LHAsaCk7cmV0dXJuIGYoZSxtLHIpLCEhbXx8KGMubGVuZ3RoPjB8fGQubGVuZ3RoPjApfWZ1bmN0aW9uIHAodCxlLHIpe3ZhciBuLGk9ITE7aWYocil7bj1lO2Zvcih2YXIgYT1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MDtvPGUubGVuZ3RoOysrbyl7dmFyIHM9ZVtvXTthW29dPVtzWzBdLHNbMV0scltvXV19ZT1hfWZvcig7ZCh0LGUsISFyKTspaT0hMDtpZihyJiZpKXtuLmxlbmd0aD0wLHIubGVuZ3RoPTA7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBzPWVbb107bi5wdXNoKFtzWzBdLHNbMV1dKSxyLnB1c2goc1syXSl9fXJldHVybiBpfWUuZXhwb3J0cz1wO3ZhciBtPXQoInVuaW9uLWZpbmQiKSxnPXQoImJveC1pbnRlcnNlY3QiKSx2PSh0KCJjb21wYXJlLWNlbGwiKSx0KCJyb2J1c3Qtc2VnbWVudC1pbnRlcnNlY3QiKSkseT10KCJiaWctcmF0IiksYj10KCJiaWctcmF0L2NtcCIpLHg9dCgiYmlnLXJhdC90by1mbG9hdCIpLF89dCgicmF0LXZlYyIpLHc9dCgibmV4dGFmdGVyIiksTT10KCIuL2xpYi9yYXQtc2VnLWludGVyc2VjdCIpfSx7Ii4vbGliL3JhdC1zZWctaW50ZXJzZWN0Ijo3OSwiYmlnLXJhdCI6NDIsImJpZy1yYXQvY21wIjo0MCwiYmlnLXJhdC90by1mbG9hdCI6NTQsImJveC1pbnRlcnNlY3QiOjU5LCJjb21wYXJlLWNlbGwiOjg0LG5leHRhZnRlcjo0MzMsInJhdC12ZWMiOjQ1OSwicm9idXN0LXNlZ21lbnQtaW50ZXJzZWN0Ijo0NzQsInVuaW9uLWZpbmQiOjUwM31dLDc5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gcyhhKHRbMF0sZVsxXSksYSh0WzFdLGVbMF0pKX1mdW5jdGlvbiBpKHQsZSxyLGkpe3ZhciBhPXUoZSx0KSxzPXUoaSxyKSxmPW4oYSxzKTtpZigwPT09bChmKSlyZXR1cm4gbnVsbDt2YXIgZD11KHQscikscD1uKHMsZCksbT1vKHAsZik7cmV0dXJuIGModCxoKGEsbSkpfWUuZXhwb3J0cz1pO3ZhciBhPXQoImJpZy1yYXQvbXVsIiksbz10KCJiaWctcmF0L2RpdiIpLHM9dCgiYmlnLXJhdC9zdWIiKSxsPXQoImJpZy1yYXQvc2lnbiIpLHU9dCgicmF0LXZlYy9zdWIiKSxjPXQoInJhdC12ZWMvYWRkIiksaD10KCJyYXQtdmVjL211bHMiKTt0KCJiaWctcmF0L3RvLWZsb2F0Iil9LHsiYmlnLXJhdC9kaXYiOjQxLCJiaWctcmF0L211bCI6NTEsImJpZy1yYXQvc2lnbiI6NTIsImJpZy1yYXQvc3ViIjo1MywiYmlnLXJhdC90by1mbG9hdCI6NTQsInJhdC12ZWMvYWRkIjo0NTgsInJhdC12ZWMvbXVscyI6NDYwLCJyYXQtdmVjL3N1YiI6NDYxfV0sODA6W2Z1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7dmFyIHI9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShyLG4saSxhKXtmdW5jdGlvbiBzKHIsaSl7aWYobnVsbD09PXIpcmV0dXJuIG51bGw7aWYoMD09aSlyZXR1cm4gcjt2YXIgbCxmO2lmKCJvYmplY3QiIT10eXBlb2YgcilyZXR1cm4gcjtpZihlLl9faXNBcnJheShyKSlsPVtdO2Vsc2UgaWYoZS5fX2lzUmVnRXhwKHIpKWw9bmV3IFJlZ0V4cChyLnNvdXJjZSxvKHIpKSxyLmxhc3RJbmRleCYmKGwubGFzdEluZGV4PXIubGFzdEluZGV4KTtlbHNlIGlmKGUuX19pc0RhdGUocikpbD1uZXcgRGF0ZShyLmdldFRpbWUoKSk7ZWxzZXtpZihoJiZ0LmlzQnVmZmVyKHIpKXJldHVybiBsPW5ldyB0KHIubGVuZ3RoKSxyLmNvcHkobCksbDsidW5kZWZpbmVkIj09dHlwZW9mIGE/KGY9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpLGw9T2JqZWN0LmNyZWF0ZShmKSk6KGw9T2JqZWN0LmNyZWF0ZShhKSxmPWEpfWlmKG4pe3ZhciBkPXUuaW5kZXhPZihyKTtpZihkIT0tMSlyZXR1cm4gY1tkXTt1LnB1c2gociksYy5wdXNoKGwpfWZvcih2YXIgcCBpbiByKXt2YXIgbTtmJiYobT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGYscCkpLG0mJm51bGw9PW0uc2V0fHwobFtwXT1zKHJbcF0saS0xKSl9cmV0dXJuIGx9dmFyIGw7Im9iamVjdCI9PXR5cGVvZiBuJiYoaT1uLmRlcHRoLGE9bi5wcm90b3R5cGUsbD1uLmZpbHRlcixuPW4uY2lyY3VsYXIpO3ZhciB1PVtdLGM9W10saD0idW5kZWZpbmVkIiE9dHlwZW9mIHQ7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBuJiYobj0hMCksInVuZGVmaW5lZCI9PXR5cGVvZiBpJiYoaT0xLzApLHMocixpKX1mdW5jdGlvbiByKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJbb2JqZWN0IERhdGVdIj09PXIodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJbb2JqZWN0IEFycmF5XSI9PT1yKHQpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYiW29iamVjdCBSZWdFeHBdIj09PXIodCl9ZnVuY3Rpb24gbyh0KXt2YXIgZT0iIjtyZXR1cm4gdC5nbG9iYWwmJihlKz0iZyIpLHQuaWdub3JlQ2FzZSYmKGUrPSJpIiksdC5tdWx0aWxpbmUmJihlKz0ibSIpLGV9cmV0dXJuIGUuY2xvbmVQcm90b3R5cGU9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7dmFyIGU9ZnVuY3Rpb24oKXt9O3JldHVybiBlLnByb3RvdHlwZT10LG5ldyBlfSxlLl9fb2JqVG9TdHI9cixlLl9faXNEYXRlPW4sZS5fX2lzQXJyYXk9aSxlLl9faXNSZWdFeHA9YSxlLl9fZ2V0UmVnRXhwRmxhZ3M9byxlfSgpOyJvYmplY3QiPT10eXBlb2YgZSYmZS5leHBvcnRzJiYoZS5leHBvcnRzPXIpfSkuY2FsbCh0aGlzLHQoImJ1ZmZlciIpLkJ1ZmZlcil9LHtidWZmZXI6NjZ9XSw4MTpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz17amV0Olt7aW5kZXg6MCxyZ2I6WzAsMCwxMzFdfSx7aW5kZXg6LjEyNSxyZ2I6WzAsNjAsMTcwXX0se2luZGV4Oi4zNzUscmdiOls1LDI1NSwyNTVdfSx7aW5kZXg6LjYyNSxyZ2I6WzI1NSwyNTUsMF19LHtpbmRleDouODc1LHJnYjpbMjUwLDAsMF19LHtpbmRleDoxLHJnYjpbMTI4LDAsMF19XSxoc3Y6W3tpbmRleDowLHJnYjpbMjU1LDAsMF19LHtpbmRleDouMTY5LHJnYjpbMjUzLDI1NSwyXX0se2luZGV4Oi4xNzMscmdiOlsyNDcsMjU1LDJdfSx7aW5kZXg6LjMzNyxyZ2I6WzAsMjUyLDRdfSx7aW5kZXg6LjM0MSxyZ2I6WzAsMjUyLDEwXX0se2luZGV4Oi41MDYscmdiOlsxLDI0OSwyNTVdfSx7aW5kZXg6LjY3MSxyZ2I6WzIsMCwyNTNdfSx7aW5kZXg6LjY3NSxyZ2I6WzgsMCwyNTNdfSx7aW5kZXg6LjgzOSxyZ2I6WzI1NSwwLDI1MV19LHtpbmRleDouODQzLHJnYjpbMjU1LDAsMjQ1XX0se2luZGV4OjEscmdiOlsyNTUsMCw2XX1dLGhvdDpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMyxyZ2I6WzIzMCwwLDBdfSx7aW5kZXg6LjYscmdiOlsyNTUsMjEwLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjU1XX1dLGNvb2w6W3tpbmRleDowLHJnYjpbMCwyNTUsMjU1XX0se2luZGV4OjEscmdiOlsyNTUsMCwyNTVdfV0sc3ByaW5nOlt7aW5kZXg6MCxyZ2I6WzI1NSwwLDI1NV19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwwXX1dLHN1bW1lcjpbe2luZGV4OjAscmdiOlswLDEyOCwxMDJdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMTAyXX1dLGF1dHVtbjpbe2luZGV4OjAscmdiOlsyNTUsMCwwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDBdfV0sd2ludGVyOlt7aW5kZXg6MCxyZ2I6WzAsMCwyNTVdfSx7aW5kZXg6MSxyZ2I6WzAsMjU1LDEyOF19XSxib25lOlt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4zNzYscmdiOls4NCw4NCwxMTZdfSx7aW5kZXg6Ljc1MyxyZ2I6WzE2OSwyMDAsMjAwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDI1NV19XSxjb3BwZXI6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjgwNCxyZ2I6WzI1NSwxNjAsMTAyXX0se2luZGV4OjEscmdiOlsyNTUsMTk5LDEyN119XSxncmV5czpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0seWlnbmJ1Olt7aW5kZXg6MCxyZ2I6WzgsMjksODhdfSx7aW5kZXg6LjEyNSxyZ2I6WzM3LDUyLDE0OF19LHtpbmRleDouMjUscmdiOlszNCw5NCwxNjhdfSx7aW5kZXg6LjM3NSxyZ2I6WzI5LDE0NSwxOTJdfSx7aW5kZXg6LjUscmdiOls2NSwxODIsMTk2XX0se2luZGV4Oi42MjUscmdiOlsxMjcsMjA1LDE4N119LHtpbmRleDouNzUscmdiOlsxOTksMjMzLDE4MF19LHtpbmRleDouODc1LHJnYjpbMjM3LDI0OCwyMTddfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjE3XX1dLGdyZWVuczpbe2luZGV4OjAscmdiOlswLDY4LDI3XX0se2luZGV4Oi4xMjUscmdiOlswLDEwOSw0NF19LHtpbmRleDouMjUscmdiOlszNSwxMzksNjldfSx7aW5kZXg6LjM3NSxyZ2I6WzY1LDE3MSw5M119LHtpbmRleDouNSxyZ2I6WzExNiwxOTYsMTE4XX0se2luZGV4Oi42MjUscmdiOlsxNjEsMjE3LDE1NV19LHtpbmRleDouNzUscmdiOlsxOTksMjMzLDE5Ml19LHtpbmRleDouODc1LHJnYjpbMjI5LDI0NSwyMjRdfSx7aW5kZXg6MSxyZ2I6WzI0NywyNTIsMjQ1XX1dLHlpb3JyZDpbe2luZGV4OjAscmdiOlsxMjgsMCwzOF19LHtpbmRleDouMTI1LHJnYjpbMTg5LDAsMzhdfSx7aW5kZXg6LjI1LHJnYjpbMjI3LDI2LDI4XX0se2luZGV4Oi4zNzUscmdiOlsyNTIsNzgsNDJdfSx7aW5kZXg6LjUscmdiOlsyNTMsMTQxLDYwXX0se2luZGV4Oi42MjUscmdiOlsyNTQsMTc4LDc2XX0se2luZGV4Oi43NSxyZ2I6WzI1NCwyMTcsMTE4XX0se2luZGV4Oi44NzUscmdiOlsyNTUsMjM3LDE2MF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyMDRdfV0sYmx1ZXJlZDpbe2luZGV4OjAscmdiOlswLDAsMjU1XX0se2luZGV4OjEscmdiOlsyNTUsMCwwXX1dLHJkYnU6W3tpbmRleDowLHJnYjpbNSwxMCwxNzJdfSx7aW5kZXg6LjM1LHJnYjpbMTA2LDEzNywyNDddfSx7aW5kZXg6LjUscmdiOlsxOTAsMTkwLDE5MF19LHtpbmRleDouNixyZ2I6WzIyMCwxNzAsMTMyXX0se2luZGV4Oi43LHJnYjpbMjMwLDE0NSw5MF19LHtpbmRleDoxLHJnYjpbMTc4LDEwLDI4XX1dLHBpY25pYzpbe2luZGV4OjAscmdiOlswLDAsMjU1XX0se2luZGV4Oi4xLHJnYjpbNTEsMTUzLDI1NV19LHtpbmRleDouMixyZ2I6WzEwMiwyMDQsMjU1XX0se2luZGV4Oi4zLHJnYjpbMTUzLDIwNCwyNTVdfSx7aW5kZXg6LjQscmdiOlsyMDQsMjA0LDI1NV19LHtpbmRleDouNSxyZ2I6WzI1NSwyNTUsMjU1XX0se2luZGV4Oi42LHJnYjpbMjU1LDIwNCwyNTVdfSx7aW5kZXg6LjcscmdiOlsyNTUsMTUzLDI1NV19LHtpbmRleDouOCxyZ2I6WzI1NSwxMDIsMjA0XX0se2luZGV4Oi45LHJnYjpbMjU1LDEwMiwxMDJdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDBdfV0scmFpbmJvdzpbe2luZGV4OjAscmdiOlsxNTAsMCw5MF19LHtpbmRleDouMTI1LHJnYjpbMCwwLDIwMF19LHtpbmRleDouMjUscmdiOlswLDI1LDI1NV19LHtpbmRleDouMzc1LHJnYjpbMCwxNTIsMjU1XX0se2luZGV4Oi41LHJnYjpbNDQsMjU1LDE1MF19LHtpbmRleDouNjI1LHJnYjpbMTUxLDI1NSwwXX0se2luZGV4Oi43NSxyZ2I6WzI1NSwyMzQsMF19LHtpbmRleDouODc1LHJnYjpbMjU1LDExMSwwXX0se2luZGV4OjEscmdiOlsyNTUsMCwwXX1dLHBvcnRsYW5kOlt7aW5kZXg6MCxyZ2I6WzEyLDUxLDEzMV19LHtpbmRleDouMjUscmdiOlsxMCwxMzYsMTg2XX0se2luZGV4Oi41LHJnYjpbMjQyLDIxMSw1Nl19LHtpbmRleDouNzUscmdiOlsyNDIsMTQzLDU2XX0se2luZGV4OjEscmdiOlsyMTcsMzAsMzBdfV0sYmxhY2tib2R5Olt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4yLHJnYjpbMjMwLDAsMF19LHtpbmRleDouNCxyZ2I6WzIzMCwyMTAsMF19LHtpbmRleDouNyxyZ2I6WzI1NSwyNTUsMjU1XX0se2luZGV4OjEscmdiOlsxNjAsMjAwLDI1NV19XSxlYXJ0aDpbe2luZGV4OjAscmdiOlswLDAsMTMwXX0se2luZGV4Oi4xLHJnYjpbMCwxODAsMTgwXX0se2luZGV4Oi4yLHJnYjpbNDAsMjEwLDQwXX0se2luZGV4Oi40LHJnYjpbMjMwLDIzMCw1MF19LHtpbmRleDouNixyZ2I6WzEyMCw3MCwyMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0sZWxlY3RyaWM6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjE1LHJnYjpbMzAsMCwxMDBdfSx7aW5kZXg6LjQscmdiOlsxMjAsMCwxMDBdfSx7aW5kZXg6LjYscmdiOlsxNjAsOTAsMF19LHtpbmRleDouOCxyZ2I6WzIzMCwyMDAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1MCwyMjBdfV0sYWxwaGE6W3tpbmRleDowLHJnYjpbMjU1LDI1NSwyNTUsMF19LHtpbmRleDowLHJnYjpbMjU1LDI1NSwyNTUsMV19XSx2aXJpZGlzOlt7aW5kZXg6MCxyZ2I6WzY4LDEsODRdfSx7aW5kZXg6LjEzLHJnYjpbNzEsNDQsMTIyXX0se2luZGV4Oi4yNSxyZ2I6WzU5LDgxLDEzOV19LHtpbmRleDouMzgscmdiOls0NCwxMTMsMTQyXX0se2luZGV4Oi41LHJnYjpbMzMsMTQ0LDE0MV19LHtpbmRleDouNjMscmdiOlszOSwxNzMsMTI5XX0se2luZGV4Oi43NSxyZ2I6WzkyLDIwMCw5OV19LHtpbmRleDouODgscmdiOlsxNzAsMjIwLDUwXX0se2luZGV4OjEscmdiOlsyNTMsMjMxLDM3XX1dLGluZmVybm86W3tpbmRleDowLHJnYjpbMCwwLDRdfSx7aW5kZXg6LjEzLHJnYjpbMzEsMTIsNzJdfSx7aW5kZXg6LjI1LHJnYjpbODUsMTUsMTA5XX0se2luZGV4Oi4zOCxyZ2I6WzEzNiwzNCwxMDZdfSx7aW5kZXg6LjUscmdiOlsxODYsNTQsODVdfSx7aW5kZXg6LjYzLHJnYjpbMjI3LDg5LDUxXX0se2luZGV4Oi43NSxyZ2I6WzI0OSwxNDAsMTBdfSx7aW5kZXg6Ljg4LHJnYjpbMjQ5LDIwMSw1MF19LHtpbmRleDoxLHJnYjpbMjUyLDI1NSwxNjRdfV0sbWFnbWE6W3tpbmRleDowLHJnYjpbMCwwLDRdfSx7aW5kZXg6LjEzLHJnYjpbMjgsMTYsNjhdfSx7aW5kZXg6LjI1LHJnYjpbNzksMTgsMTIzXX0se2luZGV4Oi4zOCxyZ2I6WzEyOSwzNywxMjldfSx7aW5kZXg6LjUscmdiOlsxODEsNTQsMTIyXX0se2luZGV4Oi42MyxyZ2I6WzIyOSw4MCwxMDBdfSx7aW5kZXg6Ljc1LHJnYjpbMjUxLDEzNSw5N119LHtpbmRleDouODgscmdiOlsyNTQsMTk0LDEzNV19LHtpbmRleDoxLHJnYjpbMjUyLDI1MywxOTFdfV0scGxhc21hOlt7aW5kZXg6MCxyZ2I6WzEzLDgsMTM1XX0se2luZGV4Oi4xMyxyZ2I6Wzc1LDMsMTYxXX0se2luZGV4Oi4yNSxyZ2I6WzEyNSwzLDE2OF19LHtpbmRleDouMzgscmdiOlsxNjgsMzQsMTUwXX0se2luZGV4Oi41LHJnYjpbMjAzLDcwLDEyMV19LHtpbmRleDouNjMscmdiOlsyMjksMTA3LDkzXX0se2luZGV4Oi43NSxyZ2I6WzI0OCwxNDgsNjVdfSx7aW5kZXg6Ljg4LHJnYjpbMjUzLDE5NSw0MF19LHtpbmRleDoxLHJnYjpbMjQwLDI0OSwzM119XSx3YXJtOlt7aW5kZXg6MCxyZ2I6WzEyNSwwLDE3OV19LHtpbmRleDouMTMscmdiOlsxNzIsMCwxODddfSx7aW5kZXg6LjI1LHJnYjpbMjE5LDAsMTcwXX0se2luZGV4Oi4zOCxyZ2I6WzI1NSwwLDEzMF19LHtpbmRleDouNSxyZ2I6WzI1NSw2Myw3NF19LHtpbmRleDouNjMscmdiOlsyNTUsMTIzLDBdfSx7aW5kZXg6Ljc1LHJnYjpbMjM0LDE3NiwwXX0se2luZGV4Oi44OCxyZ2I6WzE5MCwyMjgsMF19LHtpbmRleDoxLHJnYjpbMTQ3LDI1NSwwXX1dLGNvb2w6W3tpbmRleDowLHJnYjpbMTI1LDAsMTc5XX0se2luZGV4Oi4xMyxyZ2I6WzExNiwwLDIxOF19LHtpbmRleDouMjUscmdiOls5OCw3NCwyMzddfSx7aW5kZXg6LjM4LHJnYjpbNjgsMTQ2LDIzMV19LHtpbmRleDouNSxyZ2I6WzAsMjA0LDE5N119LHtpbmRleDouNjMscmdiOlswLDI0NywxNDZdfSx7aW5kZXg6Ljc1LHJnYjpbMCwyNTUsODhdfSx7aW5kZXg6Ljg4LHJnYjpbNDAsMjU1LDhdfSx7aW5kZXg6MSxyZ2I6WzE0NywyNTUsMF19XSwicmFpbmJvdy1zb2Z0Ijpbe2luZGV4OjAscmdiOlsxMjUsMCwxNzldfSx7aW5kZXg6LjEscmdiOlsxOTksMCwxODBdfSx7aW5kZXg6LjIscmdiOlsyNTUsMCwxMjFdfSx7aW5kZXg6LjMscmdiOlsyNTUsMTA4LDBdfSx7aW5kZXg6LjQscmdiOlsyMjIsMTk0LDBdfSx7aW5kZXg6LjUscmdiOlsxNTAsMjU1LDBdfSx7aW5kZXg6LjYscmdiOlswLDI1NSw1NV19LHtpbmRleDouNyxyZ2I6WzAsMjQ2LDE1MF19LHtpbmRleDouOCxyZ2I6WzUwLDE2NywyMjJdfSx7aW5kZXg6LjkscmdiOlsxMDMsNTEsMjM1XX0se2luZGV4OjEscmdiOlsxMjQsMCwxODZdfV0sYmF0aHltZXRyeTpbe2luZGV4OjAscmdiOls0MCwyNiw0NF19LHtpbmRleDouMTMscmdiOls1OSw0OSw5MF19LHtpbmRleDouMjUscmdiOls2NCw3NiwxMzldfSx7aW5kZXg6LjM4LHJnYjpbNjMsMTEwLDE1MV19LHtpbmRleDouNSxyZ2I6WzcyLDE0MiwxNThdfSx7aW5kZXg6LjYzLHJnYjpbODUsMTc0LDE2M119LHtpbmRleDouNzUscmdiOlsxMjAsMjA2LDE2M119LHtpbmRleDouODgscmdiOlsxODcsMjMwLDE3Ml19LHtpbmRleDoxLHJnYjpbMjUzLDI1NCwyMDRdfV0sY2RvbTpbe2luZGV4OjAscmdiOls0NywxNSw2Ml19LHtpbmRleDouMTMscmdiOls4NywyMyw4Nl19LHtpbmRleDouMjUscmdiOlsxMzAsMjgsOTldfSx7aW5kZXg6LjM4LHJnYjpbMTcxLDQxLDk2XX0se2luZGV4Oi41LHJnYjpbMjA2LDY3LDg2XX0se2luZGV4Oi42MyxyZ2I6WzIzMCwxMDYsODRdfSx7aW5kZXg6Ljc1LHJnYjpbMjQyLDE0OSwxMDNdfSx7aW5kZXg6Ljg4LHJnYjpbMjQ5LDE5MywxMzVdfSx7aW5kZXg6MSxyZ2I6WzI1NCwyMzcsMTc2XX1dLGNobG9yb3BoeWxsOlt7aW5kZXg6MCxyZ2I6WzE4LDM2LDIwXX0se2luZGV4Oi4xMyxyZ2I6WzI1LDYzLDQxXX0se2luZGV4Oi4yNSxyZ2I6WzI0LDkxLDU5XX0se2luZGV4Oi4zOCxyZ2I6WzEzLDExOSw3Ml19LHtpbmRleDouNSxyZ2I6WzE4LDE0OCw4MF19LHtpbmRleDouNjMscmdiOls4MCwxNzMsODldfSx7aW5kZXg6Ljc1LHJnYjpbMTMyLDE5NiwxMjJdfSx7aW5kZXg6Ljg4LHJnYjpbMTc1LDIyMSwxNjJdfSx7aW5kZXg6MSxyZ2I6WzIxNSwyNDksMjA4XX1dLGRlbnNpdHk6W3tpbmRleDowLHJnYjpbNTQsMTQsMzZdfSx7aW5kZXg6LjEzLHJnYjpbODksMjMsODBdfSx7aW5kZXg6LjI1LHJnYjpbMTEwLDQ1LDEzMl19LHtpbmRleDouMzgscmdiOlsxMjAsNzcsMTc4XX0se2luZGV4Oi41LHJnYjpbMTIwLDExMywyMTNdfSx7aW5kZXg6LjYzLHJnYjpbMTE1LDE1MSwyMjhdfSx7aW5kZXg6Ljc1LHJnYjpbMTM0LDE4NSwyMjddfSx7aW5kZXg6Ljg4LHJnYjpbMTc3LDIxNCwyMjddfSx7aW5kZXg6MSxyZ2I6WzIzMCwyNDEsMjQxXX1dLCJmcmVlc3VyZmFjZS1ibHVlIjpbe2luZGV4OjAscmdiOlszMCw0LDExMF19LHtpbmRleDouMTMscmdiOls0NywxNCwxNzZdfSx7aW5kZXg6LjI1LHJnYjpbNDEsNDUsMjM2XX0se2luZGV4Oi4zOCxyZ2I6WzI1LDk5LDIxMl19LHtpbmRleDouNSxyZ2I6WzY4LDEzMSwyMDBdfSx7aW5kZXg6LjYzLHJnYjpbMTE0LDE1NiwxOTddfSx7aW5kZXg6Ljc1LHJnYjpbMTU3LDE4MSwyMDNdfSx7aW5kZXg6Ljg4LHJnYjpbMjAwLDIwOCwyMTZdfSx7aW5kZXg6MSxyZ2I6WzI0MSwyMzcsMjM2XX1dLCJmcmVlc3VyZmFjZS1yZWQiOlt7aW5kZXg6MCxyZ2I6WzYwLDksMThdfSx7aW5kZXg6LjEzLHJnYjpbMTAwLDE3LDI3XX0se2luZGV4Oi4yNSxyZ2I6WzE0MiwyMCwyOV19LHtpbmRleDouMzgscmdiOlsxNzcsNDMsMjddfSx7aW5kZXg6LjUscmdiOlsxOTIsODcsNjNdfSx7aW5kZXg6LjYzLHJnYjpbMjA1LDEyNSwxMDVdfSx7aW5kZXg6Ljc1LHJnYjpbMjE2LDE2MiwxNDhdfSx7aW5kZXg6Ljg4LHJnYjpbMjI3LDE5OSwxOTNdfSx7aW5kZXg6MSxyZ2I6WzI0MSwyMzcsMjM2XX1dLG94eWdlbjpbe2luZGV4OjAscmdiOls2NCw1LDVdfSx7aW5kZXg6LjEzLHJnYjpbMTA2LDYsMTVdfSx7aW5kZXg6LjI1LHJnYjpbMTQ0LDI2LDddfSx7aW5kZXg6LjM4LHJnYjpbMTY4LDY0LDNdfSx7aW5kZXg6LjUscmdiOlsxODgsMTAwLDRdfSx7aW5kZXg6LjYzLHJnYjpbMjA2LDEzNiwxMV19LHtpbmRleDouNzUscmdiOlsyMjAsMTc0LDI1XX0se2luZGV4Oi44OCxyZ2I6WzIzMSwyMTUsNDRdfSx7aW5kZXg6MSxyZ2I6WzI0OCwyNTQsMTA1XX1dLHBhcjpbe2luZGV4OjAscmdiOls1MSwyMCwyNF19LHtpbmRleDouMTMscmdiOls5MCwzMiwzNV19LHtpbmRleDouMjUscmdiOlsxMjksNDQsMzRdfSx7aW5kZXg6LjM4LHJnYjpbMTU5LDY4LDI1XX0se2luZGV4Oi41LHJnYjpbMTgyLDk5LDE5XX0se2luZGV4Oi42MyxyZ2I6WzE5OSwxMzQsMjJdfSx7aW5kZXg6Ljc1LHJnYjpbMjEyLDE3MSwzNV19LHtpbmRleDouODgscmdiOlsyMjEsMjEwLDU0XX0se2luZGV4OjEscmdiOlsyMjUsMjUzLDc1XX1dLHBoYXNlOlt7aW5kZXg6MCxyZ2I6WzE0NSwxMDUsMThdfSx7aW5kZXg6LjEzLHJnYjpbMTg0LDcxLDM4XX0se2luZGV4Oi4yNSxyZ2I6WzE4Niw1OCwxMTVdfSx7aW5kZXg6LjM4LHJnYjpbMTYwLDcxLDE4NV19LHtpbmRleDouNSxyZ2I6WzExMCw5NywyMThdfSx7aW5kZXg6LjYzLHJnYjpbNTAsMTIzLDE2NF19LHtpbmRleDouNzUscmdiOlszMSwxMzEsMTEwXX0se2luZGV4Oi44OCxyZ2I6Wzc3LDEyOSwzNF19LHtpbmRleDoxLHJnYjpbMTQ1LDEwNSwxOF19XSxzYWxpbml0eTpbe2luZGV4OjAscmdiOls0MiwyNCwxMDhdfSx7aW5kZXg6LjEzLHJnYjpbMzMsNTAsMTYyXX0se2luZGV4Oi4yNSxyZ2I6WzE1LDkwLDE0NV19LHtpbmRleDouMzgscmdiOls0MCwxMTgsMTM3XX0se2luZGV4Oi41LHJnYjpbNTksMTQ2LDEzNV19LHtpbmRleDouNjMscmdiOls3OSwxNzUsMTI2XX0se2luZGV4Oi43NSxyZ2I6WzEyMCwyMDMsMTA0XX0se2luZGV4Oi44OCxyZ2I6WzE5MywyMjEsMTAwXX0se2luZGV4OjEscmdiOlsyNTMsMjM5LDE1NF19XSx0ZW1wZXJhdHVyZTpbe2luZGV4OjAscmdiOls0LDM1LDUxXX0se2luZGV4Oi4xMyxyZ2I6WzIzLDUxLDEyMl19LHtpbmRleDouMjUscmdiOls4NSw1OSwxNTddfSx7aW5kZXg6LjM4LHJnYjpbMTI5LDc5LDE0M119LHtpbmRleDouNSxyZ2I6WzE3NSw5NSwxMzBdfSx7aW5kZXg6LjYzLHJnYjpbMjIyLDExMiwxMDFdfSx7aW5kZXg6Ljc1LHJnYjpbMjQ5LDE0Niw2Nl19LHtpbmRleDouODgscmdiOlsyNDksMTk2LDY1XX0se2luZGV4OjEscmdiOlsyMzIsMjUwLDkxXX1dLHR1cmJpZGl0eTpbe2luZGV4OjAscmdiOlszNCwzMSwyN119LHtpbmRleDouMTMscmdiOls2NSw1MCw0MV19LHtpbmRleDouMjUscmdiOls5OCw2OSw1Ml19LHtpbmRleDouMzgscmdiOlsxMzEsODksNTddfSx7aW5kZXg6LjUscmdiOlsxNjEsMTEyLDU5XX0se2luZGV4Oi42MyxyZ2I6WzE4NSwxNDAsNjZdfSx7aW5kZXg6Ljc1LHJnYjpbMjAyLDE3NCw4OF19LHtpbmRleDouODgscmdiOlsyMTYsMjA5LDEyNl19LHtpbmRleDoxLHJnYjpbMjMzLDI0NiwxNzFdfV0sInZlbG9jaXR5LWJsdWUiOlt7aW5kZXg6MCxyZ2I6WzE3LDMyLDY0XX0se2luZGV4Oi4xMyxyZ2I6WzM1LDUyLDExNl19LHtpbmRleDouMjUscmdiOlsyOSw4MSwxNTZdfSx7aW5kZXg6LjM4LHJnYjpbMzEsMTEzLDE2Ml19LHtpbmRleDouNSxyZ2I6WzUwLDE0NCwxNjldfSx7aW5kZXg6LjYzLHJnYjpbODcsMTczLDE3Nl19LHtpbmRleDouNzUscmdiOlsxNDksMTk2LDE4OV19LHtpbmRleDouODgscmdiOlsyMDMsMjIxLDIxMV19LHtpbmRleDoxLHJnYjpbMjU0LDI1MSwyMzBdfV0sInZlbG9jaXR5LWdyZWVuIjpbe2luZGV4OjAscmdiOlsyMywzNSwxOV19LHtpbmRleDouMTMscmdiOlsyNCw2NCwzOF19LHtpbmRleDouMjUscmdiOlsxMSw5NSw0NV19LHtpbmRleDouMzgscmdiOlszOSwxMjMsMzVdfSx7aW5kZXg6LjUscmdiOls5NSwxNDYsMTJdfSx7aW5kZXg6LjYzLHJnYjpbMTUyLDE2NSwxOF19LHtpbmRleDouNzUscmdiOlsyMDEsMTg2LDY5XX0se2luZGV4Oi44OCxyZ2I6WzIzMywyMTYsMTM3XX0se2luZGV4OjEscmdiOlsyNTUsMjUzLDIwNV19XSxjdWJlaGVsaXg6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjA3LHJnYjpbMjIsNSw1OV19LHtpbmRleDouMTMscmdiOls2MCw0LDEwNV19LHtpbmRleDouMixyZ2I6WzEwOSwxLDEzNV19LHtpbmRleDouMjcscmdiOlsxNjEsMCwxNDddfSx7aW5kZXg6LjMzLHJnYjpbMjEwLDIsMTQyXX0se2luZGV4Oi40LHJnYjpbMjUxLDExLDEyM119LHtpbmRleDouNDcscmdiOlsyNTUsMjksOTddfSx7aW5kZXg6LjUzLHJnYjpbMjU1LDU0LDY5XX0se2luZGV4Oi42LHJnYjpbMjU1LDg1LDQ2XX0se2luZGV4Oi42NyxyZ2I6WzI1NSwxMjAsMzRdfSx7aW5kZXg6LjczLHJnYjpbMjU1LDE1NywzN119LHtpbmRleDouOCxyZ2I6WzI0MSwxOTEsNTddfSx7aW5kZXg6Ljg3LHJnYjpbMjI0LDIyMCw5M119LHtpbmRleDouOTMscmdiOlsyMTgsMjQxLDE0Ml19LHtpbmRleDoxLHJnYjpbMjI3LDI1MywxOThdfV19fSx7fV0sODI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZSxyLG4sdSxjLGgsZixkLHAsbSxnLHYseSxiPVtdLHg9W10sXz1bXSx3PVtdO2lmKG8uaXNQbGFpbk9iamVjdCh0KXx8KHQ9e30pLHA9dC5uc2hhZGVzfHw3MixkPXQuZm9ybWF0fHwiaGV4IixmPXQuY29sb3JtYXAsZnx8KGY9ImpldCIpLCJzdHJpbmciPT10eXBlb2YgZil7aWYoZj1mLnRvTG93ZXJDYXNlKCksIWxbZl0pdGhyb3cgRXJyb3IoZisiIG5vdCBhIHN1cHBvcnRlZCBjb2xvcnNjYWxlIik7aD1zKGxbZl0pfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkoZikpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGNvbG9ybWFwIG9wdGlvbiIsZik7aD1zKGYpfWlmKGgubGVuZ3RoPnApdGhyb3cgbmV3IEVycm9yKGYrIiBtYXAgcmVxdWlyZXMgbnNoYWRlcyB0byBiZSBhdCBsZWFzdCBzaXplICIraC5sZW5ndGgpO2ZvcihnPUFycmF5LmlzQXJyYXkodC5hbHBoYSk/MiE9PXQuYWxwaGEubGVuZ3RoP1sxLDFdOnModC5hbHBoYSk6Im51bWJlciI9PXR5cGVvZiB0LmFscGhhP1t0LmFscGhhLHQuYWxwaGFdOlsxLDFdLGU9aC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodC5pbmRleCpwKX0pLGdbMF08MCYmKGdbMF09MCksZ1sxXTwwJiYoZ1swXT0wKSxnWzBdPjEmJihnWzBdPTEpLGdbMV0+MSYmKGdbMF09MSkseT0wO3k8ZS5sZW5ndGg7Kyt5KXY9aFt5XS5pbmRleCxyPWhbeV0ucmdiLDQ9PT1yLmxlbmd0aCYmclszXT49MCYmclszXTw9MXx8KHJbM109Z1swXSsoZ1sxXS1nWzBdKSp2KTtmb3IoeT0wO3k8ZS5sZW5ndGgtMTsrK3kpYz1lW3krMV0tZVt5XSxuPWhbeV0ucmdiLHU9aFt5KzFdLnJnYixiPWIuY29uY2F0KG8ubGluc3BhY2UoblswXSx1WzBdLGMpKSx4PXguY29uY2F0KG8ubGluc3BhY2UoblsxXSx1WzFdLGMpKSxfPV8uY29uY2F0KG8ubGluc3BhY2UoblsyXSx1WzJdLGMpKSx3PXcuY29uY2F0KG8ubGluc3BhY2UoblszXSx1WzNdLGMpKTtyZXR1cm4gYj1iLm1hcChNYXRoLnJvdW5kKSx4PXgubWFwKE1hdGgucm91bmQpLF89Xy5tYXAoTWF0aC5yb3VuZCksbT1vLnppcChiLHgsXyx3KSwiaGV4Ij09PWQmJihtPW0ubWFwKGkpKSwicmdiYVN0cmluZyI9PT1kJiYobT1tLm1hcChhKSksbX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZSxyPSIjIixuPTA7bjwzOysrbillPXRbbl0sZT1lLnRvU3RyaW5nKDE2KSxyKz0oIjAwIitlKS5zdWJzdHIoZS5sZW5ndGgpO3JldHVybiByfWZ1bmN0aW9uIGEodCl7cmV0dXJuInJnYmEoIit0LmpvaW4oIiwiKSsiKSJ9dmFyIG89dCgiYXJyYXl0b29scyIpLHM9dCgiY2xvbmUiKSxsPXQoIi4vY29sb3JTY2FsZXMiKTtlLmV4cG9ydHM9bn0seyIuL2NvbG9yU2NhbGVzIjo4MSxhcnJheXRvb2xzOjM1LGNsb25lOjgwfV0sODM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49cyh0WzBdLC1lWzBdKSxpPXModFsxXSwtZVsxXSksYT1zKHJbMF0sLWVbMF0pLG89cyhyWzFdLC1lWzFdKSxjPXUobChuLGEpLGwoaSxvKSk7cmV0dXJuIGNbYy5sZW5ndGgtMV0+PTB9ZnVuY3Rpb24gaSh0LGUscixpKXt2YXIgcz1hKGUscixpKTtpZigwPT09cyl7dmFyIGw9byhhKHQsZSxyKSksdT1vKGEodCxlLGkpKTtpZihsPT09dSl7aWYoMD09PWwpe3ZhciBjPW4odCxlLHIpLGg9bih0LGUsaSk7cmV0dXJuIGM9PT1oPzA6Yz8xOi0xfXJldHVybiAwfXJldHVybiAwPT09dT9sPjA/LTE6bih0LGUsaSk/LTE6MTowPT09bD91PjA/MTpuKHQsZSxyKT8xOi0xOm8odS1sKX12YXIgZj1hKHQsZSxyKTtpZihmPjApcmV0dXJuIHM+MCYmYSh0LGUsaSk+MD8xOi0xO2lmKGY8MClyZXR1cm4gcz4wfHxhKHQsZSxpKT4wPzE6LTE7dmFyIGQ9YSh0LGUsaSk7cmV0dXJuIGQ+MD8xOm4odCxlLHIpPzE6LTF9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LW9yaWVudGF0aW9uIiksbz10KCJzaWdudW0iKSxzPXQoInR3by1zdW0iKSxsPXQoInJvYnVzdC1wcm9kdWN0IiksdT10KCJyb2J1c3Qtc3VtIil9LHsicm9idXN0LW9yaWVudGF0aW9uIjo0NzEsInJvYnVzdC1wcm9kdWN0Ijo0NzIsInJvYnVzdC1zdW0iOjQ3NixzaWdudW06NDc4LCJ0d28tc3VtIjo1MDF9XSw4NDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdC1lfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj10Lmxlbmd0aCxpPXQubGVuZ3RoLWUubGVuZ3RoO2lmKGkpcmV0dXJuIGk7c3dpdGNoKHIpe2Nhc2UgMDpyZXR1cm4gMDtjYXNlIDE6cmV0dXJuIHRbMF0tZVswXTtjYXNlIDI6cmV0dXJuIHRbMF0rdFsxXS1lWzBdLWVbMV18fGEodFswXSx0WzFdKS1hKGVbMF0sZVsxXSk7Y2FzZSAzOnZhciBvPXRbMF0rdFsxXSxzPWVbMF0rZVsxXTtpZihpPW8rdFsyXS0ocytlWzJdKSlyZXR1cm4gaTt2YXIgbD1hKHRbMF0sdFsxXSksdT1hKGVbMF0sZVsxXSk7cmV0dXJuIGEobCx0WzJdKS1hKHUsZVsyXSl8fGEobCt0WzJdLG8pLWEodStlWzJdLHMpO2Nhc2UgNDp2YXIgYz10WzBdLGg9dFsxXSxmPXRbMl0sZD10WzNdLHA9ZVswXSxtPWVbMV0sZz1lWzJdLHY9ZVszXTtyZXR1cm4gYytoK2YrZC0ocCttK2crdil8fGEoYyxoLGYsZCktYShwLG0sZyx2LHApfHxhKGMraCxjK2YsYytkLGgrZixoK2QsZitkKS1hKHArbSxwK2cscCt2LG0rZyxtK3YsZyt2KXx8YShjK2grZixjK2grZCxjK2YrZCxoK2YrZCktYShwK20rZyxwK20rdixwK2crdixtK2crdik7ZGVmYXVsdDpmb3IodmFyIHk9dC5zbGljZSgpLnNvcnQobiksYj1lLnNsaWNlKCkuc29ydChuKSx4PTA7eDxyOysreClpZihpPXlbeF0tYlt4XSlyZXR1cm4gaTtyZXR1cm4gMH19ZS5leHBvcnRzPWk7dmFyIGE9TWF0aC5taW59LHt9XSw4NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodCxlKXx8YSh0KS1hKGUpfXZhciBpPXQoImNvbXBhcmUtY2VsbCIpLGE9dCgiY2VsbC1vcmllbnRhdGlvbiIpO2UuZXhwb3J0cz1ufSx7ImNlbGwtb3JpZW50YXRpb24iOjc1LCJjb21wYXJlLWNlbGwiOjg0fV0sODY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10Lmxlbmd0aDtpZigwPT09ZSlyZXR1cm5bXTtpZigxPT09ZSlyZXR1cm5bWzBdXTt2YXIgcj10WzBdLmxlbmd0aDtyZXR1cm4gMD09PXI/W106MT09PXI/aSh0KToyPT09cj9hKHQpOm8odCxyKX12YXIgaT10KCIuL2xpYi9jaDFkIiksYT10KCIuL2xpYi9jaDJkIiksbz10KCIuL2xpYi9jaG5kIik7ZS5leHBvcnRzPW59LHsiLi9saWIvY2gxZCI6ODcsIi4vbGliL2NoMmQiOjg4LCIuL2xpYi9jaG5kIjo4OX1dLDg3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBlPTAscj0wLG49MTtuPHQubGVuZ3RoOysrbil0W25dWzBdPHRbZV1bMF0mJihlPW4pLHRbbl1bMF0+dFtyXVswXSYmKHI9bik7cmV0dXJuIGU8cj9bW2VdLFtyXV06ZT5yP1tbcl0sW2VdXTpbW2VdXX1lLmV4cG9ydHM9bn0se31dLDg4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aSh0KSxyPWUubGVuZ3RoO2lmKHI8PTIpcmV0dXJuW107Zm9yKHZhciBuPW5ldyBBcnJheShyKSxhPWVbci0xXSxvPTA7bzxyOysrbyl7dmFyIHM9ZVtvXTtuW29dPVthLHNdLGE9c31yZXR1cm4gbn1lLmV4cG9ydHM9bjt2YXIgaT10KCJtb25vdG9uZS1jb252ZXgtaHVsbC0yZCIpfSx7Im1vbm90b25lLWNvbnZleC1odWxsLTJkIjo0MTd9XSw4OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLG49bmV3IEFycmF5KHIpLGk9MDtpPGUubGVuZ3RoOysraSluW2ldPXRbZVtpXV07Zm9yKHZhciBhPWUubGVuZ3RoLGk9MDtpPHI7KytpKWUuaW5kZXhPZihpKTwwJiYoblthKytdPXRbaV0pO3JldHVybiBufWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTA7aTxyOysraSlmb3IodmFyIGE9dFtpXSxvPTA7bzxhLmxlbmd0aDsrK28pe3ZhciBzPWFbb107aWYoczxuKWFbb109ZVtzXTtlbHNle3MtPW47Zm9yKHZhciBsPTA7bDxuOysrbClzPj1lW2xdJiYocys9MSk7YVtvXT1zfX1yZXR1cm4gdH1mdW5jdGlvbiBhKHQsZSl7dHJ5e3JldHVybiBvKHQsITApfWNhdGNoKHUpe3ZhciByPXModCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuW107dmFyIGE9bih0LHIpLGw9byhhLCEwKTtyZXR1cm4gaShsLHIpfX1lLmV4cG9ydHM9YTt2YXIgbz10KCJpbmNyZW1lbnRhbC1jb252ZXgtaHVsbCIpLHM9dCgiYWZmaW5lLWh1bGwiKX0seyJhZmZpbmUtaHVsbCI6MzIsImluY3JlbWVudGFsLWNvbnZleC1odWxsIjoyNTl9XSw5MDpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz17QUZHOiJhZmdoYW4iLEFMQToiXFxiXFx3bGFuZCIsQUxCOiJhbGJhbmlhIixEWkE6ImFsZ2VyaWEiLEFTTToiXig/PS4qYW1lcmljKS4qc2Ftb2EiLEFORDoiYW5kb3JyYSIsQUdPOiJhbmdvbGEiLEFJQToiYW5ndWlsbD9hIixBVEE6ImFudGFyY3RpY2EiLEFURzoiYW50aWd1YSIsQVJHOiJhcmdlbnRpbiIsQVJNOiJhcm1lbmlhIixBQlc6Il4oPyEuKmJvbmFpcmUpLipcXGJhcnViYSIsQVVTOiJhdXN0cmFsaWEiLEFVVDoiXig/IS4qaHVuZ2FyeSkuKmF1c3RyaWF8XFxiYXVzdHJpLipcXGJlbXAiLEFaRToiYXplcmJhaWphbiIsQkhTOiJiYWhhbWFzIixCSFI6ImJhaHJhaW4iLEJHRDoiYmFuZ2xhZGVzaHxeKD89LiplYXN0KS4qcGFraT9zdGFuIixCUkI6ImJhcmJhZG9zIixCTFI6ImJlbGFydXN8YnllbG8iLEJFTDoiXig/IS4qbHV4ZW0pLipiZWxnaXVtIixCTFo6ImJlbGl6ZXxeKD89Lipicml0aXNoKS4qaG9uZHVyYXMiLEJFTjoiYmVuaW58ZGFob21lIixCTVU6ImJlcm11ZGEiLEJUTjoiYmh1dGFuIixCT0w6ImJvbGl2aWEiLEJFUzoiXig/PS4qYm9uYWlyZSkuKmV1c3RhdGl1c3xeKD89LipjYXJpYikuKm5ldGhlcmxhbmRzfFxcYmJlcy4/aXNsYW5kcyIsQklIOiJoZXJ6ZWdvdmluYXxib3NuaWEiLEJXQToiYm90c3dhbmF8YmVjaHVhbmEiLEJWVDoiYm91dmV0IixCUkE6ImJyYXppbCIsSU9UOiJicml0aXNoLj9pbmRpYW4uP29jZWFuIixCUk46ImJydW5laSIsQkdSOiJidWxnYXJpYSIsQkZBOiJidXJraW5hfFxcYmZhc298dXBwZXIuP3ZvbHRhIixCREk6ImJ1cnVuZGkiLEtITToiY2FtYm9kaWF8a2FtcHVjaGVhfGtobWVyIixDTVI6ImNhbWVyb29uIixDQU46ImNhbmFkYSIsQ1BWOiJ2ZXJkZSIsQ1lNOiJjYXltYW4iLENBRjoiXFxiY2VudHJhbC5hZnJpY2FuLnJlcHVibGljIixUQ0Q6IlxcYmNoYWQiLENITDoiXFxiY2hpbGUiLENITjoiXig/IS4qXFxibWFjKSg/IS4qXFxiaG9uZykoPyEuKlxcYnRhaSkoPyEuKlxcYnJlcCkuKmNoaW5hfF4oPz0uKnBlbykoPz0uKnJlcCkuKmNoaW5hIixDWFI6ImNocmlzdG1hcyIsQ0NLOiJcXGJjb2Nvc3xrZWVsaW5nIixDT0w6ImNvbG9tYmlhIixDT006ImNvbW9ybyIsQ09EOiJcXGJkZW0uKmNvbmdvfGNvbmdvLipcXGJkZW18Y29uZ28uKlxcYmRyfFxcYmRyLipjb25nb3xiZWxnaWFuLj9jb25nb3xjb25nby4/ZnJlZS4/c3RhdGV8a2luc2hhc2F8emFpcmV8bC5vcG9sZHZpbGxlfGRyY3xkcm9jfHJkYyIsQ09HOiJeKD8hLipcXGJkZW0pKD8hLipcXGJkcikoPyEuKmtpbnNoYXNhKSg/IS4qemFpcmUpKD8hLipiZWxnKSg/IS4qbC5vcG9sZHZpbGxlKSg/IS4qZnJlZSkuKlxcYmNvbmdvIixDT0s6IlxcYmNvb2siLENSSToiY29zdGEuP3JpY2EiLENJVjoiaXZvaXJlfGl2b3J5IixIUlY6ImNyb2F0aWEiLENVQjoiXFxiY3ViYSIsQ1VXOiJeKD8hLipib25haXJlKS4qXFxiY3VyYShjfFx4ZTcpYW8iLENZUDoiY3lwcnVzIixDWkU6Il4oPz0uKnJlcCkuKmN6ZWNofGN6ZWNoaWF8Ym9oZW1pYSIsQ1NLOiJjemVjaG9zbG92YWtpYSIsRE5LOiJkZW5tYXJrIixESkk6ImRqaWJvdXRpIixETUE6ImRvbWluaWNhKD8hbikiLERPTToiZG9taW5pY2FuLnJlcCIsRUNVOiJlY3VhZG9yIixFR1k6ImVneXB0IixTTFY6ImVsLj9zYWx2YWRvciIsR05ROiJndWluZS4qZXF8ZXEuKmd1aW5lfF4oPz0uKnNwYW4pLipndWluZWEiLEVSSToiZXJpdHJlYSIsRVNUOiJlc3RvbmlhIixFVEg6ImV0aGlvcGlhfGFieXNzaW5pYSIsRkxLOiJmYWxrbGFuZHxtYWx2aW5hcyIsRlJPOiJmYXJvZXxmYWVyb2UiLEZKSToiZmlqaSIsRklOOiJmaW5sYW5kIixGUkE6Il4oPyEuKlxcYmRlcCkoPyEuKm1hcnRpbmlxdWUpLipmcmFuY2V8ZnJlbmNoLj9yZXB1YmxpY3xcXGJnYXVsIixHVUY6Il4oPz0uKmZyZW5jaCkuKmd1aWFuYSIsUFlGOiJmcmVuY2guP3BvbHluZXNpYXx0YWhpdGkiLEFURjoiZnJlbmNoLj9zb3V0aGVybiIsR0FCOiJnYWJvbiIsR01COiJnYW1iaWEiLEdFTzoiXig/IS4qc291dGgpLipnZW9yZ2lhIixERFI6Imdlcm1hbi4/ZGVtb2NyYXRpYy4/cmVwdWJsaWN8ZGVtb2NyYXRpYy4/cmVwdWJsaWMuKmdlcm1hbnl8ZWFzdC5nZXJtYW55IixERVU6Il4oPyEuKmVhc3QpLipnZXJtYW55fF4oPz0uKlxcYmZlZC4qXFxicmVwKS4qZ2VybWFuIixHSEE6ImdoYW5hfGdvbGQuP2NvYXN0IixHSUI6ImdpYnJhbHRhciIsR1JDOiJncmVlY2V8aGVsbGVuaWN8aGVsbGFzIixHUkw6ImdyZWVubGFuZCIsR1JEOiJncmVuYWRhIixHTFA6Imd1YWRlbG91cGUiLEdVTToiXFxiZ3VhbSIsR1RNOiJndWF0ZW1hbGEiLEdHWToiZ3Vlcm5zZXkiLEdJTjoiXig/IS4qZXEpKD8hLipzcGFuKSg/IS4qYmlzc2F1KSg/IS4qcG9ydHUpKD8hLipuZXcpLipndWluZWEiLEdOQjoiYmlzc2F1fF4oPz0uKnBvcnR1KS4qZ3VpbmVhIixHVVk6Imd1eWFuYXxicml0aXNoLj9ndWlhbmEiLEhUSToiaGFpdGkiLEhNRDoiaGVhcmQuKm1jZG9uYWxkIixWQVQ6ImhvbHkuP3NlZXx2YXRpY2FufHBhcGFsLj9zdCIsSE5EOiJeKD8hLipicml0KS4qaG9uZHVyYXMiLEhLRzoiaG9uZy4/a29uZyIsSFVOOiJeKD8hLiphdXN0cikuKmh1bmdhcnkiLElTTDoiaWNlbGFuZCIsSU5EOiJpbmRpYSg/IS4qb2NlYSkiLElETjoiaW5kb25lc2lhIixJUk46IlxcYmlyYW58cGVyc2lhIixJUlE6IlxcYmlyYXF8bWVzb3BvdGFtaWEiLElSTDoiaXJlbGFuZCIsSU1OOiJeKD89Lippc2xlKS4qXFxibWFuIixJU1I6ImlzcmFlbCIsSVRBOiJpdGFseSIsSkFNOiJqYW1haWNhIixKUE46ImphcGFuIixKRVk6ImplcnNleSIsSk9SOiJqb3JkYW4iLEtBWjoia2F6YWsiLEtFTjoia2VueWF8YnJpdGlzaC4/ZWFzdC4/YWZyaWNhfGVhc3QuP2FmcmljYS4/cHJvdCIsS0lSOiJraXJpYmF0aSIsUFJLOiJeKD89LipkZW1vY3JhdCkuKlxcYmtvcmVhfF4oPz0uKnBlb3BsZSkuKlxcYmtvcmVhfF4oPz0uKm5vcnRoKS4qXFxia29yZWF8ZHByayIsS09SOiJeKD8hLipkZW1vY3JhdCkoPyEuKnBlb3BsZSkoPyEuKm5vcnRoKS4qXFxia29yZWEiLEtXVDoia3V3YWl0IixLR1o6Imt5cmd5enxraXJnaGl6IixMQU86IlxcYmxhb3M/XFxiIixMVkE6ImxhdHZpYSIsTEJOOiJsZWJhbm9uIixMU086Imxlc290aG98YmFzdXRvIixMQlI6ImxpYmVyaWEiLExCWToibGlieWEiLExJRToibGllY2h0ZW5zdGVpbiIsTFRVOiJsaXRodWFuaWEiLExVWDoiXig/IS4qYmVsZykuKmx1eGVtIixNQUM6Im1hY2Eob3x1KSIsTUtEOiJtYWNlZG9uaWF8Znlyb20iLE1ERzoibWFkYWdhc2NhcnxtYWxhZ2FzeSIsTVdJOiJtYWxhd2l8bnlhc2EiLE1ZUzoibWFsYXlzaWEiLE1EVjoibWFsZGl2ZSIsTUxJOiJcXGJtYWxpXFxiIixNTFQ6IlxcYm1hbHRhIixNSEw6Im1hcnNoYWxsIixNVFE6Im1hcnRpbmlxdWUiLE1SVDoibWF1cml0YW5pYSIsTVVTOiJtYXVyaXRpdXMiLE1ZVDoiXFxibWF5b3R0ZSIsTUVYOiJcXGJtZXhpYyIsRlNNOiJtaWNyb25lc2lhIixNREE6Im1vbGRvdnxiKGF8ZSlzc2FyYWJpYSIsTUNPOiJtb25hY28iLE1ORzoibW9uZ29saWEiLE1ORToiXig/IS4qc2VyYmlhKS4qbW9udGVuZWdybyIsTVNSOiJtb250c2VycmF0IixNQVI6Im1vcm9jY298XFxibWFyb2MiLE1PWjoibW96YW1iaXF1ZSIsTU1SOiJteWFubWFyfGJ1cm1hIixOQU06Im5hbWliaWEiLE5SVToibmF1cnUiLE5QTDoibmVwYWwiLE5MRDoiXig/IS4qXFxiYW50KSg/IS4qXFxiY2FyaWIpLipuZXRoZXJsYW5kcyIsQU5UOiJeKD89LipcXGJhbnQpLioobmV0aGVyfGR1dGNoKSIsTkNMOiJuZXcuP2NhbGVkb25pYSIsTlpMOiJuZXcuP3plYWxhbmQiLE5JQzoibmljYXJhZ3VhIixORVI6IlxcYm5pZ2VyKD8haWEpIixOR0E6Im5pZ2VyaWEiLE5JVToibml1ZSIsTkZLOiJub3Jmb2xrIixNTlA6Im1hcmlhbmEiLE5PUjoibm9yd2F5IixPTU46IlxcYm9tYW58dHJ1Y2lhbCIsUEFLOiJeKD8hLiplYXN0KS4qcGFraT9zdGFuIixQTFc6InBhbGF1IixQU0U6InBhbGVzdGlufFxcYmdhemF8d2VzdC4/YmFuayIsUEFOOiJwYW5hbWEiLFBORzoicGFwdWF8bmV3Lj9ndWluZWEiLFBSWToicGFyYWd1YXkiLFBFUjoicGVydSIsUEhMOiJwaGlsaXBwaW5lcyIsUENOOiJwaXRjYWlybiIsUE9MOiJwb2xhbmQiLFBSVDoicG9ydHVnYWwiLFBSSToicHVlcnRvLj9yaWNvIixRQVQ6InFhdGFyIixSRVU6InIoZXxceGU5KXVuaW9uIiwKUk9VOiJyKG98dXxvdSltYW5pYSIsUlVTOiJcXGJydXNzaWF8c292aWV0Lj91bmlvbnx1XFwuP3NcXC4/c1xcLj9yfHNvY2lhbGlzdC4/cmVwdWJsaWNzIixSV0E6InJ3YW5kYSIsQkxNOiJiYXJ0aChlfFx4ZTkpbGVteSIsU0hOOiJoZWxlbmEiLEtOQToia2l0dHN8XFxibmV2aXMiLExDQToiXFxibHVjaWEiLE1BRjoiXig/PS4qY29sbGVjdGl2aXR5KS4qbWFydGlufF4oPz0uKmZyYW5jZSkuKm1hcnRpbig/IWlxdWUpfF4oPz0uKmZyZW5jaCkuKm1hcnRpbig/IWlxdWUpIixTUE06Im1pcXVlbG9uIixWQ1Q6InZpbmNlbnQiLFdTTToiXig/IS4qYW1lcikuKnNhbW9hIixTTVI6InNhbi4/bWFyaW5vIixTVFA6IlxcYnMoYXxceGUzKW8uP3RvbShlfFx4ZTkpIixTQVU6IlxcYnNhXFx3Ki4/YXJhYmlhIixTRU46InNlbmVnYWwiLFNSQjoiXig/IS4qbW9udGUpLipzZXJiaWEiLFNZQzoic2V5Y2hlbGwiLFNMRToic2llcnJhIixTR1A6InNpbmdhcG9yZSIsU1hNOiJeKD8hLiptYXJ0aW4pKD8hLipzYWJhKS4qbWFhcnRlbiIsU1ZLOiJeKD8hLipjemUpLipzbG92YWsiLFNWTjoic2xvdmVuaWEiLFNMQjoic29sb21vbiIsU09NOiJzb21hbGkiLFpBRjoiXFxic1xcdyouP2FmcmljYSIsU0dTOiJzb3V0aC4/Z2VvcmdpYXxzYW5kd2ljaCIsU1NEOiJcXGJzXFx3Ki4/c3VkYW4iLEVTUDoic3BhaW4iLExLQToic3JpLj9sYW5rYXxjZXlsb24iLFNETjoiXig/IS4qXFxicyg/IXUpKS4qc3VkYW4iLFNVUjoic3VyaW5hbXxkdXRjaC4/Z3VpYW5hIixTSk06InN2YWxiYXJkIixTV1o6InN3YXppbGFuZCIsU1dFOiJzd2VkZW4iLENIRToic3dpdHp8c3dpc3MiLFNZUjoic3lyaWEiLFRXTjoidGFpd2FufHRhaXBlaXxmb3Jtb3NhfF4oPyEuKnBlbykoPz0uKnJlcCkuKmNoaW5hIixUSks6InRhamlrIixUWkE6InRhbnphbmlhIixUSEE6InRoYWlsYW5kfFxcYnNpYW0iLFRMUzoiXig/PS4qbGVzdGUpLip0aW1vcnxeKD89LiplYXN0KS4qdGltb3IiLFRHTzoidG9nbyIsVEtMOiJ0b2tlbGF1IixUT046InRvbmdhIixUVE86InRyaW5pZGFkfHRvYmFnbyIsVFVOOiJ0dW5pc2lhIixUVVI6InR1cmtleSIsVEtNOiJ0dXJrbWVuIixUQ0E6InR1cmtzIixUVVY6InR1dmFsdSIsVUdBOiJ1Z2FuZGEiLFVLUjoidWtyYWluIixBUkU6ImVtaXJhdGVzfF51XFwuP2FcXC4/ZVxcLj8kfHVuaXRlZC4/YXJhYi4/ZW0iLEdCUjoidW5pdGVkLj9raW5nZG9tfGJyaXRhaW58XnVcXC4/a1xcLj8kIixVU0E6InVuaXRlZC4/c3RhdGVzfFxcYnVcXC4/c1xcLj9hXFwuP1xcYnxcXGJ1XFwuP3NcXC4/XFxiKD8hLippc2xhbmRzKSIsVU1JOiJtaW5vci4/b3V0bHlpbmcuP2lzIixVUlk6InVydWd1YXkiLFVaQjoidXpiZWsiLFZVVDoidmFudWF0dXxuZXcuP2hlYnJpZGVzIixWRU46InZlbmV6dWVsYSIsVk5NOiJeKD8hLipyZXB1YmxpYykuKnZpZXQuP25hbXxeKD89Lipzb2NpYWxpc3QpLip2aWV0Lj9uYW0iLFZHQjoiXig/PS4qXFxidVxcLj9cXHM/aykuKnZpcmdpbnxeKD89Lipicml0KS4qdmlyZ2lufF4oPz0uKmtpbmdkb20pLip2aXJnaW4iLFZJUjoiXig/PS4qXFxidVxcLj9cXHM/cykuKnZpcmdpbnxeKD89LipzdGF0ZXMpLip2aXJnaW4iLFdMRjoiZnV0dW5hfHdhbGxpcyIsRVNIOiJ3ZXN0ZXJuLnNhaGFyYSIsWUVNOiJeKD8hLiphcmFiKSg/IS4qbm9ydGgpKD8hLipzYW5hKSg/IS4qcGVvKSg/IS4qZGVtKSg/IS4qc291dGgpKD8hLiphZGVuKSg/IS4qXFxicFxcLj9kXFwuP3IpLip5ZW1lbiIsWU1EOiJeKD89LipwZW8pLip5ZW1lbnxeKD8hLipyZXApKD89LipkZW0pLip5ZW1lbnxeKD89Lipzb3V0aCkuKnllbWVufF4oPz0uKmFkZW4pLip5ZW1lbnxeKD89LipcXGJwXFwuP2RcXC4/cikuKnllbWVuIixZVUc6Inl1Z29zbGF2aWEiLFpNQjoiemFtYmlhfG5vcnRoZXJuLj9yaG9kZXNpYSIsRUFaOiJ6YW56aWJhciIsWldFOiJ6aW1iYWJ3ZXxeKD8hLipub3J0aGVybikuKnJob2Rlc2lhIn19LHt9XSw5MTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9TWF0aC5yb3VuZCh0KSx0PDA/MDp0PjI1NT8yNTU6dH1mdW5jdGlvbiBpKHQpe3JldHVybiB0PDA/MDp0PjE/MTp0fWZ1bmN0aW9uIGEodCl7cmV0dXJuIG4oIiUiPT09dFt0Lmxlbmd0aC0xXT9wYXJzZUZsb2F0KHQpLzEwMCoyNTU6cGFyc2VJbnQodCkpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGkoIiUiPT09dFt0Lmxlbmd0aC0xXT9wYXJzZUZsb2F0KHQpLzEwMDpwYXJzZUZsb2F0KHQpKX1mdW5jdGlvbiBzKHQsZSxyKXtyZXR1cm4gcjwwP3IrPTE6cj4xJiYoci09MSksNipyPDE/dCsoZS10KSpyKjY6MipyPDE/ZTozKnI8Mj90KyhlLXQpKigyLzMtcikqNjp0fWZ1bmN0aW9uIGwodCl7dmFyIGU9dC5yZXBsYWNlKC8gL2csIiIpLnRvTG93ZXJDYXNlKCk7aWYoZSBpbiB1KXJldHVybiB1W2VdLnNsaWNlKCk7aWYoIiMiPT09ZVswXSl7aWYoND09PWUubGVuZ3RoKXt2YXIgcj1wYXJzZUludChlLnN1YnN0cigxKSwxNik7cmV0dXJuIHI+PTAmJnI8PTQwOTU/WygzODQwJnIpPj40fCgzODQwJnIpPj44LDI0MCZyfCgyNDAmcik+PjQsMTUmcnwoMTUmcik8PDQsMV06bnVsbH1pZig3PT09ZS5sZW5ndGgpe3ZhciByPXBhcnNlSW50KGUuc3Vic3RyKDEpLDE2KTtyZXR1cm4gcj49MCYmcjw9MTY3NzcyMTU/WygxNjcxMTY4MCZyKT4+MTYsKDY1MjgwJnIpPj44LDI1NSZyLDFdOm51bGx9cmV0dXJuIG51bGx9dmFyIGk9ZS5pbmRleE9mKCIoIiksbD1lLmluZGV4T2YoIikiKTtpZihpIT09LTEmJmwrMT09PWUubGVuZ3RoKXt2YXIgYz1lLnN1YnN0cigwLGkpLGg9ZS5zdWJzdHIoaSsxLGwtKGkrMSkpLnNwbGl0KCIsIiksZj0xO3N3aXRjaChjKXtjYXNlInJnYmEiOmlmKDQhPT1oLmxlbmd0aClyZXR1cm4gbnVsbDtmPW8oaC5wb3AoKSk7Y2FzZSJyZ2IiOnJldHVybiAzIT09aC5sZW5ndGg/bnVsbDpbYShoWzBdKSxhKGhbMV0pLGEoaFsyXSksZl07Y2FzZSJoc2xhIjppZig0IT09aC5sZW5ndGgpcmV0dXJuIG51bGw7Zj1vKGgucG9wKCkpO2Nhc2UiaHNsIjppZigzIT09aC5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGQ9KHBhcnNlRmxvYXQoaFswXSklMzYwKzM2MCklMzYwLzM2MCxwPW8oaFsxXSksbT1vKGhbMl0pLGc9bTw9LjU/bSoocCsxKTptK3AtbSpwLHY9MiptLWc7cmV0dXJuW24oMjU1KnModixnLGQrMS8zKSksbigyNTUqcyh2LGcsZCkpLG4oMjU1KnModixnLGQtMS8zKSksZl07ZGVmYXVsdDpyZXR1cm4gbnVsbH19cmV0dXJuIG51bGx9dmFyIHU9e3RyYW5zcGFyZW50OlswLDAsMCwwXSxhbGljZWJsdWU6WzI0MCwyNDgsMjU1LDFdLGFudGlxdWV3aGl0ZTpbMjUwLDIzNSwyMTUsMV0sYXF1YTpbMCwyNTUsMjU1LDFdLGFxdWFtYXJpbmU6WzEyNywyNTUsMjEyLDFdLGF6dXJlOlsyNDAsMjU1LDI1NSwxXSxiZWlnZTpbMjQ1LDI0NSwyMjAsMV0sYmlzcXVlOlsyNTUsMjI4LDE5NiwxXSxibGFjazpbMCwwLDAsMV0sYmxhbmNoZWRhbG1vbmQ6WzI1NSwyMzUsMjA1LDFdLGJsdWU6WzAsMCwyNTUsMV0sYmx1ZXZpb2xldDpbMTM4LDQzLDIyNiwxXSxicm93bjpbMTY1LDQyLDQyLDFdLGJ1cmx5d29vZDpbMjIyLDE4NCwxMzUsMV0sY2FkZXRibHVlOls5NSwxNTgsMTYwLDFdLGNoYXJ0cmV1c2U6WzEyNywyNTUsMCwxXSxjaG9jb2xhdGU6WzIxMCwxMDUsMzAsMV0sY29yYWw6WzI1NSwxMjcsODAsMV0sY29ybmZsb3dlcmJsdWU6WzEwMCwxNDksMjM3LDFdLGNvcm5zaWxrOlsyNTUsMjQ4LDIyMCwxXSxjcmltc29uOlsyMjAsMjAsNjAsMV0sY3lhbjpbMCwyNTUsMjU1LDFdLGRhcmtibHVlOlswLDAsMTM5LDFdLGRhcmtjeWFuOlswLDEzOSwxMzksMV0sZGFya2dvbGRlbnJvZDpbMTg0LDEzNCwxMSwxXSxkYXJrZ3JheTpbMTY5LDE2OSwxNjksMV0sZGFya2dyZWVuOlswLDEwMCwwLDFdLGRhcmtncmV5OlsxNjksMTY5LDE2OSwxXSxkYXJra2hha2k6WzE4OSwxODMsMTA3LDFdLGRhcmttYWdlbnRhOlsxMzksMCwxMzksMV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0NywxXSxkYXJrb3JhbmdlOlsyNTUsMTQwLDAsMV0sZGFya29yY2hpZDpbMTUzLDUwLDIwNCwxXSxkYXJrcmVkOlsxMzksMCwwLDFdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyLDFdLGRhcmtzZWFncmVlbjpbMTQzLDE4OCwxNDMsMV0sZGFya3NsYXRlYmx1ZTpbNzIsNjEsMTM5LDFdLGRhcmtzbGF0ZWdyYXk6WzQ3LDc5LDc5LDFdLGRhcmtzbGF0ZWdyZXk6WzQ3LDc5LDc5LDFdLGRhcmt0dXJxdW9pc2U6WzAsMjA2LDIwOSwxXSxkYXJrdmlvbGV0OlsxNDgsMCwyMTEsMV0sZGVlcHBpbms6WzI1NSwyMCwxNDcsMV0sZGVlcHNreWJsdWU6WzAsMTkxLDI1NSwxXSxkaW1ncmF5OlsxMDUsMTA1LDEwNSwxXSxkaW1ncmV5OlsxMDUsMTA1LDEwNSwxXSxkb2RnZXJibHVlOlszMCwxNDQsMjU1LDFdLGZpcmVicmljazpbMTc4LDM0LDM0LDFdLGZsb3JhbHdoaXRlOlsyNTUsMjUwLDI0MCwxXSxmb3Jlc3RncmVlbjpbMzQsMTM5LDM0LDFdLGZ1Y2hzaWE6WzI1NSwwLDI1NSwxXSxnYWluc2Jvcm86WzIyMCwyMjAsMjIwLDFdLGdob3N0d2hpdGU6WzI0OCwyNDgsMjU1LDFdLGdvbGQ6WzI1NSwyMTUsMCwxXSxnb2xkZW5yb2Q6WzIxOCwxNjUsMzIsMV0sZ3JheTpbMTI4LDEyOCwxMjgsMV0sZ3JlZW46WzAsMTI4LDAsMV0sZ3JlZW55ZWxsb3c6WzE3MywyNTUsNDcsMV0sZ3JleTpbMTI4LDEyOCwxMjgsMV0saG9uZXlkZXc6WzI0MCwyNTUsMjQwLDFdLGhvdHBpbms6WzI1NSwxMDUsMTgwLDFdLGluZGlhbnJlZDpbMjA1LDkyLDkyLDFdLGluZGlnbzpbNzUsMCwxMzAsMV0saXZvcnk6WzI1NSwyNTUsMjQwLDFdLGtoYWtpOlsyNDAsMjMwLDE0MCwxXSxsYXZlbmRlcjpbMjMwLDIzMCwyNTAsMV0sbGF2ZW5kZXJibHVzaDpbMjU1LDI0MCwyNDUsMV0sbGF3bmdyZWVuOlsxMjQsMjUyLDAsMV0sbGVtb25jaGlmZm9uOlsyNTUsMjUwLDIwNSwxXSxsaWdodGJsdWU6WzE3MywyMTYsMjMwLDFdLGxpZ2h0Y29yYWw6WzI0MCwxMjgsMTI4LDFdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTUsMV0sbGlnaHRnb2xkZW5yb2R5ZWxsb3c6WzI1MCwyNTAsMjEwLDFdLGxpZ2h0Z3JheTpbMjExLDIxMSwyMTEsMV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDQsMV0sbGlnaHRncmV5OlsyMTEsMjExLDIxMSwxXSxsaWdodHBpbms6WzI1NSwxODIsMTkzLDFdLGxpZ2h0c2FsbW9uOlsyNTUsMTYwLDEyMiwxXSxsaWdodHNlYWdyZWVuOlszMiwxNzgsMTcwLDFdLGxpZ2h0c2t5Ymx1ZTpbMTM1LDIwNiwyNTAsMV0sbGlnaHRzbGF0ZWdyYXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c2xhdGVncmV5OlsxMTksMTM2LDE1MywxXSxsaWdodHN0ZWVsYmx1ZTpbMTc2LDE5NiwyMjIsMV0sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0LDFdLGxpbWU6WzAsMjU1LDAsMV0sbGltZWdyZWVuOls1MCwyMDUsNTAsMV0sbGluZW46WzI1MCwyNDAsMjMwLDFdLG1hZ2VudGE6WzI1NSwwLDI1NSwxXSxtYXJvb246WzEyOCwwLDAsMV0sbWVkaXVtYXF1YW1hcmluZTpbMTAyLDIwNSwxNzAsMV0sbWVkaXVtYmx1ZTpbMCwwLDIwNSwxXSxtZWRpdW1vcmNoaWQ6WzE4Niw4NSwyMTEsMV0sbWVkaXVtcHVycGxlOlsxNDcsMTEyLDIxOSwxXSxtZWRpdW1zZWFncmVlbjpbNjAsMTc5LDExMywxXSxtZWRpdW1zbGF0ZWJsdWU6WzEyMywxMDQsMjM4LDFdLG1lZGl1bXNwcmluZ2dyZWVuOlswLDI1MCwxNTQsMV0sbWVkaXVtdHVycXVvaXNlOls3MiwyMDksMjA0LDFdLG1lZGl1bXZpb2xldHJlZDpbMTk5LDIxLDEzMywxXSxtaWRuaWdodGJsdWU6WzI1LDI1LDExMiwxXSxtaW50Y3JlYW06WzI0NSwyNTUsMjUwLDFdLG1pc3R5cm9zZTpbMjU1LDIyOCwyMjUsMV0sbW9jY2FzaW46WzI1NSwyMjgsMTgxLDFdLG5hdmFqb3doaXRlOlsyNTUsMjIyLDE3MywxXSxuYXZ5OlswLDAsMTI4LDFdLG9sZGxhY2U6WzI1MywyNDUsMjMwLDFdLG9saXZlOlsxMjgsMTI4LDAsMV0sb2xpdmVkcmFiOlsxMDcsMTQyLDM1LDFdLG9yYW5nZTpbMjU1LDE2NSwwLDFdLG9yYW5nZXJlZDpbMjU1LDY5LDAsMV0sb3JjaGlkOlsyMTgsMTEyLDIxNCwxXSxwYWxlZ29sZGVucm9kOlsyMzgsMjMyLDE3MCwxXSxwYWxlZ3JlZW46WzE1MiwyNTEsMTUyLDFdLHBhbGV0dXJxdW9pc2U6WzE3NSwyMzgsMjM4LDFdLHBhbGV2aW9sZXRyZWQ6WzIxOSwxMTIsMTQ3LDFdLHBhcGF5YXdoaXA6WzI1NSwyMzksMjEzLDFdLHBlYWNocHVmZjpbMjU1LDIxOCwxODUsMV0scGVydTpbMjA1LDEzMyw2MywxXSxwaW5rOlsyNTUsMTkyLDIwMywxXSxwbHVtOlsyMjEsMTYwLDIyMSwxXSxwb3dkZXJibHVlOlsxNzYsMjI0LDIzMCwxXSxwdXJwbGU6WzEyOCwwLDEyOCwxXSxyZWJlY2NhcHVycGxlOlsxMDIsNTEsMTUzLDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07dHJ5e3IucGFyc2VDU1NDb2xvcj1sfWNhdGNoKHQpe319LHt9XSw5MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXt2YXIgbz02KmkqaS02Kmkscz0zKmkqaS00KmkrMSxsPS02KmkqaSs2KmksdT0zKmkqaS0yKmk7aWYodC5sZW5ndGgpe2F8fChhPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2Zvcih2YXIgYz10Lmxlbmd0aC0xO2M+PTA7LS1jKWFbY109byp0W2NdK3MqZVtjXStsKnJbY10rdSpuW2NdO3JldHVybiBhfXJldHVybiBvKnQrcyplK2wqcltjXSt1Km59ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7dmFyIG89aS0xLHM9aSppLGw9bypvLHU9KDErMippKSpsLGM9aSpsLGg9cyooMy0yKmkpLGY9cypvO2lmKHQubGVuZ3RoKXthfHwoYT1uZXcgQXJyYXkodC5sZW5ndGgpKTtmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wOy0tZClhW2RdPXUqdFtkXStjKmVbZF0raCpyW2RdK2YqbltkXTtyZXR1cm4gYX1yZXR1cm4gdSp0K2MqZStoKnIrZipufWUuZXhwb3J0cz1pLGUuZXhwb3J0cy5kZXJpdmF0aXZlPW59LHt9XSw5MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dGhpcy5hcmdUeXBlcz1bXSx0aGlzLnNoaW1BcmdzPVtdLHRoaXMuYXJyYXlBcmdzPVtdLHRoaXMuYXJyYXlCbG9ja0luZGljZXM9W10sdGhpcy5zY2FsYXJBcmdzPVtdLHRoaXMub2Zmc2V0QXJncz1bXSx0aGlzLm9mZnNldEFyZ0luZGV4PVtdLHRoaXMuaW5kZXhBcmdzPVtdLHRoaXMuc2hhcGVBcmdzPVtdLHRoaXMuZnVuY05hbWU9IiIsdGhpcy5wcmU9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLnBvc3Q9bnVsbCx0aGlzLmRlYnVnPSExfWZ1bmN0aW9uIGkodCl7dmFyIGU9bmV3IG47ZS5wcmU9dC5wcmUsZS5ib2R5PXQuYm9keSxlLnBvc3Q9dC5wb3N0O3ZhciByPXQuYXJncy5zbGljZSgwKTtlLmFyZ1R5cGVzPXI7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDsrK2kpe3ZhciBvPXJbaV07aWYoImFycmF5Ij09PW98fCJvYmplY3QiPT10eXBlb2YgbyYmby5ibG9ja0luZGljZXMpe2lmKGUuYXJnVHlwZXNbaV09ImFycmF5IixlLmFycmF5QXJncy5wdXNoKGkpLGUuYXJyYXlCbG9ja0luZGljZXMucHVzaChvLmJsb2NrSW5kaWNlcz9vLmJsb2NrSW5kaWNlczowKSxlLnNoaW1BcmdzLnB1c2goImFycmF5IitpKSxpPGUucHJlLmFyZ3MubGVuZ3RoJiZlLnByZS5hcmdzW2ldLmNvdW50PjApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcHJlKCkgYmxvY2sgbWF5IG5vdCByZWZlcmVuY2UgYXJyYXkgYXJncyIpO2lmKGk8ZS5wb3N0LmFyZ3MubGVuZ3RoJiZlLnBvc3QuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBhcmdzIil9ZWxzZSBpZigic2NhbGFyIj09PW8pZS5zY2FsYXJBcmdzLnB1c2goaSksZS5zaGltQXJncy5wdXNoKCJzY2FsYXIiK2kpO2Vsc2UgaWYoImluZGV4Ij09PW8pe2lmKGUuaW5kZXhBcmdzLnB1c2goaSksaTxlLnByZS5hcmdzLmxlbmd0aCYmZS5wcmUuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHByZSgpIGJsb2NrIG1heSBub3QgcmVmZXJlbmNlIGFycmF5IGluZGV4Iik7aWYoaTxlLmJvZHkuYXJncy5sZW5ndGgmJmUuYm9keS5hcmdzW2ldLmx2YWx1ZSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBib2R5KCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBpbmRleCIpO2lmKGk8ZS5wb3N0LmFyZ3MubGVuZ3RoJiZlLnBvc3QuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBpbmRleCIpfWVsc2UgaWYoInNoYXBlIj09PW8pe2lmKGUuc2hhcGVBcmdzLnB1c2goaSksaTxlLnByZS5hcmdzLmxlbmd0aCYmZS5wcmUuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcHJlKCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBzaGFwZSIpO2lmKGk8ZS5ib2R5LmFyZ3MubGVuZ3RoJiZlLmJvZHkuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogYm9keSgpIGJsb2NrIG1heSBub3Qgd3JpdGUgdG8gYXJyYXkgc2hhcGUiKTtpZihpPGUucG9zdC5hcmdzLmxlbmd0aCYmZS5wb3N0LmFyZ3NbaV0ubHZhbHVlKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHdyaXRlIHRvIGFycmF5IHNoYXBlIil9ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIG98fCFvLm9mZnNldCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBVbmtub3duIGFyZ3VtZW50IHR5cGUgIityW2ldKTtlLmFyZ1R5cGVzW2ldPSJvZmZzZXQiLGUub2Zmc2V0QXJncy5wdXNoKHthcnJheTpvLmFycmF5LG9mZnNldDpvLm9mZnNldH0pLGUub2Zmc2V0QXJnSW5kZXgucHVzaChpKX19aWYoZS5hcnJheUFyZ3MubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IE5vIGFycmF5IGFyZ3VtZW50cyBzcGVjaWZpZWQiKTtpZihlLnByZS5hcmdzLmxlbmd0aD5yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBUb28gbWFueSBhcmd1bWVudHMgaW4gcHJlKCkgYmxvY2siKTtpZihlLmJvZHkuYXJncy5sZW5ndGg+ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogVG9vIG1hbnkgYXJndW1lbnRzIGluIGJvZHkoKSBibG9jayIpO2lmKGUucG9zdC5hcmdzLmxlbmd0aD5yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBUb28gbWFueSBhcmd1bWVudHMgaW4gcG9zdCgpIGJsb2NrIik7cmV0dXJuIGUuZGVidWc9ISF0LnByaW50Q29kZXx8ISF0LmRlYnVnLGUuZnVuY05hbWU9dC5mdW5jTmFtZXx8ImN3aXNlIixlLmJsb2NrU2l6ZT10LmJsb2NrU2l6ZXx8NjQsYShlKX12YXIgYT10KCIuL2xpYi90aHVuay5qcyIpO2UuZXhwb3J0cz1pfSx7Ii4vbGliL3RodW5rLmpzIjo5NX1dLDk0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuLGksYT10Lmxlbmd0aCxvPWUuYXJyYXlBcmdzLmxlbmd0aCxzPWUuaW5kZXhBcmdzLmxlbmd0aD4wLGw9W10sdT1bXSxjPTAsaD0wO2ZvcihuPTA7bjxhOysrbil1LnB1c2goWyJpIixuLCI9MCJdLmpvaW4oIiIpKTtmb3IoaT0wO2k8bzsrK2kpZm9yKG49MDtuPGE7KytuKWg9YyxjPXRbbl0sMD09PW4/dS5wdXNoKFsiZCIsaSwicyIsbiwiPXQiLGksInAiLGNdLmpvaW4oIiIpKTp1LnB1c2goWyJkIixpLCJzIixuLCI9KHQiLGksInAiLGMsIi1zIixoLCIqdCIsaSwicCIsaCwiKSJdLmpvaW4oIiIpKTtmb3IobC5wdXNoKCJ2YXIgIit1LmpvaW4oIiwiKSksbj1hLTE7bj49MDstLW4pYz10W25dLGwucHVzaChbImZvcihpIixuLCI9MDtpIixuLCI8cyIsYywiOysraSIsbiwiKXsiXS5qb2luKCIiKSk7Zm9yKGwucHVzaChyKSxuPTA7bjxhOysrbil7Zm9yKGg9YyxjPXRbbl0saT0wO2k8bzsrK2kpbC5wdXNoKFsicCIsaSwiKz1kIixpLCJzIixuXS5qb2luKCIiKSk7cyYmKG4+MCYmbC5wdXNoKFsiaW5kZXhbIixoLCJdLT1zIixoXS5qb2luKCIiKSksbC5wdXNoKFsiKytpbmRleFsiLGMsIl0iXS5qb2luKCIiKSkpLGwucHVzaCgifSIpfXJldHVybiBsLmpvaW4oIlxuIil9ZnVuY3Rpb24gaSh0LGUscixpKXtmb3IodmFyIGE9ZS5sZW5ndGgsbz1yLmFycmF5QXJncy5sZW5ndGgscz1yLmJsb2NrU2l6ZSxsPXIuaW5kZXhBcmdzLmxlbmd0aD4wLHU9W10sYz0wO2M8bzsrK2MpdS5wdXNoKFsidmFyIG9mZnNldCIsYywiPXAiLGNdLmpvaW4oIiIpKTtmb3IodmFyIGM9dDtjPGE7KytjKXUucHVzaChbImZvcih2YXIgaiIrYysiPVNTWyIsZVtjXSwiXXwwO2oiLGMsIj4wOyl7Il0uam9pbigiIikpLHUucHVzaChbImlmKGoiLGMsIjwiLHMsIil7Il0uam9pbigiIikpLHUucHVzaChbInMiLGVbY10sIj1qIixjXS5qb2luKCIiKSksdS5wdXNoKFsiaiIsYywiPTAiXS5qb2luKCIiKSksdS5wdXNoKFsifWVsc2V7cyIsZVtjXSwiPSIsc10uam9pbigiIikpLHUucHVzaChbImoiLGMsIi09IixzLCJ9Il0uam9pbigiIikpLGwmJnUucHVzaChbImluZGV4WyIsZVtjXSwiXT1qIixjXS5qb2luKCIiKSk7Zm9yKHZhciBjPTA7YzxvOysrYyl7Zm9yKHZhciBoPVsib2Zmc2V0IitjXSxmPXQ7ZjxhOysrZiloLnB1c2goWyJqIixmLCIqdCIsYywicCIsZVtmXV0uam9pbigiIikpO3UucHVzaChbInAiLGMsIj0oIixoLmpvaW4oIisiKSwiKSJdLmpvaW4oIiIpKX11LnB1c2gobihlLHIsaSkpO2Zvcih2YXIgYz10O2M8YTsrK2MpdS5wdXNoKCJ9Iik7cmV0dXJuIHUuam9pbigiXG4iKX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLHI9dFswXS5sZW5ndGg7ZTxyOyl7Zm9yKHZhciBuPTE7bjx0Lmxlbmd0aDsrK24paWYodFtuXVtlXSE9PXRbMF1bZV0pcmV0dXJuIGU7KytlfXJldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbj10LmJvZHksaT1bXSxhPVtdLG89MDtvPHQuYXJncy5sZW5ndGg7KytvKXt2YXIgcz10LmFyZ3Nbb107aWYoIShzLmNvdW50PD0wKSl7dmFyIGw9bmV3IFJlZ0V4cChzLm5hbWUsImciKSx1PSIiLGM9ZS5hcnJheUFyZ3MuaW5kZXhPZihvKTtzd2l0Y2goZS5hcmdUeXBlc1tvXSl7Y2FzZSJvZmZzZXQiOnZhciBoPWUub2Zmc2V0QXJnSW5kZXguaW5kZXhPZihvKSxmPWUub2Zmc2V0QXJnc1toXTtjPWYuYXJyYXksdT0iK3EiK2g7Y2FzZSJhcnJheSI6dT0icCIrYyt1O3ZhciBkPSJsIitvLHA9ImEiK2M7aWYoMD09PWUuYXJyYXlCbG9ja0luZGljZXNbY10pMT09PXMuY291bnQ/ImdlbmVyaWMiPT09cltjXT9zLmx2YWx1ZT8oaS5wdXNoKFsidmFyICIsZCwiPSIscCwiLmdldCgiLHUsIikiXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxkKSxhLnB1c2goW3AsIi5zZXQoIix1LCIsIixkLCIpIl0uam9pbigiIikpKTpuPW4ucmVwbGFjZShsLFtwLCIuZ2V0KCIsdSwiKSJdLmpvaW4oIiIpKTpuPW4ucmVwbGFjZShsLFtwLCJbIix1LCJdIl0uam9pbigiIikpOiJnZW5lcmljIj09PXJbY10/KGkucHVzaChbInZhciAiLGQsIj0iLHAsIi5nZXQoIix1LCIpIl0uam9pbigiIikpLG49bi5yZXBsYWNlKGwsZCkscy5sdmFsdWUmJmEucHVzaChbcCwiLnNldCgiLHUsIiwiLGQsIikiXS5qb2luKCIiKSkpOihpLnB1c2goWyJ2YXIgIixkLCI9IixwLCJbIix1LCJdIl0uam9pbigiIikpLG49bi5yZXBsYWNlKGwsZCkscy5sdmFsdWUmJmEucHVzaChbcCwiWyIsdSwiXT0iLGRdLmpvaW4oIiIpKSk7ZWxzZXtmb3IodmFyIG09W3MubmFtZV0sZz1bdV0sdj0wO3Y8TWF0aC5hYnMoZS5hcnJheUJsb2NrSW5kaWNlc1tjXSk7disrKW0ucHVzaCgiXFxzKlxcWyhbXlxcXV0rKVxcXSIpLGcucHVzaCgiJCIrKHYrMSkrIip0IitjKyJiIit2KTtpZihsPW5ldyBSZWdFeHAobS5qb2luKCIiKSwiZyIpLHU9Zy5qb2luKCIrIiksImdlbmVyaWMiPT09cltjXSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBHZW5lcmljIGFycmF5cyBub3Qgc3VwcG9ydGVkIGluIGNvbWJpbmF0aW9uIHdpdGggYmxvY2tzISIpO249bi5yZXBsYWNlKGwsW3AsIlsiLHUsIl0iXS5qb2luKCIiKSl9YnJlYWs7Y2FzZSJzY2FsYXIiOm49bi5yZXBsYWNlKGwsIlkiK2Uuc2NhbGFyQXJncy5pbmRleE9mKG8pKTticmVhaztjYXNlImluZGV4IjpuPW4ucmVwbGFjZShsLCJpbmRleCIpO2JyZWFrO2Nhc2Uic2hhcGUiOm49bi5yZXBsYWNlKGwsInNoYXBlIil9fX1yZXR1cm5baS5qb2luKCJcbiIpLG4sYS5qb2luKCJcbiIpXS5qb2luKCJcbiIpLnRyaW0oKX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9ITAsbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9aS5tYXRjaCgvXGQrLyk7YT1hP2FbMF06IiIsMD09PWkuY2hhckF0KDApP2Vbbl09InUiK2kuY2hhckF0KDEpK2E6ZVtuXT1pLmNoYXJBdCgwKSthLG4+MCYmKHI9ciYmZVtuXT09PWVbbi0xXSl9cmV0dXJuIHI/ZVswXTplLmpvaW4oIiIpfWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIHI9ZVsxXS5sZW5ndGgtTWF0aC5hYnModC5hcnJheUJsb2NrSW5kaWNlc1swXSl8MCxsPW5ldyBBcnJheSh0LmFycmF5QXJncy5sZW5ndGgpLGM9bmV3IEFycmF5KHQuYXJyYXlBcmdzLmxlbmd0aCksaD0wO2g8dC5hcnJheUFyZ3MubGVuZ3RoOysraCljW2hdPWVbMipoXSxsW2hdPWVbMipoKzFdO2Zvcih2YXIgZj1bXSxkPVtdLHA9W10sbT1bXSxnPVtdLGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpe3QuYXJyYXlCbG9ja0luZGljZXNbaF08MD8ocC5wdXNoKDApLG0ucHVzaChyKSxmLnB1c2gociksZC5wdXNoKHIrdC5hcnJheUJsb2NrSW5kaWNlc1toXSkpOihwLnB1c2godC5hcnJheUJsb2NrSW5kaWNlc1toXSksbS5wdXNoKHQuYXJyYXlCbG9ja0luZGljZXNbaF0rciksZi5wdXNoKDApLGQucHVzaCh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSk7Zm9yKHZhciB2PVtdLHk9MDt5PGxbaF0ubGVuZ3RoO3krKylwW2hdPD1sW2hdW3ldJiZsW2hdW3ldPG1baF0mJnYucHVzaChsW2hdW3ldLXBbaF0pO2cucHVzaCh2KX1mb3IodmFyIGI9WyJTUyJdLHg9WyIndXNlIHN0cmljdCciXSxfPVtdLHk9MDt5PHI7Kyt5KV8ucHVzaChbInMiLHksIj1TU1siLHksIl0iXS5qb2luKCIiKSk7Zm9yKHZhciBoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKXtiLnB1c2goImEiK2gpLGIucHVzaCgidCIraCksYi5wdXNoKCJwIitoKTtmb3IodmFyIHk9MDt5PHI7Kyt5KV8ucHVzaChbInQiLGgsInAiLHksIj10IixoLCJbIixwW2hdK3ksIl0iXS5qb2luKCIiKSk7Zm9yKHZhciB5PTA7eTxNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKTsrK3kpXy5wdXNoKFsidCIsaCwiYiIseSwiPXQiLGgsIlsiLGZbaF0reSwiXSJdLmpvaW4oIiIpKX1mb3IodmFyIGg9MDtoPHQuc2NhbGFyQXJncy5sZW5ndGg7KytoKWIucHVzaCgiWSIraCk7aWYodC5zaGFwZUFyZ3MubGVuZ3RoPjAmJl8ucHVzaCgic2hhcGU9U1Muc2xpY2UoMCkiKSx0LmluZGV4QXJncy5sZW5ndGg+MCl7Zm9yKHZhciB3PW5ldyBBcnJheShyKSxoPTA7aDxyOysraCl3W2hdPSIwIjtfLnB1c2goWyJpbmRleD1bIix3LmpvaW4oIiwiKSwiXSJdLmpvaW4oIiIpKX1mb3IodmFyIGg9MDtoPHQub2Zmc2V0QXJncy5sZW5ndGg7KytoKXtmb3IodmFyIE09dC5vZmZzZXRBcmdzW2hdLEE9W10seT0wO3k8TS5vZmZzZXQubGVuZ3RoOysreSkwIT09TS5vZmZzZXRbeV0mJigxPT09TS5vZmZzZXRbeV0/QS5wdXNoKFsidCIsTS5hcnJheSwicCIseV0uam9pbigiIikpOkEucHVzaChbTS5vZmZzZXRbeV0sIip0IixNLmFycmF5LCJwIix5XS5qb2luKCIiKSkpOzA9PT1BLmxlbmd0aD9fLnB1c2goInEiK2grIj0wIik6Xy5wdXNoKFsicSIsaCwiPSIsQS5qb2luKCIrIildLmpvaW4oIiIpKX12YXIgaz11KFtdLmNvbmNhdCh0LnByZS50aGlzVmFycykuY29uY2F0KHQuYm9keS50aGlzVmFycykuY29uY2F0KHQucG9zdC50aGlzVmFycykpO189Xy5jb25jYXQoaykseC5wdXNoKCJ2YXIgIitfLmpvaW4oIiwiKSk7Zm9yKHZhciBoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKXgucHVzaCgicCIraCsifD0wIik7dC5wcmUuYm9keS5sZW5ndGg+MyYmeC5wdXNoKG8odC5wcmUsdCxjKSk7dmFyIFQ9byh0LmJvZHksdCxjKSxFPWEoZyk7RTxyP3gucHVzaChpKEUsZ1swXSx0LFQpKTp4LnB1c2gobihnWzBdLHQsVCkpLHQucG9zdC5ib2R5Lmxlbmd0aD4zJiZ4LnB1c2gobyh0LnBvc3QsdCxjKSksdC5kZWJ1ZyYmY29uc29sZS5sb2coIi0tLS0tR2VuZXJhdGVkIGN3aXNlIHJvdXRpbmUgZm9yICIsZSwiOlxuIit4LmpvaW4oIlxuIikrIlxuLS0tLS0tLS0tLSIpO3ZhciBTPVt0LmZ1bmNOYW1lfHwidW5uYW1lZCIsIl9jd2lzZV9sb29wXyIsbFswXS5qb2luKCJzIiksIm0iLEUscyhjKV0uam9pbigiIiksTD1uZXcgRnVuY3Rpb24oWyJmdW5jdGlvbiAiLFMsIigiLGIuam9pbigiLCIpLCIpeyIseC5qb2luKCJcbiIpLCJ9IHJldHVybiAiLFNdLmpvaW4oIiIpKTtyZXR1cm4gTCgpfXZhciB1PXQoInVuaXEiKTtlLmV4cG9ydHM9bH0se3VuaXE6NTA0fV0sOTU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1bIid1c2Ugc3RyaWN0JyIsInZhciBDQUNIRUQ9e30iXSxyPVtdLG49dC5mdW5jTmFtZSsiX2N3aXNlX3RodW5rIjtlLnB1c2goWyJyZXR1cm4gZnVuY3Rpb24gIixuLCIoIix0LnNoaW1BcmdzLmpvaW4oIiwiKSwiKXsiXS5qb2luKCIiKSk7Zm9yKHZhciBhPVtdLG89W10scz1bWyJhcnJheSIsdC5hcnJheUFyZ3NbMF0sIi5zaGFwZS5zbGljZSgiLE1hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1swXSksdC5hcnJheUJsb2NrSW5kaWNlc1swXTwwPyIsIit0LmFycmF5QmxvY2tJbmRpY2VzWzBdKyIpIjoiKSJdLmpvaW4oIiIpXSxsPVtdLHU9W10sYz0wO2M8dC5hcnJheUFyZ3MubGVuZ3RoOysrYyl7dmFyIGg9dC5hcnJheUFyZ3NbY107ci5wdXNoKFsidCIsaCwiPWFycmF5IixoLCIuZHR5cGUsIiwiciIsaCwiPWFycmF5IixoLCIub3JkZXIiXS5qb2luKCIiKSksYS5wdXNoKCJ0IitoKSxhLnB1c2goInIiK2gpLG8ucHVzaCgidCIraCksby5wdXNoKCJyIitoKyIuam9pbigpIikscy5wdXNoKCJhcnJheSIraCsiLmRhdGEiKSxzLnB1c2goImFycmF5IitoKyIuc3RyaWRlIikscy5wdXNoKCJhcnJheSIraCsiLm9mZnNldHwwIiksYz4wJiYobC5wdXNoKCJhcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZS5sZW5ndGg9PT1hcnJheSIraCsiLnNoYXBlLmxlbmd0aCsiKyhNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKS1NYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzW2NdKSkpLHUucHVzaCgiYXJyYXkiK3QuYXJyYXlBcmdzWzBdKyIuc2hhcGVbc2hhcGVJbmRleCsiK01hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1swXSkrIl09PT1hcnJheSIraCsiLnNoYXBlW3NoYXBlSW5kZXgrIitNYXRoLm1heCgwLHQuYXJyYXlCbG9ja0luZGljZXNbY10pKyJdIikpfXQuYXJyYXlBcmdzLmxlbmd0aD4xJiYoZS5wdXNoKCJpZiAoISgiK2wuam9pbigiICYmICIpKyIpKSB0aHJvdyBuZXcgRXJyb3IoJ2N3aXNlOiBBcnJheXMgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IScpIiksZS5wdXNoKCJmb3IodmFyIHNoYXBlSW5kZXg9YXJyYXkiK3QuYXJyYXlBcmdzWzBdKyIuc2hhcGUubGVuZ3RoLSIrTWF0aC5hYnModC5hcnJheUJsb2NrSW5kaWNlc1swXSkrIjsgc2hhcGVJbmRleC0tPjA7KSB7IiksZS5wdXNoKCJpZiAoISgiK3Uuam9pbigiICYmICIpKyIpKSB0aHJvdyBuZXcgRXJyb3IoJ2N3aXNlOiBBcnJheXMgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlIScpIiksZS5wdXNoKCJ9IikpO2Zvcih2YXIgYz0wO2M8dC5zY2FsYXJBcmdzLmxlbmd0aDsrK2Mpcy5wdXNoKCJzY2FsYXIiK3Quc2NhbGFyQXJnc1tjXSk7ci5wdXNoKFsidHlwZT1bIixvLmpvaW4oIiwiKSwiXS5qb2luKCkiXS5qb2luKCIiKSksci5wdXNoKCJwcm9jPUNBQ0hFRFt0eXBlXSIpLGUucHVzaCgidmFyICIrci5qb2luKCIsIikpLGUucHVzaChbImlmKCFwcm9jKXsiLCJDQUNIRURbdHlwZV09cHJvYz1jb21waWxlKFsiLGEuam9pbigiLCIpLCJdKX0iLCJyZXR1cm4gcHJvYygiLHMuam9pbigiLCIpLCIpfSJdLmpvaW4oIiIpKSx0LmRlYnVnJiZjb25zb2xlLmxvZygiLS0tLS1HZW5lcmF0ZWQgdGh1bms6XG4iK2Uuam9pbigiXG4iKSsiXG4tLS0tLS0tLS0tIik7dmFyIGY9bmV3IEZ1bmN0aW9uKCJjb21waWxlIixlLmpvaW4oIlxuIikpO3JldHVybiBmKGkuYmluZCh2b2lkIDAsdCkpfXZhciBpPXQoIi4vY29tcGlsZS5qcyIpO2UuZXhwb3J0cz1ufSx7Ii4vY29tcGlsZS5qcyI6OTR9XSw5NjpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz10KCJjd2lzZS1jb21waWxlciIpfSx7ImN3aXNlLWNvbXBpbGVyIjo5M31dLDk3OltmdW5jdGlvbihlLHIsbil7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmKHQub3duZXJEb2N1bWVudHx8dC5kb2N1bWVudHx8dCkuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIG4odCl7cmV0dXJuIHQmJih0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gbyh0KXtyZXR1cm4haXNOYU4odCl9ZnVuY3Rpb24gcyh0KXtyZXR1cm57bGVmdDpmdW5jdGlvbihlLHIsbixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYobj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPWUubGVuZ3RoKTtuPGk7KXt2YXIgYT1uK2k+Pj4xO3QoZVthXSxyKTwwP249YSsxOmk9YX1yZXR1cm4gbn0scmlnaHQ6ZnVuY3Rpb24oZSxyLG4saSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKG49MCksYXJndW1lbnRzLmxlbmd0aDw0JiYoaT1lLmxlbmd0aCk7bjxpOyl7dmFyIGE9bitpPj4+MTt0KGVbYV0scik+MD9pPWE6bj1hKzF9cmV0dXJuIG59fX1mdW5jdGlvbiBsKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT0xO3QqZSUxOyllKj0xMDtyZXR1cm4gZX1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByIGluIGUpT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLHIse3ZhbHVlOmVbcl0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGgoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBmKHQpe3JldHVybih0Kz0iIik9PT1fb3x8dFswXT09PXdvP3dvK3Q6dH1mdW5jdGlvbiBkKHQpe3JldHVybih0Kz0iIilbMF09PT13bz90LnNsaWNlKDEpOnR9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZih0KWluIHRoaXMuX31mdW5jdGlvbiBtKHQpe3JldHVybih0PWYodCkpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW3RdfWZ1bmN0aW9uIGcoKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fKXQucHVzaChkKGUpKTtyZXR1cm4gdH1mdW5jdGlvbiB2KCl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcy5fKSsrdDtyZXR1cm4gdH1mdW5jdGlvbiB5KCl7Zm9yKHZhciB0IGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBiKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBfKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dDpufX1mdW5jdGlvbiB3KHQsZSl7aWYoZSBpbiB0KXJldHVybiBlO2U9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2Zvcih2YXIgcj0wLG49TW8ubGVuZ3RoO3I8bjsrK3Ipe3ZhciBpPU1vW3JdK2U7aWYoaSBpbiB0KXJldHVybiBpfX1mdW5jdGlvbiBNKCl7fWZ1bmN0aW9uIEEoKXt9ZnVuY3Rpb24gayh0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlLG49cixpPS0xLGE9bi5sZW5ndGg7KytpPGE7KShlPW5baV0ub24pJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdH12YXIgcj1bXSxuPW5ldyBoO3JldHVybiBlLm9uPWZ1bmN0aW9uKGUsaSl7dmFyIGEsbz1uLmdldChlKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwscj1yLnNsaWNlKDAsYT1yLmluZGV4T2YobykpLmNvbmNhdChyLnNsaWNlKGErMSkpLG4ucmVtb3ZlKGUpKSxpJiZyLnB1c2gobi5zZXQoZSx7b246aX0pKSx0KX0sZX1mdW5jdGlvbiBUKCl7dW8uZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBFKCl7Zm9yKHZhciB0LGU9dW8uZXZlbnQ7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gUyh0KXtmb3IodmFyIGU9bmV3IEEscj0wLG49YXJndW1lbnRzLmxlbmd0aDsrK3I8bjspZVthcmd1bWVudHNbcl1dPWsoZSk7cmV0dXJuIGUub2Y9ZnVuY3Rpb24ocixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3ZhciBhPWkuc291cmNlRXZlbnQ9dW8uZXZlbnQ7aS50YXJnZXQ9dCx1by5ldmVudD1pLGVbaS50eXBlXS5hcHBseShyLG4pfWZpbmFsbHl7dW8uZXZlbnQ9YX19fSxlfWZ1bmN0aW9uIEwodCl7cmV0dXJuIGtvKHQsTG8pLHR9ZnVuY3Rpb24gQyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIFRvKHQsdGhpcyl9fWZ1bmN0aW9uIEkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiBFbyh0LHRoaXMpfX1mdW5jdGlvbiB6KHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfWZ1bmN0aW9uIG4oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9ZnVuY3Rpb24gYSgpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfWZ1bmN0aW9uIG8oKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQscil9ZnVuY3Rpb24gcygpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIpfXJldHVybiB0PXVvLm5zLnF1YWxpZnkodCksbnVsbD09ZT90LmxvY2FsP246cjoiZnVuY3Rpb24iPT10eXBlb2YgZT90LmxvY2FsP3M6bzp0LmxvY2FsP2E6aX1mdW5jdGlvbiBEKHQpe3JldHVybiB0LnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIFAodCl7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3VvLnJlcXVvdGUodCkrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gTyh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIodCxlKXtmdW5jdGlvbiByKCl7Zm9yKHZhciByPS0xOysrcjxpOyl0W3JdKHRoaXMsZSl9ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj0tMSxuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrcjxpOyl0W3JdKHRoaXMsbil9dD1PKHQpLm1hcChGKTt2YXIgaT10Lmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9uOnJ9ZnVuY3Rpb24gRih0KXt2YXIgZT1QKHQpO3JldHVybiBmdW5jdGlvbihyLG4pe2lmKGk9ci5jbGFzc0xpc3QpcmV0dXJuIG4/aS5hZGQodCk6aS5yZW1vdmUodCk7dmFyIGk9ci5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO24/KGUubGFzdEluZGV4PTAsZS50ZXN0KGkpfHxyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEQoaSsiICIrdCkpKTpyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEQoaS5yZXBsYWNlKGUsIiAiKSkpfX1mdW5jdGlvbiBqKHQsZSxyKXtmdW5jdGlvbiBuKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX1mdW5jdGlvbiBpKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUscil9ZnVuY3Rpb24gYSgpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixyKX1yZXR1cm4gbnVsbD09ZT9uOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2E6aX1mdW5jdGlvbiBOKHQsZSl7ZnVuY3Rpb24gcigpe2RlbGV0ZSB0aGlzW3RdfWZ1bmN0aW9uIG4oKXt0aGlzW3RdPWV9ZnVuY3Rpb24gaSgpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1yfXJldHVybiBudWxsPT1lP3I6ImZ1bmN0aW9uIj09dHlwZW9mIGU/aTpufWZ1bmN0aW9uIEIodCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxyPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiByPT09Q28mJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUNvP2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhyLHQpfWZ1bmN0aW9uIHIoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHQ9dW8ubnMucXVhbGlmeSh0KSkubG9jYWw/cjplfWZ1bmN0aW9uIFUoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBWKHQpe3JldHVybntfX2RhdGFfXzp0fX1mdW5jdGlvbiBxKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBTbyh0aGlzLHQpfX1mdW5jdGlvbiBIKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwodD1pKSxmdW5jdGlvbihlLHIpe3JldHVybiBlJiZyP3QoZS5fX2RhdGFfXyxyLl9fZGF0YV9fKTohZS0hcn19ZnVuY3Rpb24gWSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylmb3IodmFyIGksYT10W3JdLG89MCxzPWEubGVuZ3RoO288cztvKyspKGk9YVtvXSkmJmUoaSxvLHIpO3JldHVybiB0fWZ1bmN0aW9uIEcodCl7cmV0dXJuIGtvKHQsem8pLHR9ZnVuY3Rpb24gWCh0KXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbihuLGksYSl7dmFyIG8scz10W2FdLnVwZGF0ZSxsPXMubGVuZ3RoO2ZvcihhIT1yJiYocj1hLGU9MCksaT49ZSYmKGU9aSsxKTshKG89c1tlXSkmJisrZTxsOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFcodCxlLHIpe2Z1bmN0aW9uIG4oKXt2YXIgZT10aGlzW29dO2UmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxlLGUuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIGkoKXt2YXIgaT1sKGUsaG8oYXJndW1lbnRzKSk7bi5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LHRoaXNbb109aSxpLiQ9ciksaS5fPWV9ZnVuY3Rpb24gYSgpe3ZhciBlLHI9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit1by5yZXF1b3RlKHQpKyIkIik7Zm9yKHZhciBuIGluIHRoaXMpaWYoZT1uLm1hdGNoKHIpKXt2YXIgaT10aGlzW25dO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlWzFdLGksaS4kKSxkZWxldGUgdGhpc1tuXX19dmFyIG89Il9fb24iK3Qscz10LmluZGV4T2YoIi4iKSxsPVo7cz4wJiYodD10LnNsaWNlKDAscykpO3ZhciB1PURvLmdldCh0KTtyZXR1cm4gdSYmKHQ9dSxsPUopLHM/ZT9pOm46ZT9NOmF9ZnVuY3Rpb24gWih0LGUpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbj11by5ldmVudDt1by5ldmVudD1yLGVbMF09dGhpcy5fX2RhdGFfXzt0cnl7dC5hcHBseSh0aGlzLGUpfWZpbmFsbHl7dW8uZXZlbnQ9bn19fWZ1bmN0aW9uIEoodCxlKXt2YXIgcj1aKHQsZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10LnJlbGF0ZWRUYXJnZXQ7biYmKG49PT1lfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSkpfHxyLmNhbGwoZSx0KX19ZnVuY3Rpb24gSyh0KXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK09vLGk9ImNsaWNrIityLGE9dW8uc2VsZWN0KG4odCkpLm9uKCJ0b3VjaG1vdmUiK3IsVCkub24oImRyYWdzdGFydCIrcixUKS5vbigic2VsZWN0c3RhcnQiK3IsVCk7aWYobnVsbD09UG8mJihQbz0hKCJvbnNlbGVjdHN0YXJ0ImluIHQpJiZ3KHQuc3R5bGUsInVzZXJTZWxlY3QiKSksUG8pe3ZhciBvPWUodCkuc3R5bGUscz1vW1BvXTtvW1BvXT0ibm9uZSJ9cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKGEub24ocixudWxsKSxQbyYmKG9bUG9dPXMpLHQpe3ZhciBlPWZ1bmN0aW9uKCl7YS5vbihpLG51bGwpfTthLm9uKGksZnVuY3Rpb24oKXtUKCksZSgpfSwhMCksc2V0VGltZW91dChlLDApfX19ZnVuY3Rpb24gUSh0LGUpe2UuY2hhbmdlZFRvdWNoZXMmJihlPWUuY2hhbmdlZFRvdWNoZXNbMF0pO3ZhciByPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKHIuY3JlYXRlU1ZHUG9pbnQpe3ZhciBpPXIuY3JlYXRlU1ZHUG9pbnQoKTtpZihSbzwwKXt2YXIgYT1uKHQpO2lmKGEuc2Nyb2xsWHx8YS5zY3JvbGxZKXtyPXVvLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6Im5vbmUifSwiaW1wb3J0YW50Iik7dmFyIG89clswXVswXS5nZXRTY3JlZW5DVE0oKTtSbz0hKG8uZnx8by5lKSxyLnJlbW92ZSgpfX1yZXR1cm4gUm8/KGkueD1lLnBhZ2VYLGkueT1lLnBhZ2VZKTooaS54PWUuY2xpZW50WCxpLnk9ZS5jbGllbnRZKSxpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbaS54LGkueV19dmFyIHM9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXMubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXMudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiAkKCl7cmV0dXJuIHVvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfWZ1bmN0aW9uIGV0KHQsZSxyKXtyZXR1cm4oZVswXS10WzBdKSooclsxXS10WzFdKS0oZVsxXS10WzFdKSooclswXS10WzBdKX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdD4xPzA6dDwtMT9ObzpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gbnQodCl7cmV0dXJuIHQ+MT9Wbzp0PC0xPy1WbzpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gaXQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9ZnVuY3Rpb24gYXQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gb3QodCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfWZ1bmN0aW9uIHN0KHQpe3JldHVybih0PU1hdGguc2luKHQvMikpKnR9ZnVuY3Rpb24gbHQoKXt9ZnVuY3Rpb24gdXQodCxlLHIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgdXQ/KHRoaXMuaD0rdCx0aGlzLnM9K2Usdm9pZCh0aGlzLmw9K3IpKTphcmd1bWVudHMubGVuZ3RoPDI/dCBpbnN0YW5jZW9mIHV0P25ldyB1dCh0LmgsdC5zLHQubCk6TXQoIiIrdCxBdCx1dCk6bmV3IHV0KHQsZSxyKX1mdW5jdGlvbiBjdCh0LGUscil7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD4zNjA/dC09MzYwOnQ8MCYmKHQrPTM2MCksdDw2MD9hKyhvLWEpKnQvNjA6dDwxODA/bzp0PDI0MD9hKyhvLWEpKigyNDAtdCkvNjA6YX1mdW5jdGlvbiBpKHQpe3JldHVybiBNYXRoLnJvdW5kKDI1NSpuKHQpKX12YXIgYSxvO3JldHVybiB0PWlzTmFOKHQpPzA6KHQlPTM2MCk8MD90KzM2MDp0LGU9aXNOYU4oZSk/MDplPDA/MDplPjE/MTplLHI9cjwwPzA6cj4xPzE6cixvPXI8PS41P3IqKDErZSk6citlLXIqZSxhPTIqci1vLG5ldyBidChpKHQrMTIwKSxpKHQpLGkodC0xMjApKX1mdW5jdGlvbiBodCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBodD8odGhpcy5oPSt0LHRoaXMuYz0rZSx2b2lkKHRoaXMubD0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgaHQ/bmV3IGh0KHQuaCx0LmMsdC5sKTp0IGluc3RhbmNlb2YgZHQ/bXQodC5sLHQuYSx0LmIpOm10KCh0PWt0KCh0PXVvLnJnYih0KSkucix0LmcsdC5iKSkubCx0LmEsdC5iKTpuZXcgaHQodCxlLHIpfWZ1bmN0aW9uIGZ0KHQsZSxyKXtyZXR1cm4gaXNOYU4odCkmJih0PTApLGlzTmFOKGUpJiYoZT0wKSxuZXcgZHQocixNYXRoLmNvcyh0Kj1xbykqZSxNYXRoLnNpbih0KSplKX1mdW5jdGlvbiBkdCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkdD8odGhpcy5sPSt0LHRoaXMuYT0rZSx2b2lkKHRoaXMuYj0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgZHQ/bmV3IGR0KHQubCx0LmEsdC5iKTp0IGluc3RhbmNlb2YgaHQ/ZnQodC5oLHQuYyx0LmwpOmt0KCh0PWJ0KHQpKS5yLHQuZyx0LmIpOm5ldyBkdCh0LGUscil9ZnVuY3Rpb24gcHQodCxlLHIpe3ZhciBuPSh0KzE2KS8xMTYsaT1uK2UvNTAwLGE9bi1yLzIwMDtyZXR1cm4gaT1ndChpKSp0cyxuPWd0KG4pKmVzLGE9Z3QoYSkqcnMsbmV3IGJ0KHl0KDMuMjQwNDU0MippLTEuNTM3MTM4NSpuLS40OTg1MzE0KmEpLHl0KC0uOTY5MjY2KmkrMS44NzYwMTA4Km4rLjA0MTU1NiphKSx5dCguMDU1NjQzNCppLS4yMDQwMjU5Km4rMS4wNTcyMjUyKmEpKX1mdW5jdGlvbiBtdCh0LGUscil7cmV0dXJuIHQ+MD9uZXcgaHQoTWF0aC5hdGFuMihyLGUpKkhvLE1hdGguc3FydChlKmUrcipyKSx0KTpuZXcgaHQoTmFOLE5hTix0KX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gdD4uMjA2ODkzMDM0P3QqdCp0Oih0LTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0Pi4wMDg4NTY/TWF0aC5wb3codCwxLzMpOjcuNzg3MDM3KnQrNC8yOX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKHQ8PS4wMDMwND8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBidCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBidD8odGhpcy5yPX5+dCx0aGlzLmc9fn5lLHZvaWQodGhpcy5iPX5+cikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgYnQ/bmV3IGJ0KHQucix0LmcsdC5iKTpNdCgiIit0LGJ0LGN0KTpuZXcgYnQodCxlLHIpfWZ1bmN0aW9uIHh0KHQpe3JldHVybiBuZXcgYnQodD4+MTYsdD4+OCYyNTUsMjU1JnQpfWZ1bmN0aW9uIF90KHQpe3JldHVybiB4dCh0KSsiIn1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdDwxNj8iMCIrTWF0aC5tYXgoMCx0KS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LHQpLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBNdCh0LGUscil7dmFyIG4saSxhLG89MCxzPTAsbD0wO2lmKG49LyhbYS16XSspXCgoLiopXCkvLmV4ZWModD10LnRvTG93ZXJDYXNlKCkpKXN3aXRjaChpPW5bMl0uc3BsaXQoIiwiKSxuWzFdKXtjYXNlImhzbCI6cmV0dXJuIHIocGFyc2VGbG9hdChpWzBdKSxwYXJzZUZsb2F0KGlbMV0pLzEwMCxwYXJzZUZsb2F0KGlbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiBlKEV0KGlbMF0pLEV0KGlbMV0pLEV0KGlbMl0pKX1yZXR1cm4oYT1hcy5nZXQodCkpP2UoYS5yLGEuZyxhLmIpOihudWxsPT10fHwiIyIhPT10LmNoYXJBdCgwKXx8aXNOYU4oYT1wYXJzZUludCh0LnNsaWNlKDEpLDE2KSl8fCg0PT09dC5sZW5ndGg/KG89KDM4NDAmYSk+PjQsb3w9bz4+NCxzPTI0MCZhLHN8PXM+PjQsbD0xNSZhLGx8PWw8PDQpOjc9PT10Lmxlbmd0aCYmKG89KDE2NzExNjgwJmEpPj4xNixzPSg2NTI4MCZhKT4+OCxsPTI1NSZhKSksZShvLHMsbCkpfWZ1bmN0aW9uIEF0KHQsZSxyKXt2YXIgbixpLGE9TWF0aC5taW4odC89MjU1LGUvPTI1NSxyLz0yNTUpLG89TWF0aC5tYXgodCxlLHIpLHM9by1hLGw9KG8rYSkvMjtyZXR1cm4gcz8oaT1sPC41P3MvKG8rYSk6cy8oMi1vLWEpLG49dD09bz8oZS1yKS9zKyhlPHI/NjowKTplPT1vPyhyLXQpL3MrMjoodC1lKS9zKzQsbio9NjApOihuPU5hTixpPWw+MCYmbDwxPzA6biksbmV3IHV0KG4saSxsKX1mdW5jdGlvbiBrdCh0LGUscil7dD1UdCh0KSxlPVR0KGUpLHI9VHQocik7dmFyIG49dnQoKC40MTI0NTY0KnQrLjM1NzU3NjEqZSsuMTgwNDM3NSpyKS90cyksaT12dCgoLjIxMjY3MjkqdCsuNzE1MTUyMiplKy4wNzIxNzUqcikvZXMpLGE9dnQoKC4wMTkzMzM5KnQrLjExOTE5MiplKy45NTAzMDQxKnIpL3JzKTtyZXR1cm4gZHQoMTE2KmktMTYsNTAwKihuLWkpLDIwMCooaS1hKSl9ZnVuY3Rpb24gVHQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gRXQodCl7dmFyIGU9cGFyc2VGbG9hdCh0KTtyZXR1cm4iJSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqZSk6ZX1mdW5jdGlvbiBTdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIEx0KHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKG49cixyPW51bGwpLEN0KGUscix0LG4pfX1mdW5jdGlvbiBDdCh0LGUscixuKXtmdW5jdGlvbiBpKCl7dmFyIHQsZT1sLnN0YXR1cztpZighZSYmenQobCl8fGU+PTIwMCYmZTwzMDB8fDMwND09PWUpe3RyeXt0PXIuY2FsbChhLGwpfWNhdGNoKHQpe3JldHVybiB2b2lkIG8uZXJyb3IuY2FsbChhLHQpfW8ubG9hZC5jYWxsKGEsdCl9ZWxzZSBvLmVycm9yLmNhbGwoYSxsKX12YXIgYT17fSxvPXVvLmRpc3BhdGNoKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxzPXt9LGw9bmV3IFhNTEh0dHBSZXF1ZXN0LHU9bnVsbDtyZXR1cm4hdGhpcy5YRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBsfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHQpfHwobD1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gbD9sLm9ubG9hZD1sLm9uZXJyb3I9aTpsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2wucmVhZHlTdGF0ZT4zJiZpKCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbih0KXt2YXIgZT11by5ldmVudDt1by5ldmVudD10O3RyeXtvLnByb2dyZXNzLmNhbGwoYSxsKX1maW5hbGx5e3VvLmV2ZW50PWV9fSxhLmhlYWRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9zW3RdOihudWxsPT1lP2RlbGV0ZSBzW3RdOnNbdF09ZSsiIixhKX0sYS5taW1lVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCsiIixhKTplfSxhLnJlc3BvbnNlVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGEpOnV9LGEucmVzcG9uc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxhfSxbImdldCIsInBvc3QiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF09ZnVuY3Rpb24oKXtyZXR1cm4gYS5zZW5kLmFwcGx5KGEsW3RdLmNvbmNhdChobyhhcmd1bWVudHMpKSl9fSksYS5zZW5kPWZ1bmN0aW9uKHIsbixpKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJihpPW4sbj1udWxsKSxsLm9wZW4ocix0LCEwKSxudWxsPT1lfHwiYWNjZXB0ImluIHN8fChzLmFjY2VwdD1lKyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyKWZvcih2YXIgYyBpbiBzKWwuc2V0UmVxdWVzdEhlYWRlcihjLHNbY10pO3JldHVybiBudWxsIT1lJiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZShlKSxudWxsIT11JiYobC5yZXNwb25zZVR5cGU9dSksbnVsbCE9aSYmYS5vbigiZXJyb3IiLGkpLm9uKCJsb2FkIixmdW5jdGlvbih0KXtpKG51bGwsdCl9KSxvLmJlZm9yZXNlbmQuY2FsbChhLGwpLGwuc2VuZChudWxsPT1uP251bGw6biksYX0sYS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksYX0sdW8ucmViaW5kKGEsbywib24iKSxudWxsPT1uP2E6YS5nZXQoSXQobikpfWZ1bmN0aW9uIEl0KHQpe3JldHVybiAxPT09dC5sZW5ndGg/ZnVuY3Rpb24oZSxyKXt0KG51bGw9PWU/cjpudWxsKX06dH1mdW5jdGlvbiB6dCh0KXt2YXIgZT10LnJlc3BvbnNlVHlwZTtyZXR1cm4gZSYmInRleHQiIT09ZT90LnJlc3BvbnNlOnQucmVzcG9uc2VUZXh0fWZ1bmN0aW9uIER0KHQsZSxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO248MiYmKGU9MCksbjwzJiYocj1EYXRlLm5vdygpKTt2YXIgaT1yK2UsYT17Yzp0LHQ6aSxuOm51bGx9O3JldHVybiBzcz9zcy5uPWE6b3M9YSxzcz1hLGxzfHwodXM9Y2xlYXJUaW1lb3V0KHVzKSxscz0xLGNzKFB0KSksYX1mdW5jdGlvbiBQdCgpe3ZhciB0PU90KCksZT1SdCgpLXQ7ZT4yND8oaXNGaW5pdGUoZSkmJihjbGVhclRpbWVvdXQodXMpLHVzPXNldFRpbWVvdXQoUHQsZSkpLGxzPTApOihscz0xLGNzKFB0KSl9ZnVuY3Rpb24gT3QoKXtmb3IodmFyIHQ9RGF0ZS5ub3coKSxlPW9zO2U7KXQ+PWUudCYmZS5jKHQtZS50KSYmKGUuYz1udWxsKSxlPWUubjtyZXR1cm4gdH1mdW5jdGlvbiBSdCgpe2Zvcih2YXIgdCxlPW9zLHI9MS8wO2U7KWUuYz8oZS50PHImJihyPWUudCksZT0odD1lKS5uKTplPXQ/dC5uPWUubjpvcz1lLm47cmV0dXJuIHNzPXQscn1mdW5jdGlvbiBGdCh0LGUpe3JldHVybiBlLSh0P01hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIGp0KHQsZSl7dmFyIHI9TWF0aC5wb3coMTAsMyp4byg4LWUpKTtyZXR1cm57c2NhbGU6ZT44P2Z1bmN0aW9uKHQpe3JldHVybiB0L3J9OmZ1bmN0aW9uKHQpe3JldHVybiB0KnJ9LHN5bWJvbDp0fX1mdW5jdGlvbiBOdCh0KXt2YXIgZT10LmRlY2ltYWwscj10LnRob3VzYW5kcyxuPXQuZ3JvdXBpbmcsaT10LmN1cnJlbmN5LGE9biYmcj9mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10Lmxlbmd0aCxhPVtdLG89MCxzPW5bMF0sbD0wO2k+MCYmcz4wJiYobCtzKzE+ZSYmKHM9TWF0aC5tYXgoMSxlLWwpKSxhLnB1c2godC5zdWJzdHJpbmcoaS09cyxpK3MpKSwhKChsKz1zKzEpPmUpKTspcz1uW289KG8rMSklbi5sZW5ndGhdO3JldHVybiBhLnJldmVyc2UoKS5qb2luKHIpfTp4O3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1mcy5leGVjKHQpLG49clsxXXx8IiAiLG89clsyXXx8Ij4iLHM9clszXXx8Ii0iLGw9cls0XXx8IiIsdT1yWzVdLGM9K3JbNl0saD1yWzddLGY9cls4XSxkPXJbOV0scD0xLG09IiIsZz0iIix2PSExLHk9ITA7c3dpdGNoKGYmJihmPStmLnN1YnN0cmluZygxKSksKHV8fCIwIj09PW4mJiI9Ij09PW8pJiYodT1uPSIwIixvPSI9IiksZCl7Y2FzZSJuIjpoPSEwLGQ9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZz0iJSIsZD0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxnPSIlIixkPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWwmJihtPSIwIitkLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOnY9ITAsZj0wO2JyZWFrO2Nhc2UicyI6cD0tMSxkPSJyIn0iJCI9PT1sJiYobT1pWzBdLGc9aVsxXSksInIiIT1kfHxmfHwoZD0iZyIpLG51bGwhPWYmJigiZyI9PWQ/Zj1NYXRoLm1heCgxLE1hdGgubWluKDIxLGYpKToiZSIhPWQmJiJmIiE9ZHx8KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxmKSkpKSxkPWRzLmdldChkKXx8QnQ7dmFyIGI9dSYmaDtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9ZztpZih2JiZ0JTEpcmV0dXJuIiI7dmFyIGk9dDwwfHwwPT09dCYmMS90PDA/KHQ9LXQsIi0iKToiLSI9PT1zPyIiOnM7aWYocDwwKXt2YXIgbD11by5mb3JtYXRQcmVmaXgodCxmKTt0PWwuc2NhbGUodCkscj1sLnN5bWJvbCtnfWVsc2UgdCo9cDt0PWQodCxmKTt2YXIgeCxfLHc9dC5sYXN0SW5kZXhPZigiLiIpO2lmKHc8MCl7dmFyIE09eT90Lmxhc3RJbmRleE9mKCJlIik6LTE7TTwwPyh4PXQsXz0iIik6KHg9dC5zdWJzdHJpbmcoMCxNKSxfPXQuc3Vic3RyaW5nKE0pKX1lbHNlIHg9dC5zdWJzdHJpbmcoMCx3KSxfPWUrdC5zdWJzdHJpbmcodysxKTshdSYmaCYmKHg9YSh4LDEvMCkpO3ZhciBBPW0ubGVuZ3RoK3gubGVuZ3RoK18ubGVuZ3RoKyhiPzA6aS5sZW5ndGgpLGs9QTxjP25ldyBBcnJheShBPWMtQSsxKS5qb2luKG4pOiIiO3JldHVybiBiJiYoeD1hKGsreCxrLmxlbmd0aD9jLV8ubGVuZ3RoOjEvMCkpLGkrPW0sdD14K18sKCI8Ij09PW8/aSt0K2s6Ij4iPT09bz9rK2krdDoiXiI9PT1vP2suc3Vic3RyaW5nKDAsQT4+PTEpK2krdCtrLnN1YnN0cmluZyhBKTppKyhiP3Q6ayt0KSkrcn19fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiB0KyIifWZ1bmN0aW9uIFV0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBWdCh0LGUscil7ZnVuY3Rpb24gbihlKXt2YXIgcj10KGUpLG49YShyLDEpO3JldHVybiBlLXI8bi1lP3I6bn1mdW5jdGlvbiBpKHIpe3JldHVybiBlKHI9dChuZXcgbXMoci0xKSksMSkscn1mdW5jdGlvbiBhKHQscil7cmV0dXJuIGUodD1uZXcgbXMoK3QpLHIpLHR9ZnVuY3Rpb24gbyh0LG4sYSl7dmFyIG89aSh0KSxzPVtdO2lmKGE+MSlmb3IoO288bjspcihvKSVhfHxzLnB1c2gobmV3IERhdGUoK28pKSxlKG8sMSk7ZWxzZSBmb3IoO288bjspcy5wdXNoKG5ldyBEYXRlKCtvKSksZShvLDEpO3JldHVybiBzfWZ1bmN0aW9uIHModCxlLHIpe3RyeXttcz1VdDt2YXIgbj1uZXcgVXQ7cmV0dXJuIG4uXz10LG8obixlLHIpfWZpbmFsbHl7bXM9RGF0ZX19dC5mbG9vcj10LHQucm91bmQ9bix0LmNlaWw9aSx0Lm9mZnNldD1hLHQucmFuZ2U9bzt2YXIgbD10LnV0Yz1xdCh0KTtyZXR1cm4gbC5mbG9vcj1sLGwucm91bmQ9cXQobiksbC5jZWlsPXF0KGkpLGwub2Zmc2V0PXF0KGEpLGwucmFuZ2U9cyx0fWZ1bmN0aW9uIHF0KHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3RyeXttcz1VdDt2YXIgbj1uZXcgVXQ7cmV0dXJuIG4uXz1lLHQobixyKS5ffWZpbmFsbHl7bXM9RGF0ZX19fWZ1bmN0aW9uIEh0KHQpe2Z1bmN0aW9uIGUodCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIHIsaSxhLG89W10scz0tMSxsPTA7KytzPG47KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoby5wdXNoKHQuc2xpY2UobCxzKSksbnVsbCE9KGk9dnNbcj10LmNoYXJBdCgrK3MpXSkmJihyPXQuY2hhckF0KCsrcykpLChhPVNbcl0pJiYocj1hKGUsbnVsbD09aT8iZSI9PT1yPyIgIjoiMCI6aSkpLG8ucHVzaChyKSxsPXMrMSk7cmV0dXJuIG8ucHVzaCh0LnNsaWNlKGwscykpLG8uam9pbigiIil9dmFyIG49dC5sZW5ndGg7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24oZSl7dmFyIG49e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LGk9cihuLHQsZSwwKTtpZihpIT1lLmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiBuJiYobi5IPW4uSCUxMisxMipuLnApO3ZhciBhPW51bGwhPW4uWiYmbXMhPT1VdCxvPW5ldyhhP1V0Om1zKTtyZXR1cm4iaiJpbiBuP28uc2V0RnVsbFllYXIobi55LDAsbi5qKToiVyJpbiBufHwiVSJpbiBuPygidyJpbiBufHwobi53PSJXImluIG4/MTowKSxvLnNldEZ1bGxZZWFyKG4ueSwwLDEpLG8uc2V0RnVsbFllYXIobi55LDAsIlciaW4gbj8obi53KzYpJTcrNypuLlctKG8uZ2V0RGF5KCkrNSklNzpuLncrNypuLlUtKG8uZ2V0RGF5KCkrNiklNykpOm8uc2V0RnVsbFllYXIobi55LG4ubSxuLmQpLG8uc2V0SG91cnMobi5IKyhuLlovMTAwfDApLG4uTStuLlolMTAwLG4uUyxuLkwpLAphP28uXzpvfSxlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9ZnVuY3Rpb24gcih0LGUscixuKXtmb3IodmFyIGksYSxvLHM9MCxsPWUubGVuZ3RoLHU9ci5sZW5ndGg7czxsOyl7aWYobj49dSlyZXR1cm4tMTtpZihpPWUuY2hhckNvZGVBdChzKyspLDM3PT09aSl7aWYobz1lLmNoYXJBdChzKyspLGE9TFtvIGluIHZzP2UuY2hhckF0KHMrKyk6b10sIWF8fChuPWEodCxyLG4pKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ci5jaGFyQ29kZUF0KG4rKykpcmV0dXJuLTF9cmV0dXJuIG59ZnVuY3Rpb24gbih0LGUscil7dy5sYXN0SW5kZXg9MDt2YXIgbj13LmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQudz1NLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGkodCxlLHIpe3gubGFzdEluZGV4PTA7dmFyIG49eC5leGVjKGUuc2xpY2UocikpO3JldHVybiBuPyh0Lnc9Xy5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKHQsZSxyKXtULmxhc3RJbmRleD0wO3ZhciBuPVQuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5tPUUuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSkscituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyh0LGUscil7QS5sYXN0SW5kZXg9MDt2YXIgbj1BLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQubT1rLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiByKHQsUy5jLnRvU3RyaW5nKCksZSxuKX1mdW5jdGlvbiBsKHQsZSxuKXtyZXR1cm4gcih0LFMueC50b1N0cmluZygpLGUsbil9ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIHIodCxTLlgudG9TdHJpbmcoKSxlLG4pfWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPWIuZ2V0KGUuc2xpY2UocixyKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09bj8tMToodC5wPW4scil9dmFyIGg9dC5kYXRlVGltZSxmPXQuZGF0ZSxkPXQudGltZSxwPXQucGVyaW9kcyxtPXQuZGF5cyxnPXQuc2hvcnREYXlzLHY9dC5tb250aHMseT10LnNob3J0TW9udGhzO2UudXRjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7dHJ5e21zPVV0O3ZhciBlPW5ldyBtcztyZXR1cm4gZS5fPXQsbihlKX1maW5hbGx5e21zPURhdGV9fXZhciBuPWUodCk7cmV0dXJuIHIucGFyc2U9ZnVuY3Rpb24odCl7dHJ5e21zPVV0O3ZhciBlPW4ucGFyc2UodCk7cmV0dXJuIGUmJmUuX31maW5hbGx5e21zPURhdGV9fSxyLnRvU3RyaW5nPW4udG9TdHJpbmcscn0sZS5tdWx0aT1lLnV0Yy5tdWx0aT1jZTt2YXIgYj11by5tYXAoKSx4PUd0KG0pLF89WHQobSksdz1HdChnKSxNPVh0KGcpLEE9R3Qodiksaz1YdCh2KSxUPUd0KHkpLEU9WHQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7Yi5zZXQodC50b0xvd2VyQ2FzZSgpLGUpfSk7dmFyIFM9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGdbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG1bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIHlbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdlt0LmdldE1vbnRoKCldfSxjOmUoaCksZDpmdW5jdGlvbih0LGUpe3JldHVybiBZdCh0LmdldERhdGUoKSxlLDIpfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KHQuZ2V0RGF0ZSgpLGUsMil9LEg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQodC5nZXRIb3VycygpLGUsMil9LEk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQodC5nZXRIb3VycygpJTEyfHwxMixlLDIpfSxqOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KDErcHMuZGF5T2ZZZWFyKHQpLGUsMyl9LEw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfSxtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KHQuZ2V0TW9udGgoKSsxLGUsMil9LE06ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQodC5nZXRNaW51dGVzKCksZSwyKX0scDpmdW5jdGlvbih0KXtyZXR1cm4gcFsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbih0LGUpe3JldHVybiBZdCh0LmdldFNlY29uZHMoKSxlLDIpfSxVOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KHBzLnN1bmRheU9mWWVhcih0KSxlLDIpfSx3OmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpfSxXOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KHBzLm1vbmRheU9mWWVhcih0KSxlLDIpfSx4OmUoZiksWDplKGQpLHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfSxZOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFl0KHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX0sWjpsZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxMPXthOm4sQTppLGI6YSxCOm8sYzpzLGQ6cmUsZTpyZSxIOmllLEk6aWUsajpuZSxMOnNlLG06ZWUsTTphZSxwOmMsUzpvZSxVOlp0LHc6V3QsVzpKdCx4OmwsWDp1LHk6UXQsWTpLdCxaOiR0LCIlIjp1ZX07cmV0dXJuIGV9ZnVuY3Rpb24gWXQodCxlLHIpe3ZhciBuPXQ8MD8iLSI6IiIsaT0obj8tdDp0KSsiIixhPWkubGVuZ3RoO3JldHVybiBuKyhhPHI/bmV3IEFycmF5KHItYSsxKS5qb2luKGUpK2k6aSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKHVvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBYdCh0KXtmb3IodmFyIGU9bmV3IGgscj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnNldCh0W3JdLnRvTG93ZXJDYXNlKCkscik7cmV0dXJuIGV9ZnVuY3Rpb24gV3QodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMSkpO3JldHVybiBuPyh0Lnc9K25bMF0scituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWnQodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQuVT0rblswXSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdCh0LGUscil7eXMubGFzdEluZGV4PTA7dmFyIG49eXMuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5XPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEt0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzQpKTtyZXR1cm4gbj8odC55PStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC55PXRlKCtuWzBdKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdCh0LGUscil7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KGU9ZS5zbGljZShyLHIrNSkpPyh0Llo9LWUscis1KTotMX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdCsodD42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gZWUodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMikpO3JldHVybiBuPyh0Lm09blswXS0xLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5kPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5qPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5IPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5NPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5TPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5MPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPWU+MD8iLSI6IisiLG49eG8oZSkvNjB8MCxpPXhvKGUpJTYwO3JldHVybiByK1l0KG4sIjAiLDIpK1l0KGksIjAiLDIpfWZ1bmN0aW9uIHVlKHQsZSxyKXticy5sYXN0SW5kZXg9MDt2YXIgbj1icy5leGVjKGUuc2xpY2UocixyKzEpKTtyZXR1cm4gbj9yK25bMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGNlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPS0xOysrcjxlOyl0W3JdWzBdPXRoaXModFtyXVswXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wLG49dFtyXTshblsxXShlKTspbj10Wysrcl07cmV0dXJuIG5bMF0oZSl9fWZ1bmN0aW9uIGhlKCl7fWZ1bmN0aW9uIGZlKHQsZSxyKXt2YXIgbj1yLnM9dCtlLGk9bi10LGE9bi1pO3IudD10LWErKGUtaSl9ZnVuY3Rpb24gZGUodCxlKXt0JiZNcy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpJiZNc1t0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gcGUodCxlLHIpe3ZhciBuLGk9LTEsYT10Lmxlbmd0aC1yO2ZvcihlLmxpbmVTdGFydCgpOysraTxhOyluPXRbaV0sZS5wb2ludChuWzBdLG5bMV0sblsyXSk7ZS5saW5lRW5kKCl9ZnVuY3Rpb24gbWUodCxlKXt2YXIgcj0tMSxuPXQubGVuZ3RoO2ZvcihlLnBvbHlnb25TdGFydCgpOysrcjxuOylwZSh0W3JdLGUsMSk7ZS5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiB0KHQsZSl7dCo9cW8sZT1lKnFvLzIrTm8vNDt2YXIgcj10LW4sbz1yPj0wPzE6LTEscz1vKnIsbD1NYXRoLmNvcyhlKSx1PU1hdGguc2luKGUpLGM9YSp1LGg9aSpsK2MqTWF0aC5jb3MocyksZj1jKm8qTWF0aC5zaW4ocyk7a3MuYWRkKE1hdGguYXRhbjIoZixoKSksbj10LGk9bCxhPXV9dmFyIGUscixuLGksYTtUcy5wb2ludD1mdW5jdGlvbihvLHMpe1RzLnBvaW50PXQsbj0oZT1vKSpxbyxpPU1hdGguY29zKHM9KHI9cykqcW8vMitOby80KSxhPU1hdGguc2luKHMpfSxUcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT10WzBdLHI9dFsxXSxuPU1hdGguY29zKHIpO3JldHVybltuKk1hdGguY29zKGUpLG4qTWF0aC5zaW4oZSksTWF0aC5zaW4ocildfWZ1bmN0aW9uIHllKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiB4ZSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiB3ZSh0KXt2YXIgZT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPWUsdFsxXS89ZSx0WzJdLz1lfWZ1bmN0aW9uIE1lKHQpe3JldHVybltNYXRoLmF0YW4yKHRbMV0sdFswXSksbnQodFsyXSldfWZ1bmN0aW9uIEFlKHQsZSl7cmV0dXJuIHhvKHRbMF0tZVswXSk8Rm8mJnhvKHRbMV0tZVsxXSk8Rm99ZnVuY3Rpb24ga2UodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyk7VGUocipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpKX1mdW5jdGlvbiBUZSh0LGUscil7KytFcyxMcys9KHQtTHMpL0VzLENzKz0oZS1DcykvRXMsSXMrPShyLUlzKS9Fc31mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIHQodCxpKXt0Kj1xbzt2YXIgYT1NYXRoLmNvcyhpKj1xbyksbz1hKk1hdGguY29zKHQpLHM9YSpNYXRoLnNpbih0KSxsPU1hdGguc2luKGkpLHU9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHU9cipsLW4qcykqdSsodT1uKm8tZSpsKSp1Kyh1PWUqcy1yKm8pKnUpLGUqbytyKnMrbipsKTtTcys9dSx6cys9dSooZSsoZT1vKSksRHMrPXUqKHIrKHI9cykpLFBzKz11KihuKyhuPWwpKSxUZShlLHIsbil9dmFyIGUscixuO2pzLnBvaW50PWZ1bmN0aW9uKGksYSl7aSo9cW87dmFyIG89TWF0aC5jb3MoYSo9cW8pO2U9bypNYXRoLmNvcyhpKSxyPW8qTWF0aC5zaW4oaSksbj1NYXRoLnNpbihhKSxqcy5wb2ludD10LFRlKGUscixuKX19ZnVuY3Rpb24gU2UoKXtqcy5wb2ludD1rZX1mdW5jdGlvbiBMZSgpe2Z1bmN0aW9uIHQodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyksbz1yKk1hdGguY29zKHQpLHM9cipNYXRoLnNpbih0KSxsPU1hdGguc2luKGUpLHU9aSpsLWEqcyxjPWEqby1uKmwsaD1uKnMtaSpvLGY9TWF0aC5zcXJ0KHUqdStjKmMraCpoKSxkPW4qbytpKnMrYSpsLHA9ZiYmLXJ0KGQpL2YsbT1NYXRoLmF0YW4yKGYsZCk7T3MrPXAqdSxScys9cCpjLEZzKz1wKmgsU3MrPW0senMrPW0qKG4rKG49bykpLERzKz1tKihpKyhpPXMpKSxQcys9bSooYSsoYT1sKSksVGUobixpLGEpfXZhciBlLHIsbixpLGE7anMucG9pbnQ9ZnVuY3Rpb24obyxzKXtlPW8scj1zLGpzLnBvaW50PXQsbyo9cW87dmFyIGw9TWF0aC5jb3Mocyo9cW8pO249bCpNYXRoLmNvcyhvKSxpPWwqTWF0aC5zaW4obyksYT1NYXRoLnNpbihzKSxUZShuLGksYSl9LGpzLmxpbmVFbmQ9ZnVuY3Rpb24oKXt0KGUsciksanMubGluZUVuZD1TZSxqcy5wb2ludD1rZX19ZnVuY3Rpb24gQ2UodCxlKXtmdW5jdGlvbiByKHIsbil7cmV0dXJuIHI9dChyLG4pLGUoclswXSxyWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYoci5pbnZlcnQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4gcj1lLmludmVydChyLG4pLHImJnQuaW52ZXJ0KHJbMF0sclsxXSl9KSxyfWZ1bmN0aW9uIEllKCl7cmV0dXJuITB9ZnVuY3Rpb24gemUodCxlLHIsbixpKXt2YXIgYT1bXSxvPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUscj10WzBdLG49dFtlXTtpZihBZShyLG4pKXtpLmxpbmVTdGFydCgpO2Zvcih2YXIgcz0wO3M8ZTsrK3MpaS5wb2ludCgocj10W3NdKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX12YXIgbD1uZXcgUGUocix0LG51bGwsITApLHU9bmV3IFBlKHIsbnVsbCxsLCExKTtsLm89dSxhLnB1c2gobCksby5wdXNoKHUpLGw9bmV3IFBlKG4sdCxudWxsLCExKSx1PW5ldyBQZShuLG51bGwsbCwhMCksbC5vPXUsYS5wdXNoKGwpLG8ucHVzaCh1KX19KSxvLnNvcnQoZSksRGUoYSksRGUobyksYS5sZW5ndGgpe2Zvcih2YXIgcz0wLGw9cix1PW8ubGVuZ3RoO3M8dTsrK3Mpb1tzXS5lPWw9IWw7Zm9yKHZhciBjLGgsZj1hWzBdOzspe2Zvcih2YXIgZD1mLHA9ITA7ZC52OylpZigoZD1kLm4pPT09ZilyZXR1cm47Yz1kLnosaS5saW5lU3RhcnQoKTtkb3tpZihkLnY9ZC5vLnY9ITAsZC5lKXtpZihwKWZvcih2YXIgcz0wLHU9Yy5sZW5ndGg7czx1OysrcylpLnBvaW50KChoPWNbc10pWzBdLGhbMV0pO2Vsc2UgbihkLngsZC5uLngsMSxpKTtkPWQubn1lbHNle2lmKHApe2M9ZC5wLno7Zm9yKHZhciBzPWMubGVuZ3RoLTE7cz49MDstLXMpaS5wb2ludCgoaD1jW3NdKVswXSxoWzFdKX1lbHNlIG4oZC54LGQucC54LC0xLGkpO2Q9ZC5wfWQ9ZC5vLGM9ZC56LHA9IXB9d2hpbGUoIWQudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBEZSh0KXtpZihlPXQubGVuZ3RoKXtmb3IodmFyIGUscixuPTAsaT10WzBdOysrbjxlOylpLm49cj10W25dLHIucD1pLGk9cjtpLm49cj10WzBdLHIucD1pfX1mdW5jdGlvbiBQZSh0LGUscixuKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89cix0aGlzLmU9bix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIE9lKHQsZSxyLG4pe3JldHVybiBmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIG8oZSxyKXt2YXIgbj1pKGUscik7dChlPW5bMF0scj1uWzFdKSYmYS5wb2ludChlLHIpfWZ1bmN0aW9uIHModCxlKXt2YXIgcj1pKHQsZSk7Zy5wb2ludChyWzBdLHJbMV0pfWZ1bmN0aW9uIGwoKXt5LnBvaW50PXMsZy5saW5lU3RhcnQoKX1mdW5jdGlvbiB1KCl7eS5wb2ludD1vLGcubGluZUVuZCgpfWZ1bmN0aW9uIGModCxlKXttLnB1c2goW3QsZV0pO3ZhciByPWkodCxlKTt4LnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gaCgpe3gubGluZVN0YXJ0KCksbT1bXX1mdW5jdGlvbiBmKCl7YyhtWzBdWzBdLG1bMF1bMV0pLHgubGluZUVuZCgpO3ZhciB0LGU9eC5jbGVhbigpLHI9Yi5idWZmZXIoKSxuPXIubGVuZ3RoO2lmKG0ucG9wKCkscC5wdXNoKG0pLG09bnVsbCxuKWlmKDEmZSl7dD1yWzBdO3ZhciBpLG49dC5sZW5ndGgtMSxvPS0xO2lmKG4+MCl7Zm9yKF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLGEubGluZVN0YXJ0KCk7KytvPG47KWEucG9pbnQoKGk9dFtvXSlbMF0saVsxXSk7YS5saW5lRW5kKCl9fWVsc2Ugbj4xJiYyJmUmJnIucHVzaChyLnBvcCgpLmNvbmNhdChyLnNoaWZ0KCkpKSxkLnB1c2goci5maWx0ZXIoUmUpKX12YXIgZCxwLG0sZz1lKGEpLHY9aS5pbnZlcnQoblswXSxuWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpsLGxpbmVFbmQ6dSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PWMseS5saW5lU3RhcnQ9aCx5LmxpbmVFbmQ9ZixkPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9bCx5LmxpbmVFbmQ9dSxkPXVvLm1lcmdlKGQpO3ZhciB0PVZlKHYscCk7ZC5sZW5ndGg/KF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLHplKGQsamUsdCxyLGEpKTp0JiYoX3x8KGEucG9seWdvblN0YXJ0KCksXz0hMCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxfJiYoYS5wb2x5Z29uRW5kKCksXz0hMSksZD1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2EucG9seWdvblN0YXJ0KCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpLGEucG9seWdvbkVuZCgpfX0sYj1GZSgpLHg9ZShiKSxfPSExO3JldHVybiB5fX1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBGZSgpe3ZhciB0LGU9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0scG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goW2Uscl0pfSxsaW5lRW5kOk0sYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIHI9ZTtyZXR1cm4gZT1bXSx0PW51bGwscn0scmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfX19ZnVuY3Rpb24gamUodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tVm8tRm86Vm8tdFsxXSktKChlPWUueClbMF08MD9lWzFdLVZvLUZvOlZvLWVbMV0pfWZ1bmN0aW9uIE5lKHQpe3ZhciBlLHI9TmFOLG49TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGU9MX0scG9pbnQ6ZnVuY3Rpb24oYSxvKXt2YXIgcz1hPjA/Tm86LU5vLGw9eG8oYS1yKTt4byhsLU5vKTxGbz8odC5wb2ludChyLG49KG4rbykvMj4wP1ZvOi1WbyksdC5wb2ludChpLG4pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLG4pLHQucG9pbnQoYSxuKSxlPTApOmkhPT1zJiZsPj1ObyYmKHhvKHItaSk8Rm8mJihyLT1pKkZvKSx4byhhLXMpPEZvJiYoYS09cypGbyksbj1CZShyLG4sYSxvKSx0LnBvaW50KGksbiksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHMsbiksZT0wKSx0LnBvaW50KHI9YSxuPW8pLGk9c30sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLHI9bj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe3ZhciBpLGEsbz1NYXRoLnNpbih0LXIpO3JldHVybiB4byhvKT5Gbz9NYXRoLmF0YW4oKE1hdGguc2luKGUpKihhPU1hdGguY29zKG4pKSpNYXRoLnNpbihyKS1NYXRoLnNpbihuKSooaT1NYXRoLmNvcyhlKSkqTWF0aC5zaW4odCkpLyhpKmEqbykpOihlK24pLzJ9ZnVuY3Rpb24gVWUodCxlLHIsbil7dmFyIGk7aWYobnVsbD09dClpPXIqVm8sbi5wb2ludCgtTm8saSksbi5wb2ludCgwLGkpLG4ucG9pbnQoTm8saSksbi5wb2ludChObywwKSxuLnBvaW50KE5vLC1pKSxuLnBvaW50KDAsLWkpLG4ucG9pbnQoLU5vLC1pKSxuLnBvaW50KC1ObywwKSxuLnBvaW50KC1ObyxpKTtlbHNlIGlmKHhvKHRbMF0tZVswXSk+Rm8pe3ZhciBhPXRbMF08ZVswXT9ObzotTm87aT1yKmEvMixuLnBvaW50KC1hLGkpLG4ucG9pbnQoMCxpKSxuLnBvaW50KGEsaSl9ZWxzZSBuLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gVmUodCxlKXt2YXIgcj10WzBdLG49dFsxXSxpPVtNYXRoLnNpbihyKSwtTWF0aC5jb3MociksMF0sYT0wLG89MDtrcy5yZXNldCgpO2Zvcih2YXIgcz0wLGw9ZS5sZW5ndGg7czxsOysrcyl7dmFyIHU9ZVtzXSxjPXUubGVuZ3RoO2lmKGMpZm9yKHZhciBoPXVbMF0sZj1oWzBdLGQ9aFsxXS8yK05vLzQscD1NYXRoLnNpbihkKSxtPU1hdGguY29zKGQpLGc9MTs7KXtnPT09YyYmKGc9MCksdD11W2ddO3ZhciB2PXRbMF0seT10WzFdLzIrTm8vNCxiPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksXz12LWYsdz1fPj0wPzE6LTEsTT13Kl8sQT1NPk5vLGs9cCpiO2lmKGtzLmFkZChNYXRoLmF0YW4yKGsqdypNYXRoLnNpbihNKSxtKngraypNYXRoLmNvcyhNKSkpLGErPUE/Xyt3KkJvOl8sQV5mPj1yXnY+PXIpe3ZhciBUPWJlKHZlKGgpLHZlKHQpKTt3ZShUKTt2YXIgRT1iZShpLFQpO3dlKEUpO3ZhciBTPShBXl8+PTA/LTE6MSkqbnQoRVsyXSk7KG4+U3x8bj09PVMmJihUWzBdfHxUWzFdKSkmJihvKz1BXl8+PTA/MTotMSl9aWYoIWcrKylicmVhaztmPXYscD1iLG09eCxoPXR9fXJldHVybihhPC1Gb3x8YTxGbyYma3M8LUZvKV4xJm99ZnVuY3Rpb24gcWUodCl7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBNYXRoLmNvcyh0KSpNYXRoLmNvcyhlKT5hfWZ1bmN0aW9uIHIodCl7dmFyIHIsYSxsLHUsYztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dT1sPSExLGM9MX0scG9pbnQ6ZnVuY3Rpb24oaCxmKXt2YXIgZCxwPVtoLGZdLG09ZShoLGYpLGc9bz9tPzA6aShoLGYpOm0/aShoKyhoPDA/Tm86LU5vKSxmKTowO2lmKCFyJiYodT1sPW0pJiZ0LmxpbmVTdGFydCgpLG0hPT1sJiYoZD1uKHIscCksKEFlKHIsZCl8fEFlKHAsZCkpJiYocFswXSs9Rm8scFsxXSs9Rm8sbT1lKHBbMF0scFsxXSkpKSxtIT09bCljPTAsbT8odC5saW5lU3RhcnQoKSxkPW4ocCxyKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPW4ocixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLHI9ZDtlbHNlIGlmKHMmJnImJm9ebSl7dmFyIHY7ZyZhfHwhKHY9bihwLHIsITApKXx8KGM9MCxvPyh0LmxpbmVTdGFydCgpLHQucG9pbnQodlswXVswXSx2WzBdWzFdKSx0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHZbMF1bMF0sdlswXVsxXSkpKX0hbXx8ciYmQWUocixwKXx8dC5wb2ludChwWzBdLHBbMV0pLHI9cCxsPW0sYT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmdC5saW5lRW5kKCkscj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBjfCh1JiZsKTw8MX19fWZ1bmN0aW9uIG4odCxlLHIpe3ZhciBuPXZlKHQpLGk9dmUoZSksbz1bMSwwLDBdLHM9YmUobixpKSxsPXllKHMscyksdT1zWzBdLGM9bC11KnU7aWYoIWMpcmV0dXJuIXImJnQ7dmFyIGg9YSpsL2MsZj0tYSp1L2MsZD1iZShvLHMpLHA9X2UobyxoKSxtPV9lKHMsZik7eGUocCxtKTt2YXIgZz1kLHY9eWUocCxnKSx5PXllKGcsZyksYj12KnYteSooeWUocCxwKS0xKTtpZighKGI8MCkpe3ZhciB4PU1hdGguc3FydChiKSxfPV9lKGcsKC12LXgpL3kpO2lmKHhlKF8scCksXz1NZShfKSwhcilyZXR1cm4gXzt2YXIgdyxNPXRbMF0sQT1lWzBdLGs9dFsxXSxUPWVbMV07QTxNJiYodz1NLE09QSxBPXcpO3ZhciBFPUEtTSxTPXhvKEUtTm8pPEZvLEw9U3x8RTxGbztpZighUyYmVDxrJiYodz1rLGs9VCxUPXcpLEw/Uz9rK1Q+MF5fWzFdPCh4byhfWzBdLU0pPEZvP2s6VCk6azw9X1sxXSYmX1sxXTw9VDpFPk5vXihNPD1fWzBdJiZfWzBdPD1BKSl7dmFyIEM9X2UoZywoLXYreCkveSk7cmV0dXJuIHhlKEMscCksW18sTWUoQyldfX19ZnVuY3Rpb24gaShlLHIpe3ZhciBuPW8/dDpOby10LGk9MDtyZXR1cm4gZTwtbj9pfD0xOmU+biYmKGl8PTIpLHI8LW4/aXw9NDpyPm4mJihpfD04KSxpfXZhciBhPU1hdGguY29zKHQpLG89YT4wLHM9eG8oYSk+Rm8sbD1ncih0LDYqcW8pO3JldHVybiBPZShlLHIsbCxvP1swLC10XTpbLU5vLHQtTm9dKX1mdW5jdGlvbiBIZSh0LGUscixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIGEsbz1pLmEscz1pLmIsbD1vLngsdT1vLnksYz1zLngsaD1zLnksZj0wLGQ9MSxwPWMtbCxtPWgtdTtpZihhPXQtbCxwfHwhKGE+MCkpe2lmKGEvPXAscDwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihwPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPXItbCxwfHwhKGE8MCkpe2lmKGEvPXAscDwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihwPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1pZihhPWUtdSxtfHwhKGE+MCkpe2lmKGEvPW0sbTwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihtPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPW4tdSxtfHwhKGE8MCkpe2lmKGEvPW0sbTwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihtPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1yZXR1cm4gZj4wJiYoaS5hPXt4OmwrZipwLHk6dStmKm19KSxkPDEmJihpLmI9e3g6bCtkKnAseTp1K2QqbX0pLGl9fX19fX1mdW5jdGlvbiBZZSh0LGUscixuKXtmdW5jdGlvbiBpKG4saSl7cmV0dXJuIHhvKG5bMF0tdCk8Rm8/aT4wPzA6Mzp4byhuWzBdLXIpPEZvP2k+MD8yOjE6eG8oblsxXS1lKTxGbz9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBvKHQueCxlLngpfWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1pKHQsMSksbj1pKGUsMSk7cmV0dXJuIHIhPT1uP3ItbjowPT09cj9lWzFdLXRbMV06MT09PXI/dFswXS1lWzBdOjI9PT1yP3RbMV0tZVsxXTplWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKHMpe2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlPTAscj1nLmxlbmd0aCxuPXRbMV0saT0wO2k8cjsrK2kpZm9yKHZhciBhLG89MSxzPWdbaV0sbD1zLmxlbmd0aCx1PXNbMF07bzxsOysrbylhPXNbb10sdVsxXTw9bj9hWzFdPm4mJmV0KHUsYSx0KT4wJiYrK2U6YVsxXTw9biYmZXQodSxhLHQpPDAmJi0tZSx1PWE7cmV0dXJuIDAhPT1lfWZ1bmN0aW9uIHUoYSxzLGwsdSl7dmFyIGM9MCxoPTA7aWYobnVsbD09YXx8KGM9aShhLGwpKSE9PShoPWkocyxsKSl8fG8oYSxzKTwwXmw+MCl7ZG8gdS5wb2ludCgwPT09Y3x8Mz09PWM/dDpyLGM+MT9uOmUpO3doaWxlKChjPShjK2wrNCklNCkhPT1oKX1lbHNlIHUucG9pbnQoc1swXSxzWzFdKX1mdW5jdGlvbiBjKGksYSl7cmV0dXJuIHQ8PWkmJmk8PXImJmU8PWEmJmE8PW59ZnVuY3Rpb24gaCh0LGUpe2ModCxlKSYmcy5wb2ludCh0LGUpfWZ1bmN0aW9uIGYoKXtMLnBvaW50PXAsZyYmZy5wdXNoKHY9W10pLEE9ITAsTT0hMSxfPXc9TmFOfWZ1bmN0aW9uIGQoKXttJiYocCh5LGIpLHgmJk0mJkUucmVqb2luKCksbS5wdXNoKEUuYnVmZmVyKCkpKSxMLnBvaW50PWgsTSYmcy5saW5lRW5kKCl9ZnVuY3Rpb24gcCh0LGUpe3Q9TWF0aC5tYXgoLUJzLE1hdGgubWluKEJzLHQpKSxlPU1hdGgubWF4KC1CcyxNYXRoLm1pbihCcyxlKSk7dmFyIHI9Yyh0LGUpO2lmKGcmJnYucHVzaChbdCxlXSksQSl5PXQsYj1lLHg9cixBPSExLHImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSk7ZWxzZSBpZihyJiZNKXMucG9pbnQodCxlKTtlbHNle3ZhciBuPXthOnt4Ol8seTp3fSxiOnt4OnQseTplfX07UyhuKT8oTXx8KHMubGluZVN0YXJ0KCkscy5wb2ludChuLmEueCxuLmEueSkpLHMucG9pbnQobi5iLngsbi5iLnkpLHJ8fHMubGluZUVuZCgpLGs9ITEpOnImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSxrPSExKX1fPXQsdz1lLE09cn12YXIgbSxnLHYseSxiLHgsXyx3LE0sQSxrLFQ9cyxFPUZlKCksUz1IZSh0LGUscixuKSxMPXtwb2ludDpoLGxpbmVTdGFydDpmLGxpbmVFbmQ6ZCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzPUUsbT1bXSxnPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzPVQsbT11by5tZXJnZShtKTt2YXIgZT1sKFt0LG5dKSxyPWsmJmUsaT1tLmxlbmd0aDsocnx8aSkmJihzLnBvbHlnb25TdGFydCgpLHImJihzLmxpbmVTdGFydCgpLHUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGkmJnplKG0sYSxlLHUscykscy5wb2x5Z29uRW5kKCkpLG09Zz12PW51bGx9fTtyZXR1cm4gTH19ZnVuY3Rpb24gR2UodCl7dmFyIGU9MCxyPU5vLzMsbj1scih0KSxpPW4oZSxyKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihlPXRbMF0qTm8vMTgwLHI9dFsxXSpOby8xODApOltlL05vKjE4MCxyL05vKjE4MF19LGl9ZnVuY3Rpb24gWGUodCxlKXtmdW5jdGlvbiByKHQsZSl7dmFyIHI9TWF0aC5zcXJ0KGEtMippKk1hdGguc2luKGUpKS9pO3JldHVybltyKk1hdGguc2luKHQqPWkpLG8tcipNYXRoLmNvcyh0KV19dmFyIG49TWF0aC5zaW4odCksaT0obitNYXRoLnNpbihlKSkvMixhPTErbiooMippLW4pLG89TWF0aC5zcXJ0KGEpL2k7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9by1lO3JldHVybltNYXRoLmF0YW4yKHQscikvaSxudCgoYS0odCp0K3IqcikqaSppKS8oMippKSldfSxyfWZ1bmN0aW9uIFdlKCl7ZnVuY3Rpb24gdCh0LGUpe1ZzKz1pKnQtbiplLG49dCxpPWV9dmFyIGUscixuLGk7WHMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtYcy5wb2ludD10LGU9bj1hLHI9aT1vfSxYcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiBaZSh0LGUpe3Q8cXMmJihxcz10KSx0PllzJiYoWXM9dCksZTxIcyYmKEhzPWUpLGU+R3MmJihHcz1lKX1mdW5jdGlvbiBKZSgpe2Z1bmN0aW9uIHQodCxlKXtvLnB1c2goIk0iLHQsIiwiLGUsYSl9ZnVuY3Rpb24gZSh0LGUpe28ucHVzaCgiTSIsdCwiLCIsZSkscy5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtvLnB1c2goIkwiLHQsIiwiLGUpfWZ1bmN0aW9uIG4oKXtzLnBvaW50PXR9ZnVuY3Rpb24gaSgpe28ucHVzaCgiWiIpfXZhciBhPUtlKDQuNSksbz1bXSxzPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe3MucG9pbnQ9ZX0sbGluZUVuZDpuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3MubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cy5saW5lRW5kPW4scy5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gYT1LZSh0KSxzfSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZihvLmxlbmd0aCl7dmFyIHQ9by5qb2luKCIiKTtyZXR1cm4gbz1bXSx0fX19O3JldHVybiBzfWZ1bmN0aW9uIEtlKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uIFFlKHQsZSl7THMrPXQsQ3MrPWUsKytJc31mdW5jdGlvbiAkZSgpe2Z1bmN0aW9uIHQodCxuKXt2YXIgaT10LWUsYT1uLXIsbz1NYXRoLnNxcnQoaSppK2EqYSk7enMrPW8qKGUrdCkvMixEcys9byoocituKS8yLFBzKz1vLFFlKGU9dCxyPW4pfXZhciBlLHI7WnMucG9pbnQ9ZnVuY3Rpb24obixpKXtacy5wb2ludD10LFFlKGU9bixyPWkpfX1mdW5jdGlvbiB0cigpe1pzLnBvaW50PVFlfWZ1bmN0aW9uIGVyKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXQtbixhPWUtaSxvPU1hdGguc3FydChyKnIrYSphKTt6cys9byoobit0KS8yLERzKz1vKihpK2UpLzIsUHMrPW8sbz1pKnQtbiplLE9zKz1vKihuK3QpLFJzKz1vKihpK2UpLEZzKz0zKm8sUWUobj10LGk9ZSl9dmFyIGUscixuLGk7WnMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtacy5wb2ludD10LFFlKGU9bj1hLHI9aT1vKX0sWnMubGluZUVuZD1mdW5jdGlvbigpe3QoZSxyKX19ZnVuY3Rpb24gcnIodCl7ZnVuY3Rpb24gZShlLHIpe3QubW92ZVRvKGUrbyxyKSx0LmFyYyhlLHIsbywwLEJvKX1mdW5jdGlvbiByKGUscil7dC5tb3ZlVG8oZSxyKSxzLnBvaW50PW59ZnVuY3Rpb24gbihlLHIpe3QubGluZVRvKGUscil9ZnVuY3Rpb24gaSgpe3MucG9pbnQ9ZX1mdW5jdGlvbiBhKCl7dC5jbG9zZVBhdGgoKX12YXIgbz00LjUscz17cG9pbnQ6ZSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtzLnBvaW50PXJ9LGxpbmVFbmQ6aSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzLmxpbmVFbmQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3MubGluZUVuZD1pLHMucG9pbnQ9ZX0scG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxzfSxyZXN1bHQ6TX07cmV0dXJuIHN9ZnVuY3Rpb24gbnIodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ocz9uOnIpKHQpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIG9yKGUsZnVuY3Rpb24ocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9KX1mdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gbigpe2I9TmFOLEEucG9pbnQ9YSxlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGEocixuKXt2YXIgYT12ZShbcixuXSksbz10KHIsbik7aShiLHgseSxfLHcsTSxiPW9bMF0seD1vWzFdLHk9cixfPWFbMF0sdz1hWzFdLE09YVsyXSxzLGUpLGUucG9pbnQoYix4KX1mdW5jdGlvbiBvKCl7QS5wb2ludD1yLGUubGluZUVuZCgpfWZ1bmN0aW9uIGwoKXtuKCksQS5wb2ludD11LEEubGluZUVuZD1jfWZ1bmN0aW9uIHUodCxlKXthKGg9dCxmPWUpLGQ9YixwPXgsbT1fLGc9dyx2PU0sQS5wb2ludD1hfWZ1bmN0aW9uIGMoKXtpKGIseCx5LF8sdyxNLGQscCxoLG0sZyx2LHMsZSksQS5saW5lRW5kPW8sbygpfXZhciBoLGYsZCxwLG0sZyx2LHksYix4LF8sdyxNLEE9e3BvaW50OnIsbGluZVN0YXJ0Om4sbGluZUVuZDpvLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksQS5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLEEubGluZVN0YXJ0PW59fTtyZXR1cm4gQX1mdW5jdGlvbiBpKGUscixuLHMsbCx1LGMsaCxmLGQscCxtLGcsdil7dmFyIHk9Yy1lLGI9aC1yLHg9eSp5K2IqYjtpZih4PjQqYSYmZy0tKXt2YXIgXz1zK2Qsdz1sK3AsTT11K20sQT1NYXRoLnNxcnQoXypfK3cqdytNKk0pLGs9TWF0aC5hc2luKE0vPUEpLFQ9eG8oeG8oTSktMSk8Rm98fHhvKG4tZik8Rm8/KG4rZikvMjpNYXRoLmF0YW4yKHcsXyksRT10KFQsayksUz1FWzBdLEw9RVsxXSxDPVMtZSxJPUwtcix6PWIqQy15Kkk7KHoqei94PmF8fHhvKCh5KkMrYipJKS94LS41KT4uM3x8cypkK2wqcCt1Km08bykmJihpKGUscixuLHMsbCx1LFMsTCxULF8vPUEsdy89QSxNLGcsdiksdi5wb2ludChTLEwpLGkoUyxMLFQsXyx3LE0sYyxoLGYsZCxwLG0sZyx2KSl9fXZhciBhPS41LG89TWF0aC5jb3MoMzAqcW8pLHM9MTY7cmV0dXJuIGUucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPShhPXQqdCk+MCYmMTYsZSk6TWF0aC5zcXJ0KGEpfSxlfWZ1bmN0aW9uIGlyKHQpe3ZhciBlPW5yKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQoW2UqSG8scipIb10pfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB1cihlKHQpKX19ZnVuY3Rpb24gYXIodCl7dGhpcy5zdHJlYW09dH1mdW5jdGlvbiBvcih0LGUpe3JldHVybntwb2ludDplLHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gc3IodCl7cmV0dXJuIGxyKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIGxyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQ9cyh0WzBdKnFvLHRbMV0qcW8pLFt0WzBdKmYrbCx1LXRbMV0qZl19ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD1zLmludmVydCgodFswXS1sKS9mLCh1LXRbMV0pL2YpLHQmJlt0WzBdKkhvLHRbMV0qSG9dfWZ1bmN0aW9uIG4oKXtzPUNlKG89ZnIodix5LGIpLGEpO3ZhciB0PWEobSxnKTtyZXR1cm4gbD1kLXRbMF0qZix1PXArdFsxXSpmLGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIGMmJihjLnZhbGlkPSExLGM9bnVsbCksZX12YXIgYSxvLHMsbCx1LGMsaD1ucihmdW5jdGlvbih0LGUpe3JldHVybiB0PWEodCxlKSxbdFswXSpmK2wsdS10WzFdKmZdfSksZj0xNTAsZD00ODAscD0yNTAsbT0wLGc9MCx2PTAseT0wLGI9MCxfPU5zLHc9eCxNPW51bGwsQT1udWxsO3JldHVybiBlLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmKGMudmFsaWQ9ITEpLGM9dXIoXyhvLGgodyh0KSkpKSxjLnZhbGlkPSEwLGN9LGUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPW51bGw9PXQ/KE09dCxOcyk6cWUoKE09K3QpKnFvKSxpKCkpOk19LGUuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10LHc9dD9ZZSh0WzBdWzBdLHRbMF1bMV0sdFsxXVswXSx0WzFdWzFdKTp4LGkoKSk6QX0sZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdCxuKCkpOmZ9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0sbigpKTpbZCxwXX0sZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dFswXSUzNjAqcW8sZz10WzFdJTM2MCpxbyxuKCkpOlttKkhvLGcqSG9dfSxlLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj10WzBdJTM2MCpxbyx5PXRbMV0lMzYwKnFvLGI9dC5sZW5ndGg+Mj90WzJdJTM2MCpxbzowLG4oKSk6W3YqSG8seSpIbyxiKkhvXX0sdW8ucmViaW5kKGUsaCwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gYT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLmludmVydD1hLmludmVydCYmcixuKCl9fWZ1bmN0aW9uIHVyKHQpe3JldHVybiBvcih0LGZ1bmN0aW9uKGUscil7dC5wb2ludChlKnFvLHIqcW8pfSl9ZnVuY3Rpb24gY3IodCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBocih0LGUpe3JldHVyblt0Pk5vP3QtQm86dDwtTm8/dCtCbzp0LGVdfWZ1bmN0aW9uIGZyKHQsZSxyKXtyZXR1cm4gdD9lfHxyP0NlKHByKHQpLG1yKGUscikpOnByKHQpOmV8fHI/bXIoZSxyKTpocn1mdW5jdGlvbiBkcih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gZSs9dCxbZT5Obz9lLUJvOmU8LU5vP2UrQm86ZSxyXX19ZnVuY3Rpb24gcHIodCl7dmFyIGU9ZHIodCk7cmV0dXJuIGUuaW52ZXJ0PWRyKC10KSxlfWZ1bmN0aW9uIG1yKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPU1hdGguY29zKGUpLHM9TWF0aC5jb3ModCkqcixsPU1hdGguc2luKHQpKnIsdT1NYXRoLnNpbihlKSxjPXUqbitzKmk7cmV0dXJuW01hdGguYXRhbjIobCphLWMqbyxzKm4tdSppKSxudChjKmErbCpvKV19dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxhPU1hdGguY29zKGUpLG89TWF0aC5zaW4oZSk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5jb3MoZSkscz1NYXRoLmNvcyh0KSpyLGw9TWF0aC5zaW4odCkqcix1PU1hdGguc2luKGUpLGM9dSphLWwqbztyZXR1cm5bTWF0aC5hdGFuMihsKmErdSpvLHMqbitjKmkpLG50KGMqbi1zKmkpXX0scn1mdW5jdGlvbiBncih0LGUpe3ZhciByPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIGZ1bmN0aW9uKGksYSxvLHMpe3ZhciBsPW8qZTtudWxsIT1pPyhpPXZyKHIsaSksYT12cihyLGEpLChvPjA/aTxhOmk+YSkmJihpKz1vKkJvKSk6KGk9dCtvKkJvLGE9dC0uNSpsKTtmb3IodmFyIHUsYz1pO28+MD9jPmE6YzxhO2MtPWwpcy5wb2ludCgodT1NZShbciwtbipNYXRoLmNvcyhjKSwtbipNYXRoLnNpbihjKV0pKVswXSx1WzFdKX19ZnVuY3Rpb24gdnIodCxlKXt2YXIgcj12ZShlKTtyWzBdLT10LHdlKHIpO3ZhciBuPXJ0KC1yWzFdKTtyZXR1cm4oKC1yWzJdPDA/LW46bikrMipNYXRoLlBJLUZvKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB5cih0LGUscil7dmFyIG49dW8ucmFuZ2UodCxlLUZvLHIpLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSl9fWZ1bmN0aW9uIGJyKHQsZSxyKXt2YXIgbj11by5yYW5nZSh0LGUtRm8scikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdF19KX19ZnVuY3Rpb24geHIodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiB3cih0LGUscixuKXt2YXIgaT1NYXRoLmNvcyhlKSxhPU1hdGguc2luKGUpLG89TWF0aC5jb3Mobikscz1NYXRoLnNpbihuKSxsPWkqTWF0aC5jb3ModCksdT1pKk1hdGguc2luKHQpLGM9bypNYXRoLmNvcyhyKSxoPW8qTWF0aC5zaW4ociksZj0yKk1hdGguYXNpbihNYXRoLnNxcnQoc3Qobi1lKStpKm8qc3Qoci10KSkpLGQ9MS9NYXRoLnNpbihmKSxwPWY/ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zaW4odCo9ZikqZCxyPU1hdGguc2luKGYtdCkqZCxuPXIqbCtlKmMsaT1yKnUrZSpoLG89ciphK2UqcztyZXR1cm5bTWF0aC5hdGFuMihpLG4pKkhvLE1hdGguYXRhbjIobyxNYXRoLnNxcnQobipuK2kqaSkpKkhvXX06ZnVuY3Rpb24oKXtyZXR1cm5bdCpIbyxlKkhvXX07cmV0dXJuIHAuZGlzdGFuY2U9ZixwfWZ1bmN0aW9uIE1yKCl7ZnVuY3Rpb24gdCh0LGkpe3ZhciBhPU1hdGguc2luKGkqPXFvKSxvPU1hdGguY29zKGkpLHM9eG8oKHQqPXFvKS1lKSxsPU1hdGguY29zKHMpO0pzKz1NYXRoLmF0YW4yKE1hdGguc3FydCgocz1vKk1hdGguc2luKHMpKSpzKyhzPW4qYS1yKm8qbCkqcyksciphK24qbypsKSxlPXQscj1hLG49b312YXIgZSxyLG47S3MucG9pbnQ9ZnVuY3Rpb24oaSxhKXtlPWkqcW8scj1NYXRoLnNpbihhKj1xbyksbj1NYXRoLmNvcyhhKSxLcy5wb2ludD10fSxLcy5saW5lRW5kPWZ1bmN0aW9uKCl7S3MucG9pbnQ9S3MubGluZUVuZD1NfX1mdW5jdGlvbiBBcih0LGUpe2Z1bmN0aW9uIHIoZSxyKXt2YXIgbj1NYXRoLmNvcyhlKSxpPU1hdGguY29zKHIpLGE9dChuKmkpO3JldHVyblthKmkqTWF0aC5zaW4oZSksYSpNYXRoLnNpbihyKV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQscil7dmFyIG49TWF0aC5zcXJ0KHQqdCtyKnIpLGk9ZShuKSxhPU1hdGguc2luKGkpLG89TWF0aC5jb3MoaSk7cmV0dXJuW01hdGguYXRhbjIodCphLG4qbyksTWF0aC5hc2luKG4mJnIqYS9uKV19LHJ9ZnVuY3Rpb24ga3IodCxlKXtmdW5jdGlvbiByKHQsZSl7bz4wP2U8LVZvK0ZvJiYoZT0tVm8rRm8pOmU+Vm8tRm8mJihlPVZvLUZvKTt2YXIgcj1vL01hdGgucG93KGkoZSksYSk7cmV0dXJuW3IqTWF0aC5zaW4oYSp0KSxvLXIqTWF0aC5jb3MoYSp0KV19dmFyIG49TWF0aC5jb3ModCksaT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC50YW4oTm8vNCt0LzIpfSxhPXQ9PT1lP01hdGguc2luKHQpOk1hdGgubG9nKG4vTWF0aC5jb3MoZSkpL01hdGgubG9nKGkoZSkvaSh0KSksbz1uKk1hdGgucG93KGkodCksYSkvYTtyZXR1cm4gYT8oci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1vLWUsbj10dChhKSpNYXRoLnNxcnQodCp0K3Iqcik7cmV0dXJuW01hdGguYXRhbjIodCxyKS9hLDIqTWF0aC5hdGFuKE1hdGgucG93KG8vbiwxL2EpKS1Wb119LHIpOkVyfWZ1bmN0aW9uIFRyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPWEtZTtyZXR1cm5bcipNYXRoLnNpbihpKnQpLGEtcipNYXRoLmNvcyhpKnQpXX12YXIgbj1NYXRoLmNvcyh0KSxpPXQ9PT1lP01hdGguc2luKHQpOihuLU1hdGguY29zKGUpKS8oZS10KSxhPW4vaSt0O3JldHVybiB4byhpKTxGbz9jcjooci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hLWU7cmV0dXJuW01hdGguYXRhbjIodCxyKS9pLGEtdHQoaSkqTWF0aC5zcXJ0KHQqdCtyKnIpXX0scil9ZnVuY3Rpb24gRXIodCxlKXtyZXR1cm5bdCxNYXRoLmxvZyhNYXRoLnRhbihOby80K2UvMikpXX1mdW5jdGlvbiBTcih0KXt2YXIgZSxyPXNyKHQpLG49ci5zY2FsZSxpPXIudHJhbnNsYXRlLGE9ci5jbGlwRXh0ZW50O3JldHVybiByLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1yP2U/ci5jbGlwRXh0ZW50KG51bGwpOnI6dH0sci50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gdD09PXI/ZT9yLmNsaXBFeHRlbnQobnVsbCk6cjp0fSxyLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG89YS5hcHBseShyLGFyZ3VtZW50cyk7aWYobz09PXIpe2lmKGU9bnVsbD09dCl7dmFyIHM9Tm8qbigpLGw9aSgpO2EoW1tsWzBdLXMsbFsxXS1zXSxbbFswXStzLGxbMV0rc11dKX19ZWxzZSBlJiYobz1udWxsKTtyZXR1cm4gb30sci5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIExyKHQsZSl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKE5vLzQrZS8yKSksLXRdfWZ1bmN0aW9uIENyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIElyKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHpyKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPVswLDFdLG49MixpPTI7aTxlO2krKyl7Zm9yKDtuPjEmJmV0KHRbcltuLTJdXSx0W3Jbbi0xXV0sdFtpXSk8PTA7KS0tbjtyW24rK109aX1yZXR1cm4gci5zbGljZSgwLG4pfWZ1bmN0aW9uIERyKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIFByKHQsZSxyKXtyZXR1cm4oclswXS1lWzBdKSoodFsxXS1lWzFdKTwoclsxXS1lWzFdKSoodFswXS1lWzBdKX1mdW5jdGlvbiBPcih0LGUscixuKXt2YXIgaT10WzBdLGE9clswXSxvPWVbMF0taSxzPW5bMF0tYSxsPXRbMV0sdT1yWzFdLGM9ZVsxXS1sLGg9blsxXS11LGY9KHMqKGwtdSktaCooaS1hKSkvKGgqby1zKmMpO3JldHVybltpK2YqbyxsK2YqY119ZnVuY3Rpb24gUnIodCl7dmFyIGU9dFswXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIShlWzBdLXJbMF18fGVbMV0tclsxXSl9ZnVuY3Rpb24gRnIoKXthbih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24ganIodCl7dmFyIGU9dWwucG9wKCl8fG5ldyBGcjtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiBOcih0KXtacih0KSxvbC5yZW1vdmUodCksdWwucHVzaCh0KSxhbih0KX1mdW5jdGlvbiBCcih0KXt2YXIgZT10LmNpcmNsZSxyPWUueCxuPWUuY3ksaT17eDpyLHk6bn0sYT10LlAsbz10Lk4scz1bdF07TnIodCk7Zm9yKHZhciBsPWE7bC5jaXJjbGUmJnhvKHItbC5jaXJjbGUueCk8Rm8mJnhvKG4tbC5jaXJjbGUuY3kpPEZvOylhPWwuUCxzLnVuc2hpZnQobCksTnIobCksbD1hO3MudW5zaGlmdChsKSxacihsKTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmeG8oci11LmNpcmNsZS54KTxGbyYmeG8obi11LmNpcmNsZS5jeSk8Rm87KW89dS5OLHMucHVzaCh1KSxOcih1KSx1PW87cy5wdXNoKHUpLFpyKHUpO3ZhciBjLGg9cy5sZW5ndGg7Zm9yKGM9MTtjPGg7KytjKXU9c1tjXSxsPXNbYy0xXSxlbih1LmVkZ2UsbC5zaXRlLHUuc2l0ZSxpKTtsPXNbMF0sdT1zW2gtMV0sdS5lZGdlPSRyKGwuc2l0ZSx1LnNpdGUsbnVsbCxpKSxXcihsKSxXcih1KX1mdW5jdGlvbiBVcih0KXtmb3IodmFyIGUscixuLGksYT10Lngsbz10Lnkscz1vbC5fO3M7KWlmKG49VnIocyxvKS1hLG4+Rm8pcz1zLkw7ZWxzZXtpZihpPWEtcXIocyxvKSwhKGk+Rm8pKXtuPi1Gbz8oZT1zLlAscj1zKTppPi1Gbz8oZT1zLHI9cy5OKTplPXI9czticmVha31pZighcy5SKXtlPXM7YnJlYWt9cz1zLlJ9dmFyIGw9anIodCk7aWYob2wuaW5zZXJ0KGUsbCksZXx8cil7aWYoZT09PXIpcmV0dXJuIFpyKGUpLHI9anIoZS5zaXRlKSxvbC5pbnNlcnQobCxyKSxsLmVkZ2U9ci5lZGdlPSRyKGUuc2l0ZSxsLnNpdGUpLFdyKGUpLHZvaWQgV3Iocik7aWYoIXIpcmV0dXJuIHZvaWQobC5lZGdlPSRyKGUuc2l0ZSxsLnNpdGUpKTtacihlKSxacihyKTt2YXIgdT1lLnNpdGUsYz11LngsaD11LnksZj10LngtYyxkPXQueS1oLHA9ci5zaXRlLG09cC54LWMsZz1wLnktaCx2PTIqKGYqZy1kKm0pLHk9ZipmK2QqZCxiPW0qbStnKmcseD17eDooZyp5LWQqYikvditjLHk6KGYqYi1tKnkpL3YraH07ZW4oci5lZGdlLHUscCx4KSxsLmVkZ2U9JHIodSx0LG51bGwseCksci5lZGdlPSRyKHQscCxudWxsLHgpLFdyKGUpLFdyKHIpfX1mdW5jdGlvbiBWcih0LGUpe3ZhciByPXQuc2l0ZSxuPXIueCxpPXIueSxhPWktZTtpZighYSlyZXR1cm4gbjt2YXIgbz10LlA7aWYoIW8pcmV0dXJuLSgxLzApO3I9by5zaXRlO3ZhciBzPXIueCxsPXIueSx1PWwtZTtpZighdSlyZXR1cm4gczt2YXIgYz1zLW4saD0xL2EtMS91LGY9Yy91O3JldHVybiBoPygtZitNYXRoLnNxcnQoZipmLTIqaCooYypjLygtMip1KS1sK3UvMitpLWEvMikpKS9oK246KG4rcykvMn1mdW5jdGlvbiBxcih0LGUpe3ZhciByPXQuTjtpZihyKXJldHVybiBWcihyLGUpO3ZhciBuPXQuc2l0ZTtyZXR1cm4gbi55PT09ZT9uLng6MS8wfWZ1bmN0aW9uIEhyKHQpe3RoaXMuc2l0ZT10LHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gWXIodCl7Zm9yKHZhciBlLHIsbixpLGEsbyxzLGwsdSxjLGg9dFswXVswXSxmPXRbMV1bMF0sZD10WzBdWzFdLHA9dFsxXVsxXSxtPWFsLGc9bS5sZW5ndGg7Zy0tOylpZihhPW1bZ10sYSYmYS5wcmVwYXJlKCkpZm9yKHM9YS5lZGdlcyxsPXMubGVuZ3RoLG89MDtvPGw7KWM9c1tvXS5lbmQoKSxuPWMueCxpPWMueSx1PXNbKytvJWxdLnN0YXJ0KCksZT11Lngscj11LnksKHhvKG4tZSk+Rm98fHhvKGktcik+Rm8pJiYocy5zcGxpY2UobywwLG5ldyBybih0bihhLnNpdGUsYyx4byhuLWgpPEZvJiZwLWk+Rm8/e3g6aCx5OnhvKGUtaCk8Rm8/cjpwfTp4byhpLXApPEZvJiZmLW4+Rm8/e3g6eG8oci1wKTxGbz9lOmYseTpwfTp4byhuLWYpPEZvJiZpLWQ+Rm8/e3g6Zix5OnhvKGUtZik8Rm8/cjpkfTp4byhpLWQpPEZvJiZuLWg+Rm8/e3g6eG8oci1kKTxGbz9lOmgseTpkfTpudWxsKSxhLnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gR3IodCxlKXtyZXR1cm4gZS5hbmdsZS10LmFuZ2xlfWZ1bmN0aW9uIFhyKCl7YW4odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFdyKHQpe3ZhciBlPXQuUCxyPXQuTjtpZihlJiZyKXt2YXIgbj1lLnNpdGUsaT10LnNpdGUsYT1yLnNpdGU7aWYobiE9PWEpe3ZhciBvPWkueCxzPWkueSxsPW4ueC1vLHU9bi55LXMsYz1hLngtbyxoPWEueS1zLGY9MioobCpoLXUqYyk7aWYoIShmPj0tam8pKXt2YXIgZD1sKmwrdSp1LHA9YypjK2gqaCxtPShoKmQtdSpwKS9mLGc9KGwqcC1jKmQpL2YsaD1nK3Msdj1jbC5wb3AoKXx8bmV3IFhyO3YuYXJjPXQsdi5zaXRlPWksdi54PW0rbyx2Lnk9aCtNYXRoLnNxcnQobSptK2cqZyksdi5jeT1oLHQuY2lyY2xlPXY7Zm9yKHZhciB5PW51bGwsYj1sbC5fO2I7KWlmKHYueTxiLnl8fHYueT09PWIueSYmdi54PD1iLngpe2lmKCFiLkwpe3k9Yi5QO2JyZWFrfWI9Yi5MfWVsc2V7aWYoIWIuUil7eT1iO2JyZWFrfWI9Yi5SfWxsLmluc2VydCh5LHYpLHl8fChzbD12KX19fX1mdW5jdGlvbiBacih0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoc2w9ZS5OKSxsbC5yZW1vdmUoZSksY2wucHVzaChlKSxhbihlKSx0LmNpcmNsZT1udWxsKX1mdW5jdGlvbiBKcih0KXtmb3IodmFyIGUscj1pbCxuPUhlKHRbMF1bMF0sdFswXVsxXSx0WzFdWzBdLHRbMV1bMV0pLGk9ci5sZW5ndGg7aS0tOyllPXJbaV0sKCFLcihlLHQpfHwhbihlKXx8eG8oZS5hLngtZS5iLngpPEZvJiZ4byhlLmEueS1lLmIueSk8Rm8pJiYoZS5hPWUuYj1udWxsLHIuc3BsaWNlKGksMSkpfWZ1bmN0aW9uIEtyKHQsZSl7dmFyIHI9dC5iO2lmKHIpcmV0dXJuITA7dmFyIG4saSxhPXQuYSxvPWVbMF1bMF0scz1lWzFdWzBdLGw9ZVswXVsxXSx1PWVbMV1bMV0sYz10LmwsaD10LnIsZj1jLngsZD1jLnkscD1oLngsbT1oLnksZz0oZitwKS8yLHY9KGQrbSkvMjtpZihtPT09ZCl7aWYoZzxvfHxnPj1zKXJldHVybjtpZihmPnApe2lmKGEpe2lmKGEueT49dSlyZXR1cm59ZWxzZSBhPXt4OmcseTpsfTtyPXt4OmcseTp1fX1lbHNle2lmKGEpe2lmKGEueTxsKXJldHVybn1lbHNlIGE9e3g6Zyx5OnV9O3I9e3g6Zyx5Omx9fX1lbHNlIGlmKG49KGYtcCkvKG0tZCksaT12LW4qZyxuPC0xfHxuPjEpaWYoZj5wKXtpZihhKXtpZihhLnk+PXUpcmV0dXJufWVsc2UgYT17eDoobC1pKS9uLHk6bH07cj17eDoodS1pKS9uLHk6dX19ZWxzZXtpZihhKXtpZihhLnk8bClyZXR1cm59ZWxzZSBhPXt4Oih1LWkpL24seTp1fTtyPXt4OihsLWkpL24seTpsfX1lbHNlIGlmKGQ8bSl7aWYoYSl7aWYoYS54Pj1zKXJldHVybn1lbHNlIGE9e3g6byx5Om4qbytpfTtyPXt4OnMseTpuKnMraX19ZWxzZXtpZihhKXtpZihhLng8bylyZXR1cm59ZWxzZSBhPXt4OnMseTpuKnMraX07cj17eDpvLHk6bipvK2l9fXJldHVybiB0LmE9YSx0LmI9ciwhMH1mdW5jdGlvbiBRcih0LGUpe3RoaXMubD10LHRoaXMucj1lLHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiAkcih0LGUscixuKXt2YXIgaT1uZXcgUXIodCxlKTtyZXR1cm4gaWwucHVzaChpKSxyJiZlbihpLHQsZSxyKSxuJiZlbihpLGUsdCxuKSxhbFt0LmldLmVkZ2VzLnB1c2gobmV3IHJuKGksdCxlKSksYWxbZS5pXS5lZGdlcy5wdXNoKG5ldyBybihpLGUsdCkpLGl9ZnVuY3Rpb24gdG4odCxlLHIpe3ZhciBuPW5ldyBRcih0LG51bGwpO3JldHVybiBuLmE9ZSxuLmI9cixpbC5wdXNoKG4pLG59ZnVuY3Rpb24gZW4odCxlLHIsbil7dC5hfHx0LmI/dC5sPT09cj90LmI9bjp0LmE9bjoodC5hPW4sdC5sPWUsdC5yPXIpfWZ1bmN0aW9uIHJuKHQsZSxyKXt2YXIgbj10LmEsaT10LmI7dGhpcy5lZGdlPXQsdGhpcy5zaXRlPWUsdGhpcy5hbmdsZT1yP01hdGguYXRhbjIoci55LWUueSxyLngtZS54KTp0Lmw9PT1lP01hdGguYXRhbjIoaS54LW4ueCxuLnktaS55KTpNYXRoLmF0YW4yKG4ueC1pLngsaS55LW4ueSl9ZnVuY3Rpb24gbm4oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBhbih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIG9uKHQsZSl7dmFyIHI9ZSxuPWUuUixpPXIuVTtpP2kuTD09PXI/aS5MPW46aS5SPW46dC5fPW4sbi5VPWksci5VPW4sci5SPW4uTCxyLlImJihyLlIuVT1yKSxuLkw9cn1mdW5jdGlvbiBzbih0LGUpe3ZhciByPWUsbj1lLkwsaT1yLlU7aT9pLkw9PT1yP2kuTD1uOmkuUj1uOnQuXz1uLG4uVT1pLHIuVT1uLHIuTD1uLlIsci5MJiYoci5MLlU9ciksbi5SPXJ9ZnVuY3Rpb24gbG4odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIHVuKHQsZSl7dmFyIHIsbixpLGE9dC5zb3J0KGNuKS5wb3AoKTtmb3IoaWw9W10sYWw9bmV3IEFycmF5KHQubGVuZ3RoKSxvbD1uZXcgbm4sbGw9bmV3IG5uOzspaWYoaT1zbCxhJiYoIWl8fGEueTxpLnl8fGEueT09PWkueSYmYS54PGkueCkpYS54PT09ciYmYS55PT09bnx8KGFsW2EuaV09bmV3IEhyKGEpLFVyKGEpLHI9YS54LG49YS55KSxhPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztCcihpLmFyYyl9ZSYmKEpyKGUpLFlyKGUpKTt2YXIgbz17Y2VsbHM6YWwsZWRnZXM6aWx9O3JldHVybiBvbD1sbD1pbD1hbD1udWxsLG99ZnVuY3Rpb24gY24odCxlKXtyZXR1cm4gZS55LXQueXx8ZS54LXQueH1mdW5jdGlvbiBobih0LGUscil7cmV0dXJuKHQueC1yLngpKihlLnktdC55KS0odC54LWUueCkqKHIueS10LnkpfWZ1bmN0aW9uIGZuKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gZG4odCl7cmV0dXJuIHQueX1mdW5jdGlvbiBwbigpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gbW4odCxlLHIsbixpLGEpe2lmKCF0KGUscixuLGksYSkpe3ZhciBvPS41KihyK2kpLHM9LjUqKG4rYSksbD1lLm5vZGVzO2xbMF0mJm1uKHQsbFswXSxyLG4sbyxzKSxsWzFdJiZtbih0LGxbMV0sbyxuLGkscyksbFsyXSYmbW4odCxsWzJdLHIscyxvLGEpLGxbM10mJm1uKHQsbFszXSxvLHMsaSxhKX19ZnVuY3Rpb24gZ24odCxlLHIsbixpLGEsbyl7dmFyIHMsbD0xLzA7cmV0dXJuIGZ1bmN0aW9uIHQodSxjLGgsZixkKXtpZighKGM+YXx8aD5vfHxmPG58fGQ8aSkpe2lmKHA9dS5wb2ludCl7dmFyIHAsbT1lLXUueCxnPXItdS55LHY9bSptK2cqZztpZih2PGwpe3ZhciB5PU1hdGguc3FydChsPXYpO249ZS15LGk9ci15LGE9ZSt5LG89cit5LHM9cH19Zm9yKHZhciBiPXUubm9kZXMseD0uNSooYytmKSxfPS41KihoK2QpLHc9ZT49eCxNPXI+PV8sQT1NPDwxfHcsaz1BKzQ7QTxrOysrQSlpZih1PWJbMyZBXSlzd2l0Y2goMyZBKXtjYXNlIDA6dCh1LGMsaCx4LF8pO2JyZWFrO2Nhc2UgMTp0KHUseCxoLGYsXyk7YnJlYWs7Y2FzZSAyOnQodSxjLF8seCxkKTticmVhaztjYXNlIDM6dCh1LHgsXyxmLGQpfX19KHQsbixpLGEsbyksc31mdW5jdGlvbiB2bih0LGUpe3Q9dW8ucmdiKHQpLGU9dW8ucmdiKGUpO3ZhciByPXQucixuPXQuZyxpPXQuYixhPWUuci1yLG89ZS5nLW4scz1lLmItaTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIiMiK3d0KE1hdGgucm91bmQocithKnQpKSt3dChNYXRoLnJvdW5kKG4rbyp0KSkrd3QoTWF0aC5yb3VuZChpK3MqdCkpfX1mdW5jdGlvbiB5bih0LGUpe3ZhciByLG49e30saT17fTtmb3IociBpbiB0KXIgaW4gZT9uW3JdPV9uKHRbcl0sZVtyXSk6aVtyXT10W3JdO2ZvcihyIGluIGUpciBpbiB0fHwoaVtyXT1lW3JdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHIgaW4gbilpW3JdPW5bcl0odCk7cmV0dXJuIGl9fWZ1bmN0aW9uIGJuKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihyKXtyZXR1cm4gdCooMS1yKStlKnJ9fWZ1bmN0aW9uIHhuKHQsZSl7dmFyIHIsbixpLGE9ZmwubGFzdEluZGV4PWRsLmxhc3RJbmRleD0wLG89LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsocj1mbC5leGVjKHQpKSYmKG49ZGwuZXhlYyhlKSk7KShpPW4uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW29dP3Nbb10rPWk6c1srK29dPWkpLChyPXJbMF0pPT09KG49blswXSk/c1tvXT9zW29dKz1uOnNbKytvXT1uOihzWysrb109bnVsbCxsLnB1c2goe2k6byx4OmJuKHIsbil9KSksYT1kbC5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tvXT9zW29dKz1pOnNbKytvXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGU9bFswXS54LGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gZX06KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MDtuPGU7KytuKXNbKHI9bFtuXSkuaV09ci54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gX24odCxlKXtmb3IodmFyIHIsbj11by5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLW4+PTAmJiEocj11by5pbnRlcnBvbGF0b3JzW25dKHQsZSkpOyk7cmV0dXJuIHJ9ZnVuY3Rpb24gd24odCxlKXt2YXIgcixuPVtdLGk9W10sYT10Lmxlbmd0aCxvPWUubGVuZ3RoLHM9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihyPTA7cjxzOysrciluLnB1c2goX24odFtyXSxlW3JdKSk7Zm9yKDtyPGE7KytyKWlbcl09dFtyXTtmb3IoO3I8bzsrK3IpaVtyXT1lW3JdO3JldHVybiBmdW5jdGlvbih0KXtmb3Iocj0wO3I8czsrK3IpaVtyXT1uW3JdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBNbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDplPj0xPzE6dChlKX19ZnVuY3Rpb24gQW4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAxLXQoMS1lKX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi41KihlPC41P3QoMiplKToyLXQoMi0yKmUpKX19ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQqdH1mdW5jdGlvbiBFbih0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gU24odCl7aWYodDw9MClyZXR1cm4gMDtpZih0Pj0xKXJldHVybiAxO3ZhciBlPXQqdCxyPWUqdDtyZXR1cm4gNCoodDwuNT9yOjMqKHQtZSkrci0uNzUpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gQ24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpWbyl9ZnVuY3Rpb24gSW4odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqKHQtMSkpfWZ1bmN0aW9uIHpuKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gRG4odCxlKXt2YXIgcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/cj1lL0JvKk1hdGguYXNpbigxL3QpOih0PTEscj1lLzQpLGZ1bmN0aW9uKG4pe3JldHVybiAxK3QqTWF0aC5wb3coMiwtMTAqbikqTWF0aC5zaW4oKG4tcikqQm8vZSl9fWZ1bmN0aW9uIFBuKHQpe3JldHVybiB0fHwodD0xLjcwMTU4KSxmdW5jdGlvbihlKXtyZXR1cm4gZSplKigodCsxKSplLXQpfX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fWZ1bmN0aW9uIFJuKHQsZSl7dD11by5oY2wodCksZT11by5oY2woZSk7dmFyIHI9dC5oLG49dC5jLGk9dC5sLGE9ZS5oLXIsbz1lLmMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuYzpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBmdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIEZuKHQsZSl7dD11by5oc2wodCksZT11by5oc2woZSk7dmFyIHI9dC5oLG49dC5zLGk9dC5sLGE9ZS5oLXIsbz1lLnMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuczpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBjdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIGpuKHQsZSl7dD11by5sYWIodCksZT11by5sYWIoZSk7dmFyIHI9dC5sLG49dC5hLGk9dC5iLGE9ZS5sLXIsbz1lLmEtbixzPWUuYi1pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcHQocithKnQsbitvKnQsaStzKnQpKyIifX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBlLT10LGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnJvdW5kKHQrZSpyKX19ZnVuY3Rpb24gQm4odCl7dmFyIGU9W3QuYSx0LmJdLHI9W3QuYyx0LmRdLG49Vm4oZSksaT1VbihlLHIpLGE9Vm4ocW4ocixlLC1pKSl8fDA7ZVswXSpyWzFdPHJbMF0qZVsxXSYmKGVbMF0qPS0xLGVbMV0qPS0xLG4qPS0xLGkqPS0xKSx0aGlzLnJvdGF0ZT0obj9NYXRoLmF0YW4yKGVbMV0sZVswXSk6TWF0aC5hdGFuMigtclswXSxyWzFdKSkqSG8sdGhpcy50cmFuc2xhdGU9W3QuZSx0LmZdLHRoaXMuc2NhbGU9W24sYV0sdGhpcy5za2V3PWE/TWF0aC5hdGFuMihpLGEpKkhvOjB9ZnVuY3Rpb24gVW4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXX1mdW5jdGlvbiBWbih0KXt2YXIgZT1NYXRoLnNxcnQoVW4odCx0KSk7cmV0dXJuIGUmJih0WzBdLz1lLHRbMV0vPWUpLGV9ZnVuY3Rpb24gcW4odCxlLHIpe3JldHVybiB0WzBdKz1yKmVbMF0sdFsxXSs9ciplWzFdLHR9ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiwiOiIiOwp9ZnVuY3Rpb24gWW4odCxlLHIsbil7aWYodFswXSE9PWVbMF18fHRbMV0hPT1lWzFdKXt2YXIgaT1yLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKTtuLnB1c2goe2k6aS00LHg6Ym4odFswXSxlWzBdKX0se2k6aS0yLHg6Ym4odFsxXSxlWzFdKX0pfWVsc2UoZVswXXx8ZVsxXSkmJnIucHVzaCgidHJhbnNsYXRlKCIrZSsiKSIpfWZ1bmN0aW9uIEduKHQsZSxyLG4pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxuLnB1c2goe2k6ci5wdXNoKEhuKHIpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OmJuKHQsZSl9KSk6ZSYmci5wdXNoKEhuKHIpKyJyb3RhdGUoIitlKyIpIil9ZnVuY3Rpb24gWG4odCxlLHIsbil7dCE9PWU/bi5wdXNoKHtpOnIucHVzaChIbihyKSsic2tld1goIixudWxsLCIpIiktMix4OmJuKHQsZSl9KTplJiZyLnB1c2goSG4ocikrInNrZXdYKCIrZSsiKSIpfWZ1bmN0aW9uIFduKHQsZSxyLG4pe2lmKHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXSl7dmFyIGk9ci5wdXNoKEhuKHIpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTtuLnB1c2goe2k6aS00LHg6Ym4odFswXSxlWzBdKX0se2k6aS0yLHg6Ym4odFsxXSxlWzFdKX0pfWVsc2UgMT09PWVbMF0mJjE9PT1lWzFdfHxyLnB1c2goSG4ocikrInNjYWxlKCIrZSsiKSIpfWZ1bmN0aW9uIFpuKHQsZSl7dmFyIHI9W10sbj1bXTtyZXR1cm4gdD11by50cmFuc2Zvcm0odCksZT11by50cmFuc2Zvcm0oZSksWW4odC50cmFuc2xhdGUsZS50cmFuc2xhdGUscixuKSxHbih0LnJvdGF0ZSxlLnJvdGF0ZSxyLG4pLFhuKHQuc2tldyxlLnNrZXcscixuKSxXbih0LnNjYWxlLGUuc2NhbGUscixuKSx0PWU9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIGUsaT0tMSxhPW4ubGVuZ3RoOysraTxhOylyWyhlPW5baV0pLmldPWUueCh0KTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rpb24gSm4odCxlKXtyZXR1cm4gZT0oZS09dD0rdCl8fDEvZSxmdW5jdGlvbihyKXtyZXR1cm4oci10KS9lfX1mdW5jdGlvbiBLbih0LGUpe3JldHVybiBlPShlLT10PSt0KXx8MS9lLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKHItdCkvZSkpfX1mdW5jdGlvbiBRbih0KXtmb3IodmFyIGU9dC5zb3VyY2Uscj10LnRhcmdldCxuPXRpKGUsciksaT1bZV07ZSE9PW47KWU9ZS5wYXJlbnQsaS5wdXNoKGUpO2Zvcih2YXIgYT1pLmxlbmd0aDtyIT09bjspaS5zcGxpY2UoYSwwLHIpLHI9ci5wYXJlbnQ7cmV0dXJuIGl9ZnVuY3Rpb24gJG4odCl7Zm9yKHZhciBlPVtdLHI9dC5wYXJlbnQ7bnVsbCE9cjspZS5wdXNoKHQpLHQ9cixyPXIucGFyZW50O3JldHVybiBlLnB1c2godCksZX1mdW5jdGlvbiB0aSh0LGUpe2lmKHQ9PT1lKXJldHVybiB0O2Zvcih2YXIgcj0kbih0KSxuPSRuKGUpLGk9ci5wb3AoKSxhPW4ucG9wKCksbz1udWxsO2k9PT1hOylvPWksaT1yLnBvcCgpLGE9bi5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBlaSh0KXt0LmZpeGVkfD0yfWZ1bmN0aW9uIHJpKHQpe3QuZml4ZWQmPS03fWZ1bmN0aW9uIG5pKHQpe3QuZml4ZWR8PTQsdC5weD10LngsdC5weT10Lnl9ZnVuY3Rpb24gaWkodCl7dC5maXhlZCY9LTV9ZnVuY3Rpb24gYWkodCxlLHIpe3ZhciBuPTAsaT0wO2lmKHQuY2hhcmdlPTAsIXQubGVhZilmb3IodmFyIGEsbz10Lm5vZGVzLHM9by5sZW5ndGgsbD0tMTsrK2w8czspYT1vW2xdLG51bGwhPWEmJihhaShhLGUsciksdC5jaGFyZ2UrPWEuY2hhcmdlLG4rPWEuY2hhcmdlKmEuY3gsaSs9YS5jaGFyZ2UqYS5jeSk7aWYodC5wb2ludCl7dC5sZWFmfHwodC5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LHQucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIHU9ZSpyW3QucG9pbnQuaW5kZXhdO3QuY2hhcmdlKz10LnBvaW50Q2hhcmdlPXUsbis9dSp0LnBvaW50LngsaSs9dSp0LnBvaW50Lnl9dC5jeD1uL3QuY2hhcmdlLHQuY3k9aS90LmNoYXJnZX1mdW5jdGlvbiBvaSh0LGUpe3JldHVybiB1by5yZWJpbmQodCxlLCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLHQubm9kZXM9dCx0LmxpbmtzPWZpLHR9ZnVuY3Rpb24gc2kodCxlKXtmb3IodmFyIHI9W3RdO251bGwhPSh0PXIucG9wKCkpOylpZihlKHQpLChpPXQuY2hpbGRyZW4pJiYobj1pLmxlbmd0aCkpZm9yKHZhciBuLGk7LS1uPj0wOylyLnB1c2goaVtuXSl9ZnVuY3Rpb24gbGkodCxlKXtmb3IodmFyIHI9W3RdLG49W107bnVsbCE9KHQ9ci5wb3AoKSk7KWlmKG4ucHVzaCh0KSwoYT10LmNoaWxkcmVuKSYmKGk9YS5sZW5ndGgpKWZvcih2YXIgaSxhLG89LTE7KytvPGk7KXIucHVzaChhW29dKTtmb3IoO251bGwhPSh0PW4ucG9wKCkpOyllKHQpfWZ1bmN0aW9uIHVpKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIGNpKHQpe3JldHVybiB0LnZhbHVlfWZ1bmN0aW9uIGhpKHQsZSl7cmV0dXJuIGUudmFsdWUtdC52YWx1ZX1mdW5jdGlvbiBmaSh0KXtyZXR1cm4gdW8ubWVyZ2UodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuKHQuY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3NvdXJjZTp0LHRhcmdldDplfX0pfSkpfWZ1bmN0aW9uIGRpKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gcGkodCl7cmV0dXJuIHQueX1mdW5jdGlvbiBtaSh0LGUscil7dC55MD1lLHQueT1yfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB1by5yYW5nZSh0Lmxlbmd0aCl9ZnVuY3Rpb24gdmkodCl7Zm9yKHZhciBlPS0xLHI9dFswXS5sZW5ndGgsbj1bXTsrK2U8cjspbltlXT0wO3JldHVybiBufWZ1bmN0aW9uIHlpKHQpe2Zvcih2YXIgZSxyPTEsbj0wLGk9dFswXVsxXSxhPXQubGVuZ3RoO3I8YTsrK3IpKGU9dFtyXVsxXSk+aSYmKG49cixpPWUpO3JldHVybiBufWZ1bmN0aW9uIGJpKHQpe3JldHVybiB0LnJlZHVjZSh4aSwwKX1mdW5jdGlvbiB4aSh0LGUpe3JldHVybiB0K2VbMV19ZnVuY3Rpb24gX2kodCxlKXtyZXR1cm4gd2kodCxNYXRoLmNlaWwoTWF0aC5sb2coZS5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiB3aSh0LGUpe2Zvcih2YXIgcj0tMSxuPSt0WzBdLGk9KHRbMV0tbikvZSxhPVtdOysrcjw9ZTspYVtyXT1pKnIrbjtyZXR1cm4gYX1mdW5jdGlvbiBNaSh0KXtyZXR1cm5bdW8ubWluKHQpLHVvLm1heCh0KV19ZnVuY3Rpb24gQWkodCxlKXtyZXR1cm4gdC52YWx1ZS1lLnZhbHVlfWZ1bmN0aW9uIGtpKHQsZSl7dmFyIHI9dC5fcGFja19uZXh0O3QuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10LGUuX3BhY2tfbmV4dD1yLHIuX3BhY2tfcHJldj1lfWZ1bmN0aW9uIFRpKHQsZSl7dC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXR9ZnVuY3Rpb24gRWkodCxlKXt2YXIgcj1lLngtdC54LG49ZS55LXQueSxpPXQucitlLnI7cmV0dXJuLjk5OSppKmk+cipyK24qbn1mdW5jdGlvbiBTaSh0KXtmdW5jdGlvbiBlKHQpe2M9TWF0aC5taW4odC54LXQucixjKSxoPU1hdGgubWF4KHQueCt0LnIsaCksZj1NYXRoLm1pbih0LnktdC5yLGYpLGQ9TWF0aC5tYXgodC55K3QucixkKX1pZigocj10LmNoaWxkcmVuKSYmKHU9ci5sZW5ndGgpKXt2YXIgcixuLGksYSxvLHMsbCx1LGM9MS8wLGg9LSgxLzApLGY9MS8wLGQ9LSgxLzApO2lmKHIuZm9yRWFjaChMaSksbj1yWzBdLG4ueD0tbi5yLG4ueT0wLGUobiksdT4xJiYoaT1yWzFdLGkueD1pLnIsaS55PTAsZShpKSx1PjIpKWZvcihhPXJbMl0semkobixpLGEpLGUoYSksa2kobixhKSxuLl9wYWNrX3ByZXY9YSxraShhLGkpLGk9bi5fcGFja19uZXh0LG89MztvPHU7bysrKXt6aShuLGksYT1yW29dKTt2YXIgcD0wLG09MSxnPTE7Zm9yKHM9aS5fcGFja19uZXh0O3MhPT1pO3M9cy5fcGFja19uZXh0LG0rKylpZihFaShzLGEpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IobD1uLl9wYWNrX3ByZXY7bCE9PXMuX3BhY2tfcHJldiYmIUVpKGwsYSk7bD1sLl9wYWNrX3ByZXYsZysrKTtwPyhtPGd8fG09PWcmJmkucjxuLnI/VGkobixpPXMpOlRpKG49bCxpKSxvLS0pOihraShuLGEpLGk9YSxlKGEpKX12YXIgdj0oYytoKS8yLHk9KGYrZCkvMixiPTA7Zm9yKG89MDtvPHU7bysrKWE9cltvXSxhLngtPXYsYS55LT15LGI9TWF0aC5tYXgoYixhLnIrTWF0aC5zcXJ0KGEueCphLngrYS55KmEueSkpO3Qucj1iLHIuZm9yRWFjaChDaSl9fWZ1bmN0aW9uIExpKHQpe3QuX3BhY2tfbmV4dD10Ll9wYWNrX3ByZXY9dH1mdW5jdGlvbiBDaSh0KXtkZWxldGUgdC5fcGFja19uZXh0LGRlbGV0ZSB0Ll9wYWNrX3ByZXZ9ZnVuY3Rpb24gSWkodCxlLHIsbil7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSs9bip0LngsdC55PXIrPW4qdC55LHQucio9bixpKWZvcih2YXIgYT0tMSxvPWkubGVuZ3RoOysrYTxvOylJaShpW2FdLGUscixuKX1mdW5jdGlvbiB6aSh0LGUscil7dmFyIG49dC5yK3IucixpPWUueC10LngsYT1lLnktdC55O2lmKG4mJihpfHxhKSl7dmFyIG89ZS5yK3IucixzPWkqaSthKmE7byo9byxuKj1uO3ZhciBsPS41KyhuLW8pLygyKnMpLHU9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihuK3MpLShuLT1zKSpuLW8qbykpLygyKnMpO3IueD10LngrbCppK3UqYSxyLnk9dC55K2wqYS11Kml9ZWxzZSByLng9dC54K24sci55PXQueX1mdW5jdGlvbiBEaSh0LGUpe3JldHVybiB0LnBhcmVudD09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIFBpKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUubGVuZ3RoP2VbMF06dC50fWZ1bmN0aW9uIE9pKHQpe3ZhciBlLHI9dC5jaGlsZHJlbjtyZXR1cm4oZT1yLmxlbmd0aCk/cltlLTFdOnQudH1mdW5jdGlvbiBSaSh0LGUscil7dmFyIG49ci8oZS5pLXQuaSk7ZS5jLT1uLGUucys9cix0LmMrPW4sZS56Kz1yLGUubSs9cn1mdW5jdGlvbiBGaSh0KXtmb3IodmFyIGUscj0wLG49MCxpPXQuY2hpbGRyZW4sYT1pLmxlbmd0aDstLWE+PTA7KWU9aVthXSxlLnorPXIsZS5tKz1yLHIrPWUucysobis9ZS5jKX1mdW5jdGlvbiBqaSh0LGUscil7cmV0dXJuIHQuYS5wYXJlbnQ9PT1lLnBhcmVudD90LmE6cn1mdW5jdGlvbiBOaSh0KXtyZXR1cm4gMSt1by5tYXgodCxmdW5jdGlvbih0KXtyZXR1cm4gdC55fSl9ZnVuY3Rpb24gQmkodCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS54fSwwKS90Lmxlbmd0aH1mdW5jdGlvbiBVaSh0KXt2YXIgZT10LmNoaWxkcmVuO3JldHVybiBlJiZlLmxlbmd0aD9VaShlWzBdKTp0fWZ1bmN0aW9uIFZpKHQpe3ZhciBlLHI9dC5jaGlsZHJlbjtyZXR1cm4gciYmKGU9ci5sZW5ndGgpP1ZpKHJbZS0xXSk6dH1mdW5jdGlvbiBxaSh0KXtyZXR1cm57eDp0LngseTp0LnksZHg6dC5keCxkeTp0LmR5fX1mdW5jdGlvbiBIaSh0LGUpe3ZhciByPXQueCtlWzNdLG49dC55K2VbMF0saT10LmR4LWVbMV0tZVszXSxhPXQuZHktZVswXS1lWzJdO3JldHVybiBpPDAmJihyKz1pLzIsaT0wKSxhPDAmJihuKz1hLzIsYT0wKSx7eDpyLHk6bixkeDppLGR5OmF9fWZ1bmN0aW9uIFlpKHQpe3ZhciBlPXRbMF0scj10W3QubGVuZ3RoLTFdO3JldHVybiBlPHI/W2Uscl06W3IsZV19ZnVuY3Rpb24gR2kodCl7cmV0dXJuIHQucmFuZ2VFeHRlbnQ/dC5yYW5nZUV4dGVudCgpOllpKHQucmFuZ2UoKSl9ZnVuY3Rpb24gWGkodCxlLHIsbil7dmFyIGk9cih0WzBdLHRbMV0pLGE9bihlWzBdLGVbMV0pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gV2kodCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aC0xLGE9dFtuXSxvPXRbaV07cmV0dXJuIG88YSYmKHI9bixuPWksaT1yLHI9YSxhPW8sbz1yKSx0W25dPWUuZmxvb3IoYSksdFtpXT1lLmNlaWwobyksdH1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdD97Zmxvb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoZS90KSp0fSxjZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZS90KSp0fX06QWx9ZnVuY3Rpb24gSmkodCxlLHIsbil7dmFyIGk9W10sYT1bXSxvPTAscz1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCktMTtmb3IodFtzXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KytvPD1zOylpLnB1c2gocih0W28tMV0sdFtvXSkpLGEucHVzaChuKGVbby0xXSxlW29dKSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPXVvLmJpc2VjdCh0LGUsMSxzKS0xO3JldHVybiBhW3JdKGlbcl0oZSkpfX1mdW5jdGlvbiBLaSh0LGUscixuKXtmdW5jdGlvbiBpKCl7dmFyIGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpPjI/Smk6WGksbD1uP0tuOkpuO3JldHVybiBvPWkodCxlLGwscikscz1pKGUsdCxsLF9uKSxhfWZ1bmN0aW9uIGEodCl7cmV0dXJuIG8odCl9dmFyIG8scztyZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHModCl9LGEuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUubWFwKE51bWJlciksaSgpKTp0fSxhLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSgpKTplfSxhLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGEucmFuZ2UodCkuaW50ZXJwb2xhdGUoTm4pfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSgpKTpufSxhLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSgpKTpyfSxhLnRpY2tzPWZ1bmN0aW9uKGUpe3JldHVybiBlYSh0LGUpfSxhLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcmEodCxlLHIpfSxhLm5pY2U9ZnVuY3Rpb24oZSl7cmV0dXJuICRpKHQsZSksaSgpfSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gS2kodCxlLHIsbil9LGkoKX1mdW5jdGlvbiBRaSh0LGUpe3JldHVybiB1by5yZWJpbmQodCxlLCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gJGkodCxlKXtyZXR1cm4gV2kodCxaaSh0YSh0LGUpWzJdKSksV2kodCxaaSh0YSh0LGUpWzJdKSksdH1mdW5jdGlvbiB0YSh0LGUpe251bGw9PWUmJihlPTEwKTt2YXIgcj1ZaSh0KSxuPXJbMV0tclswXSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cobi9lKS9NYXRoLkxOMTApKSxhPWUvbippO3JldHVybiBhPD0uMTU/aSo9MTA6YTw9LjM1P2kqPTU6YTw9Ljc1JiYoaSo9MiksclswXT1NYXRoLmNlaWwoclswXS9pKSppLHJbMV09TWF0aC5mbG9vcihyWzFdL2kpKmkrLjUqaSxyWzJdPWkscn1mdW5jdGlvbiBlYSh0LGUpe3JldHVybiB1by5yYW5nZS5hcHBseSh1byx0YSh0LGUpKX1mdW5jdGlvbiByYSh0LGUscil7dmFyIG49dGEodCxlKTtpZihyKXt2YXIgaT1mcy5leGVjKHIpO2lmKGkuc2hpZnQoKSwicyI9PT1pWzhdKXt2YXIgYT11by5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoeG8oblswXSkseG8oblsxXSkpKTtyZXR1cm4gaVs3XXx8KGlbN109Ii4iK25hKGEuc2NhbGUoblsyXSkpKSxpWzhdPSJmIixyPXVvLmZvcm1hdChpLmpvaW4oIiIpKSxmdW5jdGlvbih0KXtyZXR1cm4gcihhLnNjYWxlKHQpKSthLnN5bWJvbH19aVs3XXx8KGlbN109Ii4iK2lhKGlbOF0sbikpLHI9aS5qb2luKCIiKX1lbHNlIHI9IiwuIituYShuWzJdKSsiZiI7cmV0dXJuIHVvLmZvcm1hdChyKX1mdW5jdGlvbiBuYSh0KXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBpYSh0LGUpe3ZhciByPW5hKGVbMl0pO3JldHVybiB0IGluIGtsP01hdGguYWJzKHItbmEoTWF0aC5tYXgoeG8oZVswXSkseG8oZVsxXSkpKSkrICsoImUiIT09dCk6ci0yKigiJSI9PT10KX1mdW5jdGlvbiBhYSh0LGUscixuKXtmdW5jdGlvbiBpKHQpe3JldHVybihyP01hdGgubG9nKHQ8MD8wOnQpOi1NYXRoLmxvZyh0PjA/MDotdCkpL01hdGgubG9nKGUpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHI/TWF0aC5wb3coZSx0KTotTWF0aC5wb3coZSwtdCl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gdChpKGUpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEodC5pbnZlcnQoZSkpfSxvLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lWzBdPj0wLHQuZG9tYWluKChuPWUubWFwKE51bWJlcikpLm1hcChpKSksbyk6bn0sby5iYXNlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStyLHQuZG9tYWluKG4ubWFwKGkpKSxvKTplfSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgZT1XaShuLm1hcChpKSxyP01hdGg6RWwpO3JldHVybiB0LmRvbWFpbihlKSxuPWUubWFwKGEpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgdD1ZaShuKSxvPVtdLHM9dFswXSxsPXRbMV0sdT1NYXRoLmZsb29yKGkocykpLGM9TWF0aC5jZWlsKGkobCkpLGg9ZSUxPzI6ZTtpZihpc0Zpbml0ZShjLXUpKXtpZihyKXtmb3IoO3U8Yzt1KyspZm9yKHZhciBmPTE7ZjxoO2YrKylvLnB1c2goYSh1KSpmKTtvLnB1c2goYSh1KSl9ZWxzZSBmb3Ioby5wdXNoKGEodSkpO3UrKzxjOylmb3IodmFyIGY9aC0xO2Y+MDtmLS0pby5wdXNoKGEodSkqZik7Zm9yKHU9MDtvW3VdPHM7dSsrKTtmb3IoYz1vLmxlbmd0aDtvW2MtMV0+bDtjLS0pO289by5zbGljZSh1LGMpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gVGw7YXJndW1lbnRzLmxlbmd0aDwyP3I9VGw6ImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXVvLmZvcm1hdChyKSk7dmFyIG49TWF0aC5tYXgoMSxlKnQvby50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBvPXQvYShNYXRoLnJvdW5kKGkodCkpKTtyZXR1cm4gbyplPGUtLjUmJihvKj1lKSxvPD1uP3IodCk6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYWEodC5jb3B5KCksZSxyLG4pfSxRaShvLHQpfWZ1bmN0aW9uIG9hKHQsZSxyKXtmdW5jdGlvbiBuKGUpe3JldHVybiB0KGkoZSkpfXZhciBpPXNhKGUpLGE9c2EoMS9lKTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEodC5pbnZlcnQoZSkpfSxuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC5kb21haW4oKHI9ZS5tYXAoTnVtYmVyKSkubWFwKGkpKSxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBlYShyLHQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmEocix0LGUpfSxuLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG4uZG9tYWluKCRpKHIsdCkpfSxuLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXNhKGU9byksYT1zYSgxL2UpLHQuZG9tYWluKHIubWFwKGkpKSxuKTplfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb2EodC5jb3B5KCksZSxyKX0sUWkobix0KX1mdW5jdGlvbiBzYSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD8tTWF0aC5wb3coLWUsdCk6TWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gbGEodCxlKXtmdW5jdGlvbiByKHIpe3JldHVybiBhWygoaS5nZXQocil8fCgicmFuZ2UiPT09ZS50P2kuc2V0KHIsdC5wdXNoKHIpKTpOYU4pKS0xKSVhLmxlbmd0aF19ZnVuY3Rpb24gbihlLHIpe3JldHVybiB1by5yYW5nZSh0Lmxlbmd0aCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlK3IqdH0pfXZhciBpLGEsbztyZXR1cm4gci5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ7dD1bXSxpPW5ldyBoO2Zvcih2YXIgYSxvPS0xLHM9bi5sZW5ndGg7KytvPHM7KWkuaGFzKGE9bltvXSl8fGkuc2V0KGEsdC5wdXNoKGEpKTtyZXR1cm4gcltlLnRdLmFwcGx5KHIsZS5hKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG89MCxlPXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LHIpOmF9LHIucmFuZ2VQb2ludHM9ZnVuY3Rpb24oaSxzKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApO3ZhciBsPWlbMF0sdT1pWzFdLGM9dC5sZW5ndGg8Mj8obD0obCt1KS8yLDApOih1LWwpLyh0Lmxlbmd0aC0xK3MpO3JldHVybiBhPW4obCtjKnMvMixjKSxvPTAsZT17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24oaSxzKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApO3ZhciBsPWlbMF0sdT1pWzFdLGM9dC5sZW5ndGg8Mj8obD11PU1hdGgucm91bmQoKGwrdSkvMiksMCk6KHUtbCkvKHQubGVuZ3RoLTErcyl8MDtyZXR1cm4gYT1uKGwrTWF0aC5yb3VuZChjKnMvMisodS1sLSh0Lmxlbmd0aC0xK3MpKmMpLzIpLGMpLG89MCxlPXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30scn0sci5yYW5nZUJhbmRzPWZ1bmN0aW9uKGkscyxsKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9cyk7dmFyIHU9aVsxXTxpWzBdLGM9aVt1LTBdLGg9aVsxLXVdLGY9KGgtYykvKHQubGVuZ3RoLXMrMipsKTtyZXR1cm4gYT1uKGMrZipsLGYpLHUmJmEucmV2ZXJzZSgpLG89ZiooMS1zKSxlPXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30scn0sci5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24oaSxzLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1zKTt2YXIgdT1pWzFdPGlbMF0sYz1pW3UtMF0saD1pWzEtdV0sZj1NYXRoLmZsb29yKChoLWMpLyh0Lmxlbmd0aC1zKzIqbCkpO3JldHVybiBhPW4oYytNYXRoLnJvdW5kKChoLWMtKHQubGVuZ3RoLXMpKmYpLzIpLGYpLHUmJmEucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChmKigxLXMpKSxlPXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxyLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFlpKGUuYVswXSl9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBsYSh0LGUpfSxyLmRvbWFpbih0KX1mdW5jdGlvbiB1YSh0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgcj0wLGk9ZS5sZW5ndGg7Zm9yKHM9W107KytyPGk7KXNbci0xXT11by5xdWFudGlsZSh0LHIvaSk7cmV0dXJuIG59ZnVuY3Rpb24gbih0KXtpZighaXNOYU4odD0rdCkpcmV0dXJuIGVbdW8uYmlzZWN0KHMsdCldfXZhciBzO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLm1hcChhKS5maWx0ZXIobykuc29ydChpKSxyKCkpOnR9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKCkpOmV9LG4ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHN9LG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHIpe3JldHVybiByPWUuaW5kZXhPZihyKSxyPDA/W05hTixOYU5dOltyPjA/c1tyLTFdOnRbMF0scjxzLmxlbmd0aD9zW3JdOnRbdC5sZW5ndGgtMV1dfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdWEodCxlKX0scigpfWZ1bmN0aW9uIGNhKHQsZSxyKXtmdW5jdGlvbiBuKGUpe3JldHVybiByW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKGEqKGUtdCkpKSldfWZ1bmN0aW9uIGkoKXtyZXR1cm4gYT1yLmxlbmd0aC8oZS10KSxvPXIubGVuZ3RoLTEsbn12YXIgYSxvO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rclswXSxlPStyW3IubGVuZ3RoLTFdLGkoKSk6W3QsZV19LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxpKCkpOnJ9LG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXIuaW5kZXhPZihlKSxlPWU8MD9OYU46ZS9hK3QsW2UsZSsxL2FdfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gY2EodCxlLHIpfSxpKCl9ZnVuY3Rpb24gaGEodCxlKXtmdW5jdGlvbiByKHIpe2lmKHI8PXIpcmV0dXJuIGVbdW8uYmlzZWN0KHQscildfXJldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKTplfSxyLmludmVydEV4dGVudD1mdW5jdGlvbihyKXtyZXR1cm4gcj1lLmluZGV4T2YociksW3Rbci0xXSx0W3JdXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhhKHQsZSl9LHJ9ZnVuY3Rpb24gZmEodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXIubWFwKGUpLGUpOnR9LGUudGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGVhKHQsZSl9LGUudGlja0Zvcm1hdD1mdW5jdGlvbihlLHIpe3JldHVybiByYSh0LGUscil9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBmYSh0KX0sZX1mdW5jdGlvbiBkYSgpe3JldHVybiAwfWZ1bmN0aW9uIHBhKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIG1hKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIGdhKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gdmEodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24geWEodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gYmEodCxlLHIsbil7cmV0dXJuKHQtcikqZS0oZS1uKSp0PjA/MDoxfWZ1bmN0aW9uIHhhKHQsZSxyLG4saSl7dmFyIGE9dFswXS1lWzBdLG89dFsxXS1lWzFdLHM9KGk/bjotbikvTWF0aC5zcXJ0KGEqYStvKm8pLGw9cypvLHU9LXMqYSxjPXRbMF0rbCxoPXRbMV0rdSxmPWVbMF0rbCxkPWVbMV0rdSxwPShjK2YpLzIsbT0oaCtkKS8yLGc9Zi1jLHY9ZC1oLHk9ZypnK3YqdixiPXItbix4PWMqZC1mKmgsXz0odjwwPy0xOjEpKk1hdGguc3FydChNYXRoLm1heCgwLGIqYip5LXgqeCkpLHc9KHgqdi1nKl8pL3ksTT0oLXgqZy12Kl8pL3ksQT0oeCp2K2cqXykveSxrPSgteCpnK3YqXykveSxUPXctcCxFPU0tbSxTPUEtcCxMPWstbTtyZXR1cm4gVCpUK0UqRT5TKlMrTCpMJiYodz1BLE09ayksW1t3LWwsTS11XSxbdypyL2IsTSpyL2JdXX1mdW5jdGlvbiBfYSh0KXtmdW5jdGlvbiBlKGUpe2Z1bmN0aW9uIG8oKXt1LnB1c2goIk0iLGEodChjKSxzKSl9Zm9yKHZhciBsLHU9W10sYz1bXSxoPS0xLGY9ZS5sZW5ndGgsZD1TdChyKSxwPVN0KG4pOysraDxmOylpLmNhbGwodGhpcyxsPWVbaF0saCk/Yy5wdXNoKFsrZC5jYWxsKHRoaXMsbCxoKSwrcC5jYWxsKHRoaXMsbCxoKV0pOmMubGVuZ3RoJiYobygpLGM9W10pO3JldHVybiBjLmxlbmd0aCYmbygpLHUubGVuZ3RoP3Uuam9pbigiIik6bnVsbH12YXIgcj1DcixuPUlyLGk9SWUsYT13YSxvPWEua2V5LHM9Ljc7cmV0dXJuIGUueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGUpOnJ9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGUpOml9LGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/YT10OihhPURsLmdldCh0KXx8d2EpLmtleSxlKTpvfSxlLnRlbnNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxlKTpzfSxlfWZ1bmN0aW9uIHdhKHQpe3JldHVybiB0Lmxlbmd0aD4xP3Quam9pbigiTCIpOnQrIloifWZ1bmN0aW9uIE1hKHQpe3JldHVybiB0LmpvaW4oIkwiKSsiWiJ9ZnVuY3Rpb24gQWEodCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aCxuPXRbMF0saT1bblswXSwiLCIsblsxXV07KytlPHI7KWkucHVzaCgiSCIsKG5bMF0rKG49dFtlXSlbMF0pLzIsIlYiLG5bMV0pO3JldHVybiByPjEmJmkucHVzaCgiSCIsblswXSksaS5qb2luKCIiKX1mdW5jdGlvbiBrYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJWIiwobj10W2VdKVsxXSwiSCIsblswXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gVGEodCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aCxuPXRbMF0saT1bblswXSwiLCIsblsxXV07KytlPHI7KWkucHVzaCgiSCIsKG49dFtlXSlbMF0sIlYiLG5bMV0pO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIEVhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDQ/d2EodCk6dFsxXStDYSh0LnNsaWNlKDEsLTEpLElhKHQsZSkpfWZ1bmN0aW9uIFNhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDM/TWEodCk6dFswXStDYSgodC5wdXNoKHRbMF0pLHQpLElhKFt0W3QubGVuZ3RoLTJdXS5jb25jYXQodCxbdFsxXV0pLGUpKX1mdW5jdGlvbiBMYSh0LGUpe3JldHVybiB0Lmxlbmd0aDwzP3dhKHQpOnRbMF0rQ2EodCxJYSh0LGUpKX1mdW5jdGlvbiBDYSh0LGUpe2lmKGUubGVuZ3RoPDF8fHQubGVuZ3RoIT1lLmxlbmd0aCYmdC5sZW5ndGghPWUubGVuZ3RoKzIpcmV0dXJuIHdhKHQpO3ZhciByPXQubGVuZ3RoIT1lLmxlbmd0aCxuPSIiLGk9dFswXSxhPXRbMV0sbz1lWzBdLHM9byxsPTE7aWYociYmKG4rPSJRIisoYVswXS0yKm9bMF0vMykrIiwiKyhhWzFdLTIqb1sxXS8zKSsiLCIrYVswXSsiLCIrYVsxXSxpPXRbMV0sbD0yKSxlLmxlbmd0aD4xKXtzPWVbMV0sYT10W2xdLGwrKyxuKz0iQyIrKGlbMF0rb1swXSkrIiwiKyhpWzFdK29bMV0pKyIsIisoYVswXS1zWzBdKSsiLCIrKGFbMV0tc1sxXSkrIiwiK2FbMF0rIiwiK2FbMV07Zm9yKHZhciB1PTI7dTxlLmxlbmd0aDt1KyssbCsrKWE9dFtsXSxzPWVbdV0sbis9IlMiKyhhWzBdLXNbMF0pKyIsIisoYVsxXS1zWzFdKSsiLCIrYVswXSsiLCIrYVsxXX1pZihyKXt2YXIgYz10W2xdO24rPSJRIisoYVswXSsyKnNbMF0vMykrIiwiKyhhWzFdKzIqc1sxXS8zKSsiLCIrY1swXSsiLCIrY1sxXX1yZXR1cm4gbn1mdW5jdGlvbiBJYSh0LGUpe2Zvcih2YXIgcixuPVtdLGk9KDEtZSkvMixhPXRbMF0sbz10WzFdLHM9MSxsPXQubGVuZ3RoOysrczxsOylyPWEsYT1vLG89dFtzXSxuLnB1c2goW2kqKG9bMF0tclswXSksaSoob1sxXS1yWzFdKV0pO3JldHVybiBufWZ1bmN0aW9uIHphKHQpe2lmKHQubGVuZ3RoPDMpcmV0dXJuIHdhKHQpO3ZhciBlPTEscj10Lmxlbmd0aCxuPXRbMF0saT1uWzBdLGE9blsxXSxvPVtpLGksaSwobj10WzFdKVswXV0scz1bYSxhLGEsblsxXV0sbD1baSwiLCIsYSwiTCIsUmEoUmwsbyksIiwiLFJhKFJsLHMpXTtmb3IodC5wdXNoKHRbci0xXSk7KytlPD1yOyluPXRbZV0sby5zaGlmdCgpLG8ucHVzaChuWzBdKSxzLnNoaWZ0KCkscy5wdXNoKG5bMV0pLEZhKGwsbyxzKTtyZXR1cm4gdC5wb3AoKSxsLnB1c2goIkwiLG4pLGwuam9pbigiIil9ZnVuY3Rpb24gRGEodCl7aWYodC5sZW5ndGg8NClyZXR1cm4gd2EodCk7Zm9yKHZhciBlLHI9W10sbj0tMSxpPXQubGVuZ3RoLGE9WzBdLG89WzBdOysrbjwzOyllPXRbbl0sYS5wdXNoKGVbMF0pLG8ucHVzaChlWzFdKTtmb3Ioci5wdXNoKFJhKFJsLGEpKyIsIitSYShSbCxvKSksLS1uOysrbjxpOyllPXRbbl0sYS5zaGlmdCgpLGEucHVzaChlWzBdKSxvLnNoaWZ0KCksby5wdXNoKGVbMV0pLEZhKHIsYSxvKTtyZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBQYSh0KXtmb3IodmFyIGUscixuPS0xLGk9dC5sZW5ndGgsYT1pKzQsbz1bXSxzPVtdOysrbjw0OylyPXRbbiVpXSxvLnB1c2goclswXSkscy5wdXNoKHJbMV0pO2ZvcihlPVtSYShSbCxvKSwiLCIsUmEoUmwscyldLC0tbjsrK248YTspcj10W24laV0sby5zaGlmdCgpLG8ucHVzaChyWzBdKSxzLnNoaWZ0KCkscy5wdXNoKHJbMV0pLEZhKGUsbyxzKTtyZXR1cm4gZS5qb2luKCIiKX1mdW5jdGlvbiBPYSh0LGUpe3ZhciByPXQubGVuZ3RoLTE7aWYocilmb3IodmFyIG4saSxhPXRbMF1bMF0sbz10WzBdWzFdLHM9dFtyXVswXS1hLGw9dFtyXVsxXS1vLHU9LTE7Kyt1PD1yOyluPXRbdV0saT11L3IsblswXT1lKm5bMF0rKDEtZSkqKGEraSpzKSxuWzFdPWUqblsxXSsoMS1lKSoobytpKmwpO3JldHVybiB6YSh0KX1mdW5jdGlvbiBSYSh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdK3RbMl0qZVsyXSt0WzNdKmVbM119ZnVuY3Rpb24gRmEodCxlLHIpe3QucHVzaCgiQyIsUmEoUGwsZSksIiwiLFJhKFBsLHIpLCIsIixSYShPbCxlKSwiLCIsUmEoT2wsciksIiwiLFJhKFJsLGUpLCIsIixSYShSbCxyKSl9ZnVuY3Rpb24gamEodCxlKXtyZXR1cm4oZVsxXS10WzFdKS8oZVswXS10WzBdKX1mdW5jdGlvbiBOYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLTEsbj1bXSxpPXRbMF0sYT10WzFdLG89blswXT1qYShpLGEpOysrZTxyOyluW2VdPShvKyhvPWphKGk9YSxhPXRbZSsxXSkpKS8yO3JldHVybiBuW2VdPW8sbn1mdW5jdGlvbiBCYSh0KXtmb3IodmFyIGUscixuLGksYT1bXSxvPU5hKHQpLHM9LTEsbD10Lmxlbmd0aC0xOysrczxsOyllPWphKHRbc10sdFtzKzFdKSx4byhlKTxGbz9vW3NdPW9bcysxXT0wOihyPW9bc10vZSxuPW9bcysxXS9lLGk9cipyK24qbixpPjkmJihpPTMqZS9NYXRoLnNxcnQoaSksb1tzXT1pKnIsb1tzKzFdPWkqbikpO2ZvcihzPS0xOysrczw9bDspaT0odFtNYXRoLm1pbihsLHMrMSldWzBdLXRbTWF0aC5tYXgoMCxzLTEpXVswXSkvKDYqKDErb1tzXSpvW3NdKSksYS5wdXNoKFtpfHwwLG9bc10qaXx8MF0pO3JldHVybiBhfWZ1bmN0aW9uIFVhKHQpe3JldHVybiB0Lmxlbmd0aDwzP3dhKHQpOnRbMF0rQ2EodCxCYSh0KSl9ZnVuY3Rpb24gVmEodCl7Zm9yKHZhciBlLHIsbixpPS0xLGE9dC5sZW5ndGg7KytpPGE7KWU9dFtpXSxyPWVbMF0sbj1lWzFdLVZvLGVbMF09cipNYXRoLmNvcyhuKSxlWzFdPXIqTWF0aC5zaW4obik7cmV0dXJuIHR9ZnVuY3Rpb24gcWEodCl7ZnVuY3Rpb24gZShlKXtmdW5jdGlvbiBsKCl7bS5wdXNoKCJNIixzKHQodiksaCksYyx1KHQoZy5yZXZlcnNlKCkpLGgpLCJaIil9Zm9yKHZhciBmLGQscCxtPVtdLGc9W10sdj1bXSx5PS0xLGI9ZS5sZW5ndGgseD1TdChyKSxfPVN0KGkpLHc9cj09PW4/ZnVuY3Rpb24oKXtyZXR1cm4gZH06U3QobiksTT1pPT09YT9mdW5jdGlvbigpe3JldHVybiBwfTpTdChhKTsrK3k8Yjspby5jYWxsKHRoaXMsZj1lW3ldLHkpPyhnLnB1c2goW2Q9K3guY2FsbCh0aGlzLGYseSkscD0rXy5jYWxsKHRoaXMsZix5KV0pLHYucHVzaChbK3cuY2FsbCh0aGlzLGYseSksK00uY2FsbCh0aGlzLGYseSldKSk6Zy5sZW5ndGgmJihsKCksZz1bXSx2PVtdKTtyZXR1cm4gZy5sZW5ndGgmJmwoKSxtLmxlbmd0aD9tLmpvaW4oIiIpOm51bGx9dmFyIHI9Q3Isbj1DcixpPTAsYT1JcixvPUllLHM9d2EsbD1zLmtleSx1PXMsYz0iTCIsaD0uNztyZXR1cm4gZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW49dCxlKTpufSxlLngwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZSk6cn0sZS54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hPXQsZSk6YX0sZS55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGUpOml9LGUueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxlKTphfSxlLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxlKTpvfSxlLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3M9dDoocz1EbC5nZXQodCl8fHdhKS5rZXksdT1zLnJldmVyc2V8fHMsYz1zLmNsb3NlZD8iTSI6IkwiLGUpOmx9LGUudGVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD10LGUpOmh9LGV9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIFlhKHQpe3JldHVyblt0LngsdC55XX1mdW5jdGlvbiBHYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPWVbMF0sbj1lWzFdLVZvO3JldHVybltyKk1hdGguY29zKG4pLHIqTWF0aC5zaW4obildfX1mdW5jdGlvbiBYYSgpe3JldHVybiA2NH1mdW5jdGlvbiBXYSgpe3JldHVybiJjaXJjbGUifWZ1bmN0aW9uIFphKHQpe3ZhciBlPU1hdGguc3FydCh0L05vKTtyZXR1cm4iTTAsIitlKyJBIitlKyIsIitlKyIgMCAxLDEgMCwiKy1lKyJBIitlKyIsIitlKyIgMCAxLDEgMCwiK2UrIloifWZ1bmN0aW9uIEphKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlLHIsbjsoZT10aGlzW3RdKSYmKG49ZVtyPWUuYWN0aXZlXSkmJihuLnRpbWVyLmM9bnVsbCxuLnRpbWVyLnQ9TmFOLC0tZS5jb3VudD9kZWxldGUgZVtyXTpkZWxldGUgdGhpc1t0XSxlLmFjdGl2ZSs9LjUsbi5ldmVudCYmbi5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sbi5pbmRleCkpfX1mdW5jdGlvbiBLYSh0LGUscil7cmV0dXJuIGtvKHQscWwpLHQubmFtZXNwYWNlPWUsdC5pZD1yLHR9ZnVuY3Rpb24gUWEodCxlLHIsbil7dmFyIGk9dC5pZCxhPXQubmFtZXNwYWNlO3JldHVybiBZKHQsImZ1bmN0aW9uIj09dHlwZW9mIHI/ZnVuY3Rpb24odCxvLHMpe3RbYV1baV0udHdlZW4uc2V0KGUsbihyLmNhbGwodCx0Ll9fZGF0YV9fLG8scykpKX06KHI9bihyKSxmdW5jdGlvbih0KXt0W2FdW2ldLnR3ZWVuLnNldChlLHIpfSkpfWZ1bmN0aW9uICRhKHQpe3JldHVybiBudWxsPT10JiYodD0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIHRvKHQpe3JldHVybiBudWxsPT10PyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK3QrIl9fIn1mdW5jdGlvbiBlbyh0LGUscixuLGkpe2Z1bmN0aW9uIGEodCl7dmFyIGU9bS5kZWxheTtyZXR1cm4gdS50PWUrbCxlPD10P28odC1lKTp2b2lkKHUuYz1vKX1mdW5jdGlvbiBvKHIpe3ZhciBpPXAuYWN0aXZlLGE9cFtpXTthJiYoYS50aW1lci5jPW51bGwsYS50aW1lci50PU5hTiwtLXAuY291bnQsZGVsZXRlIHBbaV0sYS5ldmVudCYmYS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0LHQuX19kYXRhX18sYS5pbmRleCkpO2Zvcih2YXIgbyBpbiBwKWlmKCtvPG4pe3ZhciBoPXBbb107aC50aW1lci5jPW51bGwsaC50aW1lci50PU5hTiwtLXAuY291bnQsZGVsZXRlIHBbb119dS5jPXMsRHQoZnVuY3Rpb24oKXtyZXR1cm4gdS5jJiZzKHJ8fDEpJiYodS5jPW51bGwsdS50PU5hTiksMX0sMCxsKSxwLmFjdGl2ZT1uLG0uZXZlbnQmJm0uZXZlbnQuc3RhcnQuY2FsbCh0LHQuX19kYXRhX18sZSksZD1bXSxtLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24ocixuKXsobj1uLmNhbGwodCx0Ll9fZGF0YV9fLGUpKSYmZC5wdXNoKG4pfSksZj1tLmVhc2UsYz1tLmR1cmF0aW9ufWZ1bmN0aW9uIHMoaSl7Zm9yKHZhciBhPWkvYyxvPWYoYSkscz1kLmxlbmd0aDtzPjA7KWRbLS1zXS5jYWxsKHQsbyk7aWYoYT49MSlyZXR1cm4gbS5ldmVudCYmbS5ldmVudC5lbmQuY2FsbCh0LHQuX19kYXRhX18sZSksLS1wLmNvdW50P2RlbGV0ZSBwW25dOmRlbGV0ZSB0W3JdLDF9dmFyIGwsdSxjLGYsZCxwPXRbcl18fCh0W3JdPXthY3RpdmU6MCxjb3VudDowfSksbT1wW25dO218fChsPWkudGltZSx1PUR0KGEsMCxsKSxtPXBbbl09e3R3ZWVuOm5ldyBoLHRpbWU6bCx0aW1lcjp1LGRlbGF5OmkuZGVsYXksZHVyYXRpb246aS5kdXJhdGlvbixlYXNlOmkuZWFzZSxpbmRleDplfSxpPW51bGwsKytwLmNvdW50KX1mdW5jdGlvbiBybyh0LGUscil7dC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShuKT9uOnIodCkpKyIsMCkifSl9ZnVuY3Rpb24gbm8odCxlLHIpe3QuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShuKT9uOnIodCkpKyIpIn0pfWZ1bmN0aW9uIGlvKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gYW8odCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQoZSl9ZnVuY3Rpb24gaSh0LHIpe3ZhciBuPXRbMV0tdFswXSxpPW4vcixhPXVvLmJpc2VjdChRbCxpKTtyZXR1cm4gYT09UWwubGVuZ3RoP1tlLnllYXIsdGEodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvMzE1MzZlNn0pLHIpWzJdXTphP2VbaS9RbFthLTFdPFFsW2FdL2k/YS0xOmFdOltldSx0YSh0LHIpWzJdXX1yZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG9vKHQuaW52ZXJ0KGUpKX0sbi5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQuZG9tYWluKGUpLG4pOnQuZG9tYWluKCkubWFwKG9vKX0sbi5uaWNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcihyKXtyZXR1cm4haXNOYU4ocikmJiF0LnJhbmdlKHIsb28oK3IrMSksZSkubGVuZ3RofXZhciBhPW4uZG9tYWluKCksbz1ZaShhKSxzPW51bGw9PXQ/aShvLDEwKToibnVtYmVyIj09dHlwZW9mIHQmJmkobyx0KTtyZXR1cm4gcyYmKHQ9c1swXSxlPXNbMV0pLG4uZG9tYWluKFdpKGEsZT4xP3tmbG9vcjpmdW5jdGlvbihlKXtmb3IoO3IoZT10LmZsb29yKGUpKTspZT1vbyhlLTEpO3JldHVybiBlfSxjZWlsOmZ1bmN0aW9uKGUpe2Zvcig7cihlPXQuY2VpbChlKSk7KWU9b28oK2UrMSk7cmV0dXJuIGV9fTp0KSl9LG4udGlja3M9ZnVuY3Rpb24odCxlKXt2YXIgcj1ZaShuLmRvbWFpbigpKSxhPW51bGw9PXQ/aShyLDEwKToibnVtYmVyIj09dHlwZW9mIHQ/aShyLHQpOiF0LnJhbmdlJiZbe3JhbmdlOnR9LGVdO3JldHVybiBhJiYodD1hWzBdLGU9YVsxXSksdC5yYW5nZShyWzBdLG9vKCtyWzFdKzEpLGU8MT8xOmUpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcn0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGFvKHQuY29weSgpLGUscil9LFFpKG4sdCl9ZnVuY3Rpb24gb28odCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIHNvKHQpe3JldHVybiBKU09OLnBhcnNlKHQucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBsbyh0KXt2YXIgZT1mby5jcmVhdGVSYW5nZSgpO3JldHVybiBlLnNlbGVjdE5vZGUoZm8uYm9keSksZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodC5yZXNwb25zZVRleHQpfXZhciB1bz17dmVyc2lvbjoiMy41LjE3In0sY289W10uc2xpY2UsaG89ZnVuY3Rpb24odCl7cmV0dXJuIGNvLmNhbGwodCl9LGZvPXRoaXMuZG9jdW1lbnQ7aWYoZm8pdHJ5e2hvKGZvLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaCh0KXtobz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSxmbyl0cnl7Zm8uY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKHQpe3ZhciBwbz10aGlzLkVsZW1lbnQucHJvdG90eXBlLG1vPXBvLnNldEF0dHJpYnV0ZSxnbz1wby5zZXRBdHRyaWJ1dGVOUyx2bz10aGlzLkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLHlvPXZvLnNldFByb3BlcnR5O3BvLnNldEF0dHJpYnV0ZT1mdW5jdGlvbih0LGUpe21vLmNhbGwodGhpcyx0LGUrIiIpfSxwby5zZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbih0LGUscil7Z28uY2FsbCh0aGlzLHQsZSxyKyIiKX0sdm8uc2V0UHJvcGVydHk9ZnVuY3Rpb24odCxlLHIpe3lvLmNhbGwodGhpcyx0LGUrIiIscil9fXVvLmFzY2VuZGluZz1pLHVvLmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59LHVvLm1pbj1mdW5jdGlvbih0LGUpe3ZhciByLG4saT0tMSxhPXQubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysraTxhOylpZihudWxsIT0obj10W2ldKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPXRbaV0pJiZyPm4mJihyPW4pfWVsc2V7Zm9yKDsrK2k8YTspaWYobnVsbCE9KG49ZS5jYWxsKHQsdFtpXSxpKSkmJm4+PW4pe3I9bjticmVha31mb3IoOysraTxhOyludWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmcj5uJiYocj1uKX1yZXR1cm4gcn0sdW8ubWF4PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPGE7KWlmKG51bGwhPShuPXRbaV0pJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49dFtpXSkmJm4+ciYmKHI9bil9ZWxzZXtmb3IoOysraTxhOylpZihudWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZuPnImJihyPW4pfXJldHVybiByfSx1by5leHRlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYT0tMSxvPXQubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bil7cj1pPW47YnJlYWt9Zm9yKDsrK2E8bzspbnVsbCE9KG49dFthXSkmJihyPm4mJihyPW4pLGk8biYmKGk9bikpfWVsc2V7Zm9yKDsrK2E8bzspaWYobnVsbCE9KG49ZS5jYWxsKHQsdFthXSxhKSkmJm4+PW4pe3I9aT1uO2JyZWFrfWZvcig7KythPG87KW51bGwhPShuPWUuY2FsbCh0LHRbYV0sYSkpJiYocj5uJiYocj1uKSxpPG4mJihpPW4pKX1yZXR1cm5bcixpXX0sdW8uc3VtPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj0wLGk9dC5sZW5ndGgsYT0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYTxpOylvKHI9K3RbYV0pJiYobis9cik7ZWxzZSBmb3IoOysrYTxpOylvKHI9K2UuY2FsbCh0LHRbYV0sYSkpJiYobis9cik7cmV0dXJuIG59LHVvLm1lYW49ZnVuY3Rpb24odCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aCxzPS0xLGw9aTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrczxpOylvKHI9YSh0W3NdKSk/bis9cjotLWw7ZWxzZSBmb3IoOysrczxpOylvKHI9YShlLmNhbGwodCx0W3NdLHMpKSk/bis9cjotLWw7aWYobClyZXR1cm4gbi9sfSx1by5xdWFudGlsZT1mdW5jdGlvbih0LGUpe3ZhciByPSh0Lmxlbmd0aC0xKSplKzEsbj1NYXRoLmZsb29yKHIpLGk9K3Rbbi0xXSxhPXItbjtyZXR1cm4gYT9pK2EqKHRbbl0taSk6aX0sdW8ubWVkaWFuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj1bXSxzPXQubGVuZ3RoLGw9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8czspbyhyPWEodFtsXSkpJiZuLnB1c2gocik7ZWxzZSBmb3IoOysrbDxzOylvKHI9YShlLmNhbGwodCx0W2xdLGwpKSkmJm4ucHVzaChyKTtpZihuLmxlbmd0aClyZXR1cm4gdW8ucXVhbnRpbGUobi5zb3J0KGkpLC41KX0sdW8udmFyaWFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dC5sZW5ndGgscz0wLGw9MCx1PS0xLGM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrdTxpOylvKHI9YSh0W3VdKSkmJihuPXItcyxzKz1uLysrYyxsKz1uKihyLXMpKTtlbHNlIGZvcig7Kyt1PGk7KW8ocj1hKGUuY2FsbCh0LHRbdV0sdSkpKSYmKG49ci1zLHMrPW4vKytjLGwrPW4qKHItcykpO2lmKGM+MSlyZXR1cm4gbC8oYy0xKX0sdW8uZGV2aWF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dW8udmFyaWFuY2UuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0P01hdGguc3FydCh0KTp0fTt2YXIgYm89cyhpKTt1by5iaXNlY3RMZWZ0PWJvLmxlZnQsdW8uYmlzZWN0PXVvLmJpc2VjdFJpZ2h0PWJvLnJpZ2h0LHVvLmJpc2VjdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBzKDE9PT10Lmxlbmd0aD9mdW5jdGlvbihlLHIpe3JldHVybiBpKHQoZSkscil9OnQpfSx1by5zaHVmZmxlPWZ1bmN0aW9uKHQsZSxyKXsoYT1hcmd1bWVudHMubGVuZ3RoKTwzJiYocj10Lmxlbmd0aCxhPDImJihlPTApKTtmb3IodmFyIG4saSxhPXItZTthOylpPU1hdGgucmFuZG9tKCkqYS0tfDAsbj10W2ErZV0sdFthK2VdPXRbaStlXSx0W2krZV09bjtyZXR1cm4gdH0sdW8ucGVybXV0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aCxuPW5ldyBBcnJheShyKTtyLS07KW5bcl09dFtlW3JdXTtyZXR1cm4gbn0sdW8ucGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MCxuPXQubGVuZ3RoLTEsaT10WzBdLGE9bmV3IEFycmF5KG48MD8wOm4pO3I8bjspYVtyXT1bZT1pLGk9dFsrK3JdXTtyZXR1cm4gYX0sdW8udHJhbnNwb3NlPWZ1bmN0aW9uKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBlPS0xLHI9dW8ubWluKHQsbCksbj1uZXcgQXJyYXkocik7KytlPHI7KWZvcih2YXIgaSxhPS0xLG89bltlXT1uZXcgQXJyYXkoaSk7KythPGk7KW9bYV09dFthXVtlXTtyZXR1cm4gbn0sdW8uemlwPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnRyYW5zcG9zZShhcmd1bWVudHMpfSx1by5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZX0sdW8udmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaCh0W3JdKTtyZXR1cm4gZX0sdW8uZW50cmllcz1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdCllLnB1c2goe2tleTpyLHZhbHVlOnRbcl19KTtyZXR1cm4gZX0sdW8ubWVyZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbixpPXQubGVuZ3RoLGE9LTEsbz0wOysrYTxpOylvKz10W2FdLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobyk7LS1pPj0wOylmb3Iobj10W2ldLGU9bi5sZW5ndGg7LS1lPj0wOylyWy0tb109bltlXTtyZXR1cm4gcn07dmFyIHhvPU1hdGguYWJzO3VvLnJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihyPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYoZT10LHQ9MCkpLChlLXQpL3I9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciBuLGk9W10sYT11KHhvKHIpKSxvPS0xO2lmKHQqPWEsZSo9YSxyKj1hLHI8MClmb3IoOyhuPXQrciorK28pPmU7KWkucHVzaChuL2EpO2Vsc2UgZm9yKDsobj10K3IqKytvKTxlOylpLnB1c2gobi9hKTtyZXR1cm4gaX0sdW8ubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IGg7aWYodCBpbnN0YW5jZW9mIGgpdC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ci5zZXQodCxlKX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG4saT0tMSxhPXQubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytpPGE7KXIuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxhOylyLnNldChlLmNhbGwodCxuPXRbaV0saSksbil9ZWxzZSBmb3IodmFyIG8gaW4gdClyLnNldChvLHRbb10pO3JldHVybiByfTt2YXIgX289Il9fcHJvdG9fXyIsd289IlwwIjtjKGgse2hhczpwLGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fW2YodCldfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fW2YodCldPWV9LHJlbW92ZTptLGtleXM6Zyx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb
@JimColl
Copy link

JimColl commented Nov 3, 2019

Hi, I'm unable to reproduce this example, am I missing something obvious?

@timelyportfolio
Copy link
Author

@JimColl Plotly has changed its dependency management away from traditional htmlwidget protocol to allow for different builds. This should fix the problem attaching the full Plotly build (bigger than necessary).


leaflet(df) %>% addTiles() %>%
  addMarkers(
    ~Long, ~Lat,
    popup = lapply(
      seq_along(df),
      function(x) {
        plot_ly(x=~1:20, y=~runif(20)) %>%
          add_markers() %>%
          as.tags() %>%
          {tags$div(style="width:300px;", .)} %>%
          as.character()
      }
    )
  ) %>%
  onRender(
"
function(el,x) {
  this.on('popupopen', function() {HTMLWidgets.staticRender();})
}
") %>%
  add_deps("plotly") %>%
  htmltools::attachDependencies(plotly:::plotlyMainBundle(), append = TRUE) %>%
  htmltools::attachDependencies(crosstalk::crosstalkLibs(), append = TRUE) %>%
  browsable()

@JimColl
Copy link

JimColl commented Nov 4, 2019

Fantastic, thanks! I was hitting that and the broken interaction with leafpop::popupGraph and shiny (r-spatial/mapview#192).

library(leaflet) 
library(htmlwidgets)
library(htmltools)
library(plotly)
# library(dygraphs)
# library(xts)
# library(mapview)
# library(listviewer)
library(mapedit)
library(leafpop)
library(shinydashboard)

df <- read.csv(textConnection(
  "Name,Lat,Long
  Samurai Noodle,47.597131,-122.327298
  Kukai Ramen,47.6154,-122.327157
  Tsukushinbo,47.59987,-122.326726"
))

ui <- dashboardPage(
  skin = "green",
  dashboardHeader(title = "Shiny and Plotly popup"),
  dashboardSidebar(
    sidebarMenu(
      menuItem(
        "Maps", 
        tabName = "maps", 
        icon = icon("globe"),
        menuSubItem("No popup", tabName = "NoPopup", icon = icon("map")),
        menuSubItem("With popup", tabName = "Popup", icon = icon("map"))
      )
    )
  ),
  dashboardBody(
    tags$style(type = "text/css", "#currentConditions {height: calc(100vh - 150px) !important;}"
               , "#basedata {height: calc(100vh - 150px) !important;}"),
    tabItems(
      tabItem(
        tabName = "NoPopup",
        box(
          title = paste("No Popup"),
          collapsible = TRUE,
          width = "100%",
          height = "100%",
          leafletOutput("NoPopup")
        )
      ),
      tabItem(
        tabName = "Popup",
        box(
          title = paste("Popup"),
          collapsible = TRUE,
          width = "100%",
          height = "100%",
          leafletOutput("Popup")
        )
      )
    )
  )
  
)

server <- function(input, output) {
  
  output$Popup <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
      addMarkers(
        data = df,
        popup = leafpop::popupGraph(lapply(
          seq_along(df),
          function(x) {
            plot_ly(x=~1:20, y=~runif(20)) %>%
              add_markers() %>%
              as.tags() %>%
              {tags$div(style="width:300px;", .)} %>%
              as.character()
          }
        )
      )) %>%
      onRender(
        "
        function(el,x) {
        this.on('popupopen', function() {HTMLWidgets.staticRender();})
        }
        ") %>%
      add_deps("plotly") %>%
      htmltools::attachDependencies(plotly:::plotlyMainBundle(), append = TRUE) %>%
      htmltools::attachDependencies(crosstalk::crosstalkLibs(), append = TRUE) %>%
      browsable()
  })
  
  output$NoPopup <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
      addMarkers(data = df)
  })
}

shinyApp(ui, server)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment