You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

15010 lines
1.4MB

  1. (self["webpackChunk"] = self["webpackChunk"] || []).push([["canvg"],{
  2. /***/ "./node_modules/@amcharts/amcharts4/.internal/canvg/index.js":
  3. /*!*******************************************************************!*\
  4. !*** ./node_modules/@amcharts/amcharts4/.internal/canvg/index.js ***!
  5. \*******************************************************************/
  6. /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
  7. "use strict";
  8. __webpack_require__.r(__webpack_exports__);
  9. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  10. /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
  11. /* harmony export */ "AElement": () => (/* binding */ AElement),
  12. /* harmony export */ "AnimateColorElement": () => (/* binding */ AnimateColorElement),
  13. /* harmony export */ "AnimateElement": () => (/* binding */ AnimateElement),
  14. /* harmony export */ "AnimateTransformElement": () => (/* binding */ AnimateTransformElement),
  15. /* harmony export */ "BoundingBox": () => (/* binding */ BoundingBox),
  16. /* harmony export */ "CB1": () => (/* binding */ CB1),
  17. /* harmony export */ "CB2": () => (/* binding */ CB2),
  18. /* harmony export */ "CB3": () => (/* binding */ CB3),
  19. /* harmony export */ "CB4": () => (/* binding */ CB4),
  20. /* harmony export */ "Canvg": () => (/* binding */ Canvg),
  21. /* harmony export */ "CircleElement": () => (/* binding */ CircleElement),
  22. /* harmony export */ "ClipPathElement": () => (/* binding */ ClipPathElement),
  23. /* harmony export */ "DefsElement": () => (/* binding */ DefsElement),
  24. /* harmony export */ "DescElement": () => (/* binding */ DescElement),
  25. /* harmony export */ "Document": () => (/* binding */ Document),
  26. /* harmony export */ "Element": () => (/* binding */ Element),
  27. /* harmony export */ "EllipseElement": () => (/* binding */ EllipseElement),
  28. /* harmony export */ "FeColorMatrixElement": () => (/* binding */ FeColorMatrixElement),
  29. /* harmony export */ "FeCompositeElement": () => (/* binding */ FeCompositeElement),
  30. /* harmony export */ "FeDropShadowElement": () => (/* binding */ FeDropShadowElement),
  31. /* harmony export */ "FeGaussianBlurElement": () => (/* binding */ FeGaussianBlurElement),
  32. /* harmony export */ "FeMorphologyElement": () => (/* binding */ FeMorphologyElement),
  33. /* harmony export */ "FilterElement": () => (/* binding */ FilterElement),
  34. /* harmony export */ "Font": () => (/* binding */ Font),
  35. /* harmony export */ "FontElement": () => (/* binding */ FontElement),
  36. /* harmony export */ "FontFaceElement": () => (/* binding */ FontFaceElement),
  37. /* harmony export */ "GElement": () => (/* binding */ GElement),
  38. /* harmony export */ "GlyphElement": () => (/* binding */ GlyphElement),
  39. /* harmony export */ "GradientElement": () => (/* binding */ GradientElement),
  40. /* harmony export */ "ImageElement": () => (/* binding */ ImageElement),
  41. /* harmony export */ "LineElement": () => (/* binding */ LineElement),
  42. /* harmony export */ "LinearGradientElement": () => (/* binding */ LinearGradientElement),
  43. /* harmony export */ "MarkerElement": () => (/* binding */ MarkerElement),
  44. /* harmony export */ "MaskElement": () => (/* binding */ MaskElement),
  45. /* harmony export */ "Matrix": () => (/* binding */ Matrix),
  46. /* harmony export */ "MissingGlyphElement": () => (/* binding */ MissingGlyphElement),
  47. /* harmony export */ "Mouse": () => (/* binding */ Mouse),
  48. /* harmony export */ "PSEUDO_ZERO": () => (/* binding */ PSEUDO_ZERO),
  49. /* harmony export */ "Parser": () => (/* binding */ Parser),
  50. /* harmony export */ "PathElement": () => (/* binding */ PathElement),
  51. /* harmony export */ "PathParser": () => (/* binding */ PathParser),
  52. /* harmony export */ "PatternElement": () => (/* binding */ PatternElement),
  53. /* harmony export */ "Point": () => (/* binding */ Point),
  54. /* harmony export */ "PolygonElement": () => (/* binding */ PolygonElement),
  55. /* harmony export */ "PolylineElement": () => (/* binding */ PolylineElement),
  56. /* harmony export */ "Property": () => (/* binding */ Property),
  57. /* harmony export */ "QB1": () => (/* binding */ QB1),
  58. /* harmony export */ "QB2": () => (/* binding */ QB2),
  59. /* harmony export */ "QB3": () => (/* binding */ QB3),
  60. /* harmony export */ "RadialGradientElement": () => (/* binding */ RadialGradientElement),
  61. /* harmony export */ "RectElement": () => (/* binding */ RectElement),
  62. /* harmony export */ "RenderedElement": () => (/* binding */ RenderedElement),
  63. /* harmony export */ "Rotate": () => (/* binding */ Rotate),
  64. /* harmony export */ "SVGElement": () => (/* binding */ SVGElement),
  65. /* harmony export */ "SVGFontLoader": () => (/* binding */ SVGFontLoader),
  66. /* harmony export */ "Scale": () => (/* binding */ Scale),
  67. /* harmony export */ "Screen": () => (/* binding */ Screen),
  68. /* harmony export */ "Skew": () => (/* binding */ Skew),
  69. /* harmony export */ "SkewX": () => (/* binding */ SkewX),
  70. /* harmony export */ "SkewY": () => (/* binding */ SkewY),
  71. /* harmony export */ "StopElement": () => (/* binding */ StopElement),
  72. /* harmony export */ "StyleElement": () => (/* binding */ StyleElement),
  73. /* harmony export */ "SymbolElement": () => (/* binding */ SymbolElement),
  74. /* harmony export */ "TRefElement": () => (/* binding */ TRefElement),
  75. /* harmony export */ "TSpanElement": () => (/* binding */ TSpanElement),
  76. /* harmony export */ "TextElement": () => (/* binding */ TextElement),
  77. /* harmony export */ "TextPathElement": () => (/* binding */ TextPathElement),
  78. /* harmony export */ "TitleElement": () => (/* binding */ TitleElement),
  79. /* harmony export */ "Transform": () => (/* binding */ Transform),
  80. /* harmony export */ "Translate": () => (/* binding */ Translate),
  81. /* harmony export */ "UnknownElement": () => (/* binding */ UnknownElement),
  82. /* harmony export */ "UseElement": () => (/* binding */ UseElement),
  83. /* harmony export */ "ViewPort": () => (/* binding */ ViewPort),
  84. /* harmony export */ "compressSpaces": () => (/* binding */ compressSpaces),
  85. /* harmony export */ "getSelectorSpecificity": () => (/* binding */ getSelectorSpecificity),
  86. /* harmony export */ "normalizeAttributeName": () => (/* binding */ normalizeAttributeName),
  87. /* harmony export */ "normalizeColor": () => (/* binding */ normalizeColor),
  88. /* harmony export */ "parseExternalUrl": () => (/* binding */ parseExternalUrl),
  89. /* harmony export */ "presets": () => (/* binding */ index),
  90. /* harmony export */ "toNumbers": () => (/* binding */ toNumbers),
  91. /* harmony export */ "trimLeft": () => (/* binding */ trimLeft),
  92. /* harmony export */ "trimRight": () => (/* binding */ trimRight),
  93. /* harmony export */ "vectorMagnitude": () => (/* binding */ vectorMagnitude),
  94. /* harmony export */ "vectorsAngle": () => (/* binding */ vectorsAngle),
  95. /* harmony export */ "vectorsRatio": () => (/* binding */ vectorsRatio)
  96. /* harmony export */ });
  97. /* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.map */ "./node_modules/core-js/modules/es.array.map.js");
  98. /* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_0__);
  99. /* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js");
  100. /* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__);
  101. /* harmony import */ var core_js_modules_es_string_match__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.string.match */ "./node_modules/core-js/modules/es.string.match.js");
  102. /* harmony import */ var core_js_modules_es_string_match__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_match__WEBPACK_IMPORTED_MODULE_2__);
  103. /* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.string.replace */ "./node_modules/core-js/modules/es.string.replace.js");
  104. /* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_3__);
  105. /* harmony import */ var core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.string.starts-with */ "./node_modules/core-js/modules/es.string.starts-with.js");
  106. /* harmony import */ var core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_4__);
  107. /* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.join */ "./node_modules/core-js/modules/es.array.join.js");
  108. /* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_5__);
  109. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
  110. /* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.symbol */ "./node_modules/core-js/modules/es.symbol.js");
  111. /* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_7__);
  112. /* harmony import */ var core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.filter */ "./node_modules/core-js/modules/es.array.filter.js");
  113. /* harmony import */ var core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_8__);
  114. /* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.for-each */ "./node_modules/core-js/modules/es.array.for-each.js");
  115. /* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_9__);
  116. /* harmony import */ var core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.object.get-own-property-descriptor */ "./node_modules/core-js/modules/es.object.get-own-property-descriptor.js");
  117. /* harmony import */ var core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_10__);
  118. /* harmony import */ var core_js_modules_es_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.object.get-own-property-descriptors */ "./node_modules/core-js/modules/es.object.get-own-property-descriptors.js");
  119. /* harmony import */ var core_js_modules_es_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_11__);
  120. /* harmony import */ var core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.object.keys */ "./node_modules/core-js/modules/es.object.keys.js");
  121. /* harmony import */ var core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_12__);
  122. /* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each */ "./node_modules/core-js/modules/web.dom-collections.for-each.js");
  123. /* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_13__);
  124. /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js");
  125. /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14__);
  126. /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js");
  127. /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js");
  128. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js");
  129. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js");
  130. /* harmony import */ var core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/es.array.concat */ "./node_modules/core-js/modules/es.array.concat.js");
  131. /* harmony import */ var core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_19__);
  132. /* harmony import */ var core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.array.every */ "./node_modules/core-js/modules/es.array.every.js");
  133. /* harmony import */ var core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_20__);
  134. /* harmony import */ var core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! core-js/modules/es.array.reduce */ "./node_modules/core-js/modules/es.array.reduce.js");
  135. /* harmony import */ var core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_21__);
  136. /* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ "./node_modules/core-js/modules/es.object.to-string.js");
  137. /* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_22__);
  138. /* harmony import */ var core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! core-js/modules/es.promise */ "./node_modules/core-js/modules/es.promise.js");
  139. /* harmony import */ var core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_23__);
  140. /* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! core-js/modules/es.string.split */ "./node_modules/core-js/modules/es.string.split.js");
  141. /* harmony import */ var core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_24__);
  142. /* harmony import */ var raf__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! raf */ "./node_modules/raf/index.js");
  143. /* harmony import */ var raf__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(raf__WEBPACK_IMPORTED_MODULE_25__);
  144. /* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! core-js/modules/es.function.name */ "./node_modules/core-js/modules/es.function.name.js");
  145. /* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_26__);
  146. /* harmony import */ var rgbcolor__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! rgbcolor */ "./node_modules/rgbcolor/index.js");
  147. /* harmony import */ var rgbcolor__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(rgbcolor__WEBPACK_IMPORTED_MODULE_27__);
  148. /* harmony import */ var core_js_modules_es_reflect_construct__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! core-js/modules/es.reflect.construct */ "./node_modules/core-js/modules/es.reflect.construct.js");
  149. /* harmony import */ var core_js_modules_es_reflect_construct__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_construct__WEBPACK_IMPORTED_MODULE_28__);
  150. /* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string */ "./node_modules/core-js/modules/es.regexp.to-string.js");
  151. /* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_29__);
  152. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js");
  153. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js");
  154. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/esm/inherits.js");
  155. /* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! core-js/modules/es.array.from */ "./node_modules/core-js/modules/es.array.from.js");
  156. /* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_33__);
  157. /* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! core-js/modules/es.array.includes */ "./node_modules/core-js/modules/es.array.includes.js");
  158. /* harmony import */ var core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes__WEBPACK_IMPORTED_MODULE_34__);
  159. /* harmony import */ var core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! core-js/modules/es.array.some */ "./node_modules/core-js/modules/es.array.some.js");
  160. /* harmony import */ var core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_35__);
  161. /* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! core-js/modules/es.string.includes */ "./node_modules/core-js/modules/es.string.includes.js");
  162. /* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_36__);
  163. /* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! core-js/modules/es.string.iterator */ "./node_modules/core-js/modules/es.string.iterator.js");
  164. /* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_37__);
  165. /* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! core-js/modules/es.string.trim */ "./node_modules/core-js/modules/es.string.trim.js");
  166. /* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_38___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_38__);
  167. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js");
  168. /* harmony import */ var core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! core-js/modules/es.array.index-of */ "./node_modules/core-js/modules/es.array.index-of.js");
  169. /* harmony import */ var core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_40___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_40__);
  170. /* harmony import */ var core_js_modules_es_array_reverse__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! core-js/modules/es.array.reverse */ "./node_modules/core-js/modules/es.array.reverse.js");
  171. /* harmony import */ var core_js_modules_es_array_reverse__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reverse__WEBPACK_IMPORTED_MODULE_41__);
  172. /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "./node_modules/@babel/runtime/helpers/esm/get.js");
  173. /* harmony import */ var core_js_modules_es_number_constructor__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! core-js/modules/es.number.constructor */ "./node_modules/core-js/modules/es.number.constructor.js");
  174. /* harmony import */ var core_js_modules_es_number_constructor__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_number_constructor__WEBPACK_IMPORTED_MODULE_43__);
  175. /* harmony import */ var core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! core-js/modules/es.array.fill */ "./node_modules/core-js/modules/es.array.fill.js");
  176. /* harmony import */ var core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_44___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_44__);
  177. /* harmony import */ var core_js_modules_es_reflect_delete_property__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! core-js/modules/es.reflect.delete-property */ "./node_modules/core-js/modules/es.reflect.delete-property.js");
  178. /* harmony import */ var core_js_modules_es_reflect_delete_property__WEBPACK_IMPORTED_MODULE_45___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_delete_property__WEBPACK_IMPORTED_MODULE_45__);
  179. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js");
  180. /* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! core-js/modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
  181. /* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_47___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_47__);
  182. /* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator */ "./node_modules/core-js/modules/web.dom-collections.iterator.js");
  183. /* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_48___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_48__);
  184. /* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! core-js/modules/es.symbol.description */ "./node_modules/core-js/modules/es.symbol.description.js");
  185. /* harmony import */ var core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_49___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description__WEBPACK_IMPORTED_MODULE_49__);
  186. /* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator */ "./node_modules/core-js/modules/es.symbol.iterator.js");
  187. /* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_50___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_50__);
  188. /* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! core-js/modules/es.array.slice */ "./node_modules/core-js/modules/es.array.slice.js");
  189. /* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_51___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_51__);
  190. /* harmony import */ var core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! core-js/modules/es.map */ "./node_modules/core-js/modules/es.map.js");
  191. /* harmony import */ var core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_52___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_52__);
  192. /* harmony import */ var core_js_modules_es_reflect_apply__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! core-js/modules/es.reflect.apply */ "./node_modules/core-js/modules/es.reflect.apply.js");
  193. /* harmony import */ var core_js_modules_es_reflect_apply__WEBPACK_IMPORTED_MODULE_53___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_apply__WEBPACK_IMPORTED_MODULE_53__);
  194. /* harmony import */ var core_js_modules_es_reflect_get_prototype_of__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! core-js/modules/es.reflect.get-prototype-of */ "./node_modules/core-js/modules/es.reflect.get-prototype-of.js");
  195. /* harmony import */ var core_js_modules_es_reflect_get_prototype_of__WEBPACK_IMPORTED_MODULE_54___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_get_prototype_of__WEBPACK_IMPORTED_MODULE_54__);
  196. /* harmony import */ var stackblur_canvas__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! stackblur-canvas */ "./node_modules/stackblur-canvas/dist/stackblur-es.js");
  197. /**
  198. * HTML-safe compress white-spaces.
  199. * @param str - String to compress.
  200. */
  201. function compressSpaces(str) {
  202. return str.replace(/(?!\u3000)\s+/gm, ' ');
  203. }
  204. /**
  205. * HTML-safe left trim.
  206. * @param str - String to trim.
  207. */
  208. function trimLeft(str) {
  209. return str.replace(/^[\n \t]+/, '');
  210. }
  211. /**
  212. * HTML-safe right trim.
  213. * @param str - String to trim.
  214. */
  215. function trimRight(str) {
  216. return str.replace(/[\n \t]+$/, '');
  217. }
  218. /**
  219. * String to numbers array.
  220. * @param str - Numbers string.
  221. */
  222. function toNumbers(str) {
  223. var matches = (str || '').match(/-?(\d+(?:\.\d*(?:[eE][+-]?\d+)?)?|\.\d+)(?=\D|$)/gm) || [];
  224. return matches.map(parseFloat);
  225. } // Microsoft Edge fix
  226. var allUppercase = /^[A-Z-]+$/;
  227. /**
  228. * Normalize attribute name.
  229. * @param name - Attribute name.
  230. */
  231. function normalizeAttributeName(name) {
  232. if (allUppercase.test(name)) {
  233. return name.toLowerCase();
  234. }
  235. return name;
  236. }
  237. /**
  238. * Parse external URL.
  239. * @param url - CSS url string.
  240. */
  241. function parseExternalUrl(url) {
  242. // single quotes [2]
  243. // v double quotes [3]
  244. // v v no quotes [4]
  245. // v v v
  246. var urlMatch = url.match(/url\(('([^']+)'|"([^"]+)"|([^'"\)]+))\)/) || [];
  247. return urlMatch[2] || urlMatch[3] || urlMatch[4];
  248. }
  249. /**
  250. * Transform floats to integers in rgb colors.
  251. * @param color - Color to normalize.
  252. */
  253. function normalizeColor(color) {
  254. if (!color.startsWith('rgb')) {
  255. return color;
  256. }
  257. var rgbParts = 3;
  258. var normalizedColor = color.replace(/\d+(\.\d+)?/g, function (num, isFloat) {
  259. return rgbParts-- && isFloat ? String(Math.round(parseFloat(num))) : num;
  260. });
  261. return normalizedColor;
  262. }
  263. // slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js
  264. var attributeRegex = /(\[[^\]]+\])/g;
  265. var idRegex = /(#[^\s\+>~\.\[:]+)/g;
  266. var classRegex = /(\.[^\s\+>~\.\[:]+)/g;
  267. var pseudoElementRegex = /(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;
  268. var pseudoClassWithBracketsRegex = /(:[\w-]+\([^\)]*\))/gi;
  269. var pseudoClassRegex = /(:[^\s\+>~\.\[:]+)/g;
  270. var elementRegex = /([^\s\+>~\.\[:]+)/g;
  271. function findSelectorMatch(selector, regex) {
  272. var matches = selector.match(regex);
  273. if (!matches) {
  274. return [selector, 0];
  275. }
  276. return [selector.replace(regex, ' '), matches.length];
  277. }
  278. /**
  279. * Measure selector specificity.
  280. * @param selector - Selector to measure.
  281. */
  282. function getSelectorSpecificity(selector) {
  283. var specificity = [0, 0, 0];
  284. var currentSelector = selector.replace(/:not\(([^\)]*)\)/g, ' $1 ').replace(/{[\s\S]*/gm, ' ');
  285. var delta = 0;
  286. var _findSelectorMatch = findSelectorMatch(currentSelector, attributeRegex);
  287. var _findSelectorMatch2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch, 2);
  288. currentSelector = _findSelectorMatch2[0];
  289. delta = _findSelectorMatch2[1];
  290. specificity[1] += delta;
  291. var _findSelectorMatch3 = findSelectorMatch(currentSelector, idRegex);
  292. var _findSelectorMatch4 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch3, 2);
  293. currentSelector = _findSelectorMatch4[0];
  294. delta = _findSelectorMatch4[1];
  295. specificity[0] += delta;
  296. var _findSelectorMatch5 = findSelectorMatch(currentSelector, classRegex);
  297. var _findSelectorMatch6 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch5, 2);
  298. currentSelector = _findSelectorMatch6[0];
  299. delta = _findSelectorMatch6[1];
  300. specificity[1] += delta;
  301. var _findSelectorMatch7 = findSelectorMatch(currentSelector, pseudoElementRegex);
  302. var _findSelectorMatch8 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch7, 2);
  303. currentSelector = _findSelectorMatch8[0];
  304. delta = _findSelectorMatch8[1];
  305. specificity[2] += delta;
  306. var _findSelectorMatch9 = findSelectorMatch(currentSelector, pseudoClassWithBracketsRegex);
  307. var _findSelectorMatch10 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch9, 2);
  308. currentSelector = _findSelectorMatch10[0];
  309. delta = _findSelectorMatch10[1];
  310. specificity[1] += delta;
  311. var _findSelectorMatch11 = findSelectorMatch(currentSelector, pseudoClassRegex);
  312. var _findSelectorMatch12 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch11, 2);
  313. currentSelector = _findSelectorMatch12[0];
  314. delta = _findSelectorMatch12[1];
  315. specificity[1] += delta;
  316. currentSelector = currentSelector.replace(/[\*\s\+>~]/g, ' ').replace(/[#\.]/g, ' ');
  317. var _findSelectorMatch13 = findSelectorMatch(currentSelector, elementRegex);
  318. var _findSelectorMatch14 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_findSelectorMatch13, 2);
  319. currentSelector = _findSelectorMatch14[0];
  320. delta = _findSelectorMatch14[1];
  321. // lgtm [js/useless-assignment-to-local]
  322. specificity[2] += delta;
  323. return specificity.join('');
  324. }
  325. var PSEUDO_ZERO = .00000001;
  326. /**
  327. * Vector magnitude.
  328. */
  329. function vectorMagnitude(v) {
  330. return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));
  331. }
  332. /**
  333. * Ratio between two vectors.
  334. */
  335. function vectorsRatio(u, v) {
  336. return (u[0] * v[0] + u[1] * v[1]) / (vectorMagnitude(u) * vectorMagnitude(v));
  337. }
  338. /**
  339. * Angle between two vectors.
  340. */
  341. function vectorsAngle(u, v) {
  342. return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vectorsRatio(u, v));
  343. }
  344. function CB1(t) {
  345. return t * t * t;
  346. }
  347. function CB2(t) {
  348. return 3 * t * t * (1 - t);
  349. }
  350. function CB3(t) {
  351. return 3 * t * (1 - t) * (1 - t);
  352. }
  353. function CB4(t) {
  354. return (1 - t) * (1 - t) * (1 - t);
  355. }
  356. function QB1(t) {
  357. return t * t;
  358. }
  359. function QB2(t) {
  360. return 2 * t * (1 - t);
  361. }
  362. function QB3(t) {
  363. return (1 - t) * (1 - t);
  364. }
  365. function createCommonjsModule(fn, module) {
  366. return module = { exports: {} }, fn(module, module.exports), module.exports;
  367. }
  368. var runtime_1 = createCommonjsModule(function (module) {
  369. /**
  370. * Copyright (c) 2014-present, Facebook, Inc.
  371. *
  372. * This source code is licensed under the MIT license found in the
  373. * LICENSE file in the root directory of this source tree.
  374. */
  375. var runtime = function (exports) {
  376. var Op = Object.prototype;
  377. var hasOwn = Op.hasOwnProperty;
  378. var undefined$1; // More compressible than void 0.
  379. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  380. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  381. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  382. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  383. function wrap(innerFn, outerFn, self, tryLocsList) {
  384. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  385. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  386. var generator = Object.create(protoGenerator.prototype);
  387. var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
  388. // .throw, and .return methods.
  389. generator._invoke = makeInvokeMethod(innerFn, self, context);
  390. return generator;
  391. }
  392. exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
  393. // record like context.tryEntries[i].completion. This interface could
  394. // have been (and was previously) designed to take a closure to be
  395. // invoked without arguments, but in all the cases we care about we
  396. // already have an existing method we want to call, so there's no need
  397. // to create a new function object. We can even get away with assuming
  398. // the method takes exactly one argument, since that happens to be true
  399. // in every case, so we don't have to touch the arguments object. The
  400. // only additional allocation required is the completion record, which
  401. // has a stable shape and so hopefully should be cheap to allocate.
  402. function tryCatch(fn, obj, arg) {
  403. try {
  404. return {
  405. type: "normal",
  406. arg: fn.call(obj, arg)
  407. };
  408. } catch (err) {
  409. return {
  410. type: "throw",
  411. arg: err
  412. };
  413. }
  414. }
  415. var GenStateSuspendedStart = "suspendedStart";
  416. var GenStateSuspendedYield = "suspendedYield";
  417. var GenStateExecuting = "executing";
  418. var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
  419. // breaking out of the dispatch switch statement.
  420. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
  421. // .constructor.prototype properties for functions that return Generator
  422. // objects. For full spec compliance, you may wish to configure your
  423. // minifier not to mangle the names of these two functions.
  424. function Generator() {}
  425. function GeneratorFunction() {}
  426. function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
  427. // don't natively support it.
  428. var IteratorPrototype = {};
  429. IteratorPrototype[iteratorSymbol] = function () {
  430. return this;
  431. };
  432. var getProto = Object.getPrototypeOf;
  433. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  434. if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  435. // This environment has a native %IteratorPrototype%; use it instead
  436. // of the polyfill.
  437. IteratorPrototype = NativeIteratorPrototype;
  438. }
  439. var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  440. GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  441. GeneratorFunctionPrototype.constructor = GeneratorFunction;
  442. GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the
  443. // Iterator interface in terms of a single ._invoke method.
  444. function defineIteratorMethods(prototype) {
  445. ["next", "throw", "return"].forEach(function (method) {
  446. prototype[method] = function (arg) {
  447. return this._invoke(method, arg);
  448. };
  449. });
  450. }
  451. exports.isGeneratorFunction = function (genFun) {
  452. var ctor = typeof genFun === "function" && genFun.constructor;
  453. return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
  454. // do is to check its .name property.
  455. (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  456. };
  457. exports.mark = function (genFun) {
  458. if (Object.setPrototypeOf) {
  459. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  460. } else {
  461. genFun.__proto__ = GeneratorFunctionPrototype;
  462. if (!(toStringTagSymbol in genFun)) {
  463. genFun[toStringTagSymbol] = "GeneratorFunction";
  464. }
  465. }
  466. genFun.prototype = Object.create(Gp);
  467. return genFun;
  468. }; // Within the body of any async function, `await x` is transformed to
  469. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  470. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  471. // meant to be awaited.
  472. exports.awrap = function (arg) {
  473. return {
  474. __await: arg
  475. };
  476. };
  477. function AsyncIterator(generator, PromiseImpl) {
  478. function invoke(method, arg, resolve, reject) {
  479. var record = tryCatch(generator[method], generator, arg);
  480. if (record.type === "throw") {
  481. reject(record.arg);
  482. } else {
  483. var result = record.arg;
  484. var value = result.value;
  485. if (value && typeof value === "object" && hasOwn.call(value, "__await")) {
  486. return PromiseImpl.resolve(value.__await).then(function (value) {
  487. invoke("next", value, resolve, reject);
  488. }, function (err) {
  489. invoke("throw", err, resolve, reject);
  490. });
  491. }
  492. return PromiseImpl.resolve(value).then(function (unwrapped) {
  493. // When a yielded Promise is resolved, its final value becomes
  494. // the .value of the Promise<{value,done}> result for the
  495. // current iteration.
  496. result.value = unwrapped;
  497. resolve(result);
  498. }, function (error) {
  499. // If a rejected Promise was yielded, throw the rejection back
  500. // into the async generator function so it can be handled there.
  501. return invoke("throw", error, resolve, reject);
  502. });
  503. }
  504. }
  505. var previousPromise;
  506. function enqueue(method, arg) {
  507. function callInvokeWithMethodAndArg() {
  508. return new PromiseImpl(function (resolve, reject) {
  509. invoke(method, arg, resolve, reject);
  510. });
  511. }
  512. return previousPromise = // If enqueue has been called before, then we want to wait until
  513. // all previous Promises have been resolved before calling invoke,
  514. // so that results are always delivered in the correct order. If
  515. // enqueue has not been called before, then it is important to
  516. // call invoke immediately, without waiting on a callback to fire,
  517. // so that the async generator function has the opportunity to do
  518. // any necessary setup in a predictable way. This predictability
  519. // is why the Promise constructor synchronously invokes its
  520. // executor callback, and why async functions synchronously
  521. // execute code before the first await. Since we implement simple
  522. // async functions in terms of async generators, it is especially
  523. // important to get this right, even though it requires care.
  524. previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
  525. // invocations of the iterator.
  526. callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
  527. } // Define the unified helper method that is used to implement .next,
  528. // .throw, and .return (see defineIteratorMethods).
  529. this._invoke = enqueue;
  530. }
  531. defineIteratorMethods(AsyncIterator.prototype);
  532. AsyncIterator.prototype[asyncIteratorSymbol] = function () {
  533. return this;
  534. };
  535. exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
  536. // AsyncIterator objects; they just return a Promise for the value of
  537. // the final result produced by the iterator.
  538. exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
  539. if (PromiseImpl === void 0) PromiseImpl = Promise;
  540. var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
  541. return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
  542. : iter.next().then(function (result) {
  543. return result.done ? result.value : iter.next();
  544. });
  545. };
  546. function makeInvokeMethod(innerFn, self, context) {
  547. var state = GenStateSuspendedStart;
  548. return function invoke(method, arg) {
  549. if (state === GenStateExecuting) {
  550. throw new Error("Generator is already running");
  551. }
  552. if (state === GenStateCompleted) {
  553. if (method === "throw") {
  554. throw arg;
  555. } // Be forgiving, per 25.3.3.3.3 of the spec:
  556. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  557. return doneResult();
  558. }
  559. context.method = method;
  560. context.arg = arg;
  561. while (true) {
  562. var delegate = context.delegate;
  563. if (delegate) {
  564. var delegateResult = maybeInvokeDelegate(delegate, context);
  565. if (delegateResult) {
  566. if (delegateResult === ContinueSentinel) continue;
  567. return delegateResult;
  568. }
  569. }
  570. if (context.method === "next") {
  571. // Setting context._sent for legacy support of Babel's
  572. // function.sent implementation.
  573. context.sent = context._sent = context.arg;
  574. } else if (context.method === "throw") {
  575. if (state === GenStateSuspendedStart) {
  576. state = GenStateCompleted;
  577. throw context.arg;
  578. }
  579. context.dispatchException(context.arg);
  580. } else if (context.method === "return") {
  581. context.abrupt("return", context.arg);
  582. }
  583. state = GenStateExecuting;
  584. var record = tryCatch(innerFn, self, context);
  585. if (record.type === "normal") {
  586. // If an exception is thrown from innerFn, we leave state ===
  587. // GenStateExecuting and loop back for another invocation.
  588. state = context.done ? GenStateCompleted : GenStateSuspendedYield;
  589. if (record.arg === ContinueSentinel) {
  590. continue;
  591. }
  592. return {
  593. value: record.arg,
  594. done: context.done
  595. };
  596. } else if (record.type === "throw") {
  597. state = GenStateCompleted; // Dispatch the exception by looping back around to the
  598. // context.dispatchException(context.arg) call above.
  599. context.method = "throw";
  600. context.arg = record.arg;
  601. }
  602. }
  603. };
  604. } // Call delegate.iterator[context.method](context.arg) and handle the
  605. // result, either by returning a { value, done } result from the
  606. // delegate iterator, or by modifying context.method and context.arg,
  607. // setting context.delegate to null, and returning the ContinueSentinel.
  608. function maybeInvokeDelegate(delegate, context) {
  609. var method = delegate.iterator[context.method];
  610. if (method === undefined$1) {
  611. // A .throw or .return when the delegate iterator has no .throw
  612. // method always terminates the yield* loop.
  613. context.delegate = null;
  614. if (context.method === "throw") {
  615. // Note: ["return"] must be used for ES3 parsing compatibility.
  616. if (delegate.iterator["return"]) {
  617. // If the delegate iterator has a return method, give it a
  618. // chance to clean up.
  619. context.method = "return";
  620. context.arg = undefined$1;
  621. maybeInvokeDelegate(delegate, context);
  622. if (context.method === "throw") {
  623. // If maybeInvokeDelegate(context) changed context.method from
  624. // "return" to "throw", let that override the TypeError below.
  625. return ContinueSentinel;
  626. }
  627. }
  628. context.method = "throw";
  629. context.arg = new TypeError("The iterator does not provide a 'throw' method");
  630. }
  631. return ContinueSentinel;
  632. }
  633. var record = tryCatch(method, delegate.iterator, context.arg);
  634. if (record.type === "throw") {
  635. context.method = "throw";
  636. context.arg = record.arg;
  637. context.delegate = null;
  638. return ContinueSentinel;
  639. }
  640. var info = record.arg;
  641. if (!info) {
  642. context.method = "throw";
  643. context.arg = new TypeError("iterator result is not an object");
  644. context.delegate = null;
  645. return ContinueSentinel;
  646. }
  647. if (info.done) {
  648. // Assign the result of the finished delegate to the temporary
  649. // variable specified by delegate.resultName (see delegateYield).
  650. context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
  651. context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
  652. // exception, let the outer generator proceed normally. If
  653. // context.method was "next", forget context.arg since it has been
  654. // "consumed" by the delegate iterator. If context.method was
  655. // "return", allow the original .return call to continue in the
  656. // outer generator.
  657. if (context.method !== "return") {
  658. context.method = "next";
  659. context.arg = undefined$1;
  660. }
  661. } else {
  662. // Re-yield the result returned by the delegate method.
  663. return info;
  664. } // The delegate iterator is finished, so forget it and continue with
  665. // the outer generator.
  666. context.delegate = null;
  667. return ContinueSentinel;
  668. } // Define Generator.prototype.{next,throw,return} in terms of the
  669. // unified ._invoke helper method.
  670. defineIteratorMethods(Gp);
  671. Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the
  672. // @@iterator function is called on it. Some browsers' implementations of the
  673. // iterator prototype chain incorrectly implement this, causing the Generator
  674. // object to not be returned from this call. This ensures that doesn't happen.
  675. // See https://github.com/facebook/regenerator/issues/274 for more details.
  676. Gp[iteratorSymbol] = function () {
  677. return this;
  678. };
  679. Gp.toString = function () {
  680. return "[object Generator]";
  681. };
  682. function pushTryEntry(locs) {
  683. var entry = {
  684. tryLoc: locs[0]
  685. };
  686. if (1 in locs) {
  687. entry.catchLoc = locs[1];
  688. }
  689. if (2 in locs) {
  690. entry.finallyLoc = locs[2];
  691. entry.afterLoc = locs[3];
  692. }
  693. this.tryEntries.push(entry);
  694. }
  695. function resetTryEntry(entry) {
  696. var record = entry.completion || {};
  697. record.type = "normal";
  698. delete record.arg;
  699. entry.completion = record;
  700. }
  701. function Context(tryLocsList) {
  702. // The root entry object (effectively a try statement without a catch
  703. // or a finally block) gives us a place to store values thrown from
  704. // locations where there is no enclosing try statement.
  705. this.tryEntries = [{
  706. tryLoc: "root"
  707. }];
  708. tryLocsList.forEach(pushTryEntry, this);
  709. this.reset(true);
  710. }
  711. exports.keys = function (object) {
  712. var keys = [];
  713. for (var key in object) {
  714. keys.push(key);
  715. }
  716. keys.reverse(); // Rather than returning an object with a next method, we keep
  717. // things simple and return the next function itself.
  718. return function next() {
  719. while (keys.length) {
  720. var key = keys.pop();
  721. if (key in object) {
  722. next.value = key;
  723. next.done = false;
  724. return next;
  725. }
  726. } // To avoid creating an additional object, we just hang the .value
  727. // and .done properties off the next function object itself. This
  728. // also ensures that the minifier will not anonymize the function.
  729. next.done = true;
  730. return next;
  731. };
  732. };
  733. function values(iterable) {
  734. if (iterable) {
  735. var iteratorMethod = iterable[iteratorSymbol];
  736. if (iteratorMethod) {
  737. return iteratorMethod.call(iterable);
  738. }
  739. if (typeof iterable.next === "function") {
  740. return iterable;
  741. }
  742. if (!isNaN(iterable.length)) {
  743. var i = -1,
  744. next = function next() {
  745. while (++i < iterable.length) {
  746. if (hasOwn.call(iterable, i)) {
  747. next.value = iterable[i];
  748. next.done = false;
  749. return next;
  750. }
  751. }
  752. next.value = undefined$1;
  753. next.done = true;
  754. return next;
  755. };
  756. return next.next = next;
  757. }
  758. } // Return an iterator with no values.
  759. return {
  760. next: doneResult
  761. };
  762. }
  763. exports.values = values;
  764. function doneResult() {
  765. return {
  766. value: undefined$1,
  767. done: true
  768. };
  769. }
  770. Context.prototype = {
  771. constructor: Context,
  772. reset: function (skipTempReset) {
  773. this.prev = 0;
  774. this.next = 0; // Resetting context._sent for legacy support of Babel's
  775. // function.sent implementation.
  776. this.sent = this._sent = undefined$1;
  777. this.done = false;
  778. this.delegate = null;
  779. this.method = "next";
  780. this.arg = undefined$1;
  781. this.tryEntries.forEach(resetTryEntry);
  782. if (!skipTempReset) {
  783. for (var name in this) {
  784. // Not sure about the optimal order of these conditions:
  785. if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
  786. this[name] = undefined$1;
  787. }
  788. }
  789. }
  790. },
  791. stop: function () {
  792. this.done = true;
  793. var rootEntry = this.tryEntries[0];
  794. var rootRecord = rootEntry.completion;
  795. if (rootRecord.type === "throw") {
  796. throw rootRecord.arg;
  797. }
  798. return this.rval;
  799. },
  800. dispatchException: function (exception) {
  801. if (this.done) {
  802. throw exception;
  803. }
  804. var context = this;
  805. function handle(loc, caught) {
  806. record.type = "throw";
  807. record.arg = exception;
  808. context.next = loc;
  809. if (caught) {
  810. // If the dispatched exception was caught by a catch block,
  811. // then let that catch block handle the exception normally.
  812. context.method = "next";
  813. context.arg = undefined$1;
  814. }
  815. return !!caught;
  816. }
  817. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  818. var entry = this.tryEntries[i];
  819. var record = entry.completion;
  820. if (entry.tryLoc === "root") {
  821. // Exception thrown outside of any try block that could handle
  822. // it, so set the completion value of the entire function to
  823. // throw the exception.
  824. return handle("end");
  825. }
  826. if (entry.tryLoc <= this.prev) {
  827. var hasCatch = hasOwn.call(entry, "catchLoc");
  828. var hasFinally = hasOwn.call(entry, "finallyLoc");
  829. if (hasCatch && hasFinally) {
  830. if (this.prev < entry.catchLoc) {
  831. return handle(entry.catchLoc, true);
  832. } else if (this.prev < entry.finallyLoc) {
  833. return handle(entry.finallyLoc);
  834. }
  835. } else if (hasCatch) {
  836. if (this.prev < entry.catchLoc) {
  837. return handle(entry.catchLoc, true);
  838. }
  839. } else if (hasFinally) {
  840. if (this.prev < entry.finallyLoc) {
  841. return handle(entry.finallyLoc);
  842. }
  843. } else {
  844. throw new Error("try statement without catch or finally");
  845. }
  846. }
  847. }
  848. },
  849. abrupt: function (type, arg) {
  850. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  851. var entry = this.tryEntries[i];
  852. if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
  853. var finallyEntry = entry;
  854. break;
  855. }
  856. }
  857. if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
  858. // Ignore the finally entry if control is not jumping to a
  859. // location outside the try/catch block.
  860. finallyEntry = null;
  861. }
  862. var record = finallyEntry ? finallyEntry.completion : {};
  863. record.type = type;
  864. record.arg = arg;
  865. if (finallyEntry) {
  866. this.method = "next";
  867. this.next = finallyEntry.finallyLoc;
  868. return ContinueSentinel;
  869. }
  870. return this.complete(record);
  871. },
  872. complete: function (record, afterLoc) {
  873. if (record.type === "throw") {
  874. throw record.arg;
  875. }
  876. if (record.type === "break" || record.type === "continue") {
  877. this.next = record.arg;
  878. } else if (record.type === "return") {
  879. this.rval = this.arg = record.arg;
  880. this.method = "return";
  881. this.next = "end";
  882. } else if (record.type === "normal" && afterLoc) {
  883. this.next = afterLoc;
  884. }
  885. return ContinueSentinel;
  886. },
  887. finish: function (finallyLoc) {
  888. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  889. var entry = this.tryEntries[i];
  890. if (entry.finallyLoc === finallyLoc) {
  891. this.complete(entry.completion, entry.afterLoc);
  892. resetTryEntry(entry);
  893. return ContinueSentinel;
  894. }
  895. }
  896. },
  897. "catch": function (tryLoc) {
  898. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  899. var entry = this.tryEntries[i];
  900. if (entry.tryLoc === tryLoc) {
  901. var record = entry.completion;
  902. if (record.type === "throw") {
  903. var thrown = record.arg;
  904. resetTryEntry(entry);
  905. }
  906. return thrown;
  907. }
  908. } // The context.catch method must only be called with a location
  909. // argument that corresponds to a known catch block.
  910. throw new Error("illegal catch attempt");
  911. },
  912. delegateYield: function (iterable, resultName, nextLoc) {
  913. this.delegate = {
  914. iterator: values(iterable),
  915. resultName: resultName,
  916. nextLoc: nextLoc
  917. };
  918. if (this.method === "next") {
  919. // Deliberately forget the last sent value so that we don't
  920. // accidentally pass it on to the delegate.
  921. this.arg = undefined$1;
  922. }
  923. return ContinueSentinel;
  924. }
  925. }; // Regardless of whether this script is executing as a CommonJS module
  926. // or not, return the runtime object so that we can declare the variable
  927. // regeneratorRuntime in the outer scope, which allows this module to be
  928. // injected easily by `bin/regenerator --include-runtime script.js`.
  929. return exports;
  930. }( // If this script is executing as a CommonJS module, use module.exports
  931. // as the regeneratorRuntime namespace. Otherwise create a new empty
  932. // object. Either way, the resulting object will be used to initialize
  933. // the regeneratorRuntime variable at the top of this file.
  934. module.exports );
  935. try {
  936. regeneratorRuntime = runtime;
  937. } catch (accidentalStrictMode) {
  938. // This module should not be running in strict mode, so the above
  939. // assignment should always work unless something is misconfigured. Just
  940. // in case runtime.js accidentally runs in strict mode, we can escape
  941. // strict mode using a global Function call. This could conceivably fail
  942. // if a Content Security Policy forbids using Function, but in that case
  943. // the proper solution is to fix the accidental strict mode problem. If
  944. // you've misconfigured your bundler to force strict mode and applied a
  945. // CSP to forbid Function, and you're not willing to fix either of those
  946. // problems, please detail your unique predicament in a GitHub issue.
  947. Function("r", "regeneratorRuntime = r")(runtime);
  948. }
  949. });
  950. var Property = /*#__PURE__*/function () {
  951. function Property(document, name, value) {
  952. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Property);
  953. this.document = document;
  954. this.name = name;
  955. this.value = value;
  956. this.isNormalizedColor = false;
  957. }
  958. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Property, [{
  959. key: "hasValue",
  960. value: function hasValue() {
  961. var value = this.value;
  962. return value !== null && value !== '' && value !== 0 && typeof value !== 'undefined';
  963. }
  964. }, {
  965. key: "isString",
  966. value: function isString(regexp) {
  967. var value = this.value;
  968. var result = typeof value === 'string';
  969. if (!result || !regexp) {
  970. return result;
  971. }
  972. return regexp.test(value);
  973. }
  974. }, {
  975. key: "isUrlDefinition",
  976. value: function isUrlDefinition() {
  977. return this.isString(/^url\(/);
  978. }
  979. }, {
  980. key: "isPixels",
  981. value: function isPixels() {
  982. if (!this.hasValue()) {
  983. return false;
  984. }
  985. var asString = this.getString();
  986. switch (true) {
  987. case /px$/.test(asString):
  988. case /^[0-9]+$/.test(asString):
  989. return true;
  990. default:
  991. return false;
  992. }
  993. }
  994. }, {
  995. key: "setValue",
  996. value: function setValue(value) {
  997. this.value = value;
  998. return this;
  999. }
  1000. }, {
  1001. key: "getValue",
  1002. value: function getValue(def) {
  1003. if (typeof def === 'undefined' || this.hasValue()) {
  1004. return this.value;
  1005. }
  1006. return def;
  1007. }
  1008. }, {
  1009. key: "getNumber",
  1010. value: function getNumber(def) {
  1011. if (!this.hasValue()) {
  1012. if (typeof def === 'undefined') {
  1013. return 0;
  1014. }
  1015. return parseFloat(def);
  1016. }
  1017. var value = this.value;
  1018. var n = parseFloat(value);
  1019. if (this.isString(/%$/)) {
  1020. n = n / 100.0;
  1021. }
  1022. return n;
  1023. }
  1024. }, {
  1025. key: "getString",
  1026. value: function getString(def) {
  1027. if (typeof def === 'undefined' || this.hasValue()) {
  1028. return typeof this.value === 'undefined' ? '' : String(this.value);
  1029. }
  1030. return String(def);
  1031. }
  1032. }, {
  1033. key: "getColor",
  1034. value: function getColor(def) {
  1035. var color = this.getString(def);
  1036. if (this.isNormalizedColor) {
  1037. return color;
  1038. }
  1039. this.isNormalizedColor = true;
  1040. color = normalizeColor(color);
  1041. this.value = color;
  1042. return color;
  1043. }
  1044. }, {
  1045. key: "getDpi",
  1046. value: function getDpi() {
  1047. return 96.0; // TODO: compute?
  1048. }
  1049. }, {
  1050. key: "getRem",
  1051. value: function getRem() {
  1052. return this.document.rootEmSize;
  1053. }
  1054. }, {
  1055. key: "getEm",
  1056. value: function getEm() {
  1057. return this.document.emSize;
  1058. }
  1059. }, {
  1060. key: "getUnits",
  1061. value: function getUnits() {
  1062. return this.getString().replace(/[0-9\.\-]/g, '');
  1063. }
  1064. }, {
  1065. key: "getPixels",
  1066. value: function getPixels(axisOrIsFontSize) {
  1067. var processPercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  1068. if (!this.hasValue()) {
  1069. return 0;
  1070. }
  1071. var _ref = typeof axisOrIsFontSize === 'boolean' ? [undefined, axisOrIsFontSize] : [axisOrIsFontSize],
  1072. _ref2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_ref, 2),
  1073. axis = _ref2[0],
  1074. isFontSize = _ref2[1];
  1075. var viewPort = this.document.screen.viewPort;
  1076. switch (true) {
  1077. case this.isString(/vmin$/):
  1078. return this.getNumber() / 100.0 * Math.min(viewPort.computeSize('x'), viewPort.computeSize('y'));
  1079. case this.isString(/vmax$/):
  1080. return this.getNumber() / 100.0 * Math.max(viewPort.computeSize('x'), viewPort.computeSize('y'));
  1081. case this.isString(/vw$/):
  1082. return this.getNumber() / 100.0 * viewPort.computeSize('x');
  1083. case this.isString(/vh$/):
  1084. return this.getNumber() / 100.0 * viewPort.computeSize('y');
  1085. case this.isString(/rem$/):
  1086. return this.getNumber() * this.getRem();
  1087. case this.isString(/em$/):
  1088. return this.getNumber() * this.getEm();
  1089. case this.isString(/ex$/):
  1090. return this.getNumber() * this.getEm() / 2.0;
  1091. case this.isString(/px$/):
  1092. return this.getNumber();
  1093. case this.isString(/pt$/):
  1094. return this.getNumber() * this.getDpi() * (1.0 / 72.0);
  1095. case this.isString(/pc$/):
  1096. return this.getNumber() * 15;
  1097. case this.isString(/cm$/):
  1098. return this.getNumber() * this.getDpi() / 2.54;
  1099. case this.isString(/mm$/):
  1100. return this.getNumber() * this.getDpi() / 25.4;
  1101. case this.isString(/in$/):
  1102. return this.getNumber() * this.getDpi();
  1103. case this.isString(/%$/) && isFontSize:
  1104. return this.getNumber() * this.getEm();
  1105. case this.isString(/%$/):
  1106. return this.getNumber() * viewPort.computeSize(axis);
  1107. default:
  1108. {
  1109. var n = this.getNumber();
  1110. if (processPercent && n < 1.0) {
  1111. return n * viewPort.computeSize(axis);
  1112. }
  1113. return n;
  1114. }
  1115. }
  1116. }
  1117. }, {
  1118. key: "getMilliseconds",
  1119. value: function getMilliseconds() {
  1120. if (!this.hasValue()) {
  1121. return 0;
  1122. }
  1123. if (this.isString(/ms$/)) {
  1124. return this.getNumber();
  1125. }
  1126. return this.getNumber() * 1000;
  1127. }
  1128. }, {
  1129. key: "getRadians",
  1130. value: function getRadians() {
  1131. if (!this.hasValue()) {
  1132. return 0;
  1133. }
  1134. switch (true) {
  1135. case this.isString(/deg$/):
  1136. return this.getNumber() * (Math.PI / 180.0);
  1137. case this.isString(/grad$/):
  1138. return this.getNumber() * (Math.PI / 200.0);
  1139. case this.isString(/rad$/):
  1140. return this.getNumber();
  1141. default:
  1142. return this.getNumber() * (Math.PI / 180.0);
  1143. }
  1144. }
  1145. }, {
  1146. key: "getDefinition",
  1147. value: function getDefinition() {
  1148. var asString = this.getString();
  1149. var name = asString.match(/#([^\)'"]+)/);
  1150. if (name) {
  1151. name = name[1];
  1152. }
  1153. if (!name) {
  1154. name = asString;
  1155. }
  1156. return this.document.definitions[name];
  1157. }
  1158. }, {
  1159. key: "getFillStyleDefinition",
  1160. value: function getFillStyleDefinition(element, opacity) {
  1161. var def = this.getDefinition();
  1162. if (!def) {
  1163. return null;
  1164. } // gradient
  1165. if (typeof def.createGradient === 'function') {
  1166. return def.createGradient(this.document.ctx, element, opacity);
  1167. } // pattern
  1168. if (typeof def.createPattern === 'function') {
  1169. if (def.getHrefAttribute().hasValue()) {
  1170. var patternTransform = def.getAttribute('patternTransform');
  1171. def = def.getHrefAttribute().getDefinition();
  1172. if (patternTransform.hasValue()) {
  1173. def.getAttribute('patternTransform', true).setValue(patternTransform.value);
  1174. }
  1175. }
  1176. return def.createPattern(this.document.ctx, element, opacity);
  1177. }
  1178. return null;
  1179. }
  1180. }, {
  1181. key: "getTextBaseline",
  1182. value: function getTextBaseline() {
  1183. if (!this.hasValue()) {
  1184. return null;
  1185. }
  1186. return Property.textBaselineMapping[this.getString()];
  1187. }
  1188. }, {
  1189. key: "addOpacity",
  1190. value: function addOpacity(opacity) {
  1191. var value = this.getColor();
  1192. var len = value.length;
  1193. var commas = 0; // Simulate old RGBColor version, which can't parse rgba.
  1194. for (var i = 0; i < len; i++) {
  1195. if (value[i] === ',') {
  1196. commas++;
  1197. }
  1198. if (commas === 3) {
  1199. break;
  1200. }
  1201. }
  1202. if (opacity.hasValue() && this.isString() && commas !== 3) {
  1203. var color = new (rgbcolor__WEBPACK_IMPORTED_MODULE_27___default())(value);
  1204. if (color.ok) {
  1205. color.alpha = opacity.getNumber();
  1206. value = color.toRGBA();
  1207. }
  1208. }
  1209. return new Property(this.document, this.name, value);
  1210. }
  1211. }], [{
  1212. key: "empty",
  1213. value: function empty(document) {
  1214. return new Property(document, 'EMPTY', '');
  1215. }
  1216. }]);
  1217. return Property;
  1218. }();
  1219. Property.textBaselineMapping = {
  1220. 'baseline': 'alphabetic',
  1221. 'before-edge': 'top',
  1222. 'text-before-edge': 'top',
  1223. 'middle': 'middle',
  1224. 'central': 'middle',
  1225. 'after-edge': 'bottom',
  1226. 'text-after-edge': 'bottom',
  1227. 'ideographic': 'ideographic',
  1228. 'alphabetic': 'alphabetic',
  1229. 'hanging': 'hanging',
  1230. 'mathematical': 'alphabetic'
  1231. };
  1232. var ViewPort = /*#__PURE__*/function () {
  1233. function ViewPort() {
  1234. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, ViewPort);
  1235. this.viewPorts = [];
  1236. }
  1237. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(ViewPort, [{
  1238. key: "clear",
  1239. value: function clear() {
  1240. this.viewPorts = [];
  1241. }
  1242. }, {
  1243. key: "setCurrent",
  1244. value: function setCurrent(width, height) {
  1245. this.viewPorts.push({
  1246. width: width,
  1247. height: height
  1248. });
  1249. }
  1250. }, {
  1251. key: "removeCurrent",
  1252. value: function removeCurrent() {
  1253. this.viewPorts.pop();
  1254. }
  1255. }, {
  1256. key: "getCurrent",
  1257. value: function getCurrent() {
  1258. var viewPorts = this.viewPorts;
  1259. return viewPorts[viewPorts.length - 1];
  1260. }
  1261. }, {
  1262. key: "computeSize",
  1263. value: function computeSize(d) {
  1264. if (typeof d === 'number') {
  1265. return d;
  1266. }
  1267. if (d === 'x') {
  1268. return this.width;
  1269. }
  1270. if (d === 'y') {
  1271. return this.height;
  1272. }
  1273. return Math.sqrt(Math.pow(this.width, 2) + Math.pow(this.height, 2)) / Math.sqrt(2);
  1274. }
  1275. }, {
  1276. key: "width",
  1277. get: function get() {
  1278. return this.getCurrent().width;
  1279. }
  1280. }, {
  1281. key: "height",
  1282. get: function get() {
  1283. return this.getCurrent().height;
  1284. }
  1285. }]);
  1286. return ViewPort;
  1287. }();
  1288. var Point = /*#__PURE__*/function () {
  1289. function Point(x, y) {
  1290. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Point);
  1291. this.x = x;
  1292. this.y = y;
  1293. }
  1294. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Point, [{
  1295. key: "angleTo",
  1296. value: function angleTo(point) {
  1297. return Math.atan2(point.y - this.y, point.x - this.x);
  1298. }
  1299. }, {
  1300. key: "applyTransform",
  1301. value: function applyTransform(transform) {
  1302. var x = this.x,
  1303. y = this.y;
  1304. var xp = x * transform[0] + y * transform[2] + transform[4];
  1305. var yp = x * transform[1] + y * transform[3] + transform[5];
  1306. this.x = xp;
  1307. this.y = yp;
  1308. }
  1309. }], [{
  1310. key: "parse",
  1311. value: function parse(point) {
  1312. var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  1313. var _toNumbers = toNumbers(point),
  1314. _toNumbers2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_toNumbers, 2),
  1315. _toNumbers2$ = _toNumbers2[0],
  1316. x = _toNumbers2$ === void 0 ? defaultValue : _toNumbers2$,
  1317. _toNumbers2$2 = _toNumbers2[1],
  1318. y = _toNumbers2$2 === void 0 ? defaultValue : _toNumbers2$2;
  1319. return new Point(x, y);
  1320. }
  1321. }, {
  1322. key: "parseScale",
  1323. value: function parseScale(scale) {
  1324. var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  1325. var _toNumbers3 = toNumbers(scale),
  1326. _toNumbers4 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_toNumbers3, 2),
  1327. _toNumbers4$ = _toNumbers4[0],
  1328. x = _toNumbers4$ === void 0 ? defaultValue : _toNumbers4$,
  1329. _toNumbers4$2 = _toNumbers4[1],
  1330. y = _toNumbers4$2 === void 0 ? x : _toNumbers4$2;
  1331. return new Point(x, y);
  1332. }
  1333. }, {
  1334. key: "parsePath",
  1335. value: function parsePath(path) {
  1336. var points = toNumbers(path);
  1337. var len = points.length;
  1338. var pathPoints = [];
  1339. for (var i = 0; i < len; i += 2) {
  1340. pathPoints.push(new Point(points[i], points[i + 1]));
  1341. }
  1342. return pathPoints;
  1343. }
  1344. }]);
  1345. return Point;
  1346. }();
  1347. var Mouse = /*#__PURE__*/function () {
  1348. function Mouse(screen) {
  1349. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Mouse);
  1350. this.screen = screen;
  1351. this.working = false;
  1352. this.events = [];
  1353. this.eventElements = [];
  1354. this.onClick = this.onClick.bind(this);
  1355. this.onMouseMove = this.onMouseMove.bind(this);
  1356. }
  1357. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Mouse, [{
  1358. key: "isWorking",
  1359. value: function isWorking() {
  1360. return this.working;
  1361. }
  1362. }, {
  1363. key: "start",
  1364. value: function start() {
  1365. if (this.working) {
  1366. return;
  1367. }
  1368. var screen = this.screen,
  1369. onClick = this.onClick,
  1370. onMouseMove = this.onMouseMove;
  1371. var canvas = screen.ctx.canvas;
  1372. canvas.onclick = onClick;
  1373. canvas.onmousemove = onMouseMove;
  1374. this.working = true;
  1375. }
  1376. }, {
  1377. key: "stop",
  1378. value: function stop() {
  1379. if (!this.working) {
  1380. return;
  1381. }
  1382. var canvas = this.screen.ctx.canvas;
  1383. this.working = false;
  1384. canvas.onclick = null;
  1385. canvas.onmousemove = null;
  1386. }
  1387. }, {
  1388. key: "hasEvents",
  1389. value: function hasEvents() {
  1390. return this.working && this.events.length > 0;
  1391. }
  1392. }, {
  1393. key: "runEvents",
  1394. value: function runEvents() {
  1395. if (!this.working) {
  1396. return;
  1397. }
  1398. var document = this.screen,
  1399. events = this.events,
  1400. eventElements = this.eventElements;
  1401. var style = document.ctx.canvas.style;
  1402. if (style) {
  1403. style.cursor = '';
  1404. }
  1405. events.forEach(function (_ref, i) {
  1406. var run = _ref.run;
  1407. var element = eventElements[i];
  1408. while (element) {
  1409. run(element);
  1410. element = element.parent;
  1411. }
  1412. }); // done running, clear
  1413. this.events = [];
  1414. this.eventElements = [];
  1415. }
  1416. }, {
  1417. key: "checkPath",
  1418. value: function checkPath(element, ctx) {
  1419. if (!this.working || !ctx) {
  1420. return;
  1421. }
  1422. var events = this.events,
  1423. eventElements = this.eventElements;
  1424. events.forEach(function (_ref2, i) {
  1425. var x = _ref2.x,
  1426. y = _ref2.y;
  1427. if (!eventElements[i] && ctx.isPointInPath && ctx.isPointInPath(x, y)) {
  1428. eventElements[i] = element;
  1429. }
  1430. });
  1431. }
  1432. }, {
  1433. key: "checkBoundingBox",
  1434. value: function checkBoundingBox(element, boundingBox) {
  1435. if (!this.working || !boundingBox) {
  1436. return;
  1437. }
  1438. var events = this.events,
  1439. eventElements = this.eventElements;
  1440. events.forEach(function (_ref3, i) {
  1441. var x = _ref3.x,
  1442. y = _ref3.y;
  1443. if (!eventElements[i] && boundingBox.isPointInBox(x, y)) {
  1444. eventElements[i] = element;
  1445. }
  1446. });
  1447. }
  1448. }, {
  1449. key: "mapXY",
  1450. value: function mapXY(x, y) {
  1451. var _this$screen = this.screen,
  1452. window = _this$screen.window,
  1453. ctx = _this$screen.ctx;
  1454. var point = new Point(x, y);
  1455. var element = ctx.canvas;
  1456. while (element) {
  1457. point.x -= element.offsetLeft;
  1458. point.y -= element.offsetTop;
  1459. element = element.offsetParent;
  1460. }
  1461. if (window.scrollX) {
  1462. point.x += window.scrollX;
  1463. }
  1464. if (window.scrollY) {
  1465. point.y += window.scrollY;
  1466. }
  1467. return point;
  1468. }
  1469. }, {
  1470. key: "onClick",
  1471. value: function onClick(evt) {
  1472. var _this$mapXY = this.mapXY((evt || event).clientX, (evt || event).clientY),
  1473. x = _this$mapXY.x,
  1474. y = _this$mapXY.y;
  1475. this.events.push({
  1476. type: 'onclick',
  1477. x: x,
  1478. y: y,
  1479. run: function run(event) {
  1480. if (event.onClick) {
  1481. event.onClick();
  1482. }
  1483. }
  1484. });
  1485. }
  1486. }, {
  1487. key: "onMouseMove",
  1488. value: function onMouseMove(evt) {
  1489. var _this$mapXY2 = this.mapXY((evt || event).clientX, (evt || event).clientY),
  1490. x = _this$mapXY2.x,
  1491. y = _this$mapXY2.y;
  1492. this.events.push({
  1493. type: 'onmousemove',
  1494. x: x,
  1495. y: y,
  1496. run: function run(event) {
  1497. if (event.onMouseMove) {
  1498. event.onMouseMove();
  1499. }
  1500. }
  1501. });
  1502. }
  1503. }]);
  1504. return Mouse;
  1505. }();
  1506. var defaultWindow = typeof window !== 'undefined' ? window : null;
  1507. var defaultFetch = typeof fetch !== 'undefined' ? fetch.bind(void 0) // `fetch` depends on context: `someObject.fetch(...)` will throw error.
  1508. : null;
  1509. var Screen = /*#__PURE__*/function () {
  1510. function Screen(ctx) {
  1511. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  1512. _ref$fetch = _ref.fetch,
  1513. fetch = _ref$fetch === void 0 ? defaultFetch : _ref$fetch,
  1514. _ref$window = _ref.window,
  1515. window = _ref$window === void 0 ? defaultWindow : _ref$window;
  1516. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Screen);
  1517. this.ctx = ctx;
  1518. this.FRAMERATE = 30;
  1519. this.MAX_VIRTUAL_PIXELS = 30000;
  1520. this.CLIENT_WIDTH = 800;
  1521. this.CLIENT_HEIGHT = 600;
  1522. this.viewPort = new ViewPort();
  1523. this.mouse = new Mouse(this);
  1524. this.animations = [];
  1525. this.waits = [];
  1526. this.frameDuration = 0;
  1527. this.isReadyLock = false;
  1528. this.isFirstRender = true;
  1529. this.intervalId = null;
  1530. this.window = window;
  1531. this.fetch = fetch;
  1532. }
  1533. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Screen, [{
  1534. key: "wait",
  1535. value: function wait(checker) {
  1536. this.waits.push(checker);
  1537. }
  1538. }, {
  1539. key: "ready",
  1540. value: function ready() {
  1541. if (!this.readyPromise) {
  1542. return Promise.resolve();
  1543. }
  1544. return this.readyPromise;
  1545. }
  1546. }, {
  1547. key: "isReady",
  1548. value: function isReady() {
  1549. if (this.isReadyLock) {
  1550. return true;
  1551. }
  1552. var isReadyLock = this.waits.every(function (_) {
  1553. return _();
  1554. });
  1555. if (isReadyLock) {
  1556. this.waits = [];
  1557. if (this.resolveReady) {
  1558. this.resolveReady();
  1559. }
  1560. }
  1561. this.isReadyLock = isReadyLock;
  1562. return isReadyLock;
  1563. }
  1564. }, {
  1565. key: "setDefaults",
  1566. value: function setDefaults(ctx) {
  1567. // initial values and defaults
  1568. ctx.strokeStyle = 'rgba(0,0,0,0)';
  1569. ctx.lineCap = 'butt';
  1570. ctx.lineJoin = 'miter';
  1571. ctx.miterLimit = 4;
  1572. }
  1573. }, {
  1574. key: "setViewBox",
  1575. value: function setViewBox(_ref2) {
  1576. var document = _ref2.document,
  1577. ctx = _ref2.ctx,
  1578. aspectRatio = _ref2.aspectRatio,
  1579. width = _ref2.width,
  1580. desiredWidth = _ref2.desiredWidth,
  1581. height = _ref2.height,
  1582. desiredHeight = _ref2.desiredHeight,
  1583. _ref2$minX = _ref2.minX,
  1584. minX = _ref2$minX === void 0 ? 0 : _ref2$minX,
  1585. _ref2$minY = _ref2.minY,
  1586. minY = _ref2$minY === void 0 ? 0 : _ref2$minY,
  1587. refX = _ref2.refX,
  1588. refY = _ref2.refY,
  1589. _ref2$clip = _ref2.clip,
  1590. clip = _ref2$clip === void 0 ? false : _ref2$clip,
  1591. _ref2$clipX = _ref2.clipX,
  1592. clipX = _ref2$clipX === void 0 ? 0 : _ref2$clipX,
  1593. _ref2$clipY = _ref2.clipY,
  1594. clipY = _ref2$clipY === void 0 ? 0 : _ref2$clipY;
  1595. // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
  1596. var cleanAspectRatio = compressSpaces(aspectRatio).replace(/^defer\s/, ''); // ignore defer
  1597. var _cleanAspectRatio$spl = cleanAspectRatio.split(' '),
  1598. _cleanAspectRatio$spl2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_cleanAspectRatio$spl, 2),
  1599. aspectRatioAlign = _cleanAspectRatio$spl2[0],
  1600. aspectRatioMeetOrSlice = _cleanAspectRatio$spl2[1];
  1601. var align = aspectRatioAlign || 'xMidYMid';
  1602. var meetOrSlice = aspectRatioMeetOrSlice || 'meet'; // calculate scale
  1603. var scaleX = width / desiredWidth;
  1604. var scaleY = height / desiredHeight;
  1605. var scaleMin = Math.min(scaleX, scaleY);
  1606. var scaleMax = Math.max(scaleX, scaleY);
  1607. var finalDesiredWidth = desiredWidth;
  1608. var finalDesiredHeight = desiredHeight;
  1609. if (meetOrSlice === 'meet') {
  1610. finalDesiredWidth *= scaleMin;
  1611. finalDesiredHeight *= scaleMin;
  1612. }
  1613. if (meetOrSlice === 'slice') {
  1614. finalDesiredWidth *= scaleMax;
  1615. finalDesiredHeight *= scaleMax;
  1616. }
  1617. var refXProp = new Property(document, 'refX', refX);
  1618. var refYProp = new Property(document, 'refY', refY);
  1619. var hasRefs = refXProp.hasValue() && refYProp.hasValue();
  1620. if (hasRefs) {
  1621. ctx.translate(-scaleMin * refXProp.getPixels('x'), -scaleMin * refYProp.getPixels('y'));
  1622. }
  1623. if (clip) {
  1624. var scaledClipX = scaleMin * clipX;
  1625. var scaledClipY = scaleMin * clipY;
  1626. ctx.beginPath();
  1627. ctx.moveTo(scaledClipX, scaledClipY);
  1628. ctx.lineTo(width, scaledClipY);
  1629. ctx.lineTo(width, height);
  1630. ctx.lineTo(scaledClipX, height);
  1631. ctx.closePath();
  1632. ctx.clip();
  1633. }
  1634. if (!hasRefs) {
  1635. var isMeetMinY = meetOrSlice === 'meet' && scaleMin === scaleY;
  1636. var isSliceMaxY = meetOrSlice === 'slice' && scaleMax === scaleY;
  1637. var isMeetMinX = meetOrSlice === 'meet' && scaleMin === scaleX;
  1638. var isSliceMaxX = meetOrSlice === 'slice' && scaleMax === scaleX;
  1639. if (/^xMid/.test(align) && (isMeetMinY || isSliceMaxY)) {
  1640. ctx.translate(width / 2.0 - finalDesiredWidth / 2.0, 0);
  1641. }
  1642. if (/YMid$/.test(align) && (isMeetMinX || isSliceMaxX)) {
  1643. ctx.translate(0, height / 2.0 - finalDesiredHeight / 2.0);
  1644. }
  1645. if (/^xMax/.test(align) && (isMeetMinY || isSliceMaxY)) {
  1646. ctx.translate(width - finalDesiredWidth, 0);
  1647. }
  1648. if (/YMax$/.test(align) && (isMeetMinX || isSliceMaxX)) {
  1649. ctx.translate(0, height - finalDesiredHeight);
  1650. }
  1651. } // scale
  1652. switch (true) {
  1653. case align === 'none':
  1654. ctx.scale(scaleX, scaleY);
  1655. break;
  1656. case meetOrSlice === 'meet':
  1657. ctx.scale(scaleMin, scaleMin);
  1658. break;
  1659. case meetOrSlice === 'slice':
  1660. ctx.scale(scaleMax, scaleMax);
  1661. break;
  1662. } // translate
  1663. ctx.translate(-minX, -minY);
  1664. }
  1665. }, {
  1666. key: "start",
  1667. value: function start(element) {
  1668. var _this = this;
  1669. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  1670. _ref3$enableRedraw = _ref3.enableRedraw,
  1671. enableRedraw = _ref3$enableRedraw === void 0 ? false : _ref3$enableRedraw,
  1672. _ref3$ignoreMouse = _ref3.ignoreMouse,
  1673. ignoreMouse = _ref3$ignoreMouse === void 0 ? false : _ref3$ignoreMouse,
  1674. _ref3$ignoreAnimation = _ref3.ignoreAnimation,
  1675. ignoreAnimation = _ref3$ignoreAnimation === void 0 ? false : _ref3$ignoreAnimation,
  1676. _ref3$ignoreDimension = _ref3.ignoreDimensions,
  1677. ignoreDimensions = _ref3$ignoreDimension === void 0 ? false : _ref3$ignoreDimension,
  1678. _ref3$ignoreClear = _ref3.ignoreClear,
  1679. ignoreClear = _ref3$ignoreClear === void 0 ? false : _ref3$ignoreClear,
  1680. forceRedraw = _ref3.forceRedraw,
  1681. scaleWidth = _ref3.scaleWidth,
  1682. scaleHeight = _ref3.scaleHeight,
  1683. offsetX = _ref3.offsetX,
  1684. offsetY = _ref3.offsetY;
  1685. var FRAMERATE = this.FRAMERATE,
  1686. mouse = this.mouse;
  1687. var frameDuration = 1000 / FRAMERATE;
  1688. this.frameDuration = frameDuration;
  1689. this.readyPromise = new Promise(function (resolve) {
  1690. _this.resolveReady = resolve;
  1691. });
  1692. if (this.isReady()) {
  1693. this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);
  1694. }
  1695. if (!enableRedraw) {
  1696. return;
  1697. }
  1698. var now = Date.now();
  1699. var then = now;
  1700. var delta = 0;
  1701. var tick = function tick() {
  1702. now = Date.now();
  1703. delta = now - then;
  1704. if (delta >= frameDuration) {
  1705. then = now - delta % frameDuration;
  1706. if (_this.shouldUpdate(ignoreAnimation, forceRedraw)) {
  1707. _this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);
  1708. mouse.runEvents();
  1709. }
  1710. }
  1711. _this.intervalId = raf__WEBPACK_IMPORTED_MODULE_25___default()(tick);
  1712. };
  1713. if (!ignoreMouse) {
  1714. mouse.start();
  1715. }
  1716. this.intervalId = raf__WEBPACK_IMPORTED_MODULE_25___default()(tick);
  1717. }
  1718. }, {
  1719. key: "stop",
  1720. value: function stop() {
  1721. if (this.intervalId) {
  1722. raf__WEBPACK_IMPORTED_MODULE_25___default().cancel(this.intervalId);
  1723. this.intervalId = null;
  1724. }
  1725. this.mouse.stop();
  1726. }
  1727. }, {
  1728. key: "shouldUpdate",
  1729. value: function shouldUpdate(ignoreAnimation, forceRedraw) {
  1730. // need update from animations?
  1731. if (!ignoreAnimation) {
  1732. var frameDuration = this.frameDuration;
  1733. var shouldUpdate = this.animations.reduce(function (shouldUpdate, animation) {
  1734. return animation.update(frameDuration) || shouldUpdate;
  1735. }, false);
  1736. if (shouldUpdate) {
  1737. return true;
  1738. }
  1739. } // need update from redraw?
  1740. if (typeof forceRedraw === 'function' && forceRedraw()) {
  1741. return true;
  1742. }
  1743. if (!this.isReadyLock && this.isReady()) {
  1744. return true;
  1745. } // need update from mouse events?
  1746. if (this.mouse.hasEvents()) {
  1747. return true;
  1748. }
  1749. return false;
  1750. }
  1751. }, {
  1752. key: "render",
  1753. value: function render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY) {
  1754. var CLIENT_WIDTH = this.CLIENT_WIDTH,
  1755. CLIENT_HEIGHT = this.CLIENT_HEIGHT,
  1756. viewPort = this.viewPort,
  1757. ctx = this.ctx,
  1758. isFirstRender = this.isFirstRender;
  1759. var canvas = ctx.canvas;
  1760. viewPort.clear();
  1761. if (canvas.width && canvas.height) {
  1762. viewPort.setCurrent(canvas.width, canvas.height);
  1763. } else {
  1764. viewPort.setCurrent(CLIENT_WIDTH, CLIENT_HEIGHT);
  1765. }
  1766. var widthStyle = element.getStyle('width');
  1767. var heightStyle = element.getStyle('height');
  1768. if (!ignoreDimensions && (isFirstRender || typeof scaleWidth !== 'number' && typeof scaleHeight !== 'number')) {
  1769. // set canvas size
  1770. if (widthStyle.hasValue()) {
  1771. canvas.width = widthStyle.getPixels('x');
  1772. if (canvas.style) {
  1773. canvas.style.width = "".concat(canvas.width, "px");
  1774. }
  1775. }
  1776. if (heightStyle.hasValue()) {
  1777. canvas.height = heightStyle.getPixels('y');
  1778. if (canvas.style) {
  1779. canvas.style.height = "".concat(canvas.height, "px");
  1780. }
  1781. }
  1782. }
  1783. var cWidth = canvas.clientWidth || canvas.width;
  1784. var cHeight = canvas.clientHeight || canvas.height;
  1785. if (ignoreDimensions && widthStyle.hasValue() && heightStyle.hasValue()) {
  1786. cWidth = widthStyle.getPixels('x');
  1787. cHeight = heightStyle.getPixels('y');
  1788. }
  1789. viewPort.setCurrent(cWidth, cHeight);
  1790. if (typeof offsetX === 'number') {
  1791. element.getAttribute('x', true).setValue(offsetX);
  1792. }
  1793. if (typeof offsetY === 'number') {
  1794. element.getAttribute('y', true).setValue(offsetY);
  1795. }
  1796. if (typeof scaleWidth === 'number' || typeof scaleHeight === 'number') {
  1797. var viewBox = toNumbers(element.getAttribute('viewBox').getString());
  1798. var xRatio = 0;
  1799. var yRatio = 0;
  1800. if (typeof scaleWidth === 'number') {
  1801. var _widthStyle = element.getStyle('width');
  1802. if (_widthStyle.hasValue()) {
  1803. xRatio = _widthStyle.getPixels('x') / scaleWidth;
  1804. } else if (!isNaN(viewBox[2])) {
  1805. xRatio = viewBox[2] / scaleWidth;
  1806. }
  1807. }
  1808. if (typeof scaleHeight === 'number') {
  1809. var _heightStyle = element.getStyle('height');
  1810. if (_heightStyle.hasValue()) {
  1811. yRatio = _heightStyle.getPixels('y') / scaleHeight;
  1812. } else if (!isNaN(viewBox[3])) {
  1813. yRatio = viewBox[3] / scaleHeight;
  1814. }
  1815. }
  1816. if (!xRatio) {
  1817. xRatio = yRatio;
  1818. }
  1819. if (!yRatio) {
  1820. yRatio = xRatio;
  1821. }
  1822. element.getAttribute('width', true).setValue(scaleWidth);
  1823. element.getAttribute('height', true).setValue(scaleHeight);
  1824. var transformStyle = element.getStyle('transform', true, true);
  1825. transformStyle.setValue("".concat(transformStyle.getString(), " scale(").concat(1.0 / xRatio, ", ").concat(1.0 / yRatio, ")"));
  1826. } // clear and render
  1827. if (!ignoreClear) {
  1828. ctx.clearRect(0, 0, cWidth, cHeight);
  1829. }
  1830. element.render(ctx);
  1831. if (isFirstRender) {
  1832. this.isFirstRender = false;
  1833. }
  1834. }
  1835. }]);
  1836. return Screen;
  1837. }();
  1838. Screen.defaultWindow = defaultWindow;
  1839. Screen.defaultFetch = defaultFetch;
  1840. var defaultFetch$1 = Screen.defaultFetch;
  1841. var DefaultDOMParser = typeof DOMParser !== 'undefined' ? DOMParser : null;
  1842. var Parser = /*#__PURE__*/function () {
  1843. function Parser() {
  1844. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  1845. _ref$fetch = _ref.fetch,
  1846. fetch = _ref$fetch === void 0 ? defaultFetch$1 : _ref$fetch,
  1847. _ref$DOMParser = _ref.DOMParser,
  1848. DOMParser = _ref$DOMParser === void 0 ? DefaultDOMParser : _ref$DOMParser;
  1849. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Parser);
  1850. this.fetch = fetch;
  1851. this.DOMParser = DOMParser;
  1852. }
  1853. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Parser, [{
  1854. key: "parse",
  1855. value: function () {
  1856. var _parse = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee(resource) {
  1857. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  1858. while (1) {
  1859. switch (_context.prev = _context.next) {
  1860. case 0:
  1861. if (!/^</.test(resource)) {
  1862. _context.next = 2;
  1863. break;
  1864. }
  1865. return _context.abrupt("return", this.parseFromString(resource));
  1866. case 2:
  1867. return _context.abrupt("return", this.load(resource));
  1868. case 3:
  1869. case "end":
  1870. return _context.stop();
  1871. }
  1872. }
  1873. }, _callee, this);
  1874. }));
  1875. function parse(_x) {
  1876. return _parse.apply(this, arguments);
  1877. }
  1878. return parse;
  1879. }()
  1880. }, {
  1881. key: "parseFromString",
  1882. value: function parseFromString(xml) {
  1883. var parser = new this.DOMParser();
  1884. try {
  1885. return this.checkDocument(parser.parseFromString(xml, 'image/svg+xml'));
  1886. } catch (err) {
  1887. return this.checkDocument(parser.parseFromString(xml, 'text/xml'));
  1888. }
  1889. }
  1890. }, {
  1891. key: "checkDocument",
  1892. value: function checkDocument(document) {
  1893. var parserError = document.getElementsByTagName('parsererror')[0];
  1894. if (parserError) {
  1895. throw new Error(parserError.textContent);
  1896. }
  1897. return document;
  1898. }
  1899. }, {
  1900. key: "load",
  1901. value: function () {
  1902. var _load = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee2(url) {
  1903. var response, xml;
  1904. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee2$(_context2) {
  1905. while (1) {
  1906. switch (_context2.prev = _context2.next) {
  1907. case 0:
  1908. _context2.next = 2;
  1909. return this.fetch(url);
  1910. case 2:
  1911. response = _context2.sent;
  1912. _context2.next = 5;
  1913. return response.text();
  1914. case 5:
  1915. xml = _context2.sent;
  1916. return _context2.abrupt("return", this.parseFromString(xml));
  1917. case 7:
  1918. case "end":
  1919. return _context2.stop();
  1920. }
  1921. }
  1922. }, _callee2, this);
  1923. }));
  1924. function load(_x2) {
  1925. return _load.apply(this, arguments);
  1926. }
  1927. return load;
  1928. }()
  1929. }]);
  1930. return Parser;
  1931. }();
  1932. var Translate = /*#__PURE__*/function () {
  1933. function Translate(_, point) {
  1934. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Translate);
  1935. this.type = 'translate';
  1936. this.point = null;
  1937. this.point = Point.parse(point);
  1938. }
  1939. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Translate, [{
  1940. key: "apply",
  1941. value: function apply(ctx) {
  1942. var _this$point = this.point,
  1943. x = _this$point.x,
  1944. y = _this$point.y;
  1945. ctx.translate(x || 0.0, y || 0.0);
  1946. }
  1947. }, {
  1948. key: "unapply",
  1949. value: function unapply(ctx) {
  1950. var _this$point2 = this.point,
  1951. x = _this$point2.x,
  1952. y = _this$point2.y;
  1953. ctx.translate(-1.0 * x || 0.0, -1.0 * y || 0.0);
  1954. }
  1955. }, {
  1956. key: "applyToPoint",
  1957. value: function applyToPoint(point) {
  1958. var _this$point3 = this.point,
  1959. x = _this$point3.x,
  1960. y = _this$point3.y;
  1961. point.applyTransform([1, 0, 0, 1, x || 0.0, y || 0.0]);
  1962. }
  1963. }]);
  1964. return Translate;
  1965. }();
  1966. var Rotate = /*#__PURE__*/function () {
  1967. function Rotate(document, rotate) {
  1968. var transformOrigin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  1969. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Rotate);
  1970. this.type = 'rotate';
  1971. this.angle = null;
  1972. this.cx = 0;
  1973. this.cy = 0;
  1974. var numbers = toNumbers(rotate);
  1975. this.angle = new Property(document, 'angle', numbers[0]);
  1976. this.cx = (numbers[1] || 0) + (transformOrigin[0] || 0);
  1977. this.cy = (numbers[2] || 0) + (transformOrigin[1] || 0);
  1978. }
  1979. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Rotate, [{
  1980. key: "apply",
  1981. value: function apply(ctx) {
  1982. var cx = this.cx,
  1983. cy = this.cy,
  1984. angle = this.angle;
  1985. ctx.translate(cx, cy);
  1986. ctx.rotate(angle.getRadians());
  1987. ctx.translate(-cx, -cy);
  1988. }
  1989. }, {
  1990. key: "unapply",
  1991. value: function unapply(ctx) {
  1992. var cx = this.cx,
  1993. cy = this.cy,
  1994. angle = this.angle;
  1995. ctx.translate(cx, cy);
  1996. ctx.rotate(-1.0 * angle.getRadians());
  1997. ctx.translate(-cx, -cy);
  1998. }
  1999. }, {
  2000. key: "applyToPoint",
  2001. value: function applyToPoint(point) {
  2002. var cx = this.cx,
  2003. cy = this.cy,
  2004. angle = this.angle;
  2005. var rad = angle.getRadians();
  2006. point.applyTransform([1, 0, 0, 1, cx || 0.0, cy || 0.0 // this.p.y
  2007. ]);
  2008. point.applyTransform([Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), 0, 0]);
  2009. point.applyTransform([1, 0, 0, 1, -cx || 0.0, -cy || 0.0 // -this.p.y
  2010. ]);
  2011. }
  2012. }]);
  2013. return Rotate;
  2014. }();
  2015. var Scale = /*#__PURE__*/function () {
  2016. function Scale(_, scale) {
  2017. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Scale);
  2018. this.type = 'scale';
  2019. this.scale = null;
  2020. var scaleSize = Point.parseScale(scale); // Workaround for node-canvas
  2021. if (scaleSize.x === 0 || scaleSize.y === 0) {
  2022. scaleSize.x = PSEUDO_ZERO;
  2023. scaleSize.y = PSEUDO_ZERO;
  2024. }
  2025. this.scale = scaleSize;
  2026. }
  2027. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Scale, [{
  2028. key: "apply",
  2029. value: function apply(ctx) {
  2030. var _this$scale = this.scale,
  2031. x = _this$scale.x,
  2032. y = _this$scale.y;
  2033. ctx.scale(x, y || x);
  2034. }
  2035. }, {
  2036. key: "unapply",
  2037. value: function unapply(ctx) {
  2038. var _this$scale2 = this.scale,
  2039. x = _this$scale2.x,
  2040. y = _this$scale2.y;
  2041. ctx.scale(1.0 / x, 1.0 / y || x);
  2042. }
  2043. }, {
  2044. key: "applyToPoint",
  2045. value: function applyToPoint(point) {
  2046. var _this$scale3 = this.scale,
  2047. x = _this$scale3.x,
  2048. y = _this$scale3.y;
  2049. point.applyTransform([x || 0.0, 0, 0, y || 0.0, 0, 0]);
  2050. }
  2051. }]);
  2052. return Scale;
  2053. }();
  2054. var Matrix = /*#__PURE__*/function () {
  2055. function Matrix(_, matrix) {
  2056. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Matrix);
  2057. this.type = 'matrix';
  2058. this.matrix = [];
  2059. this.matrix = toNumbers(matrix);
  2060. }
  2061. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Matrix, [{
  2062. key: "apply",
  2063. value: function apply(ctx) {
  2064. var matrix = this.matrix;
  2065. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  2066. }
  2067. }, {
  2068. key: "unapply",
  2069. value: function unapply(ctx) {
  2070. var matrix = this.matrix;
  2071. var a = matrix[0];
  2072. var b = matrix[2];
  2073. var c = matrix[4];
  2074. var d = matrix[1];
  2075. var e = matrix[3];
  2076. var f = matrix[5];
  2077. var g = 0.0;
  2078. var h = 0.0;
  2079. var i = 1.0;
  2080. var det = 1 / (a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g));
  2081. ctx.transform(det * (e * i - f * h), det * (f * g - d * i), det * (c * h - b * i), det * (a * i - c * g), det * (b * f - c * e), det * (c * d - a * f));
  2082. }
  2083. }, {
  2084. key: "applyToPoint",
  2085. value: function applyToPoint(point) {
  2086. point.applyTransform(this.matrix);
  2087. }
  2088. }]);
  2089. return Matrix;
  2090. }();
  2091. function _createSuper(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2092. function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2093. var Skew = /*#__PURE__*/function (_Matrix) {
  2094. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(Skew, _Matrix);
  2095. var _super = _createSuper(Skew);
  2096. function Skew(document, skew) {
  2097. var _this;
  2098. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Skew);
  2099. _this = _super.call(this, document, skew);
  2100. _this.type = 'skew';
  2101. _this.angle = null;
  2102. _this.angle = new Property(document, 'angle', skew);
  2103. return _this;
  2104. }
  2105. return Skew;
  2106. }(Matrix);
  2107. function _createSuper$1(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$1()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2108. function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2109. var SkewX = /*#__PURE__*/function (_Skew) {
  2110. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(SkewX, _Skew);
  2111. var _super = _createSuper$1(SkewX);
  2112. function SkewX(document, skew) {
  2113. var _this;
  2114. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, SkewX);
  2115. _this = _super.call(this, document, skew);
  2116. _this.type = 'skewX';
  2117. _this.matrix = [1, 0, Math.tan(_this.angle.getRadians()), 1, 0, 0];
  2118. return _this;
  2119. }
  2120. return SkewX;
  2121. }(Skew);
  2122. function _createSuper$2(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$2()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2123. function _isNativeReflectConstruct$2() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2124. var SkewY = /*#__PURE__*/function (_Skew) {
  2125. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(SkewY, _Skew);
  2126. var _super = _createSuper$2(SkewY);
  2127. function SkewY(document, skew) {
  2128. var _this;
  2129. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, SkewY);
  2130. _this = _super.call(this, document, skew);
  2131. _this.type = 'skewY';
  2132. _this.matrix = [1, Math.tan(_this.angle.getRadians()), 0, 1, 0, 0];
  2133. return _this;
  2134. }
  2135. return SkewY;
  2136. }(Skew);
  2137. function parseTransforms(transform) {
  2138. return compressSpaces(transform).trim().replace(/\)([a-zA-Z])/g, ') $1').replace(/\)(\s?,\s?)/g, ') ').split(/\s(?=[a-z])/);
  2139. }
  2140. function parseTransform(transform) {
  2141. var _transform$split = transform.split('('),
  2142. _transform$split2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_transform$split, 2),
  2143. type = _transform$split2[0],
  2144. value = _transform$split2[1];
  2145. return [type.trim(), value.trim().replace(')', '')];
  2146. }
  2147. var Transform = /*#__PURE__*/function () {
  2148. function Transform(document, transform, transformOrigin) {
  2149. var _this = this;
  2150. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Transform);
  2151. this.document = document;
  2152. this.transforms = [];
  2153. var data = parseTransforms(transform);
  2154. var originCoords = transformOrigin ? toNumbers(transformOrigin) : [];
  2155. data.forEach(function (transform) {
  2156. if (transform === 'none') {
  2157. return;
  2158. }
  2159. var _parseTransform = parseTransform(transform),
  2160. _parseTransform2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_parseTransform, 2),
  2161. type = _parseTransform2[0],
  2162. value = _parseTransform2[1];
  2163. var TransformType = Transform.transformTypes[type];
  2164. if (typeof TransformType !== 'undefined') {
  2165. _this.transforms.push(new TransformType(_this.document, value, originCoords));
  2166. }
  2167. });
  2168. }
  2169. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Transform, [{
  2170. key: "apply",
  2171. value: function apply(ctx) {
  2172. var transforms = this.transforms;
  2173. var len = transforms.length;
  2174. for (var i = 0; i < len; i++) {
  2175. transforms[i].apply(ctx);
  2176. }
  2177. }
  2178. }, {
  2179. key: "unapply",
  2180. value: function unapply(ctx) {
  2181. var transforms = this.transforms;
  2182. var len = transforms.length;
  2183. for (var i = len - 1; i >= 0; i--) {
  2184. transforms[i].unapply(ctx);
  2185. }
  2186. } // TODO: applyToPoint unused ... remove?
  2187. }, {
  2188. key: "applyToPoint",
  2189. value: function applyToPoint(point) {
  2190. var transforms = this.transforms;
  2191. var len = transforms.length;
  2192. for (var i = 0; i < len; i++) {
  2193. transforms[i].applyToPoint(point);
  2194. }
  2195. }
  2196. }], [{
  2197. key: "fromElement",
  2198. value: function fromElement(document, element) {
  2199. var transformStyle = element.getStyle('transform', false, true);
  2200. var transformOriginStyle = element.getStyle('transform-origin', false, true);
  2201. if (transformStyle.hasValue()) {
  2202. return new Transform(document, transformStyle.getString(), transformOriginStyle.getString());
  2203. }
  2204. return null;
  2205. }
  2206. }]);
  2207. return Transform;
  2208. }();
  2209. Transform.transformTypes = {
  2210. translate: Translate,
  2211. rotate: Rotate,
  2212. scale: Scale,
  2213. matrix: Matrix,
  2214. skewX: SkewX,
  2215. skewY: SkewY
  2216. };
  2217. var Element = /*#__PURE__*/function () {
  2218. function Element(document, node) {
  2219. var _this = this;
  2220. var captureTextNodes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  2221. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Element);
  2222. this.document = document;
  2223. this.node = node;
  2224. this.captureTextNodes = captureTextNodes;
  2225. this.attributes = {};
  2226. this.styles = {};
  2227. this.stylesSpecificity = {};
  2228. this.animationFrozen = false;
  2229. this.animationFrozenValue = '';
  2230. this.parent = null;
  2231. this.children = [];
  2232. if (!node || node.nodeType !== 1) {
  2233. // ELEMENT_NODE
  2234. return;
  2235. } // add attributes
  2236. Array.from(node.attributes).forEach(function (attribute) {
  2237. var nodeName = normalizeAttributeName(attribute.nodeName);
  2238. _this.attributes[nodeName] = new Property(document, nodeName, attribute.value);
  2239. });
  2240. this.addStylesFromStyleDefinition(); // add inline styles
  2241. if (this.getAttribute('style').hasValue()) {
  2242. var styles = this.getAttribute('style').getString().split(';').map(function (_) {
  2243. return _.trim();
  2244. });
  2245. styles.forEach(function (style) {
  2246. if (!style) {
  2247. return;
  2248. }
  2249. var _style$split$map = style.split(':').map(function (_) {
  2250. return _.trim();
  2251. }),
  2252. _style$split$map2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_style$split$map, 2),
  2253. name = _style$split$map2[0],
  2254. value = _style$split$map2[1];
  2255. _this.styles[name] = new Property(document, name, value);
  2256. });
  2257. }
  2258. var definitions = document.definitions;
  2259. var id = this.getAttribute('id'); // add id
  2260. if (id.hasValue()) {
  2261. if (!definitions[id.getValue()]) {
  2262. definitions[id.getValue()] = this;
  2263. }
  2264. }
  2265. Array.from(node.childNodes).forEach(function (childNode) {
  2266. if (childNode.nodeType === 1) {
  2267. _this.addChild(childNode); // ELEMENT_NODE
  2268. } else if (captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) {
  2269. var textNode = document.createTextNode(childNode);
  2270. if (textNode.getText().length > 0) {
  2271. _this.addChild(textNode); // TEXT_NODE
  2272. }
  2273. }
  2274. });
  2275. }
  2276. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Element, [{
  2277. key: "getAttribute",
  2278. value: function getAttribute(name) {
  2279. var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  2280. var attr = this.attributes[name];
  2281. if (!attr && createIfNotExists) {
  2282. var _attr = new Property(this.document, name, '');
  2283. this.attributes[name] = _attr;
  2284. return _attr;
  2285. }
  2286. return attr || Property.empty(this.document);
  2287. }
  2288. }, {
  2289. key: "getHrefAttribute",
  2290. value: function getHrefAttribute() {
  2291. for (var key in this.attributes) {
  2292. if (key === 'href' || /:href$/.test(key)) {
  2293. return this.attributes[key];
  2294. }
  2295. }
  2296. return Property.empty(this.document);
  2297. }
  2298. }, {
  2299. key: "getStyle",
  2300. value: function getStyle(name) {
  2301. var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  2302. var skipAncestors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  2303. var style = this.styles[name];
  2304. if (style) {
  2305. return style;
  2306. }
  2307. var attr = this.getAttribute(name);
  2308. if (attr && attr.hasValue()) {
  2309. this.styles[name] = attr; // move up to me to cache
  2310. return attr;
  2311. }
  2312. if (!skipAncestors) {
  2313. var parent = this.parent;
  2314. if (parent) {
  2315. var parentStyle = parent.getStyle(name);
  2316. if (parentStyle && parentStyle.hasValue()) {
  2317. return parentStyle;
  2318. }
  2319. }
  2320. }
  2321. if (createIfNotExists) {
  2322. var _style = new Property(this.document, name, '');
  2323. this.styles[name] = _style;
  2324. return _style;
  2325. }
  2326. return style || Property.empty(this.document);
  2327. }
  2328. }, {
  2329. key: "render",
  2330. value: function render(ctx) {
  2331. // don't render display=none
  2332. // don't render visibility=hidden
  2333. if (this.getStyle('display').getString() === 'none' || this.getStyle('visibility').getString() === 'hidden') {
  2334. return;
  2335. }
  2336. ctx.save();
  2337. if (this.getStyle('mask').hasValue()) {
  2338. // mask
  2339. var mask = this.getStyle('mask').getDefinition();
  2340. if (mask) {
  2341. this.applyEffects(ctx);
  2342. mask.apply(ctx, this);
  2343. }
  2344. } else if (this.getStyle('filter').getValue('none') !== 'none') {
  2345. // filter
  2346. var filter = this.getStyle('filter').getDefinition();
  2347. if (filter) {
  2348. this.applyEffects(ctx);
  2349. filter.apply(ctx, this);
  2350. }
  2351. } else {
  2352. this.setContext(ctx);
  2353. this.renderChildren(ctx);
  2354. this.clearContext(ctx);
  2355. }
  2356. ctx.restore();
  2357. }
  2358. }, {
  2359. key: "setContext",
  2360. value: function setContext(_) {}
  2361. }, {
  2362. key: "applyEffects",
  2363. value: function applyEffects(ctx) {
  2364. // transform
  2365. var transform = Transform.fromElement(this.document, this);
  2366. if (transform) {
  2367. transform.apply(ctx);
  2368. } // clip
  2369. var clipPathStyleProp = this.getStyle('clip-path', false, true);
  2370. if (clipPathStyleProp.hasValue()) {
  2371. var clip = clipPathStyleProp.getDefinition();
  2372. if (clip) {
  2373. clip.apply(ctx);
  2374. }
  2375. }
  2376. }
  2377. }, {
  2378. key: "clearContext",
  2379. value: function clearContext(_) {}
  2380. }, {
  2381. key: "renderChildren",
  2382. value: function renderChildren(ctx) {
  2383. this.children.forEach(function (child) {
  2384. child.render(ctx);
  2385. });
  2386. }
  2387. }, {
  2388. key: "addChild",
  2389. value: function addChild(childNode) {
  2390. var child = childNode instanceof Element ? childNode : this.document.createElement(childNode);
  2391. child.parent = this;
  2392. if (!Element.ignoreChildTypes.includes(child.type)) {
  2393. this.children.push(child);
  2394. }
  2395. }
  2396. }, {
  2397. key: "matchesSelector",
  2398. value: function matchesSelector(selector) {
  2399. var node = this.node;
  2400. if (typeof node.matches === 'function') {
  2401. return node.matches(selector);
  2402. }
  2403. var styleClasses = node.getAttribute('class');
  2404. if (!styleClasses || styleClasses === '') {
  2405. return false;
  2406. }
  2407. return styleClasses.split(' ').some(function (styleClass) {
  2408. if (".".concat(styleClass) === selector) {
  2409. return true;
  2410. }
  2411. });
  2412. }
  2413. }, {
  2414. key: "addStylesFromStyleDefinition",
  2415. value: function addStylesFromStyleDefinition() {
  2416. var _this$document = this.document,
  2417. styles = _this$document.styles,
  2418. stylesSpecificity = _this$document.stylesSpecificity;
  2419. for (var selector in styles) {
  2420. if (selector[0] !== '@' && this.matchesSelector(selector)) {
  2421. var style = styles[selector];
  2422. var specificity = stylesSpecificity[selector];
  2423. if (style) {
  2424. for (var name in style) {
  2425. var existingSpecificity = this.stylesSpecificity[name];
  2426. if (typeof existingSpecificity === 'undefined') {
  2427. existingSpecificity = '000';
  2428. }
  2429. if (specificity >= existingSpecificity) {
  2430. this.styles[name] = style[name];
  2431. this.stylesSpecificity[name] = specificity;
  2432. }
  2433. }
  2434. }
  2435. }
  2436. }
  2437. }
  2438. }, {
  2439. key: "removeStyles",
  2440. value: function removeStyles(element, ignoreStyles) {
  2441. var toRestore = ignoreStyles.reduce(function (toRestore, name) {
  2442. var styleProp = element.getStyle(name);
  2443. if (!styleProp.hasValue()) {
  2444. return toRestore;
  2445. }
  2446. var value = styleProp.getString();
  2447. styleProp.setValue('');
  2448. return [].concat((0,_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_39__.default)(toRestore), [[name, value]]);
  2449. }, []);
  2450. return toRestore;
  2451. }
  2452. }, {
  2453. key: "restoreStyles",
  2454. value: function restoreStyles(element, styles) {
  2455. styles.forEach(function (_ref) {
  2456. var _ref2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_ref, 2),
  2457. name = _ref2[0],
  2458. value = _ref2[1];
  2459. element.getStyle(name, true).setValue(value);
  2460. });
  2461. }
  2462. }]);
  2463. return Element;
  2464. }();
  2465. Element.ignoreChildTypes = ['title'];
  2466. function _createSuper$3(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$3()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2467. function _isNativeReflectConstruct$3() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2468. var UnknownElement = /*#__PURE__*/function (_Element) {
  2469. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(UnknownElement, _Element);
  2470. var _super = _createSuper$3(UnknownElement);
  2471. function UnknownElement(document, node, captureTextNodes) {
  2472. var _this;
  2473. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, UnknownElement);
  2474. _this = _super.call(this, document, node, captureTextNodes);
  2475. return _this;
  2476. }
  2477. return UnknownElement;
  2478. }(Element);
  2479. function wrapFontFamily(fontFamily) {
  2480. var trimmed = fontFamily.trim();
  2481. return /^('|")/.test(trimmed) ? trimmed : "\"".concat(trimmed, "\"");
  2482. }
  2483. function prepareFontFamily(fontFamily) {
  2484. return typeof process === 'undefined' ? fontFamily : fontFamily.trim().split(',').map(wrapFontFamily).join(',');
  2485. }
  2486. /**
  2487. * https://developer.mozilla.org/en-US/docs/Web/CSS/font-style
  2488. */
  2489. function prepareFontStyle(fontStyle) {
  2490. if (!fontStyle) {
  2491. return '';
  2492. }
  2493. var targetFontStyle = fontStyle.trim().toLowerCase();
  2494. switch (targetFontStyle) {
  2495. case 'normal':
  2496. case 'italic':
  2497. case 'oblique':
  2498. case 'inherit':
  2499. case 'initial':
  2500. case 'unset':
  2501. return targetFontStyle;
  2502. default:
  2503. if (/^oblique\s+(-|)\d+deg$/.test(targetFontStyle)) {
  2504. return targetFontStyle;
  2505. }
  2506. return '';
  2507. }
  2508. }
  2509. /**
  2510. * https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight
  2511. */
  2512. function prepareFontWeight(fontWeight) {
  2513. if (!fontWeight) {
  2514. return '';
  2515. }
  2516. var targetFontWeight = fontWeight.trim().toLowerCase();
  2517. switch (targetFontWeight) {
  2518. case 'normal':
  2519. case 'bold':
  2520. case 'lighter':
  2521. case 'bolder':
  2522. case 'inherit':
  2523. case 'initial':
  2524. case 'unset':
  2525. return targetFontWeight;
  2526. default:
  2527. if (/^[\d.]+$/.test(targetFontWeight)) {
  2528. return targetFontWeight;
  2529. }
  2530. return '';
  2531. }
  2532. }
  2533. var Font = /*#__PURE__*/function () {
  2534. function Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {
  2535. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Font);
  2536. var inheritFont = inherit ? typeof inherit === 'string' ? Font.parse(inherit) : inherit : {};
  2537. this.fontFamily = fontFamily || inheritFont.fontFamily;
  2538. this.fontSize = fontSize || inheritFont.fontSize;
  2539. this.fontStyle = fontStyle || inheritFont.fontStyle;
  2540. this.fontWeight = fontWeight || inheritFont.fontWeight;
  2541. this.fontVariant = fontVariant || inheritFont.fontVariant;
  2542. }
  2543. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Font, [{
  2544. key: "toString",
  2545. value: function toString() {
  2546. return [prepareFontStyle(this.fontStyle), this.fontVariant, prepareFontWeight(this.fontWeight), this.fontSize, // Wrap fontFamily only on nodejs and only for canvas.ctx
  2547. prepareFontFamily(this.fontFamily)].join(' ').trim();
  2548. }
  2549. }], [{
  2550. key: "parse",
  2551. value: function parse() {
  2552. var font = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  2553. var inherit = arguments.length > 1 ? arguments[1] : undefined;
  2554. var fontStyle = '';
  2555. var fontVariant = '';
  2556. var fontWeight = '';
  2557. var fontSize = '';
  2558. var fontFamily = '';
  2559. var parts = compressSpaces(font).trim().split(' ');
  2560. var set = {
  2561. fontSize: false,
  2562. fontStyle: false,
  2563. fontWeight: false,
  2564. fontVariant: false
  2565. };
  2566. parts.forEach(function (part) {
  2567. switch (true) {
  2568. case !set.fontStyle && Font.styles.includes(part):
  2569. if (part !== 'inherit') {
  2570. fontStyle = part;
  2571. }
  2572. set.fontStyle = true;
  2573. break;
  2574. case !set.fontVariant && Font.variants.includes(part):
  2575. if (part !== 'inherit') {
  2576. fontVariant = part;
  2577. }
  2578. set.fontStyle = true;
  2579. set.fontVariant = true;
  2580. break;
  2581. case !set.fontWeight && Font.weights.includes(part):
  2582. if (part !== 'inherit') {
  2583. fontWeight = part;
  2584. }
  2585. set.fontStyle = true;
  2586. set.fontVariant = true;
  2587. set.fontWeight = true;
  2588. break;
  2589. case !set.fontSize:
  2590. if (part !== 'inherit') {
  2591. var _part$split = part.split('/');
  2592. var _part$split2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_part$split, 1);
  2593. fontSize = _part$split2[0];
  2594. }
  2595. set.fontStyle = true;
  2596. set.fontVariant = true;
  2597. set.fontWeight = true;
  2598. set.fontSize = true;
  2599. break;
  2600. default:
  2601. if (part !== 'inherit') {
  2602. fontFamily += part;
  2603. }
  2604. }
  2605. });
  2606. return new Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit);
  2607. }
  2608. }]);
  2609. return Font;
  2610. }();
  2611. Font.styles = 'normal|italic|oblique|inherit';
  2612. Font.variants = 'normal|small-caps|inherit';
  2613. Font.weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';
  2614. var BoundingBox = /*#__PURE__*/function () {
  2615. function BoundingBox() {
  2616. var x1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.NaN;
  2617. var y1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.NaN;
  2618. var x2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Number.NaN;
  2619. var y2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Number.NaN;
  2620. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, BoundingBox);
  2621. this.x1 = x1;
  2622. this.y1 = y1;
  2623. this.x2 = x2;
  2624. this.y2 = y2;
  2625. this.addPoint(x1, y1);
  2626. this.addPoint(x2, y2);
  2627. }
  2628. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(BoundingBox, [{
  2629. key: "addPoint",
  2630. value: function addPoint(x, y) {
  2631. if (typeof x !== 'undefined') {
  2632. if (isNaN(this.x1) || isNaN(this.x2)) {
  2633. this.x1 = x;
  2634. this.x2 = x;
  2635. }
  2636. if (x < this.x1) {
  2637. this.x1 = x;
  2638. }
  2639. if (x > this.x2) {
  2640. this.x2 = x;
  2641. }
  2642. }
  2643. if (typeof y !== 'undefined') {
  2644. if (isNaN(this.y1) || isNaN(this.y2)) {
  2645. this.y1 = y;
  2646. this.y2 = y;
  2647. }
  2648. if (y < this.y1) {
  2649. this.y1 = y;
  2650. }
  2651. if (y > this.y2) {
  2652. this.y2 = y;
  2653. }
  2654. }
  2655. }
  2656. }, {
  2657. key: "addX",
  2658. value: function addX(x) {
  2659. this.addPoint(x, null);
  2660. }
  2661. }, {
  2662. key: "addY",
  2663. value: function addY(y) {
  2664. this.addPoint(null, y);
  2665. }
  2666. }, {
  2667. key: "addBoundingBox",
  2668. value: function addBoundingBox(boundingBox) {
  2669. if (!boundingBox) {
  2670. return;
  2671. }
  2672. var x1 = boundingBox.x1,
  2673. y1 = boundingBox.y1,
  2674. x2 = boundingBox.x2,
  2675. y2 = boundingBox.y2;
  2676. this.addPoint(x1, y1);
  2677. this.addPoint(x2, y2);
  2678. }
  2679. }, {
  2680. key: "sumCubic",
  2681. value: function sumCubic(t, p0, p1, p2, p3) {
  2682. return Math.pow(1 - t, 3) * p0 + 3 * Math.pow(1 - t, 2) * t * p1 + 3 * (1 - t) * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;
  2683. }
  2684. }, {
  2685. key: "bezierCurveAdd",
  2686. value: function bezierCurveAdd(forX, p0, p1, p2, p3) {
  2687. var b = 6 * p0 - 12 * p1 + 6 * p2;
  2688. var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;
  2689. var c = 3 * p1 - 3 * p0;
  2690. if (a === 0) {
  2691. if (b === 0) {
  2692. return;
  2693. }
  2694. var t = -c / b;
  2695. if (0 < t && t < 1) {
  2696. if (forX) {
  2697. this.addX(this.sumCubic(t, p0, p1, p2, p3));
  2698. } else {
  2699. this.addY(this.sumCubic(t, p0, p1, p2, p3));
  2700. }
  2701. }
  2702. return;
  2703. }
  2704. var b2ac = Math.pow(b, 2) - 4 * c * a;
  2705. if (b2ac < 0) {
  2706. return;
  2707. }
  2708. var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
  2709. if (0 < t1 && t1 < 1) {
  2710. if (forX) {
  2711. this.addX(this.sumCubic(t1, p0, p1, p2, p3));
  2712. } else {
  2713. this.addY(this.sumCubic(t1, p0, p1, p2, p3));
  2714. }
  2715. }
  2716. var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
  2717. if (0 < t2 && t2 < 1) {
  2718. if (forX) {
  2719. this.addX(this.sumCubic(t2, p0, p1, p2, p3));
  2720. } else {
  2721. this.addY(this.sumCubic(t2, p0, p1, p2, p3));
  2722. }
  2723. }
  2724. } // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
  2725. }, {
  2726. key: "addBezierCurve",
  2727. value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
  2728. this.addPoint(p0x, p0y);
  2729. this.addPoint(p3x, p3y);
  2730. this.bezierCurveAdd(true, p0x, p1x, p2x, p3x);
  2731. this.bezierCurveAdd(false, p0y, p1y, p2y, p3y);
  2732. }
  2733. }, {
  2734. key: "addQuadraticCurve",
  2735. value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {
  2736. var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)
  2737. var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)
  2738. var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)
  2739. var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)
  2740. this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);
  2741. }
  2742. }, {
  2743. key: "isPointInBox",
  2744. value: function isPointInBox(x, y) {
  2745. var x1 = this.x1,
  2746. y1 = this.y1,
  2747. x2 = this.x2,
  2748. y2 = this.y2;
  2749. return x1 <= x && x <= x2 && y1 <= y && y <= y2;
  2750. }
  2751. }, {
  2752. key: "x",
  2753. get: function get() {
  2754. return this.x1;
  2755. }
  2756. }, {
  2757. key: "y",
  2758. get: function get() {
  2759. return this.y1;
  2760. }
  2761. }, {
  2762. key: "width",
  2763. get: function get() {
  2764. return this.x2 - this.x1;
  2765. }
  2766. }, {
  2767. key: "height",
  2768. get: function get() {
  2769. return this.y2 - this.y1;
  2770. }
  2771. }]);
  2772. return BoundingBox;
  2773. }();
  2774. function _createSuper$4(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$4()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2775. function _isNativeReflectConstruct$4() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2776. var RenderedElement = /*#__PURE__*/function (_Element) {
  2777. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(RenderedElement, _Element);
  2778. var _super = _createSuper$4(RenderedElement);
  2779. function RenderedElement() {
  2780. var _this;
  2781. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, RenderedElement);
  2782. _this = _super.apply(this, arguments);
  2783. _this.modifiedEmSizeStack = false;
  2784. return _this;
  2785. }
  2786. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(RenderedElement, [{
  2787. key: "calculateOpacity",
  2788. value: function calculateOpacity() {
  2789. var opacity = 1.0; // tslint:disable-next-line: no-this-assignment
  2790. var element = this;
  2791. while (element) {
  2792. var opacityStyle = element.getStyle('opacity', false, true); // no ancestors on style call
  2793. if (opacityStyle.hasValue()) {
  2794. opacity *= opacityStyle.getNumber();
  2795. }
  2796. element = element.parent;
  2797. }
  2798. return opacity;
  2799. }
  2800. }, {
  2801. key: "setContext",
  2802. value: function setContext(ctx) {
  2803. var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  2804. if (!fromMeasure) {
  2805. // causes stack overflow when measuring text with gradients
  2806. // fill
  2807. var fillStyleProp = this.getStyle('fill');
  2808. var fillOpacityStyleProp = this.getStyle('fill-opacity');
  2809. var strokeStyleProp = this.getStyle('stroke');
  2810. var strokeOpacityProp = this.getStyle('stroke-opacity');
  2811. if (fillStyleProp.isUrlDefinition()) {
  2812. var fillStyle = fillStyleProp.getFillStyleDefinition(this, fillOpacityStyleProp);
  2813. if (fillStyle) {
  2814. ctx.fillStyle = fillStyle;
  2815. }
  2816. } else if (fillStyleProp.hasValue()) {
  2817. if (fillStyleProp.getString() === 'currentColor') {
  2818. fillStyleProp.setValue(this.getStyle('color').getColor());
  2819. }
  2820. var _fillStyle = fillStyleProp.getColor();
  2821. if (_fillStyle !== 'inherit') {
  2822. ctx.fillStyle = _fillStyle === 'none' ? 'rgba(0,0,0,0)' : _fillStyle;
  2823. }
  2824. }
  2825. if (fillOpacityStyleProp.hasValue()) {
  2826. var _fillStyle2 = new Property(this.document, 'fill', ctx.fillStyle).addOpacity(fillOpacityStyleProp).getColor();
  2827. ctx.fillStyle = _fillStyle2;
  2828. } // stroke
  2829. if (strokeStyleProp.isUrlDefinition()) {
  2830. var strokeStyle = strokeStyleProp.getFillStyleDefinition(this, strokeOpacityProp);
  2831. if (strokeStyle) {
  2832. ctx.strokeStyle = strokeStyle;
  2833. }
  2834. } else if (strokeStyleProp.hasValue()) {
  2835. if (strokeStyleProp.getString() === 'currentColor') {
  2836. strokeStyleProp.setValue(this.getStyle('color').getColor());
  2837. }
  2838. var _strokeStyle = strokeStyleProp.getString();
  2839. if (_strokeStyle !== 'inherit') {
  2840. ctx.strokeStyle = _strokeStyle === 'none' ? 'rgba(0,0,0,0)' : _strokeStyle;
  2841. }
  2842. }
  2843. if (strokeOpacityProp.hasValue()) {
  2844. var _strokeStyle2 = new Property(this.document, 'stroke', ctx.strokeStyle).addOpacity(strokeOpacityProp).getString();
  2845. ctx.strokeStyle = _strokeStyle2;
  2846. }
  2847. var strokeWidthStyleProp = this.getStyle('stroke-width');
  2848. if (strokeWidthStyleProp.hasValue()) {
  2849. var newLineWidth = strokeWidthStyleProp.getPixels();
  2850. ctx.lineWidth = !newLineWidth ? PSEUDO_ZERO // browsers don't respect 0 (or node-canvas? :-)
  2851. : newLineWidth;
  2852. }
  2853. var strokeLinecapStyleProp = this.getStyle('stroke-linecap');
  2854. var strokeLinejoinStyleProp = this.getStyle('stroke-linejoin');
  2855. var strokeMiterlimitProp = this.getStyle('stroke-miterlimit');
  2856. var pointOrderStyleProp = this.getStyle('paint-order');
  2857. var strokeDasharrayStyleProp = this.getStyle('stroke-dasharray');
  2858. var strokeDashoffsetProp = this.getStyle('stroke-dashoffset');
  2859. if (strokeLinecapStyleProp.hasValue()) {
  2860. ctx.lineCap = strokeLinecapStyleProp.getString();
  2861. }
  2862. if (strokeLinejoinStyleProp.hasValue()) {
  2863. ctx.lineJoin = strokeLinejoinStyleProp.getString();
  2864. }
  2865. if (strokeMiterlimitProp.hasValue()) {
  2866. ctx.miterLimit = strokeMiterlimitProp.getNumber();
  2867. }
  2868. if (pointOrderStyleProp.hasValue()) {
  2869. // ?
  2870. ctx.paintOrder = pointOrderStyleProp.getValue();
  2871. }
  2872. if (strokeDasharrayStyleProp.hasValue() && strokeDasharrayStyleProp.getString() !== 'none') {
  2873. var gaps = toNumbers(strokeDasharrayStyleProp.getString());
  2874. if (typeof ctx.setLineDash !== 'undefined') {
  2875. ctx.setLineDash(gaps);
  2876. } else if (typeof ctx.webkitLineDash !== 'undefined') {
  2877. ctx.webkitLineDash = gaps;
  2878. } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {
  2879. ctx.mozDash = gaps;
  2880. }
  2881. var offset = strokeDashoffsetProp.getPixels();
  2882. if (typeof ctx.lineDashOffset !== 'undefined') {
  2883. ctx.lineDashOffset = offset;
  2884. } else if (typeof ctx.webkitLineDashOffset !== 'undefined') {
  2885. ctx.webkitLineDashOffset = offset;
  2886. } else if (typeof ctx.mozDashOffset !== 'undefined') {
  2887. ctx.mozDashOffset = offset;
  2888. }
  2889. }
  2890. } // font
  2891. this.modifiedEmSizeStack = false;
  2892. if (typeof ctx.font !== 'undefined') {
  2893. var fontStyleProp = this.getStyle('font');
  2894. var fontStyleStyleProp = this.getStyle('font-style');
  2895. var fontVariantStyleProp = this.getStyle('font-variant');
  2896. var fontWeightStyleProp = this.getStyle('font-weight');
  2897. var fontSizeStyleProp = this.getStyle('font-size');
  2898. var fontFamilyStyleProp = this.getStyle('font-family');
  2899. var font = new Font(fontStyleStyleProp.getString(), fontVariantStyleProp.getString(), fontWeightStyleProp.getString(), fontSizeStyleProp.hasValue() ? "".concat(fontSizeStyleProp.getPixels(true), "px") : '', fontFamilyStyleProp.getString(), Font.parse(fontStyleProp.getString(), ctx.font));
  2900. fontStyleStyleProp.setValue(font.fontStyle);
  2901. fontVariantStyleProp.setValue(font.fontVariant);
  2902. fontWeightStyleProp.setValue(font.fontWeight);
  2903. fontSizeStyleProp.setValue(font.fontSize);
  2904. fontFamilyStyleProp.setValue(font.fontFamily);
  2905. ctx.font = font.toString();
  2906. if (fontSizeStyleProp.isPixels()) {
  2907. this.document.emSize = fontSizeStyleProp.getPixels();
  2908. this.modifiedEmSizeStack = true;
  2909. }
  2910. }
  2911. if (!fromMeasure) {
  2912. // effects
  2913. this.applyEffects(ctx); // opacity
  2914. ctx.globalAlpha = this.calculateOpacity();
  2915. }
  2916. }
  2917. }, {
  2918. key: "clearContext",
  2919. value: function clearContext(ctx) {
  2920. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(RenderedElement.prototype), "clearContext", this).call(this, ctx);
  2921. if (this.modifiedEmSizeStack) {
  2922. this.document.popEmSize();
  2923. }
  2924. }
  2925. }]);
  2926. return RenderedElement;
  2927. }(Element);
  2928. function _createSuper$5(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$5()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  2929. function _isNativeReflectConstruct$5() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  2930. var TextElement = /*#__PURE__*/function (_RenderedElement) {
  2931. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TextElement, _RenderedElement);
  2932. var _super = _createSuper$5(TextElement);
  2933. function TextElement(document, node, captureTextNodes) {
  2934. var _this;
  2935. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TextElement);
  2936. _this = _super.call(this, document, node, (this instanceof TextElement ? this.constructor : void 0) === TextElement ? true : captureTextNodes);
  2937. _this.type = 'text';
  2938. _this.x = 0;
  2939. _this.y = 0;
  2940. _this.measureCache = -1;
  2941. return _this;
  2942. }
  2943. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(TextElement, [{
  2944. key: "setContext",
  2945. value: function setContext(ctx) {
  2946. var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  2947. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(TextElement.prototype), "setContext", this).call(this, ctx, fromMeasure);
  2948. var textBaseline = this.getStyle('dominant-baseline').getTextBaseline() || this.getStyle('alignment-baseline').getTextBaseline();
  2949. if (textBaseline) {
  2950. ctx.textBaseline = textBaseline;
  2951. }
  2952. }
  2953. }, {
  2954. key: "initializeCoordinates",
  2955. value: function initializeCoordinates(ctx) {
  2956. this.x = this.getAttribute('x').getPixels('x');
  2957. this.y = this.getAttribute('y').getPixels('y');
  2958. var dxAttr = this.getAttribute('dx');
  2959. var dyAttr = this.getAttribute('dy');
  2960. if (dxAttr.hasValue()) {
  2961. this.x += dxAttr.getPixels('x');
  2962. }
  2963. if (dyAttr.hasValue()) {
  2964. this.y += dyAttr.getPixels('y');
  2965. }
  2966. this.x += this.getAnchorDelta(ctx, this, 0);
  2967. }
  2968. }, {
  2969. key: "getBoundingBox",
  2970. value: function getBoundingBox(ctx) {
  2971. var _this2 = this;
  2972. if (this.type !== 'text') {
  2973. return this.getTElementBoundingBox(ctx);
  2974. }
  2975. this.initializeCoordinates(ctx);
  2976. var boundingBox = null;
  2977. this.children.forEach(function (_, i) {
  2978. var childBoundingBox = _this2.getChildBoundingBox(ctx, _this2, _this2, i);
  2979. if (!boundingBox) {
  2980. boundingBox = childBoundingBox;
  2981. } else {
  2982. boundingBox.addBoundingBox(childBoundingBox);
  2983. }
  2984. });
  2985. return boundingBox;
  2986. }
  2987. }, {
  2988. key: "getFontSize",
  2989. value: function getFontSize() {
  2990. var document = this.document,
  2991. parent = this.parent;
  2992. var inheritFontSize = Font.parse(document.ctx.font).fontSize;
  2993. var fontSize = parent.getStyle('font-size').getNumber(inheritFontSize);
  2994. return fontSize;
  2995. }
  2996. }, {
  2997. key: "getTElementBoundingBox",
  2998. value: function getTElementBoundingBox(ctx) {
  2999. var fontSize = this.getFontSize();
  3000. return new BoundingBox(this.x, this.y - fontSize, this.x + this.measureText(ctx), this.y);
  3001. }
  3002. }, {
  3003. key: "getGlyph",
  3004. value: function getGlyph(font, text, i) {
  3005. var char = text[i];
  3006. var glyph = null;
  3007. if (font.isArabic) {
  3008. var len = text.length;
  3009. var prevChar = text[i - 1];
  3010. var nextChar = text[i + 1];
  3011. var arabicForm = 'isolated';
  3012. if ((i === 0 || prevChar === ' ') && i < len - 2 && nextChar !== ' ') {
  3013. arabicForm = 'terminal';
  3014. }
  3015. if (i > 0 && prevChar !== ' ' && i < len - 2 && nextChar !== ' ') {
  3016. arabicForm = 'medial';
  3017. }
  3018. if (i > 0 && prevChar !== ' ' && (i === len - 1 || nextChar === ' ')) {
  3019. arabicForm = 'initial';
  3020. }
  3021. if (typeof font.glyphs[char] !== 'undefined') {
  3022. glyph = font.glyphs[char][arabicForm];
  3023. if (!glyph && font.glyphs[char].type === 'glyph') {
  3024. glyph = font.glyphs[char];
  3025. }
  3026. }
  3027. } else {
  3028. glyph = font.glyphs[char];
  3029. }
  3030. if (!glyph) {
  3031. glyph = font.missingGlyph;
  3032. }
  3033. return glyph;
  3034. }
  3035. }, {
  3036. key: "getText",
  3037. value: function getText() {
  3038. return '';
  3039. }
  3040. }, {
  3041. key: "getTextFromNode",
  3042. value: function getTextFromNode(node) {
  3043. var textNode = node || this.node;
  3044. var childNodes = Array.from(textNode.parentNode.childNodes);
  3045. var index = childNodes.indexOf(textNode);
  3046. var lastIndex = childNodes.length - 1;
  3047. var text = compressSpaces(textNode.value || textNode.text || textNode.textContent || '');
  3048. if (index === 0) {
  3049. text = trimLeft(text);
  3050. }
  3051. if (index === lastIndex) {
  3052. text = trimRight(text);
  3053. }
  3054. return text;
  3055. }
  3056. }, {
  3057. key: "renderChildren",
  3058. value: function renderChildren(ctx) {
  3059. var _this3 = this;
  3060. if (this.type !== 'text') {
  3061. this.renderTElementChildren(ctx);
  3062. return;
  3063. }
  3064. this.initializeCoordinates(ctx);
  3065. this.children.forEach(function (_, i) {
  3066. _this3.renderChild(ctx, _this3, _this3, i);
  3067. });
  3068. var mouse = this.document.screen.mouse; // Do not calc bounding box if mouse is not working.
  3069. if (mouse.isWorking()) {
  3070. mouse.checkBoundingBox(this, this.getBoundingBox(ctx));
  3071. }
  3072. }
  3073. }, {
  3074. key: "renderTElementChildren",
  3075. value: function renderTElementChildren(ctx) {
  3076. var document = this.document,
  3077. parent = this.parent;
  3078. var renderText = this.getText();
  3079. var customFont = parent.getStyle('font-family').getDefinition();
  3080. if (customFont) {
  3081. var unitsPerEm = customFont.fontFace.unitsPerEm;
  3082. var ctxFont = Font.parse(document.ctx.font);
  3083. var fontSize = parent.getStyle('font-size').getNumber(ctxFont.fontSize);
  3084. var fontStyle = parent.getStyle('font-style').getString(ctxFont.fontStyle);
  3085. var scale = fontSize / unitsPerEm;
  3086. var text = customFont.isRTL ? renderText.split('').reverse().join('') : renderText;
  3087. var dx = toNumbers(parent.getAttribute('dx').getString());
  3088. var len = text.length;
  3089. for (var i = 0; i < len; i++) {
  3090. var glyph = this.getGlyph(customFont, text, i);
  3091. ctx.translate(this.x, this.y);
  3092. ctx.scale(scale, -scale);
  3093. var lw = ctx.lineWidth;
  3094. ctx.lineWidth = ctx.lineWidth * unitsPerEm / fontSize;
  3095. if (fontStyle === 'italic') {
  3096. ctx.transform(1, 0, .4, 1, 0, 0);
  3097. }
  3098. glyph.render(ctx);
  3099. if (fontStyle === 'italic') {
  3100. ctx.transform(1, 0, -.4, 1, 0, 0);
  3101. }
  3102. ctx.lineWidth = lw;
  3103. ctx.scale(1 / scale, -1 / scale);
  3104. ctx.translate(-this.x, -this.y);
  3105. this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / unitsPerEm;
  3106. if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {
  3107. this.x += dx[i];
  3108. }
  3109. }
  3110. return;
  3111. }
  3112. var x = this.x,
  3113. y = this.y;
  3114. if (ctx.paintOrder === 'stroke') {
  3115. if (ctx.strokeStyle) {
  3116. ctx.strokeText(renderText, x, y);
  3117. }
  3118. if (ctx.fillStyle) {
  3119. ctx.fillText(renderText, x, y);
  3120. }
  3121. } else {
  3122. if (ctx.fillStyle) {
  3123. ctx.fillText(renderText, x, y);
  3124. }
  3125. if (ctx.strokeStyle) {
  3126. ctx.strokeText(renderText, x, y);
  3127. }
  3128. }
  3129. }
  3130. }, {
  3131. key: "getAnchorDelta",
  3132. value: function getAnchorDelta(ctx, parent, startI) {
  3133. var textAnchor = this.getStyle('text-anchor').getString('start');
  3134. if (textAnchor !== 'start') {
  3135. var children = parent.children;
  3136. var len = children.length;
  3137. var child = null;
  3138. var width = 0;
  3139. for (var i = startI; i < len; i++) {
  3140. child = children[i];
  3141. if (i > startI && child.getAttribute('x').hasValue() || child.getAttribute('text-anchor').hasValue()) {
  3142. break; // new group
  3143. }
  3144. width += child.measureTextRecursive(ctx);
  3145. }
  3146. return -1 * (textAnchor === 'end' ? width : width / 2.0);
  3147. }
  3148. return 0;
  3149. }
  3150. }, {
  3151. key: "adjustChildCoordinates",
  3152. value: function adjustChildCoordinates(ctx, textParent, parent, i) {
  3153. var child = parent.children[i];
  3154. if (typeof child.measureText !== 'function') {
  3155. return child;
  3156. }
  3157. ctx.save();
  3158. child.setContext(ctx, true);
  3159. var xAttr = child.getAttribute('x');
  3160. var yAttr = child.getAttribute('y');
  3161. var dxAttr = child.getAttribute('dx');
  3162. var dyAttr = child.getAttribute('dy');
  3163. var textAnchor = child.getAttribute('text-anchor').getString('start');
  3164. if (i === 0 && child.type !== 'textNode') {
  3165. if (!xAttr.hasValue()) {
  3166. xAttr.setValue(textParent.getAttribute('x').getValue('0'));
  3167. }
  3168. if (!yAttr.hasValue()) {
  3169. yAttr.setValue(textParent.getAttribute('y').getValue('0'));
  3170. }
  3171. if (!dxAttr.hasValue()) {
  3172. dxAttr.setValue(textParent.getAttribute('dx').getValue('0'));
  3173. }
  3174. if (!dyAttr.hasValue()) {
  3175. dyAttr.setValue(textParent.getAttribute('dy').getValue('0'));
  3176. }
  3177. }
  3178. if (xAttr.hasValue()) {
  3179. child.x = xAttr.getPixels('x') + textParent.getAnchorDelta(ctx, parent, i);
  3180. if (textAnchor !== 'start') {
  3181. var width = child.measureTextRecursive(ctx);
  3182. child.x += -1 * (textAnchor === 'end' ? width : width / 2.0);
  3183. }
  3184. if (dxAttr.hasValue()) {
  3185. child.x += dxAttr.getPixels('x');
  3186. }
  3187. } else {
  3188. if (textAnchor !== 'start') {
  3189. var _width = child.measureTextRecursive(ctx);
  3190. textParent.x += -1 * (textAnchor === 'end' ? _width : _width / 2.0);
  3191. }
  3192. if (dxAttr.hasValue()) {
  3193. textParent.x += dxAttr.getPixels('x');
  3194. }
  3195. child.x = textParent.x;
  3196. }
  3197. textParent.x = child.x + child.measureText(ctx);
  3198. if (yAttr.hasValue()) {
  3199. child.y = yAttr.getPixels('y');
  3200. if (dyAttr.hasValue()) {
  3201. child.y += dyAttr.getPixels('y');
  3202. }
  3203. } else {
  3204. if (dyAttr.hasValue()) {
  3205. textParent.y += dyAttr.getPixels('y');
  3206. }
  3207. child.y = textParent.y;
  3208. }
  3209. textParent.y = child.y;
  3210. child.clearContext(ctx);
  3211. ctx.restore();
  3212. return child;
  3213. }
  3214. }, {
  3215. key: "getChildBoundingBox",
  3216. value: function getChildBoundingBox(ctx, textParent, parent, i) {
  3217. var child = this.adjustChildCoordinates(ctx, textParent, parent, i);
  3218. var boundingBox = child.getBoundingBox(ctx);
  3219. if (!boundingBox) {
  3220. return null;
  3221. }
  3222. child.children.forEach(function (_, i) {
  3223. var childBoundingBox = textParent.getChildBoundingBox(ctx, textParent, child, i);
  3224. boundingBox.addBoundingBox(childBoundingBox);
  3225. });
  3226. return boundingBox;
  3227. }
  3228. }, {
  3229. key: "renderChild",
  3230. value: function renderChild(ctx, textParent, parent, i) {
  3231. var child = this.adjustChildCoordinates(ctx, textParent, parent, i);
  3232. child.render(ctx);
  3233. child.children.forEach(function (_, i) {
  3234. textParent.renderChild(ctx, textParent, child, i);
  3235. });
  3236. }
  3237. }, {
  3238. key: "measureTextRecursive",
  3239. value: function measureTextRecursive(ctx) {
  3240. var width = this.children.reduce(function (width, child) {
  3241. return width + child.measureTextRecursive(ctx);
  3242. }, this.measureText(ctx));
  3243. return width;
  3244. }
  3245. }, {
  3246. key: "measureText",
  3247. value: function measureText(ctx) {
  3248. var measureCache = this.measureCache;
  3249. if (~measureCache) {
  3250. return measureCache;
  3251. }
  3252. var renderText = this.getText();
  3253. var measure = this.measureTargetText(ctx, renderText);
  3254. this.measureCache = measure;
  3255. return measure;
  3256. }
  3257. }, {
  3258. key: "measureTargetText",
  3259. value: function measureTargetText(ctx, targetText) {
  3260. if (!targetText.length) {
  3261. return 0;
  3262. }
  3263. var parent = this.parent;
  3264. var customFont = parent.getStyle('font-family').getDefinition();
  3265. if (customFont) {
  3266. var fontSize = this.getFontSize();
  3267. var text = customFont.isRTL ? targetText.split('').reverse().join('') : targetText;
  3268. var dx = toNumbers(parent.getAttribute('dx').getString());
  3269. var len = text.length;
  3270. var _measure = 0;
  3271. for (var i = 0; i < len; i++) {
  3272. var glyph = this.getGlyph(customFont, text, i);
  3273. _measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
  3274. if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {
  3275. _measure += dx[i];
  3276. }
  3277. }
  3278. return _measure;
  3279. }
  3280. if (!ctx.measureText) {
  3281. return targetText.length * 10;
  3282. }
  3283. ctx.save();
  3284. this.setContext(ctx, true);
  3285. var _ctx$measureText = ctx.measureText(targetText),
  3286. measure = _ctx$measureText.width;
  3287. this.clearContext(ctx);
  3288. ctx.restore();
  3289. return measure;
  3290. }
  3291. }]);
  3292. return TextElement;
  3293. }(RenderedElement);
  3294. function _createSuper$6(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$6()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  3295. function _isNativeReflectConstruct$6() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  3296. var TSpanElement = /*#__PURE__*/function (_TextElement) {
  3297. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TSpanElement, _TextElement);
  3298. var _super = _createSuper$6(TSpanElement);
  3299. function TSpanElement(document, node, captureTextNodes) {
  3300. var _this;
  3301. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TSpanElement);
  3302. _this = _super.call(this, document, node, (this instanceof TSpanElement ? this.constructor : void 0) === TSpanElement ? true : captureTextNodes);
  3303. _this.type = 'tspan'; // if this node has children, then they own the text
  3304. _this.text = _this.children.length > 0 ? '' : _this.getTextFromNode();
  3305. return _this;
  3306. }
  3307. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(TSpanElement, [{
  3308. key: "getText",
  3309. value: function getText() {
  3310. return this.text;
  3311. }
  3312. }]);
  3313. return TSpanElement;
  3314. }(TextElement);
  3315. function _createSuper$7(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$7()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  3316. function _isNativeReflectConstruct$7() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  3317. var TextNode = /*#__PURE__*/function (_TSpanElement) {
  3318. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TextNode, _TSpanElement);
  3319. var _super = _createSuper$7(TextNode);
  3320. function TextNode() {
  3321. var _this;
  3322. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TextNode);
  3323. _this = _super.apply(this, arguments);
  3324. _this.type = 'textNode';
  3325. return _this;
  3326. }
  3327. return TextNode;
  3328. }(TSpanElement);
  3329. function preparePath(path) {
  3330. var d = path.replace(/,/gm, ' ') // get rid of all commas
  3331. // As the end of a match can also be the start of the next match, we need to run this replace twice.
  3332. .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm, '$1 $2') // suffix commands with spaces
  3333. .replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm, '$1 $2') // suffix commands with spaces
  3334. .replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // prefix commands with spaces
  3335. .replace(/([0-9])([+\-])/gm, '$1 $2') // separate digits on +- signs
  3336. // Again, we need to run this twice to find all occurances
  3337. .replace(/(\.[0-9]*)(\.)/gm, '$1 $2') // separate digits when they start with a comma
  3338. .replace(/(\.[0-9]*)(\.)/gm, '$1 $2') // separate digits when they start with a comma
  3339. .replace(/([Aa](?:\s+(?:[0-9]*\.)?[0-9]+){3})\s+([01])\s*([01])/gm, '$1 $2 $3 '); // shorthand elliptical arc path syntax
  3340. return compressSpaces(d).trim();
  3341. }
  3342. var PathParser = /*#__PURE__*/function () {
  3343. function PathParser(path) {
  3344. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, PathParser);
  3345. this.control = null;
  3346. this.start = null;
  3347. this.current = null;
  3348. this.command = '';
  3349. this.tokens = [];
  3350. this.i = -1;
  3351. this.previousCommand = '';
  3352. this.points = [];
  3353. this.angles = [];
  3354. this.tokens = preparePath(path).split(' ');
  3355. }
  3356. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(PathParser, [{
  3357. key: "reset",
  3358. value: function reset() {
  3359. this.i = -1;
  3360. this.command = '';
  3361. this.previousCommand = '';
  3362. this.start = new Point(0, 0);
  3363. this.control = new Point(0, 0);
  3364. this.current = new Point(0, 0);
  3365. this.points = [];
  3366. this.angles = [];
  3367. }
  3368. }, {
  3369. key: "isEnd",
  3370. value: function isEnd() {
  3371. var i = this.i,
  3372. tokens = this.tokens;
  3373. return i >= tokens.length - 1;
  3374. }
  3375. }, {
  3376. key: "isCommandOrEnd",
  3377. value: function isCommandOrEnd() {
  3378. if (this.isEnd()) {
  3379. return true;
  3380. }
  3381. var i = this.i,
  3382. tokens = this.tokens;
  3383. return /^[A-Za-z]$/.test(tokens[i + 1]);
  3384. }
  3385. }, {
  3386. key: "isRelativeCommand",
  3387. value: function isRelativeCommand() {
  3388. switch (this.command) {
  3389. case 'm':
  3390. case 'l':
  3391. case 'h':
  3392. case 'v':
  3393. case 'c':
  3394. case 's':
  3395. case 'q':
  3396. case 't':
  3397. case 'a':
  3398. case 'z':
  3399. return true;
  3400. default:
  3401. return false;
  3402. }
  3403. }
  3404. }, {
  3405. key: "getToken",
  3406. value: function getToken() {
  3407. this.i++;
  3408. return this.tokens[this.i];
  3409. }
  3410. }, {
  3411. key: "getScalar",
  3412. value: function getScalar() {
  3413. return parseFloat(this.getToken());
  3414. }
  3415. }, {
  3416. key: "nextCommand",
  3417. value: function nextCommand() {
  3418. this.previousCommand = this.command;
  3419. this.command = this.getToken();
  3420. }
  3421. }, {
  3422. key: "getPoint",
  3423. value: function getPoint() {
  3424. var point = new Point(this.getScalar(), this.getScalar());
  3425. return this.makeAbsolute(point);
  3426. }
  3427. }, {
  3428. key: "getAsControlPoint",
  3429. value: function getAsControlPoint() {
  3430. var point = this.getPoint();
  3431. this.control = point;
  3432. return point;
  3433. }
  3434. }, {
  3435. key: "getAsCurrentPoint",
  3436. value: function getAsCurrentPoint() {
  3437. var point = this.getPoint();
  3438. this.current = point;
  3439. return point;
  3440. }
  3441. }, {
  3442. key: "getReflectedControlPoint",
  3443. value: function getReflectedControlPoint() {
  3444. var previousCommand = this.previousCommand.toLowerCase();
  3445. if (previousCommand !== 'c' && previousCommand !== 's' && previousCommand !== 'q' && previousCommand !== 't') {
  3446. return this.current;
  3447. } // reflect point
  3448. var _this$current = this.current,
  3449. cx = _this$current.x,
  3450. cy = _this$current.y,
  3451. _this$control = this.control,
  3452. ox = _this$control.x,
  3453. oy = _this$control.y;
  3454. var point = new Point(2 * cx - ox, 2 * cy - oy);
  3455. return point;
  3456. }
  3457. }, {
  3458. key: "makeAbsolute",
  3459. value: function makeAbsolute(point) {
  3460. if (this.isRelativeCommand()) {
  3461. var _this$current2 = this.current,
  3462. x = _this$current2.x,
  3463. y = _this$current2.y;
  3464. point.x += x;
  3465. point.y += y;
  3466. }
  3467. return point;
  3468. }
  3469. }, {
  3470. key: "addMarker",
  3471. value: function addMarker(point, from, priorTo) {
  3472. var points = this.points,
  3473. angles = this.angles; // if the last angle isn't filled in because we didn't have this point yet ...
  3474. if (priorTo && angles.length > 0 && !angles[angles.length - 1]) {
  3475. angles[angles.length - 1] = points[points.length - 1].angleTo(priorTo);
  3476. }
  3477. this.addMarkerAngle(point, from ? from.angleTo(point) : null);
  3478. }
  3479. }, {
  3480. key: "addMarkerAngle",
  3481. value: function addMarkerAngle(point, angle) {
  3482. this.points.push(point);
  3483. this.angles.push(angle);
  3484. }
  3485. }, {
  3486. key: "getMarkerPoints",
  3487. value: function getMarkerPoints() {
  3488. return this.points;
  3489. }
  3490. }, {
  3491. key: "getMarkerAngles",
  3492. value: function getMarkerAngles() {
  3493. var angles = this.angles;
  3494. var len = angles.length;
  3495. for (var i = 0; i < len; i++) {
  3496. if (!angles[i]) {
  3497. for (var j = i + 1; j < len; j++) {
  3498. if (angles[j]) {
  3499. angles[i] = angles[j];
  3500. break;
  3501. }
  3502. }
  3503. }
  3504. }
  3505. return angles;
  3506. }
  3507. }]);
  3508. return PathParser;
  3509. }();
  3510. function _createSuper$8(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$8()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  3511. function _isNativeReflectConstruct$8() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  3512. var PathElement = /*#__PURE__*/function (_RenderedElement) {
  3513. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(PathElement, _RenderedElement);
  3514. var _super = _createSuper$8(PathElement);
  3515. function PathElement(document, node, captureTextNodes) {
  3516. var _this;
  3517. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, PathElement);
  3518. _this = _super.call(this, document, node, captureTextNodes);
  3519. _this.type = 'path';
  3520. _this.pathParser = null;
  3521. _this.pathParser = new PathParser(_this.getAttribute('d').getString());
  3522. return _this;
  3523. }
  3524. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(PathElement, [{
  3525. key: "path",
  3526. value: function path(ctx) {
  3527. var pathParser = this.pathParser;
  3528. var boundingBox = new BoundingBox();
  3529. pathParser.reset();
  3530. if (ctx) {
  3531. ctx.beginPath();
  3532. }
  3533. while (!pathParser.isEnd()) {
  3534. pathParser.nextCommand();
  3535. switch (pathParser.command) {
  3536. case 'M':
  3537. case 'm':
  3538. this.pathM(ctx, boundingBox);
  3539. break;
  3540. case 'L':
  3541. case 'l':
  3542. this.pathL(ctx, boundingBox);
  3543. break;
  3544. case 'H':
  3545. case 'h':
  3546. this.pathH(ctx, boundingBox);
  3547. break;
  3548. case 'V':
  3549. case 'v':
  3550. this.pathV(ctx, boundingBox);
  3551. break;
  3552. case 'C':
  3553. case 'c':
  3554. this.pathC(ctx, boundingBox);
  3555. break;
  3556. case 'S':
  3557. case 's':
  3558. this.pathS(ctx, boundingBox);
  3559. break;
  3560. case 'Q':
  3561. case 'q':
  3562. this.pathQ(ctx, boundingBox);
  3563. break;
  3564. case 'T':
  3565. case 't':
  3566. this.pathT(ctx, boundingBox);
  3567. break;
  3568. case 'A':
  3569. case 'a':
  3570. this.pathA(ctx, boundingBox);
  3571. break;
  3572. case 'Z':
  3573. case 'z':
  3574. this.pathZ(ctx, boundingBox);
  3575. break;
  3576. }
  3577. }
  3578. return boundingBox;
  3579. }
  3580. }, {
  3581. key: "getBoundingBox",
  3582. value: function getBoundingBox(_) {
  3583. return this.path();
  3584. }
  3585. }, {
  3586. key: "getMarkers",
  3587. value: function getMarkers() {
  3588. var pathParser = this.pathParser;
  3589. var points = pathParser.getMarkerPoints();
  3590. var angles = pathParser.getMarkerAngles();
  3591. var markers = points.map(function (point, i) {
  3592. return [point, angles[i]];
  3593. });
  3594. return markers;
  3595. }
  3596. }, {
  3597. key: "renderChildren",
  3598. value: function renderChildren(ctx) {
  3599. this.path(ctx);
  3600. this.document.screen.mouse.checkPath(this, ctx);
  3601. var fillRuleStyleProp = this.getStyle('fill-rule');
  3602. if (ctx.fillStyle !== '') {
  3603. if (fillRuleStyleProp.getString('inherit') !== 'inherit') {
  3604. ctx.fill(fillRuleStyleProp.getString());
  3605. } else {
  3606. ctx.fill();
  3607. }
  3608. }
  3609. if (ctx.strokeStyle !== '') {
  3610. ctx.stroke();
  3611. }
  3612. var markers = this.getMarkers();
  3613. if (markers) {
  3614. var markersLastIndex = markers.length - 1;
  3615. var markerStartStyleProp = this.getStyle('marker-start');
  3616. var markerMidStyleProp = this.getStyle('marker-mid');
  3617. var markerEndStyleProp = this.getStyle('marker-end');
  3618. if (markerStartStyleProp.isUrlDefinition()) {
  3619. var marker = markerStartStyleProp.getDefinition();
  3620. var _markers$ = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(markers[0], 2),
  3621. point = _markers$[0],
  3622. angle = _markers$[1];
  3623. marker.render(ctx, point, angle);
  3624. }
  3625. if (markerMidStyleProp.isUrlDefinition()) {
  3626. var _marker = markerMidStyleProp.getDefinition();
  3627. for (var i = 1; i < markersLastIndex; i++) {
  3628. var _markers$i = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(markers[i], 2),
  3629. _point = _markers$i[0],
  3630. _angle = _markers$i[1];
  3631. _marker.render(ctx, _point, _angle);
  3632. }
  3633. }
  3634. if (markerEndStyleProp.isUrlDefinition()) {
  3635. var _marker2 = markerEndStyleProp.getDefinition();
  3636. var _markers$markersLastI = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(markers[markersLastIndex], 2),
  3637. _point2 = _markers$markersLastI[0],
  3638. _angle2 = _markers$markersLastI[1];
  3639. _marker2.render(ctx, _point2, _angle2);
  3640. }
  3641. }
  3642. }
  3643. }, {
  3644. key: "pathM",
  3645. value: function pathM(ctx, boundingBox) {
  3646. var pathParser = this.pathParser;
  3647. var point = pathParser.getAsCurrentPoint();
  3648. var x = point.x,
  3649. y = point.y;
  3650. pathParser.addMarker(point);
  3651. boundingBox.addPoint(x, y);
  3652. if (ctx) {
  3653. ctx.moveTo(x, y);
  3654. }
  3655. pathParser.start = pathParser.current;
  3656. while (!pathParser.isCommandOrEnd()) {
  3657. var _point3 = pathParser.getAsCurrentPoint();
  3658. var _x = _point3.x,
  3659. _y = _point3.y;
  3660. pathParser.addMarker(_point3, pathParser.start);
  3661. boundingBox.addPoint(_x, _y);
  3662. if (ctx) {
  3663. ctx.lineTo(_x, _y);
  3664. }
  3665. }
  3666. }
  3667. }, {
  3668. key: "pathL",
  3669. value: function pathL(ctx, boundingBox) {
  3670. var pathParser = this.pathParser;
  3671. while (!pathParser.isCommandOrEnd()) {
  3672. var current = pathParser.current;
  3673. var point = pathParser.getAsCurrentPoint();
  3674. var x = point.x,
  3675. y = point.y;
  3676. pathParser.addMarker(point, current);
  3677. boundingBox.addPoint(x, y);
  3678. if (ctx) {
  3679. ctx.lineTo(x, y);
  3680. }
  3681. }
  3682. }
  3683. }, {
  3684. key: "pathH",
  3685. value: function pathH(ctx, boundingBox) {
  3686. var pathParser = this.pathParser;
  3687. while (!pathParser.isCommandOrEnd()) {
  3688. var current = pathParser.current;
  3689. var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);
  3690. pathParser.addMarker(point, current);
  3691. pathParser.current = point;
  3692. boundingBox.addPoint(point.x, point.y);
  3693. if (ctx) {
  3694. ctx.lineTo(point.x, point.y);
  3695. }
  3696. }
  3697. }
  3698. }, {
  3699. key: "pathV",
  3700. value: function pathV(ctx, boundingBox) {
  3701. var pathParser = this.pathParser;
  3702. while (!pathParser.isCommandOrEnd()) {
  3703. var current = pathParser.current;
  3704. var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());
  3705. pathParser.addMarker(point, current);
  3706. pathParser.current = point;
  3707. boundingBox.addPoint(point.x, point.y);
  3708. if (ctx) {
  3709. ctx.lineTo(point.x, point.y);
  3710. }
  3711. }
  3712. }
  3713. }, {
  3714. key: "pathC",
  3715. value: function pathC(ctx, boundingBox) {
  3716. var pathParser = this.pathParser;
  3717. while (!pathParser.isCommandOrEnd()) {
  3718. var current = pathParser.current;
  3719. var point = pathParser.getPoint();
  3720. var controlPoint = pathParser.getAsControlPoint();
  3721. var currentPoint = pathParser.getAsCurrentPoint();
  3722. pathParser.addMarker(currentPoint, controlPoint, point);
  3723. boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3724. if (ctx) {
  3725. ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3726. }
  3727. }
  3728. }
  3729. }, {
  3730. key: "pathS",
  3731. value: function pathS(ctx, boundingBox) {
  3732. var pathParser = this.pathParser;
  3733. while (!pathParser.isCommandOrEnd()) {
  3734. var current = pathParser.current;
  3735. var point = pathParser.getReflectedControlPoint();
  3736. var controlPoint = pathParser.getAsControlPoint();
  3737. var currentPoint = pathParser.getAsCurrentPoint();
  3738. pathParser.addMarker(currentPoint, controlPoint, point);
  3739. boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3740. if (ctx) {
  3741. ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3742. }
  3743. }
  3744. }
  3745. }, {
  3746. key: "pathQ",
  3747. value: function pathQ(ctx, boundingBox) {
  3748. var pathParser = this.pathParser;
  3749. while (!pathParser.isCommandOrEnd()) {
  3750. var current = pathParser.current;
  3751. var controlPoint = pathParser.getAsControlPoint();
  3752. var currentPoint = pathParser.getAsCurrentPoint();
  3753. pathParser.addMarker(currentPoint, controlPoint, controlPoint);
  3754. boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3755. if (ctx) {
  3756. ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3757. }
  3758. }
  3759. }
  3760. }, {
  3761. key: "pathT",
  3762. value: function pathT(ctx, boundingBox) {
  3763. var pathParser = this.pathParser;
  3764. while (!pathParser.isCommandOrEnd()) {
  3765. var current = pathParser.current;
  3766. var controlPoint = pathParser.getReflectedControlPoint();
  3767. pathParser.control = controlPoint;
  3768. var currentPoint = pathParser.getAsCurrentPoint();
  3769. pathParser.addMarker(currentPoint, controlPoint, controlPoint);
  3770. boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3771. if (ctx) {
  3772. ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  3773. }
  3774. }
  3775. }
  3776. }, {
  3777. key: "pathA",
  3778. value: function pathA(ctx, boundingBox) {
  3779. var pathParser = this.pathParser;
  3780. while (!pathParser.isCommandOrEnd()) {
  3781. var current = pathParser.current;
  3782. var rx = pathParser.getScalar();
  3783. var ry = pathParser.getScalar();
  3784. var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0);
  3785. var largeArcFlag = pathParser.getScalar();
  3786. var sweepFlag = pathParser.getScalar();
  3787. var currentPoint = pathParser.getAsCurrentPoint(); // Conversion from endpoint to center parameterization
  3788. // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
  3789. // x1', y1'
  3790. var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii
  3791. var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);
  3792. if (l > 1) {
  3793. rx *= Math.sqrt(l);
  3794. ry *= Math.sqrt(l);
  3795. } // cx', cy'
  3796. var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));
  3797. if (isNaN(s)) {
  3798. s = 0;
  3799. }
  3800. var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy
  3801. var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle
  3802. var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta
  3803. var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];
  3804. var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];
  3805. var ad = vectorsAngle(u, v);
  3806. if (vectorsRatio(u, v) <= -1) {
  3807. ad = Math.PI;
  3808. }
  3809. if (vectorsRatio(u, v) >= 1) {
  3810. ad = 0;
  3811. } // for markers
  3812. var dir = 1 - sweepFlag ? 1.0 : -1.0;
  3813. var ah = a1 + dir * (ad / 2.0);
  3814. var halfWay = new Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah));
  3815. pathParser.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);
  3816. pathParser.addMarkerAngle(currentPoint, ah - dir * Math.PI);
  3817. boundingBox.addPoint(currentPoint.x, currentPoint.y); // TODO: this is too naive, make it better
  3818. if (ctx && !isNaN(a1) && !isNaN(ad)) {
  3819. var r = rx > ry ? rx : ry;
  3820. var sx = rx > ry ? 1 : rx / ry;
  3821. var sy = rx > ry ? ry / rx : 1;
  3822. ctx.translate(centp.x, centp.y);
  3823. ctx.rotate(xAxisRotation);
  3824. ctx.scale(sx, sy);
  3825. ctx.arc(0, 0, r, a1, a1 + ad, Boolean(1 - sweepFlag));
  3826. ctx.scale(1 / sx, 1 / sy);
  3827. ctx.rotate(-xAxisRotation);
  3828. ctx.translate(-centp.x, -centp.y);
  3829. }
  3830. }
  3831. }
  3832. }, {
  3833. key: "pathZ",
  3834. value: function pathZ(ctx, boundingBox) {
  3835. var pathParser = this.pathParser;
  3836. if (ctx) {
  3837. // only close path if it is not a straight line
  3838. if (boundingBox.x1 !== boundingBox.x2 && boundingBox.y1 !== boundingBox.y2) {
  3839. ctx.closePath();
  3840. }
  3841. }
  3842. pathParser.current = pathParser.start;
  3843. }
  3844. }]);
  3845. return PathElement;
  3846. }(RenderedElement);
  3847. function _createSuper$9(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$9()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  3848. function _isNativeReflectConstruct$9() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  3849. var SVGElement = /*#__PURE__*/function (_RenderedElement) {
  3850. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(SVGElement, _RenderedElement);
  3851. var _super = _createSuper$9(SVGElement);
  3852. function SVGElement() {
  3853. var _this;
  3854. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, SVGElement);
  3855. _this = _super.apply(this, arguments);
  3856. _this.type = 'svg';
  3857. _this.root = false;
  3858. return _this;
  3859. }
  3860. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(SVGElement, [{
  3861. key: "clearContext",
  3862. value: function clearContext(ctx) {
  3863. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(SVGElement.prototype), "clearContext", this).call(this, ctx);
  3864. this.document.screen.viewPort.removeCurrent();
  3865. }
  3866. }, {
  3867. key: "setContext",
  3868. value: function setContext(ctx) {
  3869. var document = this.document;
  3870. var screen = document.screen,
  3871. window = document.window;
  3872. var canvas = ctx.canvas;
  3873. screen.setDefaults(ctx);
  3874. if (canvas.style && typeof ctx.font !== 'undefined' && window && typeof window.getComputedStyle !== 'undefined') {
  3875. ctx.font = window.getComputedStyle(canvas).getPropertyValue('font');
  3876. var fontSizeProp = new Property(document, 'fontSize', Font.parse(ctx.font).fontSize);
  3877. if (fontSizeProp.hasValue()) {
  3878. document.rootEmSize = fontSizeProp.getPixels('y');
  3879. document.emSize = document.rootEmSize;
  3880. }
  3881. }
  3882. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(SVGElement.prototype), "setContext", this).call(this, ctx); // create new view port
  3883. if (!this.getAttribute('x').hasValue()) {
  3884. this.getAttribute('x', true).setValue(0);
  3885. }
  3886. if (!this.getAttribute('y').hasValue()) {
  3887. this.getAttribute('y', true).setValue(0);
  3888. }
  3889. ctx.translate(this.getAttribute('x').getPixels('x'), this.getAttribute('y').getPixels('y'));
  3890. var _screen$viewPort = screen.viewPort,
  3891. width = _screen$viewPort.width,
  3892. height = _screen$viewPort.height;
  3893. if (!this.getStyle('width').hasValue()) {
  3894. this.getStyle('width', true).setValue('100%');
  3895. }
  3896. if (!this.getStyle('height').hasValue()) {
  3897. this.getStyle('height', true).setValue('100%');
  3898. }
  3899. if (!this.getStyle('color').hasValue()) {
  3900. this.getStyle('color', true).setValue('black');
  3901. }
  3902. var refXAttr = this.getAttribute('refX');
  3903. var refYAttr = this.getAttribute('refY');
  3904. var viewBoxAttr = this.getAttribute('viewBox');
  3905. var viewBox = viewBoxAttr.hasValue() ? toNumbers(viewBoxAttr.getString()) : null;
  3906. var clip = !this.root && this.getAttribute('overflow').getValue('hidden') !== 'visible';
  3907. var minX = 0;
  3908. var minY = 0;
  3909. var clipX = 0;
  3910. var clipY = 0;
  3911. if (viewBox) {
  3912. minX = viewBox[0];
  3913. minY = viewBox[1];
  3914. }
  3915. if (!this.root) {
  3916. width = this.getStyle('width').getPixels('x');
  3917. height = this.getStyle('height').getPixels('y');
  3918. if (this.type === 'marker') {
  3919. clipX = minX;
  3920. clipY = minY;
  3921. minX = 0;
  3922. minY = 0;
  3923. }
  3924. }
  3925. screen.viewPort.setCurrent(width, height);
  3926. if (viewBox) {
  3927. width = viewBox[2];
  3928. height = viewBox[3];
  3929. }
  3930. document.setViewBox({
  3931. ctx: ctx,
  3932. aspectRatio: this.getAttribute('preserveAspectRatio').getString(),
  3933. width: screen.viewPort.width,
  3934. desiredWidth: width,
  3935. height: screen.viewPort.height,
  3936. desiredHeight: height,
  3937. minX: minX,
  3938. minY: minY,
  3939. refX: refXAttr.getValue(),
  3940. refY: refYAttr.getValue(),
  3941. clip: clip,
  3942. clipX: clipX,
  3943. clipY: clipY
  3944. });
  3945. if (viewBox) {
  3946. screen.viewPort.removeCurrent();
  3947. screen.viewPort.setCurrent(width, height);
  3948. }
  3949. }
  3950. /**
  3951. * Resize SVG to fit in given size.
  3952. * @param width
  3953. * @param height
  3954. * @param preserveAspectRatio
  3955. */
  3956. }, {
  3957. key: "resize",
  3958. value: function resize(width) {
  3959. var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;
  3960. var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  3961. var widthAttr = this.getAttribute('width', true);
  3962. var heightAttr = this.getAttribute('height', true);
  3963. var viewBoxAttr = this.getAttribute('viewBox');
  3964. var styleAttr = this.getAttribute('style');
  3965. var originWidth = widthAttr.getNumber(0);
  3966. var originHeight = heightAttr.getNumber(0);
  3967. if (preserveAspectRatio) {
  3968. if (typeof preserveAspectRatio === 'string') {
  3969. this.getAttribute('preserveAspectRatio', true).setValue(preserveAspectRatio);
  3970. } else {
  3971. var preserveAspectRatioAttr = this.getAttribute('preserveAspectRatio');
  3972. if (preserveAspectRatioAttr.hasValue()) {
  3973. preserveAspectRatioAttr.setValue(preserveAspectRatioAttr.getString().replace(/^\s*(\S.*\S)\s*$/, '$1'));
  3974. }
  3975. }
  3976. }
  3977. widthAttr.setValue(width);
  3978. heightAttr.setValue(height);
  3979. if (!viewBoxAttr.hasValue()) {
  3980. viewBoxAttr.setValue("0 0 ".concat(originWidth || width, " ").concat(originHeight || height));
  3981. }
  3982. if (styleAttr.hasValue()) {
  3983. var widthStyle = this.getStyle('width');
  3984. var heightStyle = this.getStyle('height');
  3985. if (widthStyle.hasValue()) {
  3986. widthStyle.setValue("".concat(width, "px"));
  3987. }
  3988. if (heightStyle.hasValue()) {
  3989. heightStyle.setValue("".concat(height, "px"));
  3990. }
  3991. }
  3992. }
  3993. }]);
  3994. return SVGElement;
  3995. }(RenderedElement);
  3996. function _createSuper$a(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$a()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  3997. function _isNativeReflectConstruct$a() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  3998. var RectElement = /*#__PURE__*/function (_PathElement) {
  3999. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(RectElement, _PathElement);
  4000. var _super = _createSuper$a(RectElement);
  4001. function RectElement() {
  4002. var _this;
  4003. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, RectElement);
  4004. _this = _super.apply(this, arguments);
  4005. _this.type = 'rect';
  4006. return _this;
  4007. }
  4008. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(RectElement, [{
  4009. key: "path",
  4010. value: function path(ctx) {
  4011. var x = this.getAttribute('x').getPixels('x');
  4012. var y = this.getAttribute('y').getPixels('y');
  4013. var width = this.getStyle('width').getPixels('x');
  4014. var height = this.getStyle('height').getPixels('y');
  4015. var rxAttr = this.getAttribute('rx');
  4016. var ryAttr = this.getAttribute('ry');
  4017. var rx = rxAttr.getPixels('x');
  4018. var ry = ryAttr.getPixels('y');
  4019. if (rxAttr.hasValue() && !ryAttr.hasValue()) {
  4020. ry = rx;
  4021. }
  4022. if (ryAttr.hasValue() && !rxAttr.hasValue()) {
  4023. rx = ry;
  4024. }
  4025. rx = Math.min(rx, width / 2.0);
  4026. ry = Math.min(ry, height / 2.0);
  4027. if (ctx) {
  4028. var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
  4029. ctx.beginPath(); // always start the path so we don't fill prior paths
  4030. if (height > 0 && width > 0) {
  4031. ctx.moveTo(x + rx, y);
  4032. ctx.lineTo(x + width - rx, y);
  4033. ctx.bezierCurveTo(x + width - rx + KAPPA * rx, y, x + width, y + ry - KAPPA * ry, x + width, y + ry);
  4034. ctx.lineTo(x + width, y + height - ry);
  4035. ctx.bezierCurveTo(x + width, y + height - ry + KAPPA * ry, x + width - rx + KAPPA * rx, y + height, x + width - rx, y + height);
  4036. ctx.lineTo(x + rx, y + height);
  4037. ctx.bezierCurveTo(x + rx - KAPPA * rx, y + height, x, y + height - ry + KAPPA * ry, x, y + height - ry);
  4038. ctx.lineTo(x, y + ry);
  4039. ctx.bezierCurveTo(x, y + ry - KAPPA * ry, x + rx - KAPPA * rx, y, x + rx, y);
  4040. ctx.closePath();
  4041. }
  4042. }
  4043. return new BoundingBox(x, y, x + width, y + height);
  4044. }
  4045. }, {
  4046. key: "getMarkers",
  4047. value: function getMarkers() {
  4048. return null;
  4049. }
  4050. }]);
  4051. return RectElement;
  4052. }(PathElement);
  4053. function _createSuper$b(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$b()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4054. function _isNativeReflectConstruct$b() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4055. var CircleElement = /*#__PURE__*/function (_PathElement) {
  4056. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(CircleElement, _PathElement);
  4057. var _super = _createSuper$b(CircleElement);
  4058. function CircleElement() {
  4059. var _this;
  4060. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, CircleElement);
  4061. _this = _super.apply(this, arguments);
  4062. _this.type = 'circle';
  4063. return _this;
  4064. }
  4065. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(CircleElement, [{
  4066. key: "path",
  4067. value: function path(ctx) {
  4068. var cx = this.getAttribute('cx').getPixels('x');
  4069. var cy = this.getAttribute('cy').getPixels('y');
  4070. var r = this.getAttribute('r').getPixels();
  4071. if (ctx && r > 0) {
  4072. ctx.beginPath();
  4073. ctx.arc(cx, cy, r, 0, Math.PI * 2, false);
  4074. ctx.closePath();
  4075. }
  4076. return new BoundingBox(cx - r, cy - r, cx + r, cy + r);
  4077. }
  4078. }, {
  4079. key: "getMarkers",
  4080. value: function getMarkers() {
  4081. return null;
  4082. }
  4083. }]);
  4084. return CircleElement;
  4085. }(PathElement);
  4086. function _createSuper$c(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$c()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4087. function _isNativeReflectConstruct$c() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4088. var EllipseElement = /*#__PURE__*/function (_PathElement) {
  4089. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(EllipseElement, _PathElement);
  4090. var _super = _createSuper$c(EllipseElement);
  4091. function EllipseElement() {
  4092. var _this;
  4093. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, EllipseElement);
  4094. _this = _super.apply(this, arguments);
  4095. _this.type = 'ellipse';
  4096. return _this;
  4097. }
  4098. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(EllipseElement, [{
  4099. key: "path",
  4100. value: function path(ctx) {
  4101. var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
  4102. var rx = this.getAttribute('rx').getPixels('x');
  4103. var ry = this.getAttribute('ry').getPixels('y');
  4104. var cx = this.getAttribute('cx').getPixels('x');
  4105. var cy = this.getAttribute('cy').getPixels('y');
  4106. if (ctx && rx > 0 && ry > 0) {
  4107. ctx.beginPath();
  4108. ctx.moveTo(cx + rx, cy);
  4109. ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry);
  4110. ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy);
  4111. ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry);
  4112. ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy);
  4113. ctx.closePath();
  4114. }
  4115. return new BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
  4116. }
  4117. }, {
  4118. key: "getMarkers",
  4119. value: function getMarkers() {
  4120. return null;
  4121. }
  4122. }]);
  4123. return EllipseElement;
  4124. }(PathElement);
  4125. function _createSuper$d(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$d()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4126. function _isNativeReflectConstruct$d() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4127. var LineElement = /*#__PURE__*/function (_PathElement) {
  4128. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(LineElement, _PathElement);
  4129. var _super = _createSuper$d(LineElement);
  4130. function LineElement() {
  4131. var _this;
  4132. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, LineElement);
  4133. _this = _super.apply(this, arguments);
  4134. _this.type = 'line';
  4135. return _this;
  4136. }
  4137. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(LineElement, [{
  4138. key: "getPoints",
  4139. value: function getPoints() {
  4140. return [new Point(this.getAttribute('x1').getPixels('x'), this.getAttribute('y1').getPixels('y')), new Point(this.getAttribute('x2').getPixels('x'), this.getAttribute('y2').getPixels('y'))];
  4141. }
  4142. }, {
  4143. key: "path",
  4144. value: function path(ctx) {
  4145. var _this$getPoints = this.getPoints(),
  4146. _this$getPoints2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_this$getPoints, 2),
  4147. _this$getPoints2$ = _this$getPoints2[0],
  4148. x0 = _this$getPoints2$.x,
  4149. y0 = _this$getPoints2$.y,
  4150. _this$getPoints2$2 = _this$getPoints2[1],
  4151. x1 = _this$getPoints2$2.x,
  4152. y1 = _this$getPoints2$2.y;
  4153. if (ctx) {
  4154. ctx.beginPath();
  4155. ctx.moveTo(x0, y0);
  4156. ctx.lineTo(x1, y1);
  4157. }
  4158. return new BoundingBox(x0, y0, x1, y1);
  4159. }
  4160. }, {
  4161. key: "getMarkers",
  4162. value: function getMarkers() {
  4163. var _this$getPoints3 = this.getPoints(),
  4164. _this$getPoints4 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(_this$getPoints3, 2),
  4165. p0 = _this$getPoints4[0],
  4166. p1 = _this$getPoints4[1];
  4167. var a = p0.angleTo(p1);
  4168. return [[p0, a], [p1, a]];
  4169. }
  4170. }]);
  4171. return LineElement;
  4172. }(PathElement);
  4173. function _createSuper$e(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$e()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4174. function _isNativeReflectConstruct$e() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4175. var PolylineElement = /*#__PURE__*/function (_PathElement) {
  4176. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(PolylineElement, _PathElement);
  4177. var _super = _createSuper$e(PolylineElement);
  4178. function PolylineElement(document, node, captureTextNodes) {
  4179. var _this;
  4180. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, PolylineElement);
  4181. _this = _super.call(this, document, node, captureTextNodes);
  4182. _this.type = 'polyline';
  4183. _this.points = [];
  4184. _this.points = Point.parsePath(_this.getAttribute('points').getString());
  4185. return _this;
  4186. }
  4187. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(PolylineElement, [{
  4188. key: "path",
  4189. value: function path(ctx) {
  4190. var points = this.points;
  4191. var _points = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(points, 1),
  4192. _points$ = _points[0],
  4193. x0 = _points$.x,
  4194. y0 = _points$.y;
  4195. var boundingBox = new BoundingBox(x0, y0);
  4196. if (ctx) {
  4197. ctx.beginPath();
  4198. ctx.moveTo(x0, y0);
  4199. }
  4200. points.forEach(function (_ref) {
  4201. var x = _ref.x,
  4202. y = _ref.y;
  4203. boundingBox.addPoint(x, y);
  4204. if (ctx) {
  4205. ctx.lineTo(x, y);
  4206. }
  4207. });
  4208. return boundingBox;
  4209. }
  4210. }, {
  4211. key: "getMarkers",
  4212. value: function getMarkers() {
  4213. var points = this.points;
  4214. var lastIndex = points.length - 1;
  4215. var markers = [];
  4216. points.forEach(function (point, i) {
  4217. if (i === lastIndex) {
  4218. return;
  4219. }
  4220. markers.push([point, point.angleTo(points[i + 1])]);
  4221. });
  4222. if (markers.length > 0) {
  4223. markers.push([points[points.length - 1], markers[markers.length - 1][1]]);
  4224. }
  4225. return markers;
  4226. }
  4227. }]);
  4228. return PolylineElement;
  4229. }(PathElement);
  4230. function _createSuper$f(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$f()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4231. function _isNativeReflectConstruct$f() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4232. var PolygonElement = /*#__PURE__*/function (_PolylineElement) {
  4233. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(PolygonElement, _PolylineElement);
  4234. var _super = _createSuper$f(PolygonElement);
  4235. function PolygonElement() {
  4236. var _this;
  4237. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, PolygonElement);
  4238. _this = _super.apply(this, arguments);
  4239. _this.type = 'polygon';
  4240. return _this;
  4241. }
  4242. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(PolygonElement, [{
  4243. key: "path",
  4244. value: function path(ctx) {
  4245. var boundingBox = (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(PolygonElement.prototype), "path", this).call(this, ctx);
  4246. var _this$points = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(this.points, 1),
  4247. _this$points$ = _this$points[0],
  4248. x = _this$points$.x,
  4249. y = _this$points$.y;
  4250. if (ctx) {
  4251. ctx.lineTo(x, y);
  4252. ctx.closePath();
  4253. }
  4254. return boundingBox;
  4255. }
  4256. }]);
  4257. return PolygonElement;
  4258. }(PolylineElement);
  4259. function _createSuper$g(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$g()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4260. function _isNativeReflectConstruct$g() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4261. var PatternElement = /*#__PURE__*/function (_Element) {
  4262. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(PatternElement, _Element);
  4263. var _super = _createSuper$g(PatternElement);
  4264. function PatternElement() {
  4265. var _this;
  4266. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, PatternElement);
  4267. _this = _super.apply(this, arguments);
  4268. _this.type = 'pattern';
  4269. return _this;
  4270. }
  4271. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(PatternElement, [{
  4272. key: "createPattern",
  4273. value: function createPattern(ctx, _, parentOpacityProp) {
  4274. var width = this.getStyle('width').getPixels('x', true);
  4275. var height = this.getStyle('height').getPixels('y', true); // render me using a temporary svg element
  4276. var patternSvg = new SVGElement(this.document, null);
  4277. patternSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());
  4278. patternSvg.attributes.width = new Property(this.document, 'width', "".concat(width, "px"));
  4279. patternSvg.attributes.height = new Property(this.document, 'height', "".concat(height, "px"));
  4280. patternSvg.attributes.transform = new Property(this.document, 'transform', this.getAttribute('patternTransform').getValue());
  4281. patternSvg.children = this.children;
  4282. var patternCanvas = this.document.createCanvas(width, height);
  4283. var patternCtx = patternCanvas.getContext('2d');
  4284. var xAttr = this.getAttribute('x');
  4285. var yAttr = this.getAttribute('y');
  4286. if (xAttr.hasValue() && yAttr.hasValue()) {
  4287. patternCtx.translate(xAttr.getPixels('x', true), yAttr.getPixels('y', true));
  4288. }
  4289. if (parentOpacityProp.hasValue()) {
  4290. this.styles['fill-opacity'] = parentOpacityProp;
  4291. } else {
  4292. Reflect.deleteProperty(this.styles, 'fill-opacity');
  4293. } // render 3x3 grid so when we transform there's no white space on edges
  4294. for (var x = -1; x <= 1; x++) {
  4295. for (var y = -1; y <= 1; y++) {
  4296. patternCtx.save();
  4297. patternSvg.attributes.x = new Property(this.document, 'x', x * patternCanvas.width);
  4298. patternSvg.attributes.y = new Property(this.document, 'y', y * patternCanvas.height);
  4299. patternSvg.render(patternCtx);
  4300. patternCtx.restore();
  4301. }
  4302. }
  4303. var pattern = ctx.createPattern(patternCanvas, 'repeat');
  4304. return pattern;
  4305. }
  4306. }]);
  4307. return PatternElement;
  4308. }(Element);
  4309. function _createSuper$h(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$h()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4310. function _isNativeReflectConstruct$h() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4311. var MarkerElement = /*#__PURE__*/function (_Element) {
  4312. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(MarkerElement, _Element);
  4313. var _super = _createSuper$h(MarkerElement);
  4314. function MarkerElement() {
  4315. var _this;
  4316. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, MarkerElement);
  4317. _this = _super.apply(this, arguments);
  4318. _this.type = 'marker';
  4319. return _this;
  4320. }
  4321. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(MarkerElement, [{
  4322. key: "render",
  4323. value: function render(ctx, point, angle) {
  4324. if (!point) {
  4325. return;
  4326. }
  4327. var x = point.x,
  4328. y = point.y;
  4329. var orient = this.getAttribute('orient').getValue('auto');
  4330. var markerUnits = this.getAttribute('markerUnits').getValue('strokeWidth');
  4331. ctx.translate(x, y);
  4332. if (orient === 'auto') {
  4333. ctx.rotate(angle);
  4334. }
  4335. if (markerUnits === 'strokeWidth') {
  4336. ctx.scale(ctx.lineWidth, ctx.lineWidth);
  4337. }
  4338. ctx.save(); // render me using a temporary svg element
  4339. var markerSvg = new SVGElement(this.document, null);
  4340. markerSvg.type = this.type;
  4341. markerSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());
  4342. markerSvg.attributes.refX = new Property(this.document, 'refX', this.getAttribute('refX').getValue());
  4343. markerSvg.attributes.refY = new Property(this.document, 'refY', this.getAttribute('refY').getValue());
  4344. markerSvg.attributes.width = new Property(this.document, 'width', this.getAttribute('markerWidth').getValue());
  4345. markerSvg.attributes.height = new Property(this.document, 'height', this.getAttribute('markerHeight').getValue());
  4346. markerSvg.attributes.overflow = new Property(this.document, 'overflow', this.getAttribute('overflow').getValue());
  4347. markerSvg.attributes.fill = new Property(this.document, 'fill', this.getAttribute('fill').getColor('black'));
  4348. markerSvg.attributes.stroke = new Property(this.document, 'stroke', this.getAttribute('stroke').getValue('none'));
  4349. markerSvg.children = this.children;
  4350. markerSvg.render(ctx);
  4351. ctx.restore();
  4352. if (markerUnits === 'strokeWidth') {
  4353. ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);
  4354. }
  4355. if (orient === 'auto') {
  4356. ctx.rotate(-angle);
  4357. }
  4358. ctx.translate(-x, -y);
  4359. }
  4360. }]);
  4361. return MarkerElement;
  4362. }(Element);
  4363. function _createSuper$i(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$i()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4364. function _isNativeReflectConstruct$i() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4365. var DefsElement = /*#__PURE__*/function (_Element) {
  4366. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(DefsElement, _Element);
  4367. var _super = _createSuper$i(DefsElement);
  4368. function DefsElement() {
  4369. var _this;
  4370. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, DefsElement);
  4371. _this = _super.apply(this, arguments);
  4372. _this.type = 'defs';
  4373. return _this;
  4374. }
  4375. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(DefsElement, [{
  4376. key: "render",
  4377. value: function render() {// NOOP
  4378. }
  4379. }]);
  4380. return DefsElement;
  4381. }(Element);
  4382. function _createSuper$j(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$j()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4383. function _isNativeReflectConstruct$j() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4384. var GElement = /*#__PURE__*/function (_RenderedElement) {
  4385. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(GElement, _RenderedElement);
  4386. var _super = _createSuper$j(GElement);
  4387. function GElement() {
  4388. var _this;
  4389. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, GElement);
  4390. _this = _super.apply(this, arguments);
  4391. _this.type = 'g';
  4392. return _this;
  4393. }
  4394. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(GElement, [{
  4395. key: "getBoundingBox",
  4396. value: function getBoundingBox(ctx) {
  4397. var boundingBox = new BoundingBox();
  4398. this.children.forEach(function (child) {
  4399. boundingBox.addBoundingBox(child.getBoundingBox(ctx));
  4400. });
  4401. return boundingBox;
  4402. }
  4403. }]);
  4404. return GElement;
  4405. }(RenderedElement);
  4406. function _createSuper$k(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$k()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4407. function _isNativeReflectConstruct$k() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4408. var GradientElement = /*#__PURE__*/function (_Element) {
  4409. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(GradientElement, _Element);
  4410. var _super = _createSuper$k(GradientElement);
  4411. function GradientElement(document, node, captureTextNodes) {
  4412. var _this;
  4413. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, GradientElement);
  4414. _this = _super.call(this, document, node, captureTextNodes);
  4415. _this.attributesToInherit = ['gradientUnits'];
  4416. _this.stops = [];
  4417. var _assertThisInitialize = (0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__.default)(_this),
  4418. stops = _assertThisInitialize.stops,
  4419. children = _assertThisInitialize.children;
  4420. children.forEach(function (child) {
  4421. if (child.type === 'stop') {
  4422. stops.push(child);
  4423. }
  4424. });
  4425. return _this;
  4426. }
  4427. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(GradientElement, [{
  4428. key: "getGradientUnits",
  4429. value: function getGradientUnits() {
  4430. return this.getAttribute('gradientUnits').getString('objectBoundingBox');
  4431. }
  4432. }, {
  4433. key: "createGradient",
  4434. value: function createGradient(ctx, element, parentOpacityProp) {
  4435. var _this2 = this;
  4436. // tslint:disable-next-line: no-this-assignment
  4437. var stopsContainer = this;
  4438. if (this.getHrefAttribute().hasValue()) {
  4439. stopsContainer = this.getHrefAttribute().getDefinition();
  4440. this.inheritStopContainer(stopsContainer);
  4441. }
  4442. var _stopsContainer = stopsContainer,
  4443. stops = _stopsContainer.stops;
  4444. var gradient = this.getGradient(ctx, element);
  4445. if (!gradient) {
  4446. return this.addParentOpacity(parentOpacityProp, stops[stops.length - 1].color);
  4447. }
  4448. stops.forEach(function (stop) {
  4449. gradient.addColorStop(stop.offset, _this2.addParentOpacity(parentOpacityProp, stop.color));
  4450. });
  4451. if (this.getAttribute('gradientTransform').hasValue()) {
  4452. // render as transformed pattern on temporary canvas
  4453. var document = this.document;
  4454. var _document$screen = document.screen,
  4455. MAX_VIRTUAL_PIXELS = _document$screen.MAX_VIRTUAL_PIXELS,
  4456. viewPort = _document$screen.viewPort;
  4457. var _viewPort$viewPorts = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_6__.default)(viewPort.viewPorts, 1),
  4458. rootView = _viewPort$viewPorts[0];
  4459. var rect = new RectElement(document, null);
  4460. rect.attributes.x = new Property(document, 'x', -MAX_VIRTUAL_PIXELS / 3.0);
  4461. rect.attributes.y = new Property(document, 'y', -MAX_VIRTUAL_PIXELS / 3.0);
  4462. rect.attributes.width = new Property(document, 'width', MAX_VIRTUAL_PIXELS);
  4463. rect.attributes.height = new Property(document, 'height', MAX_VIRTUAL_PIXELS);
  4464. var group = new GElement(document, null);
  4465. group.attributes.transform = new Property(document, 'transform', this.getAttribute('gradientTransform').getValue());
  4466. group.children = [rect];
  4467. var patternSvg = new SVGElement(document, null);
  4468. patternSvg.attributes.x = new Property(document, 'x', 0);
  4469. patternSvg.attributes.y = new Property(document, 'y', 0);
  4470. patternSvg.attributes.width = new Property(document, 'width', rootView.width);
  4471. patternSvg.attributes.height = new Property(document, 'height', rootView.height);
  4472. patternSvg.children = [group];
  4473. var patternCanvas = document.createCanvas(rootView.width, rootView.height);
  4474. var patternCtx = patternCanvas.getContext('2d');
  4475. patternCtx.fillStyle = gradient;
  4476. patternSvg.render(patternCtx);
  4477. return patternCtx.createPattern(patternCanvas, 'no-repeat');
  4478. }
  4479. return gradient;
  4480. }
  4481. }, {
  4482. key: "inheritStopContainer",
  4483. value: function inheritStopContainer(stopsContainer) {
  4484. var _this3 = this;
  4485. this.attributesToInherit.forEach(function (attributeToInherit) {
  4486. if (!_this3.getAttribute(attributeToInherit).hasValue() && stopsContainer.getAttribute(attributeToInherit).hasValue()) {
  4487. _this3.getAttribute(attributeToInherit, true).setValue(stopsContainer.getAttribute(attributeToInherit).getValue());
  4488. }
  4489. });
  4490. }
  4491. }, {
  4492. key: "addParentOpacity",
  4493. value: function addParentOpacity(parentOpacityProp, color) {
  4494. if (parentOpacityProp.hasValue()) {
  4495. var colorProp = new Property(this.document, 'color', color);
  4496. return colorProp.addOpacity(parentOpacityProp).getColor();
  4497. }
  4498. return color;
  4499. }
  4500. }]);
  4501. return GradientElement;
  4502. }(Element);
  4503. function _createSuper$l(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$l()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4504. function _isNativeReflectConstruct$l() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4505. var LinearGradientElement = /*#__PURE__*/function (_GradientElement) {
  4506. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(LinearGradientElement, _GradientElement);
  4507. var _super = _createSuper$l(LinearGradientElement);
  4508. function LinearGradientElement(document, node, captureTextNodes) {
  4509. var _this;
  4510. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, LinearGradientElement);
  4511. _this = _super.call(this, document, node, captureTextNodes);
  4512. _this.type = 'linearGradient';
  4513. _this.attributesToInherit.push('x1', 'y1', 'x2', 'y2');
  4514. return _this;
  4515. }
  4516. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(LinearGradientElement, [{
  4517. key: "getGradient",
  4518. value: function getGradient(ctx, element) {
  4519. var isBoundingBoxUnits = this.getGradientUnits() === 'objectBoundingBox';
  4520. var boundingBox = isBoundingBoxUnits ? element.getBoundingBox(ctx) : null;
  4521. if (isBoundingBoxUnits && !boundingBox) {
  4522. return null;
  4523. }
  4524. if (!this.getAttribute('x1').hasValue() && !this.getAttribute('y1').hasValue() && !this.getAttribute('x2').hasValue() && !this.getAttribute('y2').hasValue()) {
  4525. this.getAttribute('x1', true).setValue(0);
  4526. this.getAttribute('y1', true).setValue(0);
  4527. this.getAttribute('x2', true).setValue(1);
  4528. this.getAttribute('y2', true).setValue(0);
  4529. }
  4530. var x1 = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('x1').getNumber() : this.getAttribute('x1').getPixels('x');
  4531. var y1 = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('y1').getNumber() : this.getAttribute('y1').getPixels('y');
  4532. var x2 = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('x2').getNumber() : this.getAttribute('x2').getPixels('x');
  4533. var y2 = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('y2').getNumber() : this.getAttribute('y2').getPixels('y');
  4534. if (x1 === x2 && y1 === y2) {
  4535. return null;
  4536. }
  4537. return ctx.createLinearGradient(x1, y1, x2, y2);
  4538. }
  4539. }]);
  4540. return LinearGradientElement;
  4541. }(GradientElement);
  4542. function _createSuper$m(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$m()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4543. function _isNativeReflectConstruct$m() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4544. var RadialGradientElement = /*#__PURE__*/function (_GradientElement) {
  4545. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(RadialGradientElement, _GradientElement);
  4546. var _super = _createSuper$m(RadialGradientElement);
  4547. function RadialGradientElement(document, node, captureTextNodes) {
  4548. var _this;
  4549. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, RadialGradientElement);
  4550. _this = _super.call(this, document, node, captureTextNodes);
  4551. _this.type = 'radialGradient';
  4552. _this.attributesToInherit.push('cx', 'cy', 'r', 'fx', 'fy', 'fr');
  4553. return _this;
  4554. }
  4555. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(RadialGradientElement, [{
  4556. key: "getGradient",
  4557. value: function getGradient(ctx, element) {
  4558. var isBoundingBoxUnits = this.getGradientUnits() === 'objectBoundingBox';
  4559. var boundingBox = element.getBoundingBox(ctx);
  4560. if (isBoundingBoxUnits && !boundingBox) {
  4561. return null;
  4562. }
  4563. if (!this.getAttribute('cx').hasValue()) {
  4564. this.getAttribute('cx', true).setValue('50%');
  4565. }
  4566. if (!this.getAttribute('cy').hasValue()) {
  4567. this.getAttribute('cy', true).setValue('50%');
  4568. }
  4569. if (!this.getAttribute('r').hasValue()) {
  4570. this.getAttribute('r', true).setValue('50%');
  4571. }
  4572. var cx = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('cx').getNumber() : this.getAttribute('cx').getPixels('x');
  4573. var cy = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('cy').getNumber() : this.getAttribute('cy').getPixels('y');
  4574. var fx = cx;
  4575. var fy = cy;
  4576. if (this.getAttribute('fx').hasValue()) {
  4577. fx = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('fx').getNumber() : this.getAttribute('fx').getPixels('x');
  4578. }
  4579. if (this.getAttribute('fy').hasValue()) {
  4580. fy = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('fy').getNumber() : this.getAttribute('fy').getPixels('y');
  4581. }
  4582. var r = isBoundingBoxUnits ? (boundingBox.width + boundingBox.height) / 2.0 * this.getAttribute('r').getNumber() : this.getAttribute('r').getPixels();
  4583. var fr = this.getAttribute('fr').getPixels();
  4584. return ctx.createRadialGradient(fx, fy, fr, cx, cy, r);
  4585. }
  4586. }]);
  4587. return RadialGradientElement;
  4588. }(GradientElement);
  4589. function _createSuper$n(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$n()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4590. function _isNativeReflectConstruct$n() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4591. var StopElement = /*#__PURE__*/function (_Element) {
  4592. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(StopElement, _Element);
  4593. var _super = _createSuper$n(StopElement);
  4594. function StopElement(document, node, captureTextNodes) {
  4595. var _this;
  4596. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, StopElement);
  4597. _this = _super.call(this, document, node, captureTextNodes);
  4598. _this.type = 'stop';
  4599. var offset = Math.max(0, Math.min(1, _this.getAttribute('offset').getNumber()));
  4600. var stopOpacity = _this.getStyle('stop-opacity');
  4601. var stopColor = _this.getStyle('stop-color', true);
  4602. if (stopColor.getString() === '') {
  4603. stopColor.setValue('#000');
  4604. }
  4605. if (stopOpacity.hasValue()) {
  4606. stopColor = stopColor.addOpacity(stopOpacity);
  4607. }
  4608. _this.offset = offset;
  4609. _this.color = stopColor.getColor();
  4610. return _this;
  4611. }
  4612. return StopElement;
  4613. }(Element);
  4614. function _createSuper$o(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$o()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4615. function _isNativeReflectConstruct$o() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4616. var AnimateElement = /*#__PURE__*/function (_Element) {
  4617. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(AnimateElement, _Element);
  4618. var _super = _createSuper$o(AnimateElement);
  4619. function AnimateElement(document, node, captureTextNodes) {
  4620. var _this;
  4621. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, AnimateElement);
  4622. _this = _super.call(this, document, node, captureTextNodes);
  4623. _this.type = 'animate';
  4624. _this.duration = 0;
  4625. _this.initialValue = null;
  4626. _this.initialUnits = '';
  4627. _this.removed = false;
  4628. _this.frozen = false;
  4629. document.screen.animations.push((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__.default)(_this));
  4630. _this.begin = _this.getAttribute('begin').getMilliseconds();
  4631. _this.maxDuration = _this.begin + _this.getAttribute('dur').getMilliseconds();
  4632. _this.from = _this.getAttribute('from');
  4633. _this.to = _this.getAttribute('to');
  4634. _this.values = _this.getAttribute('values');
  4635. if (_this.values.hasValue()) {
  4636. _this.values.setValue(_this.values.getString().split(';'));
  4637. }
  4638. return _this;
  4639. }
  4640. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(AnimateElement, [{
  4641. key: "getProperty",
  4642. value: function getProperty() {
  4643. var attributeType = this.getAttribute('attributeType').getString();
  4644. var attributeName = this.getAttribute('attributeName').getString();
  4645. if (attributeType === 'CSS') {
  4646. return this.parent.getStyle(attributeName, true);
  4647. }
  4648. return this.parent.getAttribute(attributeName, true);
  4649. }
  4650. }, {
  4651. key: "calcValue",
  4652. value: function calcValue() {
  4653. var initialUnits = this.initialUnits;
  4654. var _this$getProgress = this.getProgress(),
  4655. progress = _this$getProgress.progress,
  4656. from = _this$getProgress.from,
  4657. to = _this$getProgress.to; // tween value linearly
  4658. var newValue = from.getNumber() + (to.getNumber() - from.getNumber()) * progress;
  4659. if (initialUnits === '%') {
  4660. newValue *= 100.0; // numValue() returns 0-1 whereas properties are 0-100
  4661. }
  4662. return "".concat(newValue).concat(initialUnits);
  4663. }
  4664. }, {
  4665. key: "update",
  4666. value: function update(delta) {
  4667. var parent = this.parent;
  4668. var prop = this.getProperty(); // set initial value
  4669. if (!this.initialValue) {
  4670. this.initialValue = prop.getString();
  4671. this.initialUnits = prop.getUnits();
  4672. } // if we're past the end time
  4673. if (this.duration > this.maxDuration) {
  4674. var fill = this.getAttribute('fill').getString('remove'); // loop for indefinitely repeating animations
  4675. if (this.getAttribute('repeatCount').getString() === 'indefinite' || this.getAttribute('repeatDur').getString() === 'indefinite') {
  4676. this.duration = 0;
  4677. } else if (fill === 'freeze' && !this.frozen) {
  4678. this.frozen = true;
  4679. parent.animationFrozen = true;
  4680. parent.animationFrozenValue = prop.getString();
  4681. } else if (fill === 'remove' && !this.removed) {
  4682. this.removed = true;
  4683. prop.setValue(parent.animationFrozen ? parent.animationFrozenValue : this.initialValue);
  4684. return true;
  4685. }
  4686. return false;
  4687. }
  4688. this.duration += delta; // if we're past the begin time
  4689. var updated = false;
  4690. if (this.begin < this.duration) {
  4691. var newValue = this.calcValue(); // tween
  4692. var typeAttr = this.getAttribute('type');
  4693. if (typeAttr.hasValue()) {
  4694. // for transform, etc.
  4695. var type = typeAttr.getString();
  4696. newValue = "".concat(type, "(").concat(newValue, ")");
  4697. }
  4698. prop.setValue(newValue);
  4699. updated = true;
  4700. }
  4701. return updated;
  4702. }
  4703. }, {
  4704. key: "getProgress",
  4705. value: function getProgress() {
  4706. var document = this.document,
  4707. values = this.values;
  4708. var result = {
  4709. progress: (this.duration - this.begin) / (this.maxDuration - this.begin)
  4710. };
  4711. if (values.hasValue()) {
  4712. var p = result.progress * (values.getValue().length - 1);
  4713. var lb = Math.floor(p);
  4714. var ub = Math.ceil(p);
  4715. result.from = new Property(document, 'from', parseFloat(values.getValue()[lb]));
  4716. result.to = new Property(document, 'to', parseFloat(values.getValue()[ub]));
  4717. result.progress = (p - lb) / (ub - lb);
  4718. } else {
  4719. result.from = this.from;
  4720. result.to = this.to;
  4721. }
  4722. return result;
  4723. }
  4724. }]);
  4725. return AnimateElement;
  4726. }(Element);
  4727. function _createSuper$p(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$p()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4728. function _isNativeReflectConstruct$p() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4729. var AnimateColorElement = /*#__PURE__*/function (_AnimateElement) {
  4730. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(AnimateColorElement, _AnimateElement);
  4731. var _super = _createSuper$p(AnimateColorElement);
  4732. function AnimateColorElement() {
  4733. var _this;
  4734. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, AnimateColorElement);
  4735. _this = _super.apply(this, arguments);
  4736. _this.type = 'animateColor';
  4737. return _this;
  4738. }
  4739. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(AnimateColorElement, [{
  4740. key: "calcValue",
  4741. value: function calcValue() {
  4742. var _this$getProgress = this.getProgress(),
  4743. progress = _this$getProgress.progress,
  4744. from = _this$getProgress.from,
  4745. to = _this$getProgress.to;
  4746. var colorFrom = new (rgbcolor__WEBPACK_IMPORTED_MODULE_27___default())(from.getColor());
  4747. var colorTo = new (rgbcolor__WEBPACK_IMPORTED_MODULE_27___default())(to.getColor());
  4748. if (colorFrom.ok && colorTo.ok) {
  4749. // tween color linearly
  4750. var r = colorFrom.r + (colorTo.r - colorFrom.r) * progress;
  4751. var g = colorFrom.g + (colorTo.g - colorFrom.g) * progress;
  4752. var b = colorFrom.b + (colorTo.b - colorFrom.b) * progress; // ? alpha
  4753. return "rgb(".concat(parseInt(r, 10), ", ").concat(parseInt(g, 10), ", ").concat(parseInt(b, 10), ")");
  4754. }
  4755. return this.getAttribute('from').getColor();
  4756. }
  4757. }]);
  4758. return AnimateColorElement;
  4759. }(AnimateElement);
  4760. function _createSuper$q(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$q()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4761. function _isNativeReflectConstruct$q() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4762. var AnimateTransformElement = /*#__PURE__*/function (_AnimateElement) {
  4763. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(AnimateTransformElement, _AnimateElement);
  4764. var _super = _createSuper$q(AnimateTransformElement);
  4765. function AnimateTransformElement() {
  4766. var _this;
  4767. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, AnimateTransformElement);
  4768. _this = _super.apply(this, arguments);
  4769. _this.type = 'animateTransform';
  4770. return _this;
  4771. }
  4772. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(AnimateTransformElement, [{
  4773. key: "calcValue",
  4774. value: function calcValue() {
  4775. var _this$getProgress = this.getProgress(),
  4776. progress = _this$getProgress.progress,
  4777. from = _this$getProgress.from,
  4778. to = _this$getProgress.to; // tween value linearly
  4779. var transformFrom = toNumbers(from.getString());
  4780. var transformTo = toNumbers(to.getString());
  4781. var newValue = transformFrom.map(function (from, i) {
  4782. var to = transformTo[i];
  4783. return from + (to - from) * progress;
  4784. }).join(' ');
  4785. return newValue;
  4786. }
  4787. }]);
  4788. return AnimateTransformElement;
  4789. }(AnimateElement);
  4790. function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  4791. function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
  4792. function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  4793. function _createSuper$r(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$r()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4794. function _isNativeReflectConstruct$r() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4795. var FontElement = /*#__PURE__*/function (_Element) {
  4796. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FontElement, _Element);
  4797. var _super = _createSuper$r(FontElement);
  4798. function FontElement(document, node, captureTextNodes) {
  4799. var _this;
  4800. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FontElement);
  4801. _this = _super.call(this, document, node, captureTextNodes);
  4802. _this.type = 'font';
  4803. _this.glyphs = {};
  4804. _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();
  4805. var definitions = document.definitions;
  4806. var _assertThisInitialize = (0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__.default)(_this),
  4807. children = _assertThisInitialize.children;
  4808. var _iterator = _createForOfIteratorHelper(children),
  4809. _step;
  4810. try {
  4811. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4812. var child = _step.value;
  4813. switch (child.type) {
  4814. case 'font-face':
  4815. {
  4816. _this.fontFace = child;
  4817. var fontFamilyStyle = child.getStyle('font-family');
  4818. if (fontFamilyStyle.hasValue()) {
  4819. definitions[fontFamilyStyle.getString()] = (0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__.default)(_this);
  4820. }
  4821. break;
  4822. }
  4823. case 'missing-glyph':
  4824. _this.missingGlyph = child;
  4825. break;
  4826. case 'glyph':
  4827. {
  4828. var glyph = child;
  4829. if (glyph.arabicForm) {
  4830. _this.isRTL = true;
  4831. _this.isArabic = true;
  4832. if (typeof _this.glyphs[glyph.unicode] === 'undefined') {
  4833. _this.glyphs[glyph.unicode] = {};
  4834. }
  4835. _this.glyphs[glyph.unicode][glyph.arabicForm] = glyph;
  4836. } else {
  4837. _this.glyphs[glyph.unicode] = glyph;
  4838. }
  4839. break;
  4840. }
  4841. default:
  4842. }
  4843. }
  4844. } catch (err) {
  4845. _iterator.e(err);
  4846. } finally {
  4847. _iterator.f();
  4848. }
  4849. return _this;
  4850. }
  4851. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FontElement, [{
  4852. key: "render",
  4853. value: function render() {// NO RENDER
  4854. }
  4855. }]);
  4856. return FontElement;
  4857. }(Element);
  4858. function _createSuper$s(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$s()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4859. function _isNativeReflectConstruct$s() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4860. var FontFaceElement = /*#__PURE__*/function (_Element) {
  4861. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FontFaceElement, _Element);
  4862. var _super = _createSuper$s(FontFaceElement);
  4863. function FontFaceElement(document, node, captureTextNodes) {
  4864. var _this;
  4865. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FontFaceElement);
  4866. _this = _super.call(this, document, node, captureTextNodes);
  4867. _this.type = 'font-face';
  4868. _this.ascent = _this.getAttribute('ascent').getNumber();
  4869. _this.descent = _this.getAttribute('descent').getNumber();
  4870. _this.unitsPerEm = _this.getAttribute('units-per-em').getNumber();
  4871. return _this;
  4872. }
  4873. return FontFaceElement;
  4874. }(Element);
  4875. function _createSuper$t(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$t()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4876. function _isNativeReflectConstruct$t() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4877. var MissingGlyphElement = /*#__PURE__*/function (_PathElement) {
  4878. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(MissingGlyphElement, _PathElement);
  4879. var _super = _createSuper$t(MissingGlyphElement);
  4880. function MissingGlyphElement() {
  4881. var _this;
  4882. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, MissingGlyphElement);
  4883. _this = _super.apply(this, arguments);
  4884. _this.type = 'missing-glyph';
  4885. _this.horizAdvX = 0;
  4886. return _this;
  4887. }
  4888. return MissingGlyphElement;
  4889. }(PathElement);
  4890. function _createSuper$u(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$u()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4891. function _isNativeReflectConstruct$u() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4892. var GlyphElement = /*#__PURE__*/function (_PathElement) {
  4893. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(GlyphElement, _PathElement);
  4894. var _super = _createSuper$u(GlyphElement);
  4895. function GlyphElement(document, node, captureTextNodes) {
  4896. var _this;
  4897. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, GlyphElement);
  4898. _this = _super.call(this, document, node, captureTextNodes);
  4899. _this.type = 'glyph';
  4900. _this.horizAdvX = _this.getAttribute('horiz-adv-x').getNumber();
  4901. _this.unicode = _this.getAttribute('unicode').getString();
  4902. _this.arabicForm = _this.getAttribute('arabic-form').getString();
  4903. return _this;
  4904. }
  4905. return GlyphElement;
  4906. }(PathElement);
  4907. function _createSuper$v(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$v()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4908. function _isNativeReflectConstruct$v() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4909. var TRefElement = /*#__PURE__*/function (_TextElement) {
  4910. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TRefElement, _TextElement);
  4911. var _super = _createSuper$v(TRefElement);
  4912. function TRefElement() {
  4913. var _this;
  4914. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TRefElement);
  4915. _this = _super.apply(this, arguments);
  4916. _this.type = 'tref';
  4917. return _this;
  4918. }
  4919. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(TRefElement, [{
  4920. key: "getText",
  4921. value: function getText() {
  4922. var element = this.getHrefAttribute().getDefinition();
  4923. if (element) {
  4924. var firstChild = element.children[0];
  4925. if (firstChild) {
  4926. return firstChild.getText();
  4927. }
  4928. }
  4929. return '';
  4930. }
  4931. }]);
  4932. return TRefElement;
  4933. }(TextElement);
  4934. function _createSuper$w(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$w()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  4935. function _isNativeReflectConstruct$w() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  4936. var AElement = /*#__PURE__*/function (_TextElement) {
  4937. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(AElement, _TextElement);
  4938. var _super = _createSuper$w(AElement);
  4939. function AElement(document, node, captureTextNodes) {
  4940. var _this;
  4941. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, AElement);
  4942. _this = _super.call(this, document, node, captureTextNodes);
  4943. _this.type = 'a';
  4944. var childNodes = node.childNodes;
  4945. var firstChild = childNodes[0];
  4946. var hasText = childNodes.length > 0 && Array.from(childNodes).every(function (node) {
  4947. return node.nodeType === 3;
  4948. });
  4949. _this.hasText = hasText;
  4950. _this.text = hasText ? _this.getTextFromNode(firstChild) : '';
  4951. return _this;
  4952. }
  4953. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(AElement, [{
  4954. key: "getText",
  4955. value: function getText() {
  4956. return this.text;
  4957. }
  4958. }, {
  4959. key: "renderChildren",
  4960. value: function renderChildren(ctx) {
  4961. if (this.hasText) {
  4962. // render as text element
  4963. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(AElement.prototype), "renderChildren", this).call(this, ctx);
  4964. var document = this.document,
  4965. x = this.x,
  4966. y = this.y;
  4967. var mouse = document.screen.mouse;
  4968. var fontSize = new Property(document, 'fontSize', Font.parse(document.ctx.font).fontSize); // Do not calc bounding box if mouse is not working.
  4969. if (mouse.isWorking()) {
  4970. mouse.checkBoundingBox(this, new BoundingBox(x, y - fontSize.getPixels('y'), x + this.measureText(ctx), y));
  4971. }
  4972. } else if (this.children.length > 0) {
  4973. // render as temporary group
  4974. var g = new GElement(this.document, null);
  4975. g.children = this.children;
  4976. g.parent = this;
  4977. g.render(ctx);
  4978. }
  4979. }
  4980. }, {
  4981. key: "onClick",
  4982. value: function onClick() {
  4983. var window = this.document.window;
  4984. if (window) {
  4985. window.open(this.getHrefAttribute().getString());
  4986. }
  4987. }
  4988. }, {
  4989. key: "onMouseMove",
  4990. value: function onMouseMove() {
  4991. var ctx = this.document.ctx;
  4992. ctx.canvas.style.cursor = 'pointer';
  4993. }
  4994. }]);
  4995. return AElement;
  4996. }(TextElement);
  4997. function _createForOfIteratorHelper$1(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$1(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  4998. function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }
  4999. function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  5000. function _createSuper$x(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$x()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  5001. function _isNativeReflectConstruct$x() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  5002. var TextPathElement = /*#__PURE__*/function (_TextElement) {
  5003. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TextPathElement, _TextElement);
  5004. var _super = _createSuper$x(TextPathElement);
  5005. function TextPathElement(document, node, captureTextNodes) {
  5006. var _this;
  5007. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TextPathElement);
  5008. _this = _super.call(this, document, node, captureTextNodes);
  5009. _this.type = 'textPath';
  5010. _this.textWidth = 0;
  5011. _this.textHeight = 0;
  5012. _this.pathLength = -1;
  5013. _this.glyphInfo = null;
  5014. _this.letterSpacingCache = [];
  5015. _this.measuresCache = new Map([['', 0]]);
  5016. var pathElement = _this.getHrefAttribute().getDefinition();
  5017. _this.text = _this.getTextFromNode();
  5018. _this.dataArray = _this.parsePathData(pathElement);
  5019. return _this;
  5020. }
  5021. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(TextPathElement, [{
  5022. key: "getText",
  5023. value: function getText() {
  5024. return this.text;
  5025. }
  5026. }, {
  5027. key: "path",
  5028. value: function path(ctx) {
  5029. var dataArray = this.dataArray;
  5030. if (ctx) {
  5031. ctx.beginPath();
  5032. }
  5033. dataArray.forEach(function (_ref) {
  5034. var command = _ref.command,
  5035. points = _ref.points;
  5036. switch (command) {
  5037. case 'L':
  5038. if (ctx) {
  5039. ctx.lineTo(points[0], points[1]);
  5040. }
  5041. break;
  5042. case 'M':
  5043. if (ctx) {
  5044. ctx.moveTo(points[0], points[1]);
  5045. }
  5046. break;
  5047. case 'C':
  5048. if (ctx) {
  5049. ctx.bezierCurveTo(points[0], points[1], points[2], points[3], points[4], points[5]);
  5050. }
  5051. break;
  5052. case 'Q':
  5053. if (ctx) {
  5054. ctx.quadraticCurveTo(points[0], points[1], points[2], points[3]);
  5055. }
  5056. break;
  5057. case 'A':
  5058. {
  5059. var cx = points[0];
  5060. var cy = points[1];
  5061. var rx = points[2];
  5062. var ry = points[3];
  5063. var theta = points[4];
  5064. var dTheta = points[5];
  5065. var psi = points[6];
  5066. var fs = points[7];
  5067. var r = rx > ry ? rx : ry;
  5068. var scaleX = rx > ry ? 1 : rx / ry;
  5069. var scaleY = rx > ry ? ry / rx : 1;
  5070. if (ctx) {
  5071. ctx.translate(cx, cy);
  5072. ctx.rotate(psi);
  5073. ctx.scale(scaleX, scaleY);
  5074. ctx.arc(0, 0, r, theta, theta + dTheta, Boolean(1 - fs));
  5075. ctx.scale(1 / scaleX, 1 / scaleY);
  5076. ctx.rotate(-psi);
  5077. ctx.translate(-cx, -cy);
  5078. }
  5079. break;
  5080. }
  5081. case 'z':
  5082. if (ctx) {
  5083. ctx.closePath();
  5084. }
  5085. break;
  5086. }
  5087. });
  5088. }
  5089. }, {
  5090. key: "renderChildren",
  5091. value: function renderChildren(ctx) {
  5092. this.setTextData(ctx);
  5093. ctx.save();
  5094. var textDecoration = this.parent.getStyle('text-decoration').getString();
  5095. var fontSize = this.getFontSize();
  5096. var glyphInfo = this.glyphInfo;
  5097. var fill = ctx.fillStyle;
  5098. if (textDecoration === 'underline') {
  5099. ctx.beginPath();
  5100. }
  5101. glyphInfo.forEach(function (glyph, i) {
  5102. var p0 = glyph.p0,
  5103. p1 = glyph.p1,
  5104. partialText = glyph.text;
  5105. ctx.save();
  5106. ctx.translate(p0.x, p0.y);
  5107. ctx.rotate(glyphInfo[i].rotation);
  5108. if (ctx.fillStyle) {
  5109. ctx.fillText(partialText, 0, 0);
  5110. }
  5111. if (ctx.strokeStyle) {
  5112. ctx.strokeText(partialText, 0, 0);
  5113. }
  5114. ctx.restore();
  5115. if (textDecoration === 'underline') {
  5116. if (i === 0) {
  5117. ctx.moveTo(p0.x, p0.y + fontSize / 8);
  5118. }
  5119. ctx.lineTo(p1.x, p1.y + fontSize / 5);
  5120. } //// To assist with debugging visually, uncomment following
  5121. //
  5122. // ctx.beginPath();
  5123. // if (i % 2)
  5124. // ctx.strokeStyle = 'red';
  5125. // else
  5126. // ctx.strokeStyle = 'green';
  5127. // ctx.moveTo(p0.x, p0.y);
  5128. // ctx.lineTo(p1.x, p1.y);
  5129. // ctx.stroke();
  5130. // ctx.closePath();
  5131. });
  5132. if (textDecoration === 'underline') {
  5133. ctx.lineWidth = fontSize / 20;
  5134. ctx.strokeStyle = fill;
  5135. ctx.stroke();
  5136. ctx.closePath();
  5137. }
  5138. ctx.restore();
  5139. }
  5140. }, {
  5141. key: "getLetterSpacingAt",
  5142. value: function getLetterSpacingAt() {
  5143. var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  5144. return this.letterSpacingCache[idx] || 0;
  5145. }
  5146. }, {
  5147. key: "findSegmentToFitChar",
  5148. value: function findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, inputOffset, c, charI) {
  5149. var offset = inputOffset;
  5150. var glyphWidth = this.measureText(ctx, c);
  5151. if (c === ' ' && anchor === 'justify' && textFullWidth < fullPathWidth) {
  5152. glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;
  5153. }
  5154. if (charI > -1) {
  5155. offset += this.getLetterSpacingAt(charI);
  5156. }
  5157. var splineStep = this.textHeight / 20;
  5158. var segment = {
  5159. p0: this.getEquidistantPointOnPath(offset, splineStep),
  5160. p1: this.getEquidistantPointOnPath(offset + glyphWidth, splineStep)
  5161. };
  5162. offset += glyphWidth;
  5163. return {
  5164. offset: offset,
  5165. segment: segment
  5166. };
  5167. }
  5168. }, {
  5169. key: "measureText",
  5170. value: function measureText(ctx, text) {
  5171. var measuresCache = this.measuresCache;
  5172. var targetText = text || this.getText();
  5173. if (measuresCache.has(targetText)) {
  5174. return measuresCache.get(targetText);
  5175. }
  5176. var measure = this.measureTargetText(ctx, targetText);
  5177. measuresCache.set(targetText, measure);
  5178. return measure;
  5179. } // This method supposes what all custom fonts already loaded.
  5180. // If some font will be loaded after this method call, <textPath> will not be rendered correctly.
  5181. // You need to call this method manually to update glyphs cache.
  5182. }, {
  5183. key: "setTextData",
  5184. value: function setTextData(ctx) {
  5185. var _this2 = this;
  5186. if (this.glyphInfo) {
  5187. return;
  5188. }
  5189. var renderText = this.getText();
  5190. var chars = renderText.split('');
  5191. var spacesNumber = renderText.split(' ').length - 1;
  5192. var dx = toNumbers(this.parent.getAttribute('dx').getString('0'));
  5193. var anchor = this.parent.getStyle('text-anchor').getString('start');
  5194. var thisSpacing = this.getStyle('letter-spacing');
  5195. var parentSpacing = this.parent.getStyle('letter-spacing');
  5196. var letterSpacing = 0;
  5197. if (!thisSpacing.hasValue() || thisSpacing.getValue() === 'inherit') {
  5198. letterSpacing = parentSpacing.getPixels();
  5199. } else if (thisSpacing.hasValue()) {
  5200. if (thisSpacing.getValue() !== 'initial' && thisSpacing.getValue() !== 'unset') {
  5201. letterSpacing = thisSpacing.getPixels();
  5202. }
  5203. } // fill letter-spacing cache
  5204. var letterSpacingCache = [];
  5205. var textLen = renderText.length;
  5206. this.letterSpacingCache = letterSpacingCache;
  5207. for (var i = 0; i < textLen; i++) {
  5208. letterSpacingCache.push(typeof dx[i] !== 'undefined' ? dx[i] : letterSpacing);
  5209. }
  5210. var dxSum = letterSpacingCache.reduce(function (acc, cur) {
  5211. return acc + cur || 0;
  5212. }, 0);
  5213. this.textWidth = this.measureText(ctx);
  5214. this.textHeight = this.getFontSize();
  5215. var textFullWidth = Math.max(this.textWidth + dxSum, 0);
  5216. this.glyphInfo = [];
  5217. var fullPathWidth = this.getPathLength();
  5218. var startOffset = this.getStyle('startOffset').getNumber(0) * fullPathWidth;
  5219. var offset = 0;
  5220. if (anchor === 'middle' || anchor === 'center') {
  5221. offset = -textFullWidth / 2;
  5222. }
  5223. if (anchor === 'end' || anchor === 'right') {
  5224. offset = -textFullWidth;
  5225. }
  5226. offset += startOffset;
  5227. chars.forEach(function (char, i) {
  5228. // Find such segment what distance between p0 and p1 is approx. width of glyph
  5229. var _this2$findSegmentToF = _this2.findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, offset, char, i),
  5230. nextOffset = _this2$findSegmentToF.offset,
  5231. segment = _this2$findSegmentToF.segment;
  5232. offset = nextOffset;
  5233. if (!segment.p0 || !segment.p1) {
  5234. return;
  5235. }
  5236. var width = _this2.getLineLength(segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y); // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.
  5237. // Can foresee having a rough pair table built in that the developer can override as needed.
  5238. // Or use "dx" attribute of the <text> node as a naive replacement
  5239. var kern = 0; // placeholder for future implementation
  5240. var midpoint = _this2.getPointOnLine(kern + width / 2.0, segment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y);
  5241. var rotation = Math.atan2(segment.p1.y - segment.p0.y, segment.p1.x - segment.p0.x);
  5242. _this2.glyphInfo.push({
  5243. transposeX: midpoint.x,
  5244. transposeY: midpoint.y,
  5245. text: chars[i],
  5246. p0: segment.p0,
  5247. p1: segment.p1,
  5248. rotation: rotation
  5249. });
  5250. });
  5251. }
  5252. }, {
  5253. key: "parsePathData",
  5254. value: function parsePathData(path) {
  5255. this.pathLength = -1; // reset path length
  5256. if (!path) {
  5257. return [];
  5258. }
  5259. var pathCommands = [];
  5260. var pathParser = path.pathParser;
  5261. pathParser.reset(); // convert l, H, h, V, and v to L
  5262. while (!pathParser.isEnd()) {
  5263. var current = pathParser.current;
  5264. var startX = current ? current.x : 0;
  5265. var startY = current ? current.y : 0;
  5266. var cmd = '';
  5267. var points = [];
  5268. pathParser.nextCommand();
  5269. var upperCommand = pathParser.command.toUpperCase();
  5270. switch (pathParser.command) {
  5271. case 'M':
  5272. case 'm':
  5273. cmd = this.pathM(pathParser, points);
  5274. break;
  5275. case 'L':
  5276. case 'l':
  5277. cmd = this.pathL(pathParser, points);
  5278. break;
  5279. case 'H':
  5280. case 'h':
  5281. cmd = this.pathH(pathParser, points);
  5282. break;
  5283. case 'V':
  5284. case 'v':
  5285. cmd = this.pathV(pathParser, points);
  5286. break;
  5287. case 'C':
  5288. case 'c':
  5289. this.pathC(pathParser, points);
  5290. break;
  5291. case 'S':
  5292. case 's':
  5293. cmd = this.pathS(pathParser, points);
  5294. break;
  5295. case 'Q':
  5296. case 'q':
  5297. this.pathQ(pathParser, points);
  5298. break;
  5299. case 'T':
  5300. case 't':
  5301. cmd = this.pathT(pathParser, points);
  5302. break;
  5303. case 'A':
  5304. case 'a':
  5305. points = this.pathA(pathParser);
  5306. break;
  5307. case 'Z':
  5308. case 'z':
  5309. pathParser.current = pathParser.start;
  5310. break;
  5311. }
  5312. if (upperCommand !== 'Z') {
  5313. pathCommands.push({
  5314. command: cmd || upperCommand,
  5315. points: points,
  5316. start: {
  5317. x: startX,
  5318. y: startY
  5319. },
  5320. pathLength: this.calcLength(startX, startY, cmd || upperCommand, points)
  5321. });
  5322. } else {
  5323. pathCommands.push({
  5324. command: 'z',
  5325. points: [],
  5326. pathLength: 0
  5327. });
  5328. }
  5329. }
  5330. return pathCommands;
  5331. }
  5332. }, {
  5333. key: "pathM",
  5334. value: function pathM(pathParser, points) {
  5335. var p = pathParser.getAsCurrentPoint(); // pathParser.addMarker(p);
  5336. points.push(p.x, p.y);
  5337. pathParser.start = pathParser.current;
  5338. while (!pathParser.isCommandOrEnd()) {
  5339. var _p = pathParser.getAsCurrentPoint();
  5340. points.push(_p.x, _p.y);
  5341. return 'L';
  5342. }
  5343. }
  5344. }, {
  5345. key: "pathL",
  5346. value: function pathL(pathParser, points) {
  5347. while (!pathParser.isCommandOrEnd()) {
  5348. var p = pathParser.getAsCurrentPoint();
  5349. points.push(p.x, p.y);
  5350. }
  5351. return 'L';
  5352. }
  5353. }, {
  5354. key: "pathH",
  5355. value: function pathH(pathParser, points) {
  5356. while (!pathParser.isCommandOrEnd()) {
  5357. var current = pathParser.current;
  5358. var point = new Point((pathParser.isRelativeCommand() ? current.x : 0) + pathParser.getScalar(), current.y);
  5359. points.push(point.x, point.y);
  5360. pathParser.current = point;
  5361. }
  5362. return 'L';
  5363. }
  5364. }, {
  5365. key: "pathV",
  5366. value: function pathV(pathParser, points) {
  5367. while (!pathParser.isCommandOrEnd()) {
  5368. var current = pathParser.current;
  5369. var point = new Point(current.x, (pathParser.isRelativeCommand() ? current.y : 0) + pathParser.getScalar());
  5370. points.push(point.x, point.y);
  5371. pathParser.current = point;
  5372. }
  5373. return 'L';
  5374. }
  5375. }, {
  5376. key: "pathC",
  5377. value: function pathC(pathParser, points) {
  5378. while (!pathParser.isCommandOrEnd()) {
  5379. var point = pathParser.getPoint();
  5380. var controlPoint = pathParser.getAsControlPoint();
  5381. var currentPoint = pathParser.getAsCurrentPoint();
  5382. points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  5383. }
  5384. }
  5385. }, {
  5386. key: "pathS",
  5387. value: function pathS(pathParser, points) {
  5388. while (!pathParser.isCommandOrEnd()) {
  5389. var point = pathParser.getReflectedControlPoint();
  5390. var controlPoint = pathParser.getAsControlPoint();
  5391. var currentPoint = pathParser.getAsCurrentPoint();
  5392. points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  5393. }
  5394. return 'C';
  5395. }
  5396. }, {
  5397. key: "pathQ",
  5398. value: function pathQ(pathParser, points) {
  5399. while (!pathParser.isCommandOrEnd()) {
  5400. var controlPoint = pathParser.getAsControlPoint();
  5401. var currentPoint = pathParser.getAsCurrentPoint();
  5402. points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  5403. }
  5404. }
  5405. }, {
  5406. key: "pathT",
  5407. value: function pathT(pathParser, points) {
  5408. while (!pathParser.isCommandOrEnd()) {
  5409. var controlPoint = pathParser.getReflectedControlPoint();
  5410. pathParser.control = controlPoint;
  5411. var currentPoint = pathParser.getAsCurrentPoint();
  5412. points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);
  5413. }
  5414. return 'Q';
  5415. }
  5416. }, {
  5417. key: "pathA",
  5418. value: function pathA(pathParser) {
  5419. while (!pathParser.isCommandOrEnd()) {
  5420. var current = pathParser.current; // x1, y1
  5421. var rx = pathParser.getScalar();
  5422. var ry = pathParser.getScalar();
  5423. var xAxisRotation = pathParser.getScalar() * (Math.PI / 180.0); // φ
  5424. var largeArcFlag = pathParser.getScalar(); // fA
  5425. var sweepFlag = pathParser.getScalar(); // fS
  5426. var currentPoint = pathParser.getAsCurrentPoint(); // x2, y2
  5427. // Conversion from endpoint to center parameterization
  5428. // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
  5429. // x1', y1'
  5430. var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii
  5431. var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);
  5432. if (l > 1) {
  5433. rx *= Math.sqrt(l);
  5434. ry *= Math.sqrt(l);
  5435. } // cx', cy'
  5436. var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));
  5437. if (isNaN(s)) {
  5438. s = 0;
  5439. }
  5440. var cpp = new Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy
  5441. var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle
  5442. var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // θ1
  5443. // angle delta
  5444. var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry];
  5445. var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry];
  5446. var ad = vectorsAngle(u, v); // Δθ
  5447. if (vectorsRatio(u, v) <= -1) {
  5448. ad = Math.PI;
  5449. }
  5450. if (vectorsRatio(u, v) >= 1) {
  5451. ad = 0;
  5452. }
  5453. if (sweepFlag === 0 && ad > 0) {
  5454. ad = ad - 2 * Math.PI;
  5455. }
  5456. if (sweepFlag === 1 && ad < 0) {
  5457. ad = ad + 2 * Math.PI;
  5458. }
  5459. return [centp.x, centp.y, rx, ry, a1, ad, xAxisRotation, sweepFlag];
  5460. }
  5461. }
  5462. }, {
  5463. key: "calcLength",
  5464. value: function calcLength(x, y, cmd, points) {
  5465. var len = 0;
  5466. var p1 = null;
  5467. var p2 = null;
  5468. var t = 0;
  5469. switch (cmd) {
  5470. case 'L':
  5471. return this.getLineLength(x, y, points[0], points[1]);
  5472. case 'C':
  5473. // Approximates by breaking curve into 100 line segments
  5474. len = 0.0;
  5475. p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
  5476. for (t = 0.01; t <= 1; t += 0.01) {
  5477. p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
  5478. len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
  5479. p1 = p2;
  5480. }
  5481. return len;
  5482. case 'Q':
  5483. // Approximates by breaking curve into 100 line segments
  5484. len = 0.0;
  5485. p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);
  5486. for (t = 0.01; t <= 1; t += 0.01) {
  5487. p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);
  5488. len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
  5489. p1 = p2;
  5490. }
  5491. return len;
  5492. case 'A':
  5493. // Approximates by breaking curve into line segments
  5494. len = 0.0;
  5495. var start = points[4]; // 4 = theta
  5496. var dTheta = points[5]; // 5 = dTheta
  5497. var end = points[4] + dTheta;
  5498. var inc = Math.PI / 180.0; // 1 degree resolution
  5499. if (Math.abs(start - end) < inc) {
  5500. inc = Math.abs(start - end);
  5501. } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi
  5502. p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);
  5503. if (dTheta < 0) {
  5504. // clockwise
  5505. for (t = start - inc; t > end; t -= inc) {
  5506. p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
  5507. len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
  5508. p1 = p2;
  5509. }
  5510. } else {
  5511. // counter-clockwise
  5512. for (t = start + inc; t < end; t += inc) {
  5513. p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
  5514. len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
  5515. p1 = p2;
  5516. }
  5517. }
  5518. p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);
  5519. len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
  5520. return len;
  5521. }
  5522. return 0;
  5523. }
  5524. }, {
  5525. key: "getPointOnLine",
  5526. value: function getPointOnLine(dist, P1x, P1y, P2x, P2y) {
  5527. var fromX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : P1x;
  5528. var fromY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : P1y;
  5529. var m = (P2y - P1y) / (P2x - P1x + PSEUDO_ZERO);
  5530. var run = Math.sqrt(dist * dist / (1 + m * m));
  5531. if (P2x < P1x) {
  5532. run *= -1;
  5533. }
  5534. var rise = m * run;
  5535. var pt = null;
  5536. if (P2x === P1x) {
  5537. // vertical line
  5538. pt = {
  5539. x: fromX,
  5540. y: fromY + rise
  5541. };
  5542. } else if ((fromY - P1y) / (fromX - P1x + PSEUDO_ZERO) === m) {
  5543. pt = {
  5544. x: fromX + run,
  5545. y: fromY + rise
  5546. };
  5547. } else {
  5548. var ix = 0;
  5549. var iy = 0;
  5550. var len = this.getLineLength(P1x, P1y, P2x, P2y);
  5551. if (len < PSEUDO_ZERO) {
  5552. return null;
  5553. }
  5554. var u = (fromX - P1x) * (P2x - P1x) + (fromY - P1y) * (P2y - P1y);
  5555. u = u / (len * len);
  5556. ix = P1x + u * (P2x - P1x);
  5557. iy = P1y + u * (P2y - P1y);
  5558. var pRise = this.getLineLength(fromX, fromY, ix, iy);
  5559. var pRun = Math.sqrt(dist * dist - pRise * pRise);
  5560. run = Math.sqrt(pRun * pRun / (1 + m * m));
  5561. if (P2x < P1x) {
  5562. run *= -1;
  5563. }
  5564. rise = m * run;
  5565. pt = {
  5566. x: ix + run,
  5567. y: iy + rise
  5568. };
  5569. }
  5570. return pt;
  5571. }
  5572. }, {
  5573. key: "getPointOnPath",
  5574. value: function getPointOnPath(distance) {
  5575. var fullLen = this.getPathLength();
  5576. var cumulativePathLength = 0;
  5577. var p = null;
  5578. if (distance < -0.00005 || distance - 0.00005 > fullLen) {
  5579. return null;
  5580. }
  5581. var dataArray = this.dataArray;
  5582. var _iterator = _createForOfIteratorHelper$1(dataArray),
  5583. _step;
  5584. try {
  5585. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5586. var pathCmd = _step.value;
  5587. if (pathCmd && (pathCmd.pathLength < 0.00005 || cumulativePathLength + pathCmd.pathLength + 0.00005 < distance)) {
  5588. cumulativePathLength += pathCmd.pathLength;
  5589. continue;
  5590. }
  5591. var delta = distance - cumulativePathLength;
  5592. var currentT = 0;
  5593. switch (pathCmd.command) {
  5594. case 'L':
  5595. p = this.getPointOnLine(delta, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.start.x, pathCmd.start.y);
  5596. break;
  5597. case 'A':
  5598. var start = pathCmd.points[4]; // 4 = theta
  5599. var dTheta = pathCmd.points[5]; // 5 = dTheta
  5600. var end = pathCmd.points[4] + dTheta;
  5601. currentT = start + delta / pathCmd.pathLength * dTheta;
  5602. if (dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) {
  5603. break;
  5604. }
  5605. p = this.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]);
  5606. break;
  5607. case 'C':
  5608. currentT = delta / pathCmd.pathLength;
  5609. if (currentT > 1) {
  5610. currentT = 1;
  5611. }
  5612. p = this.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]);
  5613. break;
  5614. case 'Q':
  5615. currentT = delta / pathCmd.pathLength;
  5616. if (currentT > 1) {
  5617. currentT = 1;
  5618. }
  5619. p = this.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]);
  5620. break;
  5621. default:
  5622. }
  5623. if (p) {
  5624. return p;
  5625. }
  5626. break;
  5627. }
  5628. } catch (err) {
  5629. _iterator.e(err);
  5630. } finally {
  5631. _iterator.f();
  5632. }
  5633. return null;
  5634. }
  5635. }, {
  5636. key: "getLineLength",
  5637. value: function getLineLength(x1, y1, x2, y2) {
  5638. return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
  5639. }
  5640. }, {
  5641. key: "getPathLength",
  5642. value: function getPathLength() {
  5643. if (this.pathLength === -1) {
  5644. this.pathLength = this.dataArray.reduce(function (length, command) {
  5645. return command.pathLength > 0 ? length + command.pathLength : length;
  5646. }, 0);
  5647. }
  5648. return this.pathLength;
  5649. }
  5650. }, {
  5651. key: "getPointOnCubicBezier",
  5652. value: function getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {
  5653. var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);
  5654. var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);
  5655. return {
  5656. x: x,
  5657. y: y
  5658. };
  5659. }
  5660. }, {
  5661. key: "getPointOnQuadraticBezier",
  5662. value: function getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {
  5663. var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);
  5664. var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);
  5665. return {
  5666. x: x,
  5667. y: y
  5668. };
  5669. }
  5670. }, {
  5671. key: "getPointOnEllipticalArc",
  5672. value: function getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {
  5673. var cosPsi = Math.cos(psi);
  5674. var sinPsi = Math.sin(psi);
  5675. var pt = {
  5676. x: rx * Math.cos(theta),
  5677. y: ry * Math.sin(theta)
  5678. };
  5679. return {
  5680. x: cx + (pt.x * cosPsi - pt.y * sinPsi),
  5681. y: cy + (pt.x * sinPsi + pt.y * cosPsi)
  5682. };
  5683. } // TODO need some optimisations. possibly build cache only for curved segments?
  5684. }, {
  5685. key: "buildEquidistantCache",
  5686. value: function buildEquidistantCache(inputStep, inputPrecision) {
  5687. var fullLen = this.getPathLength();
  5688. var precision = inputPrecision || 0.25; // accuracy vs performance
  5689. var step = inputStep || fullLen / 100;
  5690. if (!this.equidistantCache || this.equidistantCache.step !== step || this.equidistantCache.precision !== precision) {
  5691. // Prepare cache
  5692. this.equidistantCache = {
  5693. step: step,
  5694. precision: precision,
  5695. points: []
  5696. }; // Calculate points
  5697. var s = 0;
  5698. for (var l = 0; l <= fullLen; l += precision) {
  5699. var p0 = this.getPointOnPath(l);
  5700. var p1 = this.getPointOnPath(l + precision);
  5701. if (!p0 || !p1) {
  5702. continue;
  5703. }
  5704. s += this.getLineLength(p0.x, p0.y, p1.x, p1.y);
  5705. if (s >= step) {
  5706. this.equidistantCache.points.push({
  5707. x: p0.x,
  5708. y: p0.y,
  5709. distance: l
  5710. });
  5711. s -= step;
  5712. }
  5713. }
  5714. }
  5715. }
  5716. }, {
  5717. key: "getEquidistantPointOnPath",
  5718. value: function getEquidistantPointOnPath(targetDistance, step, precision) {
  5719. this.buildEquidistantCache(step, precision);
  5720. if (targetDistance < 0 || targetDistance - this.getPathLength() > 0.00005) {
  5721. return null;
  5722. }
  5723. var idx = Math.round(targetDistance / this.getPathLength() * (this.equidistantCache.points.length - 1));
  5724. return this.equidistantCache.points[idx] || null;
  5725. }
  5726. }]);
  5727. return TextPathElement;
  5728. }(TextElement);
  5729. function _createSuper$y(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$y()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  5730. function _isNativeReflectConstruct$y() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  5731. var ImageElement = /*#__PURE__*/function (_RenderedElement) {
  5732. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(ImageElement, _RenderedElement);
  5733. var _super = _createSuper$y(ImageElement);
  5734. function ImageElement(document, node, captureTextNodes) {
  5735. var _this;
  5736. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, ImageElement);
  5737. _this = _super.call(this, document, node, captureTextNodes);
  5738. _this.type = 'image';
  5739. _this.loaded = false;
  5740. var href = _this.getHrefAttribute().getString();
  5741. if (!href) {
  5742. return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(_this);
  5743. }
  5744. var isSvg = /\.svg$/.test(href);
  5745. document.images.push((0,_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_46__.default)(_this));
  5746. if (!isSvg) {
  5747. _this.loadImage(href);
  5748. } else {
  5749. _this.loadSvg(href);
  5750. }
  5751. _this.isSvg = isSvg;
  5752. return _this;
  5753. }
  5754. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(ImageElement, [{
  5755. key: "loadImage",
  5756. value: function () {
  5757. var _loadImage = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee(href) {
  5758. var image;
  5759. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  5760. while (1) {
  5761. switch (_context.prev = _context.next) {
  5762. case 0:
  5763. _context.prev = 0;
  5764. _context.next = 3;
  5765. return this.document.createImage(href);
  5766. case 3:
  5767. image = _context.sent;
  5768. this.image = image;
  5769. _context.next = 10;
  5770. break;
  5771. case 7:
  5772. _context.prev = 7;
  5773. _context.t0 = _context["catch"](0);
  5774. // tslint:disable-next-line: no-console
  5775. console.error("Error while loading image \"".concat(href, "\":"), _context.t0);
  5776. case 10:
  5777. this.loaded = true;
  5778. case 11:
  5779. case "end":
  5780. return _context.stop();
  5781. }
  5782. }
  5783. }, _callee, this, [[0, 7]]);
  5784. }));
  5785. function loadImage(_x) {
  5786. return _loadImage.apply(this, arguments);
  5787. }
  5788. return loadImage;
  5789. }()
  5790. }, {
  5791. key: "loadSvg",
  5792. value: function () {
  5793. var _loadSvg = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee2(href) {
  5794. var response, svg;
  5795. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee2$(_context2) {
  5796. while (1) {
  5797. switch (_context2.prev = _context2.next) {
  5798. case 0:
  5799. _context2.prev = 0;
  5800. _context2.next = 3;
  5801. return this.document.fetch(href);
  5802. case 3:
  5803. response = _context2.sent;
  5804. _context2.next = 6;
  5805. return response.text();
  5806. case 6:
  5807. svg = _context2.sent;
  5808. this.image = svg;
  5809. _context2.next = 13;
  5810. break;
  5811. case 10:
  5812. _context2.prev = 10;
  5813. _context2.t0 = _context2["catch"](0);
  5814. // tslint:disable-next-line: no-console
  5815. console.error("Error while loading image \"".concat(href, "\":"), _context2.t0);
  5816. case 13:
  5817. this.loaded = true;
  5818. case 14:
  5819. case "end":
  5820. return _context2.stop();
  5821. }
  5822. }
  5823. }, _callee2, this, [[0, 10]]);
  5824. }));
  5825. function loadSvg(_x2) {
  5826. return _loadSvg.apply(this, arguments);
  5827. }
  5828. return loadSvg;
  5829. }()
  5830. }, {
  5831. key: "renderChildren",
  5832. value: function renderChildren(ctx) {
  5833. var document = this.document,
  5834. image = this.image,
  5835. loaded = this.loaded;
  5836. var x = this.getAttribute('x').getPixels('x');
  5837. var y = this.getAttribute('y').getPixels('y');
  5838. var width = this.getStyle('width').getPixels('x');
  5839. var height = this.getStyle('height').getPixels('y');
  5840. if (!loaded || !image || !width || !height) {
  5841. return;
  5842. }
  5843. ctx.save();
  5844. if (this.isSvg) {
  5845. document.canvg.forkString(ctx, this.image, {
  5846. ignoreMouse: true,
  5847. ignoreAnimation: true,
  5848. ignoreDimensions: true,
  5849. ignoreClear: true,
  5850. offsetX: x,
  5851. offsetY: y,
  5852. scaleWidth: width,
  5853. scaleHeight: height
  5854. }).render();
  5855. } else {
  5856. var _image = this.image;
  5857. ctx.translate(x, y);
  5858. document.setViewBox({
  5859. ctx: ctx,
  5860. aspectRatio: this.getAttribute('preserveAspectRatio').getString(),
  5861. width: width,
  5862. desiredWidth: _image.width,
  5863. height: height,
  5864. desiredHeight: _image.height
  5865. });
  5866. if (this.loaded) {
  5867. if (typeof _image.complete === 'undefined' || _image.complete) {
  5868. ctx.drawImage(_image, 0, 0);
  5869. }
  5870. }
  5871. }
  5872. ctx.restore();
  5873. }
  5874. }, {
  5875. key: "getBoundingBox",
  5876. value: function getBoundingBox() {
  5877. var x = this.getAttribute('x').getPixels('x');
  5878. var y = this.getAttribute('y').getPixels('y');
  5879. var width = this.getStyle('width').getPixels('x');
  5880. var height = this.getStyle('height').getPixels('y');
  5881. return new BoundingBox(x, y, x + width, y + height);
  5882. }
  5883. }]);
  5884. return ImageElement;
  5885. }(RenderedElement);
  5886. function _createSuper$z(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$z()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  5887. function _isNativeReflectConstruct$z() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  5888. var SymbolElement = /*#__PURE__*/function (_RenderedElement) {
  5889. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(SymbolElement, _RenderedElement);
  5890. var _super = _createSuper$z(SymbolElement);
  5891. function SymbolElement() {
  5892. var _this;
  5893. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, SymbolElement);
  5894. _this = _super.apply(this, arguments);
  5895. _this.type = 'symbol';
  5896. return _this;
  5897. }
  5898. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(SymbolElement, [{
  5899. key: "render",
  5900. value: function render(_) {// NO RENDER
  5901. }
  5902. }]);
  5903. return SymbolElement;
  5904. }(RenderedElement);
  5905. var SVGFontLoader = /*#__PURE__*/function () {
  5906. function SVGFontLoader(document) {
  5907. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, SVGFontLoader);
  5908. this.document = document;
  5909. this.loaded = false;
  5910. document.fonts.push(this);
  5911. }
  5912. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(SVGFontLoader, [{
  5913. key: "load",
  5914. value: function () {
  5915. var _load = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee(fontFamily, url) {
  5916. var document, svgDocument, fonts;
  5917. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  5918. while (1) {
  5919. switch (_context.prev = _context.next) {
  5920. case 0:
  5921. _context.prev = 0;
  5922. document = this.document;
  5923. _context.next = 4;
  5924. return document.canvg.parser.load(url);
  5925. case 4:
  5926. svgDocument = _context.sent;
  5927. fonts = svgDocument.getElementsByTagName('font');
  5928. Array.from(fonts).forEach(function (fontNode) {
  5929. var font = document.createElement(fontNode);
  5930. document.definitions[fontFamily] = font;
  5931. });
  5932. _context.next = 12;
  5933. break;
  5934. case 9:
  5935. _context.prev = 9;
  5936. _context.t0 = _context["catch"](0);
  5937. // tslint:disable-next-line: no-console
  5938. console.error("Error while loading font \"".concat(url, "\":"), _context.t0);
  5939. case 12:
  5940. this.loaded = true;
  5941. case 13:
  5942. case "end":
  5943. return _context.stop();
  5944. }
  5945. }
  5946. }, _callee, this, [[0, 9]]);
  5947. }));
  5948. function load(_x, _x2) {
  5949. return _load.apply(this, arguments);
  5950. }
  5951. return load;
  5952. }()
  5953. }]);
  5954. return SVGFontLoader;
  5955. }();
  5956. function _createSuper$A(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$A()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  5957. function _isNativeReflectConstruct$A() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  5958. var StyleElement = /*#__PURE__*/function (_Element) {
  5959. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(StyleElement, _Element);
  5960. var _super = _createSuper$A(StyleElement);
  5961. function StyleElement(document, node, captureTextNodes) {
  5962. var _this;
  5963. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, StyleElement);
  5964. _this = _super.call(this, document, node, captureTextNodes);
  5965. _this.type = 'style';
  5966. var css = compressSpaces(Array.from(node.childNodes).map(function (_) {
  5967. return _.data;
  5968. }).join('').replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, '') // remove comments
  5969. .replace(/@import.*;/g, '') // remove imports
  5970. );
  5971. var cssDefs = css.split('}');
  5972. cssDefs.forEach(function (_) {
  5973. var def = _.trim();
  5974. if (!def) {
  5975. return;
  5976. }
  5977. var cssParts = def.split('{');
  5978. var cssClasses = cssParts[0].split(',');
  5979. var cssProps = cssParts[1].split(';');
  5980. cssClasses.forEach(function (_) {
  5981. var cssClass = _.trim();
  5982. if (!cssClass) {
  5983. return;
  5984. }
  5985. var props = document.styles[cssClass] || {};
  5986. cssProps.forEach(function (cssProp) {
  5987. var prop = cssProp.indexOf(':');
  5988. var name = cssProp.substr(0, prop).trim();
  5989. var value = cssProp.substr(prop + 1, cssProp.length - prop).trim();
  5990. if (name && value) {
  5991. props[name] = new Property(document, name, value);
  5992. }
  5993. });
  5994. document.styles[cssClass] = props;
  5995. document.stylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);
  5996. if (cssClass === '@font-face') {
  5997. // && !nodeEnv
  5998. var fontFamily = props['font-family'].getString().replace(/"|'/g, '');
  5999. var srcs = props.src.getString().split(',');
  6000. srcs.forEach(function (src) {
  6001. if (src.indexOf('format("svg")') > 0) {
  6002. var url = parseExternalUrl(src);
  6003. if (url) {
  6004. new SVGFontLoader(document).load(fontFamily, url);
  6005. }
  6006. }
  6007. });
  6008. }
  6009. });
  6010. });
  6011. return _this;
  6012. }
  6013. return StyleElement;
  6014. }(Element);
  6015. StyleElement.parseExternalUrl = parseExternalUrl;
  6016. function _createSuper$B(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$B()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6017. function _isNativeReflectConstruct$B() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6018. var UseElement = /*#__PURE__*/function (_RenderedElement) {
  6019. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(UseElement, _RenderedElement);
  6020. var _super = _createSuper$B(UseElement);
  6021. function UseElement() {
  6022. var _this;
  6023. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, UseElement);
  6024. _this = _super.apply(this, arguments);
  6025. _this.type = 'use';
  6026. return _this;
  6027. }
  6028. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(UseElement, [{
  6029. key: "setContext",
  6030. value: function setContext(ctx) {
  6031. (0,_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_42__.default)((0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(UseElement.prototype), "setContext", this).call(this, ctx);
  6032. var xAttr = this.getAttribute('x');
  6033. var yAttr = this.getAttribute('y');
  6034. if (xAttr.hasValue()) {
  6035. ctx.translate(xAttr.getPixels('x'), 0);
  6036. }
  6037. if (yAttr.hasValue()) {
  6038. ctx.translate(0, yAttr.getPixels('y'));
  6039. }
  6040. }
  6041. }, {
  6042. key: "path",
  6043. value: function path(ctx) {
  6044. var element = this.element;
  6045. if (element) {
  6046. element.path(ctx);
  6047. }
  6048. }
  6049. }, {
  6050. key: "renderChildren",
  6051. value: function renderChildren(ctx) {
  6052. var document = this.document,
  6053. element = this.element;
  6054. if (element) {
  6055. var tempSvg = element;
  6056. if (element.type === 'symbol') {
  6057. // render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)
  6058. tempSvg = new SVGElement(document, null);
  6059. tempSvg.attributes.viewBox = new Property(document, 'viewBox', element.getAttribute('viewBox').getString());
  6060. tempSvg.attributes.preserveAspectRatio = new Property(document, 'preserveAspectRatio', element.getAttribute('preserveAspectRatio').getString());
  6061. tempSvg.attributes.overflow = new Property(document, 'overflow', element.getAttribute('overflow').getString());
  6062. tempSvg.children = element.children;
  6063. }
  6064. if (tempSvg.type === 'svg') {
  6065. var widthStyle = this.getStyle('width', false, true);
  6066. var heightStyle = this.getStyle('height', false, true); // if symbol or svg, inherit width/height from me
  6067. if (widthStyle.hasValue()) {
  6068. tempSvg.attributes.width = new Property(document, 'width', widthStyle.getString());
  6069. }
  6070. if (heightStyle.hasValue()) {
  6071. tempSvg.attributes.height = new Property(document, 'height', heightStyle.getString());
  6072. }
  6073. }
  6074. var oldParent = tempSvg.parent;
  6075. tempSvg.parent = this;
  6076. tempSvg.render(ctx);
  6077. tempSvg.parent = oldParent;
  6078. }
  6079. }
  6080. }, {
  6081. key: "getBoundingBox",
  6082. value: function getBoundingBox(ctx) {
  6083. var element = this.element;
  6084. if (element) {
  6085. return element.getBoundingBox(ctx);
  6086. }
  6087. return null;
  6088. }
  6089. }, {
  6090. key: "elementTransform",
  6091. value: function elementTransform() {
  6092. var document = this.document,
  6093. element = this.element;
  6094. return Transform.fromElement(document, element);
  6095. }
  6096. }, {
  6097. key: "element",
  6098. get: function get() {
  6099. if (!this._element) {
  6100. this._element = this.getHrefAttribute().getDefinition();
  6101. }
  6102. return this._element;
  6103. }
  6104. }]);
  6105. return UseElement;
  6106. }(RenderedElement);
  6107. function _createSuper$C(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$C()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6108. function _isNativeReflectConstruct$C() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6109. function imGet(img, x, y, width, _, rgba) {
  6110. return img[y * width * 4 + x * 4 + rgba];
  6111. }
  6112. function imSet(img, x, y, width, _, rgba, val) {
  6113. img[y * width * 4 + x * 4 + rgba] = val;
  6114. }
  6115. function m(matrix, i, v) {
  6116. var mi = matrix[i];
  6117. return mi * (mi < 0 ? v - 255 : v);
  6118. }
  6119. function c(a, m1, m2, m3) {
  6120. return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;
  6121. }
  6122. var FeColorMatrixElement = /*#__PURE__*/function (_Element) {
  6123. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FeColorMatrixElement, _Element);
  6124. var _super = _createSuper$C(FeColorMatrixElement);
  6125. function FeColorMatrixElement(document, node, captureTextNodes) {
  6126. var _this;
  6127. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FeColorMatrixElement);
  6128. _this = _super.call(this, document, node, captureTextNodes);
  6129. _this.type = 'feColorMatrix';
  6130. var matrix = toNumbers(_this.getAttribute('values').getString());
  6131. switch (_this.getAttribute('type').getString('matrix')) {
  6132. // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement
  6133. case 'saturate':
  6134. {
  6135. var s = matrix[0];
  6136. matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];
  6137. break;
  6138. }
  6139. case 'hueRotate':
  6140. {
  6141. var a = matrix[0] * Math.PI / 180.0;
  6142. matrix = [c(a, 0.213, 0.787, -0.213), c(a, 0.715, -0.715, -0.715), c(a, 0.072, -0.072, 0.928), 0, 0, c(a, 0.213, -0.213, 0.143), c(a, 0.715, 0.285, 0.140), c(a, 0.072, -0.072, -0.283), 0, 0, c(a, 0.213, -0.213, -0.787), c(a, 0.715, -0.715, 0.715), c(a, 0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];
  6143. break;
  6144. }
  6145. case 'luminanceToAlpha':
  6146. matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1];
  6147. break;
  6148. }
  6149. _this.matrix = matrix;
  6150. _this.includeOpacity = _this.getAttribute('includeOpacity').hasValue();
  6151. return _this;
  6152. }
  6153. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FeColorMatrixElement, [{
  6154. key: "apply",
  6155. value: function apply(ctx, _, __, width, height) {
  6156. // assuming x==0 && y==0 for now
  6157. var includeOpacity = this.includeOpacity,
  6158. matrix = this.matrix;
  6159. var srcData = ctx.getImageData(0, 0, width, height);
  6160. for (var y = 0; y < height; y++) {
  6161. for (var x = 0; x < width; x++) {
  6162. var r = imGet(srcData.data, x, y, width, height, 0);
  6163. var g = imGet(srcData.data, x, y, width, height, 1);
  6164. var b = imGet(srcData.data, x, y, width, height, 2);
  6165. var a = imGet(srcData.data, x, y, width, height, 3);
  6166. var nr = m(matrix, 0, r) + m(matrix, 1, g) + m(matrix, 2, b) + m(matrix, 3, a) + m(matrix, 4, 1);
  6167. var ng = m(matrix, 5, r) + m(matrix, 6, g) + m(matrix, 7, b) + m(matrix, 8, a) + m(matrix, 9, 1);
  6168. var nb = m(matrix, 10, r) + m(matrix, 11, g) + m(matrix, 12, b) + m(matrix, 13, a) + m(matrix, 14, 1);
  6169. var na = m(matrix, 15, r) + m(matrix, 16, g) + m(matrix, 17, b) + m(matrix, 18, a) + m(matrix, 19, 1);
  6170. if (includeOpacity) {
  6171. nr = ng = nb = 0;
  6172. na *= a / 255;
  6173. }
  6174. imSet(srcData.data, x, y, width, height, 0, nr);
  6175. imSet(srcData.data, x, y, width, height, 1, ng);
  6176. imSet(srcData.data, x, y, width, height, 2, nb);
  6177. imSet(srcData.data, x, y, width, height, 3, na);
  6178. }
  6179. }
  6180. ctx.clearRect(0, 0, width, height);
  6181. ctx.putImageData(srcData, 0, 0);
  6182. }
  6183. }]);
  6184. return FeColorMatrixElement;
  6185. }(Element);
  6186. function _createSuper$D(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$D()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6187. function _isNativeReflectConstruct$D() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6188. var MaskElement = /*#__PURE__*/function (_Element) {
  6189. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(MaskElement, _Element);
  6190. var _super = _createSuper$D(MaskElement);
  6191. function MaskElement() {
  6192. var _this;
  6193. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, MaskElement);
  6194. _this = _super.apply(this, arguments);
  6195. _this.type = 'mask';
  6196. return _this;
  6197. }
  6198. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(MaskElement, [{
  6199. key: "apply",
  6200. value: function apply(ctx, element) {
  6201. var document = this.document; // render as temp svg
  6202. var x = this.getAttribute('x').getPixels('x');
  6203. var y = this.getAttribute('y').getPixels('y');
  6204. var width = this.getStyle('width').getPixels('x');
  6205. var height = this.getStyle('height').getPixels('y');
  6206. if (!width && !height) {
  6207. var boundingBox = new BoundingBox();
  6208. this.children.forEach(function (child) {
  6209. boundingBox.addBoundingBox(child.getBoundingBox(ctx));
  6210. });
  6211. x = Math.floor(boundingBox.x1);
  6212. y = Math.floor(boundingBox.y1);
  6213. width = Math.floor(boundingBox.width);
  6214. height = Math.floor(boundingBox.height);
  6215. }
  6216. var ignoredStyles = this.removeStyles(element, MaskElement.ignoreStyles);
  6217. var maskCanvas = document.createCanvas(x + width, y + height);
  6218. var maskCtx = maskCanvas.getContext('2d');
  6219. document.screen.setDefaults(maskCtx);
  6220. this.renderChildren(maskCtx); // convert mask to alpha with a fake node
  6221. // TODO: refactor out apply from feColorMatrix
  6222. new FeColorMatrixElement(document, {
  6223. nodeType: 1,
  6224. childNodes: [],
  6225. attributes: [{
  6226. nodeName: 'type',
  6227. value: 'luminanceToAlpha'
  6228. }, {
  6229. nodeName: 'includeOpacity',
  6230. value: 'true'
  6231. }]
  6232. }).apply(maskCtx, 0, 0, x + width, y + height);
  6233. var tmpCanvas = document.createCanvas(x + width, y + height);
  6234. var tmpCtx = tmpCanvas.getContext('2d');
  6235. document.screen.setDefaults(tmpCtx);
  6236. element.render(tmpCtx);
  6237. tmpCtx.globalCompositeOperation = 'destination-in';
  6238. tmpCtx.fillStyle = maskCtx.createPattern(maskCanvas, 'no-repeat');
  6239. tmpCtx.fillRect(0, 0, x + width, y + height);
  6240. ctx.fillStyle = tmpCtx.createPattern(tmpCanvas, 'no-repeat');
  6241. ctx.fillRect(0, 0, x + width, y + height); // reassign mask
  6242. this.restoreStyles(element, ignoredStyles);
  6243. }
  6244. }, {
  6245. key: "render",
  6246. value: function render(_) {// NO RENDER
  6247. }
  6248. }]);
  6249. return MaskElement;
  6250. }(Element);
  6251. MaskElement.ignoreStyles = ['mask', 'transform', 'clip-path'];
  6252. function _createSuper$E(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$E()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6253. function _isNativeReflectConstruct$E() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6254. var noop = function noop() {};
  6255. var ClipPathElement = /*#__PURE__*/function (_Element) {
  6256. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(ClipPathElement, _Element);
  6257. var _super = _createSuper$E(ClipPathElement);
  6258. function ClipPathElement() {
  6259. var _this;
  6260. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, ClipPathElement);
  6261. _this = _super.apply(this, arguments);
  6262. _this.type = 'clipPath';
  6263. return _this;
  6264. }
  6265. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(ClipPathElement, [{
  6266. key: "apply",
  6267. value: function apply(ctx) {
  6268. var document = this.document;
  6269. var contextProto = Reflect.getPrototypeOf(ctx);
  6270. var beginPath = ctx.beginPath,
  6271. closePath = ctx.closePath;
  6272. if (contextProto) {
  6273. contextProto.beginPath = noop;
  6274. contextProto.closePath = noop;
  6275. }
  6276. Reflect.apply(beginPath, ctx, []);
  6277. this.children.forEach(function (child) {
  6278. if (typeof child.path === 'undefined') {
  6279. return;
  6280. }
  6281. var transform = typeof child.elementTransform !== 'undefined' ? child.elementTransform() : null; // handle <use />
  6282. if (!transform) {
  6283. transform = Transform.fromElement(document, child);
  6284. }
  6285. if (transform) {
  6286. transform.apply(ctx);
  6287. }
  6288. child.path(ctx);
  6289. if (contextProto) {
  6290. contextProto.closePath = closePath;
  6291. }
  6292. if (transform) {
  6293. transform.unapply(ctx);
  6294. }
  6295. });
  6296. Reflect.apply(closePath, ctx, []);
  6297. ctx.clip();
  6298. if (contextProto) {
  6299. contextProto.beginPath = beginPath;
  6300. contextProto.closePath = closePath;
  6301. }
  6302. }
  6303. }, {
  6304. key: "render",
  6305. value: function render(_) {// NO RENDER
  6306. }
  6307. }]);
  6308. return ClipPathElement;
  6309. }(Element);
  6310. function _createSuper$F(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$F()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6311. function _isNativeReflectConstruct$F() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6312. var FilterElement = /*#__PURE__*/function (_Element) {
  6313. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FilterElement, _Element);
  6314. var _super = _createSuper$F(FilterElement);
  6315. function FilterElement() {
  6316. var _this;
  6317. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FilterElement);
  6318. _this = _super.apply(this, arguments);
  6319. _this.type = 'filter';
  6320. return _this;
  6321. }
  6322. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FilterElement, [{
  6323. key: "apply",
  6324. value: function apply(ctx, element) {
  6325. // render as temp svg
  6326. var document = this.document,
  6327. children = this.children;
  6328. var boundingBox = element.getBoundingBox(ctx);
  6329. if (!boundingBox) {
  6330. return;
  6331. }
  6332. var px = 0;
  6333. var py = 0;
  6334. children.forEach(function (child) {
  6335. var efd = child.extraFilterDistance || 0;
  6336. px = Math.max(px, efd);
  6337. py = Math.max(py, efd);
  6338. });
  6339. var width = Math.floor(boundingBox.width);
  6340. var height = Math.floor(boundingBox.height);
  6341. var tmpCanvasWidth = width + 2 * px;
  6342. var tmpCanvasHeight = height + 2 * py;
  6343. if (tmpCanvasWidth < 1 || tmpCanvasHeight < 1) {
  6344. return;
  6345. }
  6346. var x = Math.floor(boundingBox.x);
  6347. var y = Math.floor(boundingBox.y);
  6348. var ignoredStyles = this.removeStyles(element, FilterElement.ignoreStyles);
  6349. var tmpCanvas = document.createCanvas(tmpCanvasWidth, tmpCanvasHeight);
  6350. var tmpCtx = tmpCanvas.getContext('2d');
  6351. document.screen.setDefaults(tmpCtx);
  6352. tmpCtx.translate(-x + px, -y + py);
  6353. element.render(tmpCtx); // apply filters
  6354. children.forEach(function (child) {
  6355. if (typeof child.apply === 'function') {
  6356. child.apply(tmpCtx, 0, 0, tmpCanvasWidth, tmpCanvasHeight);
  6357. }
  6358. }); // render on me
  6359. ctx.drawImage(tmpCanvas, 0, 0, tmpCanvasWidth, tmpCanvasHeight, x - px, y - py, tmpCanvasWidth, tmpCanvasHeight);
  6360. this.restoreStyles(element, ignoredStyles);
  6361. }
  6362. }, {
  6363. key: "render",
  6364. value: function render(_) {// NO RENDER
  6365. }
  6366. }]);
  6367. return FilterElement;
  6368. }(Element);
  6369. FilterElement.ignoreStyles = ['filter', 'transform', 'clip-path'];
  6370. function _createSuper$G(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$G()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6371. function _isNativeReflectConstruct$G() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6372. var FeDropShadowElement = /*#__PURE__*/function (_Element) {
  6373. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FeDropShadowElement, _Element);
  6374. var _super = _createSuper$G(FeDropShadowElement);
  6375. function FeDropShadowElement(document, node, captureTextNodes) {
  6376. var _this;
  6377. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FeDropShadowElement);
  6378. _this = _super.call(this, document, node, captureTextNodes);
  6379. _this.type = 'feDropShadow';
  6380. _this.addStylesFromStyleDefinition();
  6381. return _this;
  6382. }
  6383. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FeDropShadowElement, [{
  6384. key: "apply",
  6385. value: function apply(_, __, ___, ____, _____) {// TODO: implement
  6386. }
  6387. }]);
  6388. return FeDropShadowElement;
  6389. }(Element);
  6390. function _createSuper$H(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$H()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6391. function _isNativeReflectConstruct$H() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6392. var FeMorphologyElement = /*#__PURE__*/function (_Element) {
  6393. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FeMorphologyElement, _Element);
  6394. var _super = _createSuper$H(FeMorphologyElement);
  6395. function FeMorphologyElement() {
  6396. var _this;
  6397. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FeMorphologyElement);
  6398. _this = _super.apply(this, arguments);
  6399. _this.type = 'feMorphology';
  6400. return _this;
  6401. }
  6402. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FeMorphologyElement, [{
  6403. key: "apply",
  6404. value: function apply(_, __, ___, ____, _____) {// TODO: implement
  6405. }
  6406. }]);
  6407. return FeMorphologyElement;
  6408. }(Element);
  6409. function _createSuper$I(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$I()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6410. function _isNativeReflectConstruct$I() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6411. var FeCompositeElement = /*#__PURE__*/function (_Element) {
  6412. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FeCompositeElement, _Element);
  6413. var _super = _createSuper$I(FeCompositeElement);
  6414. function FeCompositeElement() {
  6415. var _this;
  6416. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FeCompositeElement);
  6417. _this = _super.apply(this, arguments);
  6418. _this.type = 'feComposite';
  6419. return _this;
  6420. }
  6421. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FeCompositeElement, [{
  6422. key: "apply",
  6423. value: function apply(_, __, ___, ____, _____) {// TODO: implement
  6424. }
  6425. }]);
  6426. return FeCompositeElement;
  6427. }(Element);
  6428. function _createSuper$J(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$J()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6429. function _isNativeReflectConstruct$J() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6430. var FeGaussianBlurElement = /*#__PURE__*/function (_Element) {
  6431. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(FeGaussianBlurElement, _Element);
  6432. var _super = _createSuper$J(FeGaussianBlurElement);
  6433. function FeGaussianBlurElement(document, node, captureTextNodes) {
  6434. var _this;
  6435. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, FeGaussianBlurElement);
  6436. _this = _super.call(this, document, node, captureTextNodes);
  6437. _this.type = 'feGaussianBlur';
  6438. _this.blurRadius = Math.floor(_this.getAttribute('stdDeviation').getNumber());
  6439. _this.extraFilterDistance = _this.blurRadius;
  6440. return _this;
  6441. }
  6442. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(FeGaussianBlurElement, [{
  6443. key: "apply",
  6444. value: function apply(ctx, x, y, width, height) {
  6445. var document = this.document,
  6446. blurRadius = this.blurRadius;
  6447. var body = document.window ? document.window.document.body : null;
  6448. var canvas = ctx.canvas; // StackBlur requires canvas be on document
  6449. canvas.id = document.getUniqueId();
  6450. if (body) {
  6451. canvas.style.display = 'none';
  6452. body.appendChild(canvas);
  6453. }
  6454. (0,stackblur_canvas__WEBPACK_IMPORTED_MODULE_55__.canvasRGBA)(canvas, x, y, width, height, blurRadius);
  6455. if (body) {
  6456. body.removeChild(canvas);
  6457. }
  6458. }
  6459. }]);
  6460. return FeGaussianBlurElement;
  6461. }(Element);
  6462. function _createSuper$K(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$K()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6463. function _isNativeReflectConstruct$K() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6464. var TitleElement = /*#__PURE__*/function (_Element) {
  6465. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(TitleElement, _Element);
  6466. var _super = _createSuper$K(TitleElement);
  6467. function TitleElement() {
  6468. var _this;
  6469. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, TitleElement);
  6470. _this = _super.apply(this, arguments);
  6471. _this.type = 'title';
  6472. return _this;
  6473. }
  6474. return TitleElement;
  6475. }(Element);
  6476. function _createSuper$L(Derived) { return function () { var Super = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(Derived), result; if (_isNativeReflectConstruct$L()) { var NewTarget = (0,_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_31__.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0,_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_30__.default)(this, result); }; }
  6477. function _isNativeReflectConstruct$L() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
  6478. var DescElement = /*#__PURE__*/function (_Element) {
  6479. (0,_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_32__.default)(DescElement, _Element);
  6480. var _super = _createSuper$L(DescElement);
  6481. function DescElement() {
  6482. var _this;
  6483. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, DescElement);
  6484. _this = _super.apply(this, arguments);
  6485. _this.type = 'desc';
  6486. return _this;
  6487. }
  6488. return DescElement;
  6489. }(Element);
  6490. var elementTypes = {
  6491. 'svg': SVGElement,
  6492. 'rect': RectElement,
  6493. 'circle': CircleElement,
  6494. 'ellipse': EllipseElement,
  6495. 'line': LineElement,
  6496. 'polyline': PolylineElement,
  6497. 'polygon': PolygonElement,
  6498. 'path': PathElement,
  6499. 'pattern': PatternElement,
  6500. 'marker': MarkerElement,
  6501. 'defs': DefsElement,
  6502. 'linearGradient': LinearGradientElement,
  6503. 'radialGradient': RadialGradientElement,
  6504. 'stop': StopElement,
  6505. 'animate': AnimateElement,
  6506. 'animateColor': AnimateColorElement,
  6507. 'animateTransform': AnimateTransformElement,
  6508. 'font': FontElement,
  6509. 'font-face': FontFaceElement,
  6510. 'missing-glyph': MissingGlyphElement,
  6511. 'glyph': GlyphElement,
  6512. 'text': TextElement,
  6513. 'tspan': TSpanElement,
  6514. 'tref': TRefElement,
  6515. 'a': AElement,
  6516. 'textPath': TextPathElement,
  6517. 'image': ImageElement,
  6518. 'g': GElement,
  6519. 'symbol': SymbolElement,
  6520. 'style': StyleElement,
  6521. 'use': UseElement,
  6522. 'mask': MaskElement,
  6523. 'clipPath': ClipPathElement,
  6524. 'filter': FilterElement,
  6525. 'feDropShadow': FeDropShadowElement,
  6526. 'feMorphology': FeMorphologyElement,
  6527. 'feComposite': FeCompositeElement,
  6528. 'feColorMatrix': FeColorMatrixElement,
  6529. 'feGaussianBlur': FeGaussianBlurElement,
  6530. 'title': TitleElement,
  6531. 'desc': DescElement
  6532. };
  6533. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
  6534. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_16__.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  6535. function createCanvas(width, height) {
  6536. var canvas = document.createElement('canvas');
  6537. canvas.width = width;
  6538. canvas.height = height;
  6539. return canvas;
  6540. }
  6541. function createImage(_x) {
  6542. return _createImage.apply(this, arguments);
  6543. }
  6544. function _createImage() {
  6545. _createImage = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee(src) {
  6546. var anonymousCrossOrigin,
  6547. image,
  6548. _args = arguments;
  6549. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  6550. while (1) {
  6551. switch (_context.prev = _context.next) {
  6552. case 0:
  6553. anonymousCrossOrigin = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
  6554. image = document.createElement('img');
  6555. if (anonymousCrossOrigin) {
  6556. image.crossOrigin = 'Anonymous';
  6557. }
  6558. return _context.abrupt("return", new Promise(function (resolve, reject) {
  6559. image.onload = function () {
  6560. resolve(image);
  6561. };
  6562. image.onerror = function () {
  6563. reject();
  6564. };
  6565. image.src = src;
  6566. }));
  6567. case 4:
  6568. case "end":
  6569. return _context.stop();
  6570. }
  6571. }
  6572. }, _callee);
  6573. }));
  6574. return _createImage.apply(this, arguments);
  6575. }
  6576. var Document = /*#__PURE__*/function () {
  6577. function Document(canvg) {
  6578. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  6579. _ref$rootEmSize = _ref.rootEmSize,
  6580. rootEmSize = _ref$rootEmSize === void 0 ? 12 : _ref$rootEmSize,
  6581. _ref$emSize = _ref.emSize,
  6582. emSize = _ref$emSize === void 0 ? 12 : _ref$emSize,
  6583. _ref$createCanvas = _ref.createCanvas,
  6584. createCanvas = _ref$createCanvas === void 0 ? Document.createCanvas : _ref$createCanvas,
  6585. _ref$createImage = _ref.createImage,
  6586. createImage = _ref$createImage === void 0 ? Document.createImage : _ref$createImage,
  6587. anonymousCrossOrigin = _ref.anonymousCrossOrigin;
  6588. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Document);
  6589. this.canvg = canvg;
  6590. this.definitions = {};
  6591. this.styles = {};
  6592. this.stylesSpecificity = {};
  6593. this.images = [];
  6594. this.fonts = [];
  6595. this.emSizeStack = [];
  6596. this.uniqueId = 0;
  6597. this.screen = canvg.screen;
  6598. this.rootEmSize = rootEmSize;
  6599. this.emSize = emSize;
  6600. this.createCanvas = createCanvas;
  6601. this.createImage = this.bindCreateImage(createImage, anonymousCrossOrigin);
  6602. this.screen.wait(this.isImagesLoaded.bind(this));
  6603. this.screen.wait(this.isFontsLoaded.bind(this));
  6604. }
  6605. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Document, [{
  6606. key: "bindCreateImage",
  6607. value: function bindCreateImage(createImage, anonymousCrossOrigin) {
  6608. if (typeof anonymousCrossOrigin === 'boolean') {
  6609. return function (source, forceAnonymousCrossOrigin) {
  6610. return createImage(source, typeof forceAnonymousCrossOrigin === 'boolean' ? forceAnonymousCrossOrigin : anonymousCrossOrigin);
  6611. };
  6612. }
  6613. return createImage;
  6614. }
  6615. }, {
  6616. key: "popEmSize",
  6617. value: function popEmSize() {
  6618. var emSizeStack = this.emSizeStack;
  6619. emSizeStack.pop();
  6620. }
  6621. }, {
  6622. key: "getUniqueId",
  6623. value: function getUniqueId() {
  6624. return "canvg".concat(++this.uniqueId);
  6625. }
  6626. }, {
  6627. key: "isImagesLoaded",
  6628. value: function isImagesLoaded() {
  6629. return this.images.every(function (_) {
  6630. return _.loaded;
  6631. });
  6632. }
  6633. }, {
  6634. key: "isFontsLoaded",
  6635. value: function isFontsLoaded() {
  6636. return this.fonts.every(function (_) {
  6637. return _.loaded;
  6638. });
  6639. }
  6640. }, {
  6641. key: "createDocumentElement",
  6642. value: function createDocumentElement(document) {
  6643. var documentElement = this.createElement(document.documentElement);
  6644. documentElement.root = true;
  6645. documentElement.addStylesFromStyleDefinition();
  6646. this.documentElement = documentElement;
  6647. return documentElement;
  6648. }
  6649. }, {
  6650. key: "createElement",
  6651. value: function createElement(node) {
  6652. var elementType = node.nodeName.replace(/^[^:]+:/, '');
  6653. var ElementType = Document.elementTypes[elementType];
  6654. if (typeof ElementType !== 'undefined') {
  6655. return new ElementType(this, node);
  6656. }
  6657. return new UnknownElement(this, node);
  6658. }
  6659. }, {
  6660. key: "createTextNode",
  6661. value: function createTextNode(node) {
  6662. return new TextNode(this, node);
  6663. }
  6664. }, {
  6665. key: "setViewBox",
  6666. value: function setViewBox(config) {
  6667. this.screen.setViewBox(_objectSpread({
  6668. document: this
  6669. }, config));
  6670. }
  6671. }, {
  6672. key: "window",
  6673. get: function get() {
  6674. return this.screen.window;
  6675. }
  6676. }, {
  6677. key: "fetch",
  6678. get: function get() {
  6679. return this.screen.fetch;
  6680. }
  6681. }, {
  6682. key: "ctx",
  6683. get: function get() {
  6684. return this.screen.ctx;
  6685. }
  6686. }, {
  6687. key: "emSize",
  6688. get: function get() {
  6689. var emSizeStack = this.emSizeStack;
  6690. return emSizeStack[emSizeStack.length - 1];
  6691. },
  6692. set: function set(value) {
  6693. var emSizeStack = this.emSizeStack;
  6694. emSizeStack.push(value);
  6695. }
  6696. }]);
  6697. return Document;
  6698. }();
  6699. Document.createCanvas = createCanvas;
  6700. Document.createImage = createImage;
  6701. Document.elementTypes = elementTypes;
  6702. function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
  6703. function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_16__.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  6704. /**
  6705. * SVG renderer on canvas.
  6706. */
  6707. var Canvg = /*#__PURE__*/function () {
  6708. /**
  6709. * Main constructor.
  6710. * @param ctx - Rendering context.
  6711. * @param svg - SVG Document.
  6712. * @param options - Rendering options.
  6713. */
  6714. function Canvg(ctx, svg) {
  6715. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6716. (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_17__.default)(this, Canvg);
  6717. this.parser = new Parser(options);
  6718. this.screen = new Screen(ctx, options);
  6719. this.options = options;
  6720. var document = new Document(this, options);
  6721. var documentElement = document.createDocumentElement(svg);
  6722. this.document = document;
  6723. this.documentElement = documentElement;
  6724. }
  6725. /**
  6726. * Create Canvg isntance from SVG source string or URL.
  6727. * @param ctx - Rendering context.
  6728. * @param svg - SVG source string or URL.
  6729. * @param options - Rendering options.
  6730. */
  6731. (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_18__.default)(Canvg, [{
  6732. key: "fork",
  6733. /**
  6734. * Create new Canvg instance with inherited options.
  6735. * @param ctx - Rendering context.
  6736. * @param svg - SVG source string or URL.
  6737. * @param options - Rendering options.
  6738. */
  6739. value: function fork(ctx, svg) {
  6740. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6741. return Canvg.from(ctx, svg, _objectSpread$1({}, this.options, {}, options));
  6742. }
  6743. /**
  6744. * Create new Canvg instance with inherited options.
  6745. * @param ctx - Rendering context.
  6746. * @param svg - SVG source string.
  6747. * @param options - Rendering options.
  6748. */
  6749. }, {
  6750. key: "forkString",
  6751. value: function forkString(ctx, svg) {
  6752. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6753. return Canvg.fromString(ctx, svg, _objectSpread$1({}, this.options, {}, options));
  6754. }
  6755. /**
  6756. * Document is ready promise.
  6757. */
  6758. }, {
  6759. key: "ready",
  6760. value: function ready() {
  6761. return this.screen.ready();
  6762. }
  6763. /**
  6764. * Document is ready value.
  6765. */
  6766. }, {
  6767. key: "isReady",
  6768. value: function isReady() {
  6769. return this.screen.isReady();
  6770. }
  6771. /**
  6772. * Render only first frame, ignoring animations and mouse.
  6773. * @param options - Rendering options.
  6774. */
  6775. }, {
  6776. key: "render",
  6777. value: function () {
  6778. var _render = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee() {
  6779. var options,
  6780. _args = arguments;
  6781. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  6782. while (1) {
  6783. switch (_context.prev = _context.next) {
  6784. case 0:
  6785. options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
  6786. this.start(_objectSpread$1({
  6787. enableRedraw: true,
  6788. ignoreAnimation: true,
  6789. ignoreMouse: true
  6790. }, options));
  6791. _context.next = 4;
  6792. return this.ready();
  6793. case 4:
  6794. this.stop();
  6795. case 5:
  6796. case "end":
  6797. return _context.stop();
  6798. }
  6799. }
  6800. }, _callee, this);
  6801. }));
  6802. function render() {
  6803. return _render.apply(this, arguments);
  6804. }
  6805. return render;
  6806. }()
  6807. /**
  6808. * Start rendering.
  6809. * @param options - Render options.
  6810. */
  6811. }, {
  6812. key: "start",
  6813. value: function start() {
  6814. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  6815. var documentElement = this.documentElement,
  6816. screen = this.screen,
  6817. baseOptions = this.options;
  6818. screen.start(documentElement, _objectSpread$1({
  6819. enableRedraw: true
  6820. }, baseOptions, {}, options));
  6821. }
  6822. /**
  6823. * Stop rendering.
  6824. */
  6825. }, {
  6826. key: "stop",
  6827. value: function stop() {
  6828. this.screen.stop();
  6829. }
  6830. /**
  6831. * Resize SVG to fit in given size.
  6832. * @param width
  6833. * @param height
  6834. * @param preserveAspectRatio
  6835. */
  6836. }, {
  6837. key: "resize",
  6838. value: function resize(width) {
  6839. var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;
  6840. var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  6841. this.documentElement.resize(width, height, preserveAspectRatio);
  6842. }
  6843. }], [{
  6844. key: "from",
  6845. value: function () {
  6846. var _from = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee2(ctx, svg) {
  6847. var options,
  6848. parser,
  6849. svgDocument,
  6850. _args2 = arguments;
  6851. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee2$(_context2) {
  6852. while (1) {
  6853. switch (_context2.prev = _context2.next) {
  6854. case 0:
  6855. options = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {};
  6856. parser = new Parser(options);
  6857. _context2.next = 4;
  6858. return parser.parse(svg);
  6859. case 4:
  6860. svgDocument = _context2.sent;
  6861. return _context2.abrupt("return", new Canvg(ctx, svgDocument, options));
  6862. case 6:
  6863. case "end":
  6864. return _context2.stop();
  6865. }
  6866. }
  6867. }, _callee2);
  6868. }));
  6869. function from(_x, _x2) {
  6870. return _from.apply(this, arguments);
  6871. }
  6872. return from;
  6873. }()
  6874. /**
  6875. * Create Canvg isntance from SVG source string.
  6876. * @param ctx - Rendering context.
  6877. * @param svg - SVG source string.
  6878. * @param options - Rendering options.
  6879. */
  6880. }, {
  6881. key: "fromString",
  6882. value: function fromString(ctx, svg) {
  6883. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6884. var parser = new Parser(options);
  6885. var svgDocument = parser.parseFromString(svg);
  6886. return new Canvg(ctx, svgDocument, options);
  6887. }
  6888. }]);
  6889. return Canvg;
  6890. }();
  6891. /**
  6892. * Options preset for `OffscreenCanvas`.
  6893. * @param config - Preset requirements.
  6894. * @param config.DOMParser - XML/HTML parser from string into DOM Document.
  6895. */
  6896. function offscreen() {
  6897. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  6898. DOMParserFallback = _ref.DOMParser;
  6899. var preset = {
  6900. window: null,
  6901. ignoreAnimation: true,
  6902. ignoreMouse: true,
  6903. DOMParser: DOMParserFallback,
  6904. createCanvas: function createCanvas(width, height) {
  6905. return new OffscreenCanvas(width, height);
  6906. },
  6907. createImage: function createImage(url) {
  6908. return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_15__.default)( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().mark(function _callee() {
  6909. var response, blob, img;
  6910. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_14___default().wrap(function _callee$(_context) {
  6911. while (1) {
  6912. switch (_context.prev = _context.next) {
  6913. case 0:
  6914. _context.next = 2;
  6915. return fetch(url);
  6916. case 2:
  6917. response = _context.sent;
  6918. _context.next = 5;
  6919. return response.blob();
  6920. case 5:
  6921. blob = _context.sent;
  6922. _context.next = 8;
  6923. return createImageBitmap(blob);
  6924. case 8:
  6925. img = _context.sent;
  6926. return _context.abrupt("return", img);
  6927. case 10:
  6928. case "end":
  6929. return _context.stop();
  6930. }
  6931. }
  6932. }, _callee);
  6933. }))();
  6934. }
  6935. };
  6936. if (typeof DOMParser !== 'undefined' || typeof DOMParserFallback === 'undefined') {
  6937. Reflect.deleteProperty(preset, 'DOMParser');
  6938. }
  6939. return preset;
  6940. }
  6941. /**
  6942. * Options preset for `node-canvas`.
  6943. * @param config - Preset requirements.
  6944. * @param config.DOMParser - XML/HTML parser from string into DOM Document.
  6945. * @param config.canvas - `node-canvas` exports.
  6946. * @param config.fetch - WHATWG-compatible `fetch` function.
  6947. */
  6948. function node(_ref) {
  6949. var DOMParser = _ref.DOMParser,
  6950. canvas = _ref.canvas,
  6951. fetch = _ref.fetch;
  6952. return {
  6953. window: null,
  6954. ignoreAnimation: true,
  6955. ignoreMouse: true,
  6956. DOMParser: DOMParser,
  6957. fetch: fetch,
  6958. createCanvas: canvas.createCanvas,
  6959. createImage: canvas.loadImage
  6960. };
  6961. }
  6962. var index = /*#__PURE__*/Object.freeze({
  6963. __proto__: null,
  6964. offscreen: offscreen,
  6965. node: node
  6966. });
  6967. /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Canvg);
  6968. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJ1bmRlZmluZWQiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJfaW52b2tlIiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwiZm4iLCJvYmoiLCJhcmciLCJ0eXBlIiwiY2FsbCIsImVyciIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImNvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJfX2F3YWl0IiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlY29yZCIsInJlc3VsdCIsInZhbHVlIiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwicHJldmlvdXNQcm9taXNlIiwiZW5xdWV1ZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsIm5leHQiLCJkb25lIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwidG9TdHJpbmciLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImtleXMiLCJvYmplY3QiLCJrZXkiLCJyZXZlcnNlIiwibGVuZ3RoIiwicG9wIiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwiaSIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdEVudHJ5Iiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJtb2R1bGUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsIkZ1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9
  6969. /***/ }),
  6970. /***/ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
  6971. /*!*********************************************************************!*\
  6972. !*** ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
  6973. \*********************************************************************/
  6974. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  6975. "use strict";
  6976. __webpack_require__.r(__webpack_exports__);
  6977. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  6978. /* harmony export */ "default": () => (/* binding */ _arrayLikeToArray)
  6979. /* harmony export */ });
  6980. function _arrayLikeToArray(arr, len) {
  6981. if (len == null || len > arr.length) len = arr.length;
  6982. for (var i = 0, arr2 = new Array(len); i < len; i++) {
  6983. arr2[i] = arr[i];
  6984. }
  6985. return arr2;
  6986. }
  6987. /***/ }),
  6988. /***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
  6989. /*!*******************************************************************!*\
  6990. !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
  6991. \*******************************************************************/
  6992. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  6993. "use strict";
  6994. __webpack_require__.r(__webpack_exports__);
  6995. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  6996. /* harmony export */ "default": () => (/* binding */ _arrayWithHoles)
  6997. /* harmony export */ });
  6998. function _arrayWithHoles(arr) {
  6999. if (Array.isArray(arr)) return arr;
  7000. }
  7001. /***/ }),
  7002. /***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js":
  7003. /*!**********************************************************************!*\
  7004. !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***!
  7005. \**********************************************************************/
  7006. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7007. "use strict";
  7008. __webpack_require__.r(__webpack_exports__);
  7009. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7010. /* harmony export */ "default": () => (/* binding */ _arrayWithoutHoles)
  7011. /* harmony export */ });
  7012. /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js");
  7013. function _arrayWithoutHoles(arr) {
  7014. if (Array.isArray(arr)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__.default)(arr);
  7015. }
  7016. /***/ }),
  7017. /***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js":
  7018. /*!**************************************************************************!*\
  7019. !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***!
  7020. \**************************************************************************/
  7021. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7022. "use strict";
  7023. __webpack_require__.r(__webpack_exports__);
  7024. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7025. /* harmony export */ "default": () => (/* binding */ _assertThisInitialized)
  7026. /* harmony export */ });
  7027. function _assertThisInitialized(self) {
  7028. if (self === void 0) {
  7029. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  7030. }
  7031. return self;
  7032. }
  7033. /***/ }),
  7034. /***/ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js":
  7035. /*!*********************************************************************!*\
  7036. !*** ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js ***!
  7037. \*********************************************************************/
  7038. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7039. "use strict";
  7040. __webpack_require__.r(__webpack_exports__);
  7041. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7042. /* harmony export */ "default": () => (/* binding */ _asyncToGenerator)
  7043. /* harmony export */ });
  7044. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  7045. try {
  7046. var info = gen[key](arg);
  7047. var value = info.value;
  7048. } catch (error) {
  7049. reject(error);
  7050. return;
  7051. }
  7052. if (info.done) {
  7053. resolve(value);
  7054. } else {
  7055. Promise.resolve(value).then(_next, _throw);
  7056. }
  7057. }
  7058. function _asyncToGenerator(fn) {
  7059. return function () {
  7060. var self = this,
  7061. args = arguments;
  7062. return new Promise(function (resolve, reject) {
  7063. var gen = fn.apply(self, args);
  7064. function _next(value) {
  7065. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
  7066. }
  7067. function _throw(err) {
  7068. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
  7069. }
  7070. _next(undefined);
  7071. });
  7072. };
  7073. }
  7074. /***/ }),
  7075. /***/ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js":
  7076. /*!*******************************************************************!*\
  7077. !*** ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
  7078. \*******************************************************************/
  7079. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7080. "use strict";
  7081. __webpack_require__.r(__webpack_exports__);
  7082. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7083. /* harmony export */ "default": () => (/* binding */ _classCallCheck)
  7084. /* harmony export */ });
  7085. function _classCallCheck(instance, Constructor) {
  7086. if (!(instance instanceof Constructor)) {
  7087. throw new TypeError("Cannot call a class as a function");
  7088. }
  7089. }
  7090. /***/ }),
  7091. /***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js":
  7092. /*!****************************************************************!*\
  7093. !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***!
  7094. \****************************************************************/
  7095. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7096. "use strict";
  7097. __webpack_require__.r(__webpack_exports__);
  7098. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7099. /* harmony export */ "default": () => (/* binding */ _createClass)
  7100. /* harmony export */ });
  7101. function _defineProperties(target, props) {
  7102. for (var i = 0; i < props.length; i++) {
  7103. var descriptor = props[i];
  7104. descriptor.enumerable = descriptor.enumerable || false;
  7105. descriptor.configurable = true;
  7106. if ("value" in descriptor) descriptor.writable = true;
  7107. Object.defineProperty(target, descriptor.key, descriptor);
  7108. }
  7109. }
  7110. function _createClass(Constructor, protoProps, staticProps) {
  7111. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  7112. if (staticProps) _defineProperties(Constructor, staticProps);
  7113. return Constructor;
  7114. }
  7115. /***/ }),
  7116. /***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js":
  7117. /*!*******************************************************************!*\
  7118. !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
  7119. \*******************************************************************/
  7120. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7121. "use strict";
  7122. __webpack_require__.r(__webpack_exports__);
  7123. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7124. /* harmony export */ "default": () => (/* binding */ _defineProperty)
  7125. /* harmony export */ });
  7126. function _defineProperty(obj, key, value) {
  7127. if (key in obj) {
  7128. Object.defineProperty(obj, key, {
  7129. value: value,
  7130. enumerable: true,
  7131. configurable: true,
  7132. writable: true
  7133. });
  7134. } else {
  7135. obj[key] = value;
  7136. }
  7137. return obj;
  7138. }
  7139. /***/ }),
  7140. /***/ "./node_modules/@babel/runtime/helpers/esm/get.js":
  7141. /*!********************************************************!*\
  7142. !*** ./node_modules/@babel/runtime/helpers/esm/get.js ***!
  7143. \********************************************************/
  7144. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7145. "use strict";
  7146. __webpack_require__.r(__webpack_exports__);
  7147. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7148. /* harmony export */ "default": () => (/* binding */ _get)
  7149. /* harmony export */ });
  7150. /* harmony import */ var _superPropBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./superPropBase.js */ "./node_modules/@babel/runtime/helpers/esm/superPropBase.js");
  7151. function _get(target, property, receiver) {
  7152. if (typeof Reflect !== "undefined" && Reflect.get) {
  7153. _get = Reflect.get;
  7154. } else {
  7155. _get = function _get(target, property, receiver) {
  7156. var base = (0,_superPropBase_js__WEBPACK_IMPORTED_MODULE_0__.default)(target, property);
  7157. if (!base) return;
  7158. var desc = Object.getOwnPropertyDescriptor(base, property);
  7159. if (desc.get) {
  7160. return desc.get.call(receiver);
  7161. }
  7162. return desc.value;
  7163. };
  7164. }
  7165. return _get(target, property, receiver || target);
  7166. }
  7167. /***/ }),
  7168. /***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js":
  7169. /*!*******************************************************************!*\
  7170. !*** ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js ***!
  7171. \*******************************************************************/
  7172. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7173. "use strict";
  7174. __webpack_require__.r(__webpack_exports__);
  7175. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7176. /* harmony export */ "default": () => (/* binding */ _getPrototypeOf)
  7177. /* harmony export */ });
  7178. function _getPrototypeOf(o) {
  7179. _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
  7180. return o.__proto__ || Object.getPrototypeOf(o);
  7181. };
  7182. return _getPrototypeOf(o);
  7183. }
  7184. /***/ }),
  7185. /***/ "./node_modules/@babel/runtime/helpers/esm/inherits.js":
  7186. /*!*************************************************************!*\
  7187. !*** ./node_modules/@babel/runtime/helpers/esm/inherits.js ***!
  7188. \*************************************************************/
  7189. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7190. "use strict";
  7191. __webpack_require__.r(__webpack_exports__);
  7192. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7193. /* harmony export */ "default": () => (/* binding */ _inherits)
  7194. /* harmony export */ });
  7195. /* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js");
  7196. function _inherits(subClass, superClass) {
  7197. if (typeof superClass !== "function" && superClass !== null) {
  7198. throw new TypeError("Super expression must either be null or a function");
  7199. }
  7200. subClass.prototype = Object.create(superClass && superClass.prototype, {
  7201. constructor: {
  7202. value: subClass,
  7203. writable: true,
  7204. configurable: true
  7205. }
  7206. });
  7207. if (superClass) (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__.default)(subClass, superClass);
  7208. }
  7209. /***/ }),
  7210. /***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js":
  7211. /*!********************************************************************!*\
  7212. !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***!
  7213. \********************************************************************/
  7214. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7215. "use strict";
  7216. __webpack_require__.r(__webpack_exports__);
  7217. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7218. /* harmony export */ "default": () => (/* binding */ _iterableToArray)
  7219. /* harmony export */ });
  7220. function _iterableToArray(iter) {
  7221. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  7222. }
  7223. /***/ }),
  7224. /***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
  7225. /*!*************************************************************************!*\
  7226. !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
  7227. \*************************************************************************/
  7228. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7229. "use strict";
  7230. __webpack_require__.r(__webpack_exports__);
  7231. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7232. /* harmony export */ "default": () => (/* binding */ _iterableToArrayLimit)
  7233. /* harmony export */ });
  7234. function _iterableToArrayLimit(arr, i) {
  7235. var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
  7236. if (_i == null) return;
  7237. var _arr = [];
  7238. var _n = true;
  7239. var _d = false;
  7240. var _s, _e;
  7241. try {
  7242. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  7243. _arr.push(_s.value);
  7244. if (i && _arr.length === i) break;
  7245. }
  7246. } catch (err) {
  7247. _d = true;
  7248. _e = err;
  7249. } finally {
  7250. try {
  7251. if (!_n && _i["return"] != null) _i["return"]();
  7252. } finally {
  7253. if (_d) throw _e;
  7254. }
  7255. }
  7256. return _arr;
  7257. }
  7258. /***/ }),
  7259. /***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
  7260. /*!********************************************************************!*\
  7261. !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
  7262. \********************************************************************/
  7263. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7264. "use strict";
  7265. __webpack_require__.r(__webpack_exports__);
  7266. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7267. /* harmony export */ "default": () => (/* binding */ _nonIterableRest)
  7268. /* harmony export */ });
  7269. function _nonIterableRest() {
  7270. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  7271. }
  7272. /***/ }),
  7273. /***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js":
  7274. /*!**********************************************************************!*\
  7275. !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***!
  7276. \**********************************************************************/
  7277. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7278. "use strict";
  7279. __webpack_require__.r(__webpack_exports__);
  7280. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7281. /* harmony export */ "default": () => (/* binding */ _nonIterableSpread)
  7282. /* harmony export */ });
  7283. function _nonIterableSpread() {
  7284. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  7285. }
  7286. /***/ }),
  7287. /***/ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js":
  7288. /*!******************************************************************************!*\
  7289. !*** ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js ***!
  7290. \******************************************************************************/
  7291. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7292. "use strict";
  7293. __webpack_require__.r(__webpack_exports__);
  7294. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7295. /* harmony export */ "default": () => (/* binding */ _possibleConstructorReturn)
  7296. /* harmony export */ });
  7297. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/esm/typeof.js");
  7298. /* harmony import */ var _assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js");
  7299. function _possibleConstructorReturn(self, call) {
  7300. if (call && ((0,_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__.default)(call) === "object" || typeof call === "function")) {
  7301. return call;
  7302. } else if (call !== void 0) {
  7303. throw new TypeError("Derived constructors may only return object or undefined");
  7304. }
  7305. return (0,_assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__.default)(self);
  7306. }
  7307. /***/ }),
  7308. /***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js":
  7309. /*!*******************************************************************!*\
  7310. !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***!
  7311. \*******************************************************************/
  7312. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7313. "use strict";
  7314. __webpack_require__.r(__webpack_exports__);
  7315. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7316. /* harmony export */ "default": () => (/* binding */ _setPrototypeOf)
  7317. /* harmony export */ });
  7318. function _setPrototypeOf(o, p) {
  7319. _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
  7320. o.__proto__ = p;
  7321. return o;
  7322. };
  7323. return _setPrototypeOf(o, p);
  7324. }
  7325. /***/ }),
  7326. /***/ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
  7327. /*!******************************************************************!*\
  7328. !*** ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
  7329. \******************************************************************/
  7330. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7331. "use strict";
  7332. __webpack_require__.r(__webpack_exports__);
  7333. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7334. /* harmony export */ "default": () => (/* binding */ _slicedToArray)
  7335. /* harmony export */ });
  7336. /* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js");
  7337. /* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js");
  7338. /* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js");
  7339. /* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js");
  7340. function _slicedToArray(arr, i) {
  7341. return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__.default)(arr) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__.default)(arr, i) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__.default)(arr, i) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__.default)();
  7342. }
  7343. /***/ }),
  7344. /***/ "./node_modules/@babel/runtime/helpers/esm/superPropBase.js":
  7345. /*!******************************************************************!*\
  7346. !*** ./node_modules/@babel/runtime/helpers/esm/superPropBase.js ***!
  7347. \******************************************************************/
  7348. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7349. "use strict";
  7350. __webpack_require__.r(__webpack_exports__);
  7351. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7352. /* harmony export */ "default": () => (/* binding */ _superPropBase)
  7353. /* harmony export */ });
  7354. /* harmony import */ var _getPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js");
  7355. function _superPropBase(object, property) {
  7356. while (!Object.prototype.hasOwnProperty.call(object, property)) {
  7357. object = (0,_getPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__.default)(object);
  7358. if (object === null) break;
  7359. }
  7360. return object;
  7361. }
  7362. /***/ }),
  7363. /***/ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js":
  7364. /*!**********************************************************************!*\
  7365. !*** ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***!
  7366. \**********************************************************************/
  7367. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7368. "use strict";
  7369. __webpack_require__.r(__webpack_exports__);
  7370. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7371. /* harmony export */ "default": () => (/* binding */ _toConsumableArray)
  7372. /* harmony export */ });
  7373. /* harmony import */ var _arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js");
  7374. /* harmony import */ var _iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js");
  7375. /* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js");
  7376. /* harmony import */ var _nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread.js */ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js");
  7377. function _toConsumableArray(arr) {
  7378. return (0,_arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__.default)(arr) || (0,_iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__.default)(arr) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__.default)(arr) || (0,_nonIterableSpread_js__WEBPACK_IMPORTED_MODULE_3__.default)();
  7379. }
  7380. /***/ }),
  7381. /***/ "./node_modules/@babel/runtime/helpers/esm/typeof.js":
  7382. /*!***********************************************************!*\
  7383. !*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***!
  7384. \***********************************************************/
  7385. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7386. "use strict";
  7387. __webpack_require__.r(__webpack_exports__);
  7388. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7389. /* harmony export */ "default": () => (/* binding */ _typeof)
  7390. /* harmony export */ });
  7391. function _typeof(obj) {
  7392. "@babel/helpers - typeof";
  7393. if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
  7394. _typeof = function _typeof(obj) {
  7395. return typeof obj;
  7396. };
  7397. } else {
  7398. _typeof = function _typeof(obj) {
  7399. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  7400. };
  7401. }
  7402. return _typeof(obj);
  7403. }
  7404. /***/ }),
  7405. /***/ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
  7406. /*!*******************************************************************************!*\
  7407. !*** ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
  7408. \*******************************************************************************/
  7409. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  7410. "use strict";
  7411. __webpack_require__.r(__webpack_exports__);
  7412. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  7413. /* harmony export */ "default": () => (/* binding */ _unsupportedIterableToArray)
  7414. /* harmony export */ });
  7415. /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js");
  7416. function _unsupportedIterableToArray(o, minLen) {
  7417. if (!o) return;
  7418. if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__.default)(o, minLen);
  7419. var n = Object.prototype.toString.call(o).slice(8, -1);
  7420. if (n === "Object" && o.constructor) n = o.constructor.name;
  7421. if (n === "Map" || n === "Set") return Array.from(o);
  7422. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__.default)(o, minLen);
  7423. }
  7424. /***/ }),
  7425. /***/ "./node_modules/@babel/runtime/regenerator/index.js":
  7426. /*!**********************************************************!*\
  7427. !*** ./node_modules/@babel/runtime/regenerator/index.js ***!
  7428. \**********************************************************/
  7429. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7430. module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js");
  7431. /***/ }),
  7432. /***/ "./node_modules/core-js/internals/a-function.js":
  7433. /*!******************************************************!*\
  7434. !*** ./node_modules/core-js/internals/a-function.js ***!
  7435. \******************************************************/
  7436. /***/ ((module) => {
  7437. module.exports = function (it) {
  7438. if (typeof it != 'function') {
  7439. throw TypeError(String(it) + ' is not a function');
  7440. } return it;
  7441. };
  7442. /***/ }),
  7443. /***/ "./node_modules/core-js/internals/a-possible-prototype.js":
  7444. /*!****************************************************************!*\
  7445. !*** ./node_modules/core-js/internals/a-possible-prototype.js ***!
  7446. \****************************************************************/
  7447. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7448. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  7449. module.exports = function (it) {
  7450. if (!isObject(it) && it !== null) {
  7451. throw TypeError("Can't set " + String(it) + ' as a prototype');
  7452. } return it;
  7453. };
  7454. /***/ }),
  7455. /***/ "./node_modules/core-js/internals/add-to-unscopables.js":
  7456. /*!**************************************************************!*\
  7457. !*** ./node_modules/core-js/internals/add-to-unscopables.js ***!
  7458. \**************************************************************/
  7459. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7460. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  7461. var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  7462. var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
  7463. var UNSCOPABLES = wellKnownSymbol('unscopables');
  7464. var ArrayPrototype = Array.prototype;
  7465. // Array.prototype[@@unscopables]
  7466. // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
  7467. if (ArrayPrototype[UNSCOPABLES] == undefined) {
  7468. definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {
  7469. configurable: true,
  7470. value: create(null)
  7471. });
  7472. }
  7473. // add a key to Array.prototype[@@unscopables]
  7474. module.exports = function (key) {
  7475. ArrayPrototype[UNSCOPABLES][key] = true;
  7476. };
  7477. /***/ }),
  7478. /***/ "./node_modules/core-js/internals/an-instance.js":
  7479. /*!*******************************************************!*\
  7480. !*** ./node_modules/core-js/internals/an-instance.js ***!
  7481. \*******************************************************/
  7482. /***/ ((module) => {
  7483. module.exports = function (it, Constructor, name) {
  7484. if (!(it instanceof Constructor)) {
  7485. throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');
  7486. } return it;
  7487. };
  7488. /***/ }),
  7489. /***/ "./node_modules/core-js/internals/array-fill.js":
  7490. /*!******************************************************!*\
  7491. !*** ./node_modules/core-js/internals/array-fill.js ***!
  7492. \******************************************************/
  7493. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7494. "use strict";
  7495. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  7496. var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
  7497. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  7498. // `Array.prototype.fill` method implementation
  7499. // https://tc39.es/ecma262/#sec-array.prototype.fill
  7500. module.exports = function fill(value /* , start = 0, end = @length */) {
  7501. var O = toObject(this);
  7502. var length = toLength(O.length);
  7503. var argumentsLength = arguments.length;
  7504. var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);
  7505. var end = argumentsLength > 2 ? arguments[2] : undefined;
  7506. var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
  7507. while (endPos > index) O[index++] = value;
  7508. return O;
  7509. };
  7510. /***/ }),
  7511. /***/ "./node_modules/core-js/internals/array-for-each.js":
  7512. /*!**********************************************************!*\
  7513. !*** ./node_modules/core-js/internals/array-for-each.js ***!
  7514. \**********************************************************/
  7515. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7516. "use strict";
  7517. var $forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
  7518. var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
  7519. var STRICT_METHOD = arrayMethodIsStrict('forEach');
  7520. // `Array.prototype.forEach` method implementation
  7521. // https://tc39.es/ecma262/#sec-array.prototype.foreach
  7522. module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {
  7523. return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  7524. // eslint-disable-next-line es/no-array-prototype-foreach -- safe
  7525. } : [].forEach;
  7526. /***/ }),
  7527. /***/ "./node_modules/core-js/internals/array-from.js":
  7528. /*!******************************************************!*\
  7529. !*** ./node_modules/core-js/internals/array-from.js ***!
  7530. \******************************************************/
  7531. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7532. "use strict";
  7533. var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
  7534. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  7535. var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js");
  7536. var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js");
  7537. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  7538. var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
  7539. var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
  7540. // `Array.from` method implementation
  7541. // https://tc39.es/ecma262/#sec-array.from
  7542. module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
  7543. var O = toObject(arrayLike);
  7544. var C = typeof this == 'function' ? this : Array;
  7545. var argumentsLength = arguments.length;
  7546. var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
  7547. var mapping = mapfn !== undefined;
  7548. var iteratorMethod = getIteratorMethod(O);
  7549. var index = 0;
  7550. var length, result, step, iterator, next, value;
  7551. if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
  7552. // if the target is not iterable or it's an array with the default iterator - use a simple case
  7553. if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {
  7554. iterator = iteratorMethod.call(O);
  7555. next = iterator.next;
  7556. result = new C();
  7557. for (;!(step = next.call(iterator)).done; index++) {
  7558. value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
  7559. createProperty(result, index, value);
  7560. }
  7561. } else {
  7562. length = toLength(O.length);
  7563. result = new C(length);
  7564. for (;length > index; index++) {
  7565. value = mapping ? mapfn(O[index], index) : O[index];
  7566. createProperty(result, index, value);
  7567. }
  7568. }
  7569. result.length = index;
  7570. return result;
  7571. };
  7572. /***/ }),
  7573. /***/ "./node_modules/core-js/internals/array-iteration.js":
  7574. /*!***********************************************************!*\
  7575. !*** ./node_modules/core-js/internals/array-iteration.js ***!
  7576. \***********************************************************/
  7577. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7578. var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
  7579. var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
  7580. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  7581. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  7582. var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
  7583. var push = [].push;
  7584. // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation
  7585. var createMethod = function (TYPE) {
  7586. var IS_MAP = TYPE == 1;
  7587. var IS_FILTER = TYPE == 2;
  7588. var IS_SOME = TYPE == 3;
  7589. var IS_EVERY = TYPE == 4;
  7590. var IS_FIND_INDEX = TYPE == 6;
  7591. var IS_FILTER_OUT = TYPE == 7;
  7592. var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  7593. return function ($this, callbackfn, that, specificCreate) {
  7594. var O = toObject($this);
  7595. var self = IndexedObject(O);
  7596. var boundFunction = bind(callbackfn, that, 3);
  7597. var length = toLength(self.length);
  7598. var index = 0;
  7599. var create = specificCreate || arraySpeciesCreate;
  7600. var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined;
  7601. var value, result;
  7602. for (;length > index; index++) if (NO_HOLES || index in self) {
  7603. value = self[index];
  7604. result = boundFunction(value, index, O);
  7605. if (TYPE) {
  7606. if (IS_MAP) target[index] = result; // map
  7607. else if (result) switch (TYPE) {
  7608. case 3: return true; // some
  7609. case 5: return value; // find
  7610. case 6: return index; // findIndex
  7611. case 2: push.call(target, value); // filter
  7612. } else switch (TYPE) {
  7613. case 4: return false; // every
  7614. case 7: push.call(target, value); // filterOut
  7615. }
  7616. }
  7617. }
  7618. return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
  7619. };
  7620. };
  7621. module.exports = {
  7622. // `Array.prototype.forEach` method
  7623. // https://tc39.es/ecma262/#sec-array.prototype.foreach
  7624. forEach: createMethod(0),
  7625. // `Array.prototype.map` method
  7626. // https://tc39.es/ecma262/#sec-array.prototype.map
  7627. map: createMethod(1),
  7628. // `Array.prototype.filter` method
  7629. // https://tc39.es/ecma262/#sec-array.prototype.filter
  7630. filter: createMethod(2),
  7631. // `Array.prototype.some` method
  7632. // https://tc39.es/ecma262/#sec-array.prototype.some
  7633. some: createMethod(3),
  7634. // `Array.prototype.every` method
  7635. // https://tc39.es/ecma262/#sec-array.prototype.every
  7636. every: createMethod(4),
  7637. // `Array.prototype.find` method
  7638. // https://tc39.es/ecma262/#sec-array.prototype.find
  7639. find: createMethod(5),
  7640. // `Array.prototype.findIndex` method
  7641. // https://tc39.es/ecma262/#sec-array.prototype.findIndex
  7642. findIndex: createMethod(6),
  7643. // `Array.prototype.filterOut` method
  7644. // https://github.com/tc39/proposal-array-filtering
  7645. filterOut: createMethod(7)
  7646. };
  7647. /***/ }),
  7648. /***/ "./node_modules/core-js/internals/array-reduce.js":
  7649. /*!********************************************************!*\
  7650. !*** ./node_modules/core-js/internals/array-reduce.js ***!
  7651. \********************************************************/
  7652. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7653. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  7654. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  7655. var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
  7656. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  7657. // `Array.prototype.{ reduce, reduceRight }` methods implementation
  7658. var createMethod = function (IS_RIGHT) {
  7659. return function (that, callbackfn, argumentsLength, memo) {
  7660. aFunction(callbackfn);
  7661. var O = toObject(that);
  7662. var self = IndexedObject(O);
  7663. var length = toLength(O.length);
  7664. var index = IS_RIGHT ? length - 1 : 0;
  7665. var i = IS_RIGHT ? -1 : 1;
  7666. if (argumentsLength < 2) while (true) {
  7667. if (index in self) {
  7668. memo = self[index];
  7669. index += i;
  7670. break;
  7671. }
  7672. index += i;
  7673. if (IS_RIGHT ? index < 0 : length <= index) {
  7674. throw TypeError('Reduce of empty array with no initial value');
  7675. }
  7676. }
  7677. for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
  7678. memo = callbackfn(memo, self[index], index, O);
  7679. }
  7680. return memo;
  7681. };
  7682. };
  7683. module.exports = {
  7684. // `Array.prototype.reduce` method
  7685. // https://tc39.es/ecma262/#sec-array.prototype.reduce
  7686. left: createMethod(false),
  7687. // `Array.prototype.reduceRight` method
  7688. // https://tc39.es/ecma262/#sec-array.prototype.reduceright
  7689. right: createMethod(true)
  7690. };
  7691. /***/ }),
  7692. /***/ "./node_modules/core-js/internals/array-species-create.js":
  7693. /*!****************************************************************!*\
  7694. !*** ./node_modules/core-js/internals/array-species-create.js ***!
  7695. \****************************************************************/
  7696. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7697. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  7698. var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
  7699. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  7700. var SPECIES = wellKnownSymbol('species');
  7701. // `ArraySpeciesCreate` abstract operation
  7702. // https://tc39.es/ecma262/#sec-arrayspeciescreate
  7703. module.exports = function (originalArray, length) {
  7704. var C;
  7705. if (isArray(originalArray)) {
  7706. C = originalArray.constructor;
  7707. // cross-realm fallback
  7708. if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
  7709. else if (isObject(C)) {
  7710. C = C[SPECIES];
  7711. if (C === null) C = undefined;
  7712. }
  7713. } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
  7714. };
  7715. /***/ }),
  7716. /***/ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js":
  7717. /*!****************************************************************************!*\
  7718. !*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
  7719. \****************************************************************************/
  7720. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7721. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  7722. var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "./node_modules/core-js/internals/iterator-close.js");
  7723. // call something on iterator step with safe closing on error
  7724. module.exports = function (iterator, fn, value, ENTRIES) {
  7725. try {
  7726. return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
  7727. } catch (error) {
  7728. iteratorClose(iterator);
  7729. throw error;
  7730. }
  7731. };
  7732. /***/ }),
  7733. /***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js":
  7734. /*!**************************************************************************!*\
  7735. !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***!
  7736. \**************************************************************************/
  7737. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7738. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  7739. var ITERATOR = wellKnownSymbol('iterator');
  7740. var SAFE_CLOSING = false;
  7741. try {
  7742. var called = 0;
  7743. var iteratorWithReturn = {
  7744. next: function () {
  7745. return { done: !!called++ };
  7746. },
  7747. 'return': function () {
  7748. SAFE_CLOSING = true;
  7749. }
  7750. };
  7751. iteratorWithReturn[ITERATOR] = function () {
  7752. return this;
  7753. };
  7754. // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
  7755. Array.from(iteratorWithReturn, function () { throw 2; });
  7756. } catch (error) { /* empty */ }
  7757. module.exports = function (exec, SKIP_CLOSING) {
  7758. if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
  7759. var ITERATION_SUPPORT = false;
  7760. try {
  7761. var object = {};
  7762. object[ITERATOR] = function () {
  7763. return {
  7764. next: function () {
  7765. return { done: ITERATION_SUPPORT = true };
  7766. }
  7767. };
  7768. };
  7769. exec(object);
  7770. } catch (error) { /* empty */ }
  7771. return ITERATION_SUPPORT;
  7772. };
  7773. /***/ }),
  7774. /***/ "./node_modules/core-js/internals/collection-strong.js":
  7775. /*!*************************************************************!*\
  7776. !*** ./node_modules/core-js/internals/collection-strong.js ***!
  7777. \*************************************************************/
  7778. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7779. "use strict";
  7780. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  7781. var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  7782. var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
  7783. var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
  7784. var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
  7785. var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
  7786. var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
  7787. var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
  7788. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  7789. var fastKey = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").fastKey;
  7790. var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
  7791. var setInternalState = InternalStateModule.set;
  7792. var internalStateGetterFor = InternalStateModule.getterFor;
  7793. module.exports = {
  7794. getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
  7795. var C = wrapper(function (that, iterable) {
  7796. anInstance(that, C, CONSTRUCTOR_NAME);
  7797. setInternalState(that, {
  7798. type: CONSTRUCTOR_NAME,
  7799. index: create(null),
  7800. first: undefined,
  7801. last: undefined,
  7802. size: 0
  7803. });
  7804. if (!DESCRIPTORS) that.size = 0;
  7805. if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
  7806. });
  7807. var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
  7808. var define = function (that, key, value) {
  7809. var state = getInternalState(that);
  7810. var entry = getEntry(that, key);
  7811. var previous, index;
  7812. // change existing entry
  7813. if (entry) {
  7814. entry.value = value;
  7815. // create new entry
  7816. } else {
  7817. state.last = entry = {
  7818. index: index = fastKey(key, true),
  7819. key: key,
  7820. value: value,
  7821. previous: previous = state.last,
  7822. next: undefined,
  7823. removed: false
  7824. };
  7825. if (!state.first) state.first = entry;
  7826. if (previous) previous.next = entry;
  7827. if (DESCRIPTORS) state.size++;
  7828. else that.size++;
  7829. // add to index
  7830. if (index !== 'F') state.index[index] = entry;
  7831. } return that;
  7832. };
  7833. var getEntry = function (that, key) {
  7834. var state = getInternalState(that);
  7835. // fast case
  7836. var index = fastKey(key);
  7837. var entry;
  7838. if (index !== 'F') return state.index[index];
  7839. // frozen object case
  7840. for (entry = state.first; entry; entry = entry.next) {
  7841. if (entry.key == key) return entry;
  7842. }
  7843. };
  7844. redefineAll(C.prototype, {
  7845. // `{ Map, Set }.prototype.clear()` methods
  7846. // https://tc39.es/ecma262/#sec-map.prototype.clear
  7847. // https://tc39.es/ecma262/#sec-set.prototype.clear
  7848. clear: function clear() {
  7849. var that = this;
  7850. var state = getInternalState(that);
  7851. var data = state.index;
  7852. var entry = state.first;
  7853. while (entry) {
  7854. entry.removed = true;
  7855. if (entry.previous) entry.previous = entry.previous.next = undefined;
  7856. delete data[entry.index];
  7857. entry = entry.next;
  7858. }
  7859. state.first = state.last = undefined;
  7860. if (DESCRIPTORS) state.size = 0;
  7861. else that.size = 0;
  7862. },
  7863. // `{ Map, Set }.prototype.delete(key)` methods
  7864. // https://tc39.es/ecma262/#sec-map.prototype.delete
  7865. // https://tc39.es/ecma262/#sec-set.prototype.delete
  7866. 'delete': function (key) {
  7867. var that = this;
  7868. var state = getInternalState(that);
  7869. var entry = getEntry(that, key);
  7870. if (entry) {
  7871. var next = entry.next;
  7872. var prev = entry.previous;
  7873. delete state.index[entry.index];
  7874. entry.removed = true;
  7875. if (prev) prev.next = next;
  7876. if (next) next.previous = prev;
  7877. if (state.first == entry) state.first = next;
  7878. if (state.last == entry) state.last = prev;
  7879. if (DESCRIPTORS) state.size--;
  7880. else that.size--;
  7881. } return !!entry;
  7882. },
  7883. // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
  7884. // https://tc39.es/ecma262/#sec-map.prototype.foreach
  7885. // https://tc39.es/ecma262/#sec-set.prototype.foreach
  7886. forEach: function forEach(callbackfn /* , that = undefined */) {
  7887. var state = getInternalState(this);
  7888. var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
  7889. var entry;
  7890. while (entry = entry ? entry.next : state.first) {
  7891. boundFunction(entry.value, entry.key, this);
  7892. // revert to the last existing entry
  7893. while (entry && entry.removed) entry = entry.previous;
  7894. }
  7895. },
  7896. // `{ Map, Set}.prototype.has(key)` methods
  7897. // https://tc39.es/ecma262/#sec-map.prototype.has
  7898. // https://tc39.es/ecma262/#sec-set.prototype.has
  7899. has: function has(key) {
  7900. return !!getEntry(this, key);
  7901. }
  7902. });
  7903. redefineAll(C.prototype, IS_MAP ? {
  7904. // `Map.prototype.get(key)` method
  7905. // https://tc39.es/ecma262/#sec-map.prototype.get
  7906. get: function get(key) {
  7907. var entry = getEntry(this, key);
  7908. return entry && entry.value;
  7909. },
  7910. // `Map.prototype.set(key, value)` method
  7911. // https://tc39.es/ecma262/#sec-map.prototype.set
  7912. set: function set(key, value) {
  7913. return define(this, key === 0 ? 0 : key, value);
  7914. }
  7915. } : {
  7916. // `Set.prototype.add(value)` method
  7917. // https://tc39.es/ecma262/#sec-set.prototype.add
  7918. add: function add(value) {
  7919. return define(this, value = value === 0 ? 0 : value, value);
  7920. }
  7921. });
  7922. if (DESCRIPTORS) defineProperty(C.prototype, 'size', {
  7923. get: function () {
  7924. return getInternalState(this).size;
  7925. }
  7926. });
  7927. return C;
  7928. },
  7929. setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {
  7930. var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
  7931. var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
  7932. var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
  7933. // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
  7934. // https://tc39.es/ecma262/#sec-map.prototype.entries
  7935. // https://tc39.es/ecma262/#sec-map.prototype.keys
  7936. // https://tc39.es/ecma262/#sec-map.prototype.values
  7937. // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
  7938. // https://tc39.es/ecma262/#sec-set.prototype.entries
  7939. // https://tc39.es/ecma262/#sec-set.prototype.keys
  7940. // https://tc39.es/ecma262/#sec-set.prototype.values
  7941. // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
  7942. defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
  7943. setInternalState(this, {
  7944. type: ITERATOR_NAME,
  7945. target: iterated,
  7946. state: getInternalCollectionState(iterated),
  7947. kind: kind,
  7948. last: undefined
  7949. });
  7950. }, function () {
  7951. var state = getInternalIteratorState(this);
  7952. var kind = state.kind;
  7953. var entry = state.last;
  7954. // revert to the last existing entry
  7955. while (entry && entry.removed) entry = entry.previous;
  7956. // get next entry
  7957. if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
  7958. // or finish the iteration
  7959. state.target = undefined;
  7960. return { value: undefined, done: true };
  7961. }
  7962. // return step by kind
  7963. if (kind == 'keys') return { value: entry.key, done: false };
  7964. if (kind == 'values') return { value: entry.value, done: false };
  7965. return { value: [entry.key, entry.value], done: false };
  7966. }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
  7967. // `{ Map, Set }.prototype[@@species]` accessors
  7968. // https://tc39.es/ecma262/#sec-get-map-@@species
  7969. // https://tc39.es/ecma262/#sec-get-set-@@species
  7970. setSpecies(CONSTRUCTOR_NAME);
  7971. }
  7972. };
  7973. /***/ }),
  7974. /***/ "./node_modules/core-js/internals/collection.js":
  7975. /*!******************************************************!*\
  7976. !*** ./node_modules/core-js/internals/collection.js ***!
  7977. \******************************************************/
  7978. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  7979. "use strict";
  7980. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  7981. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  7982. var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
  7983. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  7984. var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js");
  7985. var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
  7986. var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
  7987. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  7988. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  7989. var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
  7990. var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
  7991. var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
  7992. module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
  7993. var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
  7994. var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
  7995. var ADDER = IS_MAP ? 'set' : 'add';
  7996. var NativeConstructor = global[CONSTRUCTOR_NAME];
  7997. var NativePrototype = NativeConstructor && NativeConstructor.prototype;
  7998. var Constructor = NativeConstructor;
  7999. var exported = {};
  8000. var fixMethod = function (KEY) {
  8001. var nativeMethod = NativePrototype[KEY];
  8002. redefine(NativePrototype, KEY,
  8003. KEY == 'add' ? function add(value) {
  8004. nativeMethod.call(this, value === 0 ? 0 : value);
  8005. return this;
  8006. } : KEY == 'delete' ? function (key) {
  8007. return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
  8008. } : KEY == 'get' ? function get(key) {
  8009. return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);
  8010. } : KEY == 'has' ? function has(key) {
  8011. return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
  8012. } : function set(key, value) {
  8013. nativeMethod.call(this, key === 0 ? 0 : key, value);
  8014. return this;
  8015. }
  8016. );
  8017. };
  8018. var REPLACE = isForced(
  8019. CONSTRUCTOR_NAME,
  8020. typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {
  8021. new NativeConstructor().entries().next();
  8022. }))
  8023. );
  8024. if (REPLACE) {
  8025. // create collection constructor
  8026. Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
  8027. InternalMetadataModule.REQUIRED = true;
  8028. } else if (isForced(CONSTRUCTOR_NAME, true)) {
  8029. var instance = new Constructor();
  8030. // early implementations not supports chaining
  8031. var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
  8032. // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
  8033. var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });
  8034. // most early implementations doesn't supports iterables, most modern - not close it correctly
  8035. // eslint-disable-next-line no-new -- required for testing
  8036. var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });
  8037. // for early implementations -0 and +0 not the same
  8038. var BUGGY_ZERO = !IS_WEAK && fails(function () {
  8039. // V8 ~ Chromium 42- fails only with 5+ elements
  8040. var $instance = new NativeConstructor();
  8041. var index = 5;
  8042. while (index--) $instance[ADDER](index, index);
  8043. return !$instance.has(-0);
  8044. });
  8045. if (!ACCEPT_ITERABLES) {
  8046. Constructor = wrapper(function (dummy, iterable) {
  8047. anInstance(dummy, Constructor, CONSTRUCTOR_NAME);
  8048. var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);
  8049. if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
  8050. return that;
  8051. });
  8052. Constructor.prototype = NativePrototype;
  8053. NativePrototype.constructor = Constructor;
  8054. }
  8055. if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
  8056. fixMethod('delete');
  8057. fixMethod('has');
  8058. IS_MAP && fixMethod('get');
  8059. }
  8060. if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
  8061. // weak collections should not contains .clear method
  8062. if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;
  8063. }
  8064. exported[CONSTRUCTOR_NAME] = Constructor;
  8065. $({ global: true, forced: Constructor != NativeConstructor }, exported);
  8066. setToStringTag(Constructor, CONSTRUCTOR_NAME);
  8067. if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
  8068. return Constructor;
  8069. };
  8070. /***/ }),
  8071. /***/ "./node_modules/core-js/internals/correct-is-regexp-logic.js":
  8072. /*!*******************************************************************!*\
  8073. !*** ./node_modules/core-js/internals/correct-is-regexp-logic.js ***!
  8074. \*******************************************************************/
  8075. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8076. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  8077. var MATCH = wellKnownSymbol('match');
  8078. module.exports = function (METHOD_NAME) {
  8079. var regexp = /./;
  8080. try {
  8081. '/./'[METHOD_NAME](regexp);
  8082. } catch (error1) {
  8083. try {
  8084. regexp[MATCH] = false;
  8085. return '/./'[METHOD_NAME](regexp);
  8086. } catch (error2) { /* empty */ }
  8087. } return false;
  8088. };
  8089. /***/ }),
  8090. /***/ "./node_modules/core-js/internals/correct-prototype-getter.js":
  8091. /*!********************************************************************!*\
  8092. !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***!
  8093. \********************************************************************/
  8094. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8095. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  8096. module.exports = !fails(function () {
  8097. function F() { /* empty */ }
  8098. F.prototype.constructor = null;
  8099. // eslint-disable-next-line es/no-object-getprototypeof -- required for testing
  8100. return Object.getPrototypeOf(new F()) !== F.prototype;
  8101. });
  8102. /***/ }),
  8103. /***/ "./node_modules/core-js/internals/create-iterator-constructor.js":
  8104. /*!***********************************************************************!*\
  8105. !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***!
  8106. \***********************************************************************/
  8107. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8108. "use strict";
  8109. var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype;
  8110. var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  8111. var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
  8112. var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
  8113. var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
  8114. var returnThis = function () { return this; };
  8115. module.exports = function (IteratorConstructor, NAME, next) {
  8116. var TO_STRING_TAG = NAME + ' Iterator';
  8117. IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
  8118. setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
  8119. Iterators[TO_STRING_TAG] = returnThis;
  8120. return IteratorConstructor;
  8121. };
  8122. /***/ }),
  8123. /***/ "./node_modules/core-js/internals/create-property.js":
  8124. /*!***********************************************************!*\
  8125. !*** ./node_modules/core-js/internals/create-property.js ***!
  8126. \***********************************************************/
  8127. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8128. "use strict";
  8129. var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
  8130. var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
  8131. var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
  8132. module.exports = function (object, key, value) {
  8133. var propertyKey = toPrimitive(key);
  8134. if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
  8135. else object[propertyKey] = value;
  8136. };
  8137. /***/ }),
  8138. /***/ "./node_modules/core-js/internals/define-iterator.js":
  8139. /*!***********************************************************!*\
  8140. !*** ./node_modules/core-js/internals/define-iterator.js ***!
  8141. \***********************************************************/
  8142. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8143. "use strict";
  8144. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  8145. var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js");
  8146. var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
  8147. var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
  8148. var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
  8149. var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
  8150. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  8151. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  8152. var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
  8153. var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
  8154. var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js");
  8155. var IteratorPrototype = IteratorsCore.IteratorPrototype;
  8156. var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
  8157. var ITERATOR = wellKnownSymbol('iterator');
  8158. var KEYS = 'keys';
  8159. var VALUES = 'values';
  8160. var ENTRIES = 'entries';
  8161. var returnThis = function () { return this; };
  8162. module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
  8163. createIteratorConstructor(IteratorConstructor, NAME, next);
  8164. var getIterationMethod = function (KIND) {
  8165. if (KIND === DEFAULT && defaultIterator) return defaultIterator;
  8166. if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
  8167. switch (KIND) {
  8168. case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
  8169. case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
  8170. case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
  8171. } return function () { return new IteratorConstructor(this); };
  8172. };
  8173. var TO_STRING_TAG = NAME + ' Iterator';
  8174. var INCORRECT_VALUES_NAME = false;
  8175. var IterablePrototype = Iterable.prototype;
  8176. var nativeIterator = IterablePrototype[ITERATOR]
  8177. || IterablePrototype['@@iterator']
  8178. || DEFAULT && IterablePrototype[DEFAULT];
  8179. var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
  8180. var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
  8181. var CurrentIteratorPrototype, methods, KEY;
  8182. // fix native
  8183. if (anyNativeIterator) {
  8184. CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
  8185. if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
  8186. if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
  8187. if (setPrototypeOf) {
  8188. setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
  8189. } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {
  8190. createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);
  8191. }
  8192. }
  8193. // Set @@toStringTag to native iterators
  8194. setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
  8195. if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
  8196. }
  8197. }
  8198. // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
  8199. if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
  8200. INCORRECT_VALUES_NAME = true;
  8201. defaultIterator = function values() { return nativeIterator.call(this); };
  8202. }
  8203. // define iterator
  8204. if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
  8205. createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);
  8206. }
  8207. Iterators[NAME] = defaultIterator;
  8208. // export additional methods
  8209. if (DEFAULT) {
  8210. methods = {
  8211. values: getIterationMethod(VALUES),
  8212. keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
  8213. entries: getIterationMethod(ENTRIES)
  8214. };
  8215. if (FORCED) for (KEY in methods) {
  8216. if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
  8217. redefine(IterablePrototype, KEY, methods[KEY]);
  8218. }
  8219. } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
  8220. }
  8221. return methods;
  8222. };
  8223. /***/ }),
  8224. /***/ "./node_modules/core-js/internals/define-well-known-symbol.js":
  8225. /*!********************************************************************!*\
  8226. !*** ./node_modules/core-js/internals/define-well-known-symbol.js ***!
  8227. \********************************************************************/
  8228. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8229. var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js");
  8230. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  8231. var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js");
  8232. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  8233. module.exports = function (NAME) {
  8234. var Symbol = path.Symbol || (path.Symbol = {});
  8235. if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {
  8236. value: wrappedWellKnownSymbolModule.f(NAME)
  8237. });
  8238. };
  8239. /***/ }),
  8240. /***/ "./node_modules/core-js/internals/dom-iterables.js":
  8241. /*!*********************************************************!*\
  8242. !*** ./node_modules/core-js/internals/dom-iterables.js ***!
  8243. \*********************************************************/
  8244. /***/ ((module) => {
  8245. // iterable DOM collections
  8246. // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
  8247. module.exports = {
  8248. CSSRuleList: 0,
  8249. CSSStyleDeclaration: 0,
  8250. CSSValueList: 0,
  8251. ClientRectList: 0,
  8252. DOMRectList: 0,
  8253. DOMStringList: 0,
  8254. DOMTokenList: 1,
  8255. DataTransferItemList: 0,
  8256. FileList: 0,
  8257. HTMLAllCollection: 0,
  8258. HTMLCollection: 0,
  8259. HTMLFormElement: 0,
  8260. HTMLSelectElement: 0,
  8261. MediaList: 0,
  8262. MimeTypeArray: 0,
  8263. NamedNodeMap: 0,
  8264. NodeList: 1,
  8265. PaintRequestList: 0,
  8266. Plugin: 0,
  8267. PluginArray: 0,
  8268. SVGLengthList: 0,
  8269. SVGNumberList: 0,
  8270. SVGPathSegList: 0,
  8271. SVGPointList: 0,
  8272. SVGStringList: 0,
  8273. SVGTransformList: 0,
  8274. SourceBufferList: 0,
  8275. StyleSheetList: 0,
  8276. TextTrackCueList: 0,
  8277. TextTrackList: 0,
  8278. TouchList: 0
  8279. };
  8280. /***/ }),
  8281. /***/ "./node_modules/core-js/internals/engine-is-browser.js":
  8282. /*!*************************************************************!*\
  8283. !*** ./node_modules/core-js/internals/engine-is-browser.js ***!
  8284. \*************************************************************/
  8285. /***/ ((module) => {
  8286. module.exports = typeof window == 'object';
  8287. /***/ }),
  8288. /***/ "./node_modules/core-js/internals/engine-is-ios.js":
  8289. /*!*********************************************************!*\
  8290. !*** ./node_modules/core-js/internals/engine-is-ios.js ***!
  8291. \*********************************************************/
  8292. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8293. var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
  8294. module.exports = /(?:iphone|ipod|ipad).*applewebkit/i.test(userAgent);
  8295. /***/ }),
  8296. /***/ "./node_modules/core-js/internals/engine-is-node.js":
  8297. /*!**********************************************************!*\
  8298. !*** ./node_modules/core-js/internals/engine-is-node.js ***!
  8299. \**********************************************************/
  8300. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8301. var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
  8302. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  8303. module.exports = classof(global.process) == 'process';
  8304. /***/ }),
  8305. /***/ "./node_modules/core-js/internals/engine-is-webos-webkit.js":
  8306. /*!******************************************************************!*\
  8307. !*** ./node_modules/core-js/internals/engine-is-webos-webkit.js ***!
  8308. \******************************************************************/
  8309. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8310. var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
  8311. module.exports = /web0s(?!.*chrome)/i.test(userAgent);
  8312. /***/ }),
  8313. /***/ "./node_modules/core-js/internals/freezing.js":
  8314. /*!****************************************************!*\
  8315. !*** ./node_modules/core-js/internals/freezing.js ***!
  8316. \****************************************************/
  8317. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8318. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  8319. module.exports = !fails(function () {
  8320. // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing
  8321. return Object.isExtensible(Object.preventExtensions({}));
  8322. });
  8323. /***/ }),
  8324. /***/ "./node_modules/core-js/internals/function-bind-context.js":
  8325. /*!*****************************************************************!*\
  8326. !*** ./node_modules/core-js/internals/function-bind-context.js ***!
  8327. \*****************************************************************/
  8328. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8329. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  8330. // optional / simple context binding
  8331. module.exports = function (fn, that, length) {
  8332. aFunction(fn);
  8333. if (that === undefined) return fn;
  8334. switch (length) {
  8335. case 0: return function () {
  8336. return fn.call(that);
  8337. };
  8338. case 1: return function (a) {
  8339. return fn.call(that, a);
  8340. };
  8341. case 2: return function (a, b) {
  8342. return fn.call(that, a, b);
  8343. };
  8344. case 3: return function (a, b, c) {
  8345. return fn.call(that, a, b, c);
  8346. };
  8347. }
  8348. return function (/* ...args */) {
  8349. return fn.apply(that, arguments);
  8350. };
  8351. };
  8352. /***/ }),
  8353. /***/ "./node_modules/core-js/internals/function-bind.js":
  8354. /*!*********************************************************!*\
  8355. !*** ./node_modules/core-js/internals/function-bind.js ***!
  8356. \*********************************************************/
  8357. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8358. "use strict";
  8359. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  8360. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  8361. var slice = [].slice;
  8362. var factories = {};
  8363. var construct = function (C, argsLength, args) {
  8364. if (!(argsLength in factories)) {
  8365. for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
  8366. // eslint-disable-next-line no-new-func -- we have no proper alternatives, IE8- only
  8367. factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');
  8368. } return factories[argsLength](C, args);
  8369. };
  8370. // `Function.prototype.bind` method implementation
  8371. // https://tc39.es/ecma262/#sec-function.prototype.bind
  8372. module.exports = Function.bind || function bind(that /* , ...args */) {
  8373. var fn = aFunction(this);
  8374. var partArgs = slice.call(arguments, 1);
  8375. var boundFunction = function bound(/* args... */) {
  8376. var args = partArgs.concat(slice.call(arguments));
  8377. return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);
  8378. };
  8379. if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;
  8380. return boundFunction;
  8381. };
  8382. /***/ }),
  8383. /***/ "./node_modules/core-js/internals/get-iterator-method.js":
  8384. /*!***************************************************************!*\
  8385. !*** ./node_modules/core-js/internals/get-iterator-method.js ***!
  8386. \***************************************************************/
  8387. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8388. var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
  8389. var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
  8390. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  8391. var ITERATOR = wellKnownSymbol('iterator');
  8392. module.exports = function (it) {
  8393. if (it != undefined) return it[ITERATOR]
  8394. || it['@@iterator']
  8395. || Iterators[classof(it)];
  8396. };
  8397. /***/ }),
  8398. /***/ "./node_modules/core-js/internals/host-report-errors.js":
  8399. /*!**************************************************************!*\
  8400. !*** ./node_modules/core-js/internals/host-report-errors.js ***!
  8401. \**************************************************************/
  8402. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8403. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  8404. module.exports = function (a, b) {
  8405. var console = global.console;
  8406. if (console && console.error) {
  8407. arguments.length === 1 ? console.error(a) : console.error(a, b);
  8408. }
  8409. };
  8410. /***/ }),
  8411. /***/ "./node_modules/core-js/internals/html.js":
  8412. /*!************************************************!*\
  8413. !*** ./node_modules/core-js/internals/html.js ***!
  8414. \************************************************/
  8415. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8416. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  8417. module.exports = getBuiltIn('document', 'documentElement');
  8418. /***/ }),
  8419. /***/ "./node_modules/core-js/internals/inherit-if-required.js":
  8420. /*!***************************************************************!*\
  8421. !*** ./node_modules/core-js/internals/inherit-if-required.js ***!
  8422. \***************************************************************/
  8423. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8424. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  8425. var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
  8426. // makes subclassing work correct for wrapped built-ins
  8427. module.exports = function ($this, dummy, Wrapper) {
  8428. var NewTarget, NewTargetPrototype;
  8429. if (
  8430. // it can work only with native `setPrototypeOf`
  8431. setPrototypeOf &&
  8432. // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
  8433. typeof (NewTarget = dummy.constructor) == 'function' &&
  8434. NewTarget !== Wrapper &&
  8435. isObject(NewTargetPrototype = NewTarget.prototype) &&
  8436. NewTargetPrototype !== Wrapper.prototype
  8437. ) setPrototypeOf($this, NewTargetPrototype);
  8438. return $this;
  8439. };
  8440. /***/ }),
  8441. /***/ "./node_modules/core-js/internals/internal-metadata.js":
  8442. /*!*************************************************************!*\
  8443. !*** ./node_modules/core-js/internals/internal-metadata.js ***!
  8444. \*************************************************************/
  8445. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8446. var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
  8447. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  8448. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  8449. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  8450. var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
  8451. var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
  8452. var METADATA = uid('meta');
  8453. var id = 0;
  8454. // eslint-disable-next-line es/no-object-isextensible -- safe
  8455. var isExtensible = Object.isExtensible || function () {
  8456. return true;
  8457. };
  8458. var setMetadata = function (it) {
  8459. defineProperty(it, METADATA, { value: {
  8460. objectID: 'O' + ++id, // object ID
  8461. weakData: {} // weak collections IDs
  8462. } });
  8463. };
  8464. var fastKey = function (it, create) {
  8465. // return a primitive with prefix
  8466. if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  8467. if (!has(it, METADATA)) {
  8468. // can't set metadata to uncaught frozen object
  8469. if (!isExtensible(it)) return 'F';
  8470. // not necessary to add metadata
  8471. if (!create) return 'E';
  8472. // add missing metadata
  8473. setMetadata(it);
  8474. // return object ID
  8475. } return it[METADATA].objectID;
  8476. };
  8477. var getWeakData = function (it, create) {
  8478. if (!has(it, METADATA)) {
  8479. // can't set metadata to uncaught frozen object
  8480. if (!isExtensible(it)) return true;
  8481. // not necessary to add metadata
  8482. if (!create) return false;
  8483. // add missing metadata
  8484. setMetadata(it);
  8485. // return the store of weak collections IDs
  8486. } return it[METADATA].weakData;
  8487. };
  8488. // add metadata on freeze-family methods calling
  8489. var onFreeze = function (it) {
  8490. if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
  8491. return it;
  8492. };
  8493. var meta = module.exports = {
  8494. REQUIRED: false,
  8495. fastKey: fastKey,
  8496. getWeakData: getWeakData,
  8497. onFreeze: onFreeze
  8498. };
  8499. hiddenKeys[METADATA] = true;
  8500. /***/ }),
  8501. /***/ "./node_modules/core-js/internals/is-array-iterator-method.js":
  8502. /*!********************************************************************!*\
  8503. !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***!
  8504. \********************************************************************/
  8505. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8506. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  8507. var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
  8508. var ITERATOR = wellKnownSymbol('iterator');
  8509. var ArrayPrototype = Array.prototype;
  8510. // check on default Array iterator
  8511. module.exports = function (it) {
  8512. return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
  8513. };
  8514. /***/ }),
  8515. /***/ "./node_modules/core-js/internals/is-array.js":
  8516. /*!****************************************************!*\
  8517. !*** ./node_modules/core-js/internals/is-array.js ***!
  8518. \****************************************************/
  8519. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8520. var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
  8521. // `IsArray` abstract operation
  8522. // https://tc39.es/ecma262/#sec-isarray
  8523. // eslint-disable-next-line es/no-array-isarray -- safe
  8524. module.exports = Array.isArray || function isArray(arg) {
  8525. return classof(arg) == 'Array';
  8526. };
  8527. /***/ }),
  8528. /***/ "./node_modules/core-js/internals/iterate.js":
  8529. /*!***************************************************!*\
  8530. !*** ./node_modules/core-js/internals/iterate.js ***!
  8531. \***************************************************/
  8532. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8533. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8534. var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js");
  8535. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  8536. var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
  8537. var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
  8538. var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "./node_modules/core-js/internals/iterator-close.js");
  8539. var Result = function (stopped, result) {
  8540. this.stopped = stopped;
  8541. this.result = result;
  8542. };
  8543. module.exports = function (iterable, unboundFunction, options) {
  8544. var that = options && options.that;
  8545. var AS_ENTRIES = !!(options && options.AS_ENTRIES);
  8546. var IS_ITERATOR = !!(options && options.IS_ITERATOR);
  8547. var INTERRUPTED = !!(options && options.INTERRUPTED);
  8548. var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);
  8549. var iterator, iterFn, index, length, result, next, step;
  8550. var stop = function (condition) {
  8551. if (iterator) iteratorClose(iterator);
  8552. return new Result(true, condition);
  8553. };
  8554. var callFn = function (value) {
  8555. if (AS_ENTRIES) {
  8556. anObject(value);
  8557. return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
  8558. } return INTERRUPTED ? fn(value, stop) : fn(value);
  8559. };
  8560. if (IS_ITERATOR) {
  8561. iterator = iterable;
  8562. } else {
  8563. iterFn = getIteratorMethod(iterable);
  8564. if (typeof iterFn != 'function') throw TypeError('Target is not iterable');
  8565. // optimisation for array iterators
  8566. if (isArrayIteratorMethod(iterFn)) {
  8567. for (index = 0, length = toLength(iterable.length); length > index; index++) {
  8568. result = callFn(iterable[index]);
  8569. if (result && result instanceof Result) return result;
  8570. } return new Result(false);
  8571. }
  8572. iterator = iterFn.call(iterable);
  8573. }
  8574. next = iterator.next;
  8575. while (!(step = next.call(iterator)).done) {
  8576. try {
  8577. result = callFn(step.value);
  8578. } catch (error) {
  8579. iteratorClose(iterator);
  8580. throw error;
  8581. }
  8582. if (typeof result == 'object' && result && result instanceof Result) return result;
  8583. } return new Result(false);
  8584. };
  8585. /***/ }),
  8586. /***/ "./node_modules/core-js/internals/iterator-close.js":
  8587. /*!**********************************************************!*\
  8588. !*** ./node_modules/core-js/internals/iterator-close.js ***!
  8589. \**********************************************************/
  8590. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8591. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8592. module.exports = function (iterator) {
  8593. var returnMethod = iterator['return'];
  8594. if (returnMethod !== undefined) {
  8595. return anObject(returnMethod.call(iterator)).value;
  8596. }
  8597. };
  8598. /***/ }),
  8599. /***/ "./node_modules/core-js/internals/iterators-core.js":
  8600. /*!**********************************************************!*\
  8601. !*** ./node_modules/core-js/internals/iterators-core.js ***!
  8602. \**********************************************************/
  8603. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8604. "use strict";
  8605. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  8606. var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
  8607. var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
  8608. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  8609. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  8610. var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
  8611. var ITERATOR = wellKnownSymbol('iterator');
  8612. var BUGGY_SAFARI_ITERATORS = false;
  8613. var returnThis = function () { return this; };
  8614. // `%IteratorPrototype%` object
  8615. // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
  8616. var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
  8617. /* eslint-disable es/no-array-prototype-keys -- safe */
  8618. if ([].keys) {
  8619. arrayIterator = [].keys();
  8620. // Safari 8 has buggy iterators w/o `next`
  8621. if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
  8622. else {
  8623. PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
  8624. if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
  8625. }
  8626. }
  8627. var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
  8628. var test = {};
  8629. // FF44- legacy iterators case
  8630. return IteratorPrototype[ITERATOR].call(test) !== test;
  8631. });
  8632. if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
  8633. // `%IteratorPrototype%[@@iterator]()` method
  8634. // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
  8635. if ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {
  8636. createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
  8637. }
  8638. module.exports = {
  8639. IteratorPrototype: IteratorPrototype,
  8640. BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
  8641. };
  8642. /***/ }),
  8643. /***/ "./node_modules/core-js/internals/iterators.js":
  8644. /*!*****************************************************!*\
  8645. !*** ./node_modules/core-js/internals/iterators.js ***!
  8646. \*****************************************************/
  8647. /***/ ((module) => {
  8648. module.exports = {};
  8649. /***/ }),
  8650. /***/ "./node_modules/core-js/internals/microtask.js":
  8651. /*!*****************************************************!*\
  8652. !*** ./node_modules/core-js/internals/microtask.js ***!
  8653. \*****************************************************/
  8654. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8655. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  8656. var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
  8657. var macrotask = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set;
  8658. var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js");
  8659. var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "./node_modules/core-js/internals/engine-is-webos-webkit.js");
  8660. var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
  8661. var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
  8662. var document = global.document;
  8663. var process = global.process;
  8664. var Promise = global.Promise;
  8665. // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
  8666. var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
  8667. var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
  8668. var flush, head, last, notify, toggle, node, promise, then;
  8669. // modern engines have queueMicrotask method
  8670. if (!queueMicrotask) {
  8671. flush = function () {
  8672. var parent, fn;
  8673. if (IS_NODE && (parent = process.domain)) parent.exit();
  8674. while (head) {
  8675. fn = head.fn;
  8676. head = head.next;
  8677. try {
  8678. fn();
  8679. } catch (error) {
  8680. if (head) notify();
  8681. else last = undefined;
  8682. throw error;
  8683. }
  8684. } last = undefined;
  8685. if (parent) parent.enter();
  8686. };
  8687. // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
  8688. // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
  8689. if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {
  8690. toggle = true;
  8691. node = document.createTextNode('');
  8692. new MutationObserver(flush).observe(node, { characterData: true });
  8693. notify = function () {
  8694. node.data = toggle = !toggle;
  8695. };
  8696. // environments with maybe non-completely correct, but existent Promise
  8697. } else if (Promise && Promise.resolve) {
  8698. // Promise.resolve without an argument throws an error in LG WebOS 2
  8699. promise = Promise.resolve(undefined);
  8700. // workaround of WebKit ~ iOS Safari 10.1 bug
  8701. promise.constructor = Promise;
  8702. then = promise.then;
  8703. notify = function () {
  8704. then.call(promise, flush);
  8705. };
  8706. // Node.js without promises
  8707. } else if (IS_NODE) {
  8708. notify = function () {
  8709. process.nextTick(flush);
  8710. };
  8711. // for other environments - macrotask based on:
  8712. // - setImmediate
  8713. // - MessageChannel
  8714. // - window.postMessag
  8715. // - onreadystatechange
  8716. // - setTimeout
  8717. } else {
  8718. notify = function () {
  8719. // strange IE + webpack dev server bug - use .call(global)
  8720. macrotask.call(global, flush);
  8721. };
  8722. }
  8723. }
  8724. module.exports = queueMicrotask || function (fn) {
  8725. var task = { fn: fn, next: undefined };
  8726. if (last) last.next = task;
  8727. if (!head) {
  8728. head = task;
  8729. notify();
  8730. } last = task;
  8731. };
  8732. /***/ }),
  8733. /***/ "./node_modules/core-js/internals/native-promise-constructor.js":
  8734. /*!**********************************************************************!*\
  8735. !*** ./node_modules/core-js/internals/native-promise-constructor.js ***!
  8736. \**********************************************************************/
  8737. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8738. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  8739. module.exports = global.Promise;
  8740. /***/ }),
  8741. /***/ "./node_modules/core-js/internals/new-promise-capability.js":
  8742. /*!******************************************************************!*\
  8743. !*** ./node_modules/core-js/internals/new-promise-capability.js ***!
  8744. \******************************************************************/
  8745. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8746. "use strict";
  8747. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  8748. var PromiseCapability = function (C) {
  8749. var resolve, reject;
  8750. this.promise = new C(function ($$resolve, $$reject) {
  8751. if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
  8752. resolve = $$resolve;
  8753. reject = $$reject;
  8754. });
  8755. this.resolve = aFunction(resolve);
  8756. this.reject = aFunction(reject);
  8757. };
  8758. // `NewPromiseCapability` abstract operation
  8759. // https://tc39.es/ecma262/#sec-newpromisecapability
  8760. module.exports.f = function (C) {
  8761. return new PromiseCapability(C);
  8762. };
  8763. /***/ }),
  8764. /***/ "./node_modules/core-js/internals/not-a-regexp.js":
  8765. /*!********************************************************!*\
  8766. !*** ./node_modules/core-js/internals/not-a-regexp.js ***!
  8767. \********************************************************/
  8768. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8769. var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
  8770. module.exports = function (it) {
  8771. if (isRegExp(it)) {
  8772. throw TypeError("The method doesn't accept regular expressions");
  8773. } return it;
  8774. };
  8775. /***/ }),
  8776. /***/ "./node_modules/core-js/internals/object-create.js":
  8777. /*!*********************************************************!*\
  8778. !*** ./node_modules/core-js/internals/object-create.js ***!
  8779. \*********************************************************/
  8780. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8781. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8782. var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js");
  8783. var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js");
  8784. var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
  8785. var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js");
  8786. var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
  8787. var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
  8788. var GT = '>';
  8789. var LT = '<';
  8790. var PROTOTYPE = 'prototype';
  8791. var SCRIPT = 'script';
  8792. var IE_PROTO = sharedKey('IE_PROTO');
  8793. var EmptyConstructor = function () { /* empty */ };
  8794. var scriptTag = function (content) {
  8795. return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
  8796. };
  8797. // Create object with fake `null` prototype: use ActiveX Object with cleared prototype
  8798. var NullProtoObjectViaActiveX = function (activeXDocument) {
  8799. activeXDocument.write(scriptTag(''));
  8800. activeXDocument.close();
  8801. var temp = activeXDocument.parentWindow.Object;
  8802. activeXDocument = null; // avoid memory leak
  8803. return temp;
  8804. };
  8805. // Create object with fake `null` prototype: use iframe Object with cleared prototype
  8806. var NullProtoObjectViaIFrame = function () {
  8807. // Thrash, waste and sodomy: IE GC bug
  8808. var iframe = documentCreateElement('iframe');
  8809. var JS = 'java' + SCRIPT + ':';
  8810. var iframeDocument;
  8811. iframe.style.display = 'none';
  8812. html.appendChild(iframe);
  8813. // https://github.com/zloirock/core-js/issues/475
  8814. iframe.src = String(JS);
  8815. iframeDocument = iframe.contentWindow.document;
  8816. iframeDocument.open();
  8817. iframeDocument.write(scriptTag('document.F=Object'));
  8818. iframeDocument.close();
  8819. return iframeDocument.F;
  8820. };
  8821. // Check for document.domain and active x support
  8822. // No need to use active x approach when document.domain is not set
  8823. // see https://github.com/es-shims/es5-shim/issues/150
  8824. // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
  8825. // avoid IE GC bug
  8826. var activeXDocument;
  8827. var NullProtoObject = function () {
  8828. try {
  8829. /* global ActiveXObject -- old IE */
  8830. activeXDocument = document.domain && new ActiveXObject('htmlfile');
  8831. } catch (error) { /* ignore */ }
  8832. NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();
  8833. var length = enumBugKeys.length;
  8834. while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
  8835. return NullProtoObject();
  8836. };
  8837. hiddenKeys[IE_PROTO] = true;
  8838. // `Object.create` method
  8839. // https://tc39.es/ecma262/#sec-object.create
  8840. module.exports = Object.create || function create(O, Properties) {
  8841. var result;
  8842. if (O !== null) {
  8843. EmptyConstructor[PROTOTYPE] = anObject(O);
  8844. result = new EmptyConstructor();
  8845. EmptyConstructor[PROTOTYPE] = null;
  8846. // add "__proto__" for Object.getPrototypeOf polyfill
  8847. result[IE_PROTO] = O;
  8848. } else result = NullProtoObject();
  8849. return Properties === undefined ? result : defineProperties(result, Properties);
  8850. };
  8851. /***/ }),
  8852. /***/ "./node_modules/core-js/internals/object-define-properties.js":
  8853. /*!********************************************************************!*\
  8854. !*** ./node_modules/core-js/internals/object-define-properties.js ***!
  8855. \********************************************************************/
  8856. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8857. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  8858. var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
  8859. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8860. var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
  8861. // `Object.defineProperties` method
  8862. // https://tc39.es/ecma262/#sec-object.defineproperties
  8863. // eslint-disable-next-line es/no-object-defineproperties -- safe
  8864. module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
  8865. anObject(O);
  8866. var keys = objectKeys(Properties);
  8867. var length = keys.length;
  8868. var index = 0;
  8869. var key;
  8870. while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);
  8871. return O;
  8872. };
  8873. /***/ }),
  8874. /***/ "./node_modules/core-js/internals/object-get-own-property-names-external.js":
  8875. /*!**********************************************************************************!*\
  8876. !*** ./node_modules/core-js/internals/object-get-own-property-names-external.js ***!
  8877. \**********************************************************************************/
  8878. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8879. /* eslint-disable es/no-object-getownpropertynames -- safe */
  8880. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  8881. var $getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
  8882. var toString = {}.toString;
  8883. var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  8884. ? Object.getOwnPropertyNames(window) : [];
  8885. var getWindowNames = function (it) {
  8886. try {
  8887. return $getOwnPropertyNames(it);
  8888. } catch (error) {
  8889. return windowNames.slice();
  8890. }
  8891. };
  8892. // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
  8893. module.exports.f = function getOwnPropertyNames(it) {
  8894. return windowNames && toString.call(it) == '[object Window]'
  8895. ? getWindowNames(it)
  8896. : $getOwnPropertyNames(toIndexedObject(it));
  8897. };
  8898. /***/ }),
  8899. /***/ "./node_modules/core-js/internals/object-get-prototype-of.js":
  8900. /*!*******************************************************************!*\
  8901. !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***!
  8902. \*******************************************************************/
  8903. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8904. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  8905. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  8906. var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
  8907. var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js");
  8908. var IE_PROTO = sharedKey('IE_PROTO');
  8909. var ObjectPrototype = Object.prototype;
  8910. // `Object.getPrototypeOf` method
  8911. // https://tc39.es/ecma262/#sec-object.getprototypeof
  8912. // eslint-disable-next-line es/no-object-getprototypeof -- safe
  8913. module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
  8914. O = toObject(O);
  8915. if (has(O, IE_PROTO)) return O[IE_PROTO];
  8916. if (typeof O.constructor == 'function' && O instanceof O.constructor) {
  8917. return O.constructor.prototype;
  8918. } return O instanceof Object ? ObjectPrototype : null;
  8919. };
  8920. /***/ }),
  8921. /***/ "./node_modules/core-js/internals/object-keys.js":
  8922. /*!*******************************************************!*\
  8923. !*** ./node_modules/core-js/internals/object-keys.js ***!
  8924. \*******************************************************/
  8925. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8926. var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js");
  8927. var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js");
  8928. // `Object.keys` method
  8929. // https://tc39.es/ecma262/#sec-object.keys
  8930. // eslint-disable-next-line es/no-object-keys -- safe
  8931. module.exports = Object.keys || function keys(O) {
  8932. return internalObjectKeys(O, enumBugKeys);
  8933. };
  8934. /***/ }),
  8935. /***/ "./node_modules/core-js/internals/object-set-prototype-of.js":
  8936. /*!*******************************************************************!*\
  8937. !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***!
  8938. \*******************************************************************/
  8939. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8940. /* eslint-disable no-proto -- safe */
  8941. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8942. var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js");
  8943. // `Object.setPrototypeOf` method
  8944. // https://tc39.es/ecma262/#sec-object.setprototypeof
  8945. // Works with __proto__ only. Old v8 can't work with null proto objects.
  8946. // eslint-disable-next-line es/no-object-setprototypeof -- safe
  8947. module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
  8948. var CORRECT_SETTER = false;
  8949. var test = {};
  8950. var setter;
  8951. try {
  8952. // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
  8953. setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
  8954. setter.call(test, []);
  8955. CORRECT_SETTER = test instanceof Array;
  8956. } catch (error) { /* empty */ }
  8957. return function setPrototypeOf(O, proto) {
  8958. anObject(O);
  8959. aPossiblePrototype(proto);
  8960. if (CORRECT_SETTER) setter.call(O, proto);
  8961. else O.__proto__ = proto;
  8962. return O;
  8963. };
  8964. }() : undefined);
  8965. /***/ }),
  8966. /***/ "./node_modules/core-js/internals/perform.js":
  8967. /*!***************************************************!*\
  8968. !*** ./node_modules/core-js/internals/perform.js ***!
  8969. \***************************************************/
  8970. /***/ ((module) => {
  8971. module.exports = function (exec) {
  8972. try {
  8973. return { error: false, value: exec() };
  8974. } catch (error) {
  8975. return { error: true, value: error };
  8976. }
  8977. };
  8978. /***/ }),
  8979. /***/ "./node_modules/core-js/internals/promise-resolve.js":
  8980. /*!***********************************************************!*\
  8981. !*** ./node_modules/core-js/internals/promise-resolve.js ***!
  8982. \***********************************************************/
  8983. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  8984. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  8985. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  8986. var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
  8987. module.exports = function (C, x) {
  8988. anObject(C);
  8989. if (isObject(x) && x.constructor === C) return x;
  8990. var promiseCapability = newPromiseCapability.f(C);
  8991. var resolve = promiseCapability.resolve;
  8992. resolve(x);
  8993. return promiseCapability.promise;
  8994. };
  8995. /***/ }),
  8996. /***/ "./node_modules/core-js/internals/redefine-all.js":
  8997. /*!********************************************************!*\
  8998. !*** ./node_modules/core-js/internals/redefine-all.js ***!
  8999. \********************************************************/
  9000. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9001. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  9002. module.exports = function (target, src, options) {
  9003. for (var key in src) redefine(target, key, src[key], options);
  9004. return target;
  9005. };
  9006. /***/ }),
  9007. /***/ "./node_modules/core-js/internals/set-species.js":
  9008. /*!*******************************************************!*\
  9009. !*** ./node_modules/core-js/internals/set-species.js ***!
  9010. \*******************************************************/
  9011. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9012. "use strict";
  9013. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  9014. var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
  9015. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9016. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  9017. var SPECIES = wellKnownSymbol('species');
  9018. module.exports = function (CONSTRUCTOR_NAME) {
  9019. var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
  9020. var defineProperty = definePropertyModule.f;
  9021. if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {
  9022. defineProperty(Constructor, SPECIES, {
  9023. configurable: true,
  9024. get: function () { return this; }
  9025. });
  9026. }
  9027. };
  9028. /***/ }),
  9029. /***/ "./node_modules/core-js/internals/set-to-string-tag.js":
  9030. /*!*************************************************************!*\
  9031. !*** ./node_modules/core-js/internals/set-to-string-tag.js ***!
  9032. \*************************************************************/
  9033. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9034. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  9035. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  9036. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9037. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  9038. module.exports = function (it, TAG, STATIC) {
  9039. if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {
  9040. defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });
  9041. }
  9042. };
  9043. /***/ }),
  9044. /***/ "./node_modules/core-js/internals/string-trim-forced.js":
  9045. /*!**************************************************************!*\
  9046. !*** ./node_modules/core-js/internals/string-trim-forced.js ***!
  9047. \**************************************************************/
  9048. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9049. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9050. var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
  9051. var non = '\u200B\u0085\u180E';
  9052. // check that a method works with the correct list
  9053. // of whitespaces and has a correct name
  9054. module.exports = function (METHOD_NAME) {
  9055. return fails(function () {
  9056. return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;
  9057. });
  9058. };
  9059. /***/ }),
  9060. /***/ "./node_modules/core-js/internals/string-trim.js":
  9061. /*!*******************************************************!*\
  9062. !*** ./node_modules/core-js/internals/string-trim.js ***!
  9063. \*******************************************************/
  9064. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9065. var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
  9066. var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
  9067. var whitespace = '[' + whitespaces + ']';
  9068. var ltrim = RegExp('^' + whitespace + whitespace + '*');
  9069. var rtrim = RegExp(whitespace + whitespace + '*$');
  9070. // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
  9071. var createMethod = function (TYPE) {
  9072. return function ($this) {
  9073. var string = String(requireObjectCoercible($this));
  9074. if (TYPE & 1) string = string.replace(ltrim, '');
  9075. if (TYPE & 2) string = string.replace(rtrim, '');
  9076. return string;
  9077. };
  9078. };
  9079. module.exports = {
  9080. // `String.prototype.{ trimLeft, trimStart }` methods
  9081. // https://tc39.es/ecma262/#sec-string.prototype.trimstart
  9082. start: createMethod(1),
  9083. // `String.prototype.{ trimRight, trimEnd }` methods
  9084. // https://tc39.es/ecma262/#sec-string.prototype.trimend
  9085. end: createMethod(2),
  9086. // `String.prototype.trim` method
  9087. // https://tc39.es/ecma262/#sec-string.prototype.trim
  9088. trim: createMethod(3)
  9089. };
  9090. /***/ }),
  9091. /***/ "./node_modules/core-js/internals/task.js":
  9092. /*!************************************************!*\
  9093. !*** ./node_modules/core-js/internals/task.js ***!
  9094. \************************************************/
  9095. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9096. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  9097. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9098. var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
  9099. var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js");
  9100. var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
  9101. var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js");
  9102. var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
  9103. var location = global.location;
  9104. var set = global.setImmediate;
  9105. var clear = global.clearImmediate;
  9106. var process = global.process;
  9107. var MessageChannel = global.MessageChannel;
  9108. var Dispatch = global.Dispatch;
  9109. var counter = 0;
  9110. var queue = {};
  9111. var ONREADYSTATECHANGE = 'onreadystatechange';
  9112. var defer, channel, port;
  9113. var run = function (id) {
  9114. // eslint-disable-next-line no-prototype-builtins -- safe
  9115. if (queue.hasOwnProperty(id)) {
  9116. var fn = queue[id];
  9117. delete queue[id];
  9118. fn();
  9119. }
  9120. };
  9121. var runner = function (id) {
  9122. return function () {
  9123. run(id);
  9124. };
  9125. };
  9126. var listener = function (event) {
  9127. run(event.data);
  9128. };
  9129. var post = function (id) {
  9130. // old engines have not location.origin
  9131. global.postMessage(id + '', location.protocol + '//' + location.host);
  9132. };
  9133. // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
  9134. if (!set || !clear) {
  9135. set = function setImmediate(fn) {
  9136. var args = [];
  9137. var i = 1;
  9138. while (arguments.length > i) args.push(arguments[i++]);
  9139. queue[++counter] = function () {
  9140. // eslint-disable-next-line no-new-func -- spec requirement
  9141. (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);
  9142. };
  9143. defer(counter);
  9144. return counter;
  9145. };
  9146. clear = function clearImmediate(id) {
  9147. delete queue[id];
  9148. };
  9149. // Node.js 0.8-
  9150. if (IS_NODE) {
  9151. defer = function (id) {
  9152. process.nextTick(runner(id));
  9153. };
  9154. // Sphere (JS game engine) Dispatch API
  9155. } else if (Dispatch && Dispatch.now) {
  9156. defer = function (id) {
  9157. Dispatch.now(runner(id));
  9158. };
  9159. // Browsers with MessageChannel, includes WebWorkers
  9160. // except iOS - https://github.com/zloirock/core-js/issues/624
  9161. } else if (MessageChannel && !IS_IOS) {
  9162. channel = new MessageChannel();
  9163. port = channel.port2;
  9164. channel.port1.onmessage = listener;
  9165. defer = bind(port.postMessage, port, 1);
  9166. // Browsers with postMessage, skip WebWorkers
  9167. // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
  9168. } else if (
  9169. global.addEventListener &&
  9170. typeof postMessage == 'function' &&
  9171. !global.importScripts &&
  9172. location && location.protocol !== 'file:' &&
  9173. !fails(post)
  9174. ) {
  9175. defer = post;
  9176. global.addEventListener('message', listener, false);
  9177. // IE8-
  9178. } else if (ONREADYSTATECHANGE in createElement('script')) {
  9179. defer = function (id) {
  9180. html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
  9181. html.removeChild(this);
  9182. run(id);
  9183. };
  9184. };
  9185. // Rest old browsers
  9186. } else {
  9187. defer = function (id) {
  9188. setTimeout(runner(id), 0);
  9189. };
  9190. }
  9191. }
  9192. module.exports = {
  9193. set: set,
  9194. clear: clear
  9195. };
  9196. /***/ }),
  9197. /***/ "./node_modules/core-js/internals/well-known-symbol-wrapped.js":
  9198. /*!*********************************************************************!*\
  9199. !*** ./node_modules/core-js/internals/well-known-symbol-wrapped.js ***!
  9200. \*********************************************************************/
  9201. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  9202. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9203. exports.f = wellKnownSymbol;
  9204. /***/ }),
  9205. /***/ "./node_modules/core-js/internals/whitespaces.js":
  9206. /*!*******************************************************!*\
  9207. !*** ./node_modules/core-js/internals/whitespaces.js ***!
  9208. \*******************************************************/
  9209. /***/ ((module) => {
  9210. // a string of all valid unicode whitespaces
  9211. module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
  9212. '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
  9213. /***/ }),
  9214. /***/ "./node_modules/core-js/modules/es.array.concat.js":
  9215. /*!*********************************************************!*\
  9216. !*** ./node_modules/core-js/modules/es.array.concat.js ***!
  9217. \*********************************************************/
  9218. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9219. "use strict";
  9220. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9221. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9222. var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
  9223. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  9224. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  9225. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  9226. var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
  9227. var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
  9228. var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
  9229. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9230. var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
  9231. var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
  9232. var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
  9233. var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
  9234. // We can't use this feature detection in V8 since it causes
  9235. // deoptimization and serious performance degradation
  9236. // https://github.com/zloirock/core-js/issues/679
  9237. var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
  9238. var array = [];
  9239. array[IS_CONCAT_SPREADABLE] = false;
  9240. return array.concat()[0] !== array;
  9241. });
  9242. var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
  9243. var isConcatSpreadable = function (O) {
  9244. if (!isObject(O)) return false;
  9245. var spreadable = O[IS_CONCAT_SPREADABLE];
  9246. return spreadable !== undefined ? !!spreadable : isArray(O);
  9247. };
  9248. var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
  9249. // `Array.prototype.concat` method
  9250. // https://tc39.es/ecma262/#sec-array.prototype.concat
  9251. // with adding support of @@isConcatSpreadable and @@species
  9252. $({ target: 'Array', proto: true, forced: FORCED }, {
  9253. // eslint-disable-next-line no-unused-vars -- required for `.length`
  9254. concat: function concat(arg) {
  9255. var O = toObject(this);
  9256. var A = arraySpeciesCreate(O, 0);
  9257. var n = 0;
  9258. var i, k, length, len, E;
  9259. for (i = -1, length = arguments.length; i < length; i++) {
  9260. E = i === -1 ? O : arguments[i];
  9261. if (isConcatSpreadable(E)) {
  9262. len = toLength(E.length);
  9263. if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
  9264. for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
  9265. } else {
  9266. if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
  9267. createProperty(A, n++, E);
  9268. }
  9269. }
  9270. A.length = n;
  9271. return A;
  9272. }
  9273. });
  9274. /***/ }),
  9275. /***/ "./node_modules/core-js/modules/es.array.every.js":
  9276. /*!********************************************************!*\
  9277. !*** ./node_modules/core-js/modules/es.array.every.js ***!
  9278. \********************************************************/
  9279. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9280. "use strict";
  9281. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9282. var $every = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").every;
  9283. var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
  9284. var STRICT_METHOD = arrayMethodIsStrict('every');
  9285. // `Array.prototype.every` method
  9286. // https://tc39.es/ecma262/#sec-array.prototype.every
  9287. $({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
  9288. every: function every(callbackfn /* , thisArg */) {
  9289. return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  9290. }
  9291. });
  9292. /***/ }),
  9293. /***/ "./node_modules/core-js/modules/es.array.fill.js":
  9294. /*!*******************************************************!*\
  9295. !*** ./node_modules/core-js/modules/es.array.fill.js ***!
  9296. \*******************************************************/
  9297. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9298. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9299. var fill = __webpack_require__(/*! ../internals/array-fill */ "./node_modules/core-js/internals/array-fill.js");
  9300. var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
  9301. // `Array.prototype.fill` method
  9302. // https://tc39.es/ecma262/#sec-array.prototype.fill
  9303. $({ target: 'Array', proto: true }, {
  9304. fill: fill
  9305. });
  9306. // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
  9307. addToUnscopables('fill');
  9308. /***/ }),
  9309. /***/ "./node_modules/core-js/modules/es.array.for-each.js":
  9310. /*!***********************************************************!*\
  9311. !*** ./node_modules/core-js/modules/es.array.for-each.js ***!
  9312. \***********************************************************/
  9313. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9314. "use strict";
  9315. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9316. var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js");
  9317. // `Array.prototype.forEach` method
  9318. // https://tc39.es/ecma262/#sec-array.prototype.foreach
  9319. // eslint-disable-next-line es/no-array-prototype-foreach -- safe
  9320. $({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
  9321. forEach: forEach
  9322. });
  9323. /***/ }),
  9324. /***/ "./node_modules/core-js/modules/es.array.from.js":
  9325. /*!*******************************************************!*\
  9326. !*** ./node_modules/core-js/modules/es.array.from.js ***!
  9327. \*******************************************************/
  9328. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9329. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9330. var from = __webpack_require__(/*! ../internals/array-from */ "./node_modules/core-js/internals/array-from.js");
  9331. var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
  9332. var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
  9333. // eslint-disable-next-line es/no-array-from -- required for testing
  9334. Array.from(iterable);
  9335. });
  9336. // `Array.from` method
  9337. // https://tc39.es/ecma262/#sec-array.from
  9338. $({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
  9339. from: from
  9340. });
  9341. /***/ }),
  9342. /***/ "./node_modules/core-js/modules/es.array.includes.js":
  9343. /*!***********************************************************!*\
  9344. !*** ./node_modules/core-js/modules/es.array.includes.js ***!
  9345. \***********************************************************/
  9346. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9347. "use strict";
  9348. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9349. var $includes = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").includes;
  9350. var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
  9351. // `Array.prototype.includes` method
  9352. // https://tc39.es/ecma262/#sec-array.prototype.includes
  9353. $({ target: 'Array', proto: true }, {
  9354. includes: function includes(el /* , fromIndex = 0 */) {
  9355. return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
  9356. }
  9357. });
  9358. // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
  9359. addToUnscopables('includes');
  9360. /***/ }),
  9361. /***/ "./node_modules/core-js/modules/es.array.iterator.js":
  9362. /*!***********************************************************!*\
  9363. !*** ./node_modules/core-js/modules/es.array.iterator.js ***!
  9364. \***********************************************************/
  9365. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9366. "use strict";
  9367. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  9368. var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
  9369. var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
  9370. var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
  9371. var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
  9372. var ARRAY_ITERATOR = 'Array Iterator';
  9373. var setInternalState = InternalStateModule.set;
  9374. var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
  9375. // `Array.prototype.entries` method
  9376. // https://tc39.es/ecma262/#sec-array.prototype.entries
  9377. // `Array.prototype.keys` method
  9378. // https://tc39.es/ecma262/#sec-array.prototype.keys
  9379. // `Array.prototype.values` method
  9380. // https://tc39.es/ecma262/#sec-array.prototype.values
  9381. // `Array.prototype[@@iterator]` method
  9382. // https://tc39.es/ecma262/#sec-array.prototype-@@iterator
  9383. // `CreateArrayIterator` internal method
  9384. // https://tc39.es/ecma262/#sec-createarrayiterator
  9385. module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
  9386. setInternalState(this, {
  9387. type: ARRAY_ITERATOR,
  9388. target: toIndexedObject(iterated), // target
  9389. index: 0, // next index
  9390. kind: kind // kind
  9391. });
  9392. // `%ArrayIteratorPrototype%.next` method
  9393. // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
  9394. }, function () {
  9395. var state = getInternalState(this);
  9396. var target = state.target;
  9397. var kind = state.kind;
  9398. var index = state.index++;
  9399. if (!target || index >= target.length) {
  9400. state.target = undefined;
  9401. return { value: undefined, done: true };
  9402. }
  9403. if (kind == 'keys') return { value: index, done: false };
  9404. if (kind == 'values') return { value: target[index], done: false };
  9405. return { value: [index, target[index]], done: false };
  9406. }, 'values');
  9407. // argumentsList[@@iterator] is %ArrayProto_values%
  9408. // https://tc39.es/ecma262/#sec-createunmappedargumentsobject
  9409. // https://tc39.es/ecma262/#sec-createmappedargumentsobject
  9410. Iterators.Arguments = Iterators.Array;
  9411. // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
  9412. addToUnscopables('keys');
  9413. addToUnscopables('values');
  9414. addToUnscopables('entries');
  9415. /***/ }),
  9416. /***/ "./node_modules/core-js/modules/es.array.map.js":
  9417. /*!******************************************************!*\
  9418. !*** ./node_modules/core-js/modules/es.array.map.js ***!
  9419. \******************************************************/
  9420. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9421. "use strict";
  9422. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9423. var $map = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").map;
  9424. var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
  9425. var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
  9426. // `Array.prototype.map` method
  9427. // https://tc39.es/ecma262/#sec-array.prototype.map
  9428. // with adding support of @@species
  9429. $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  9430. map: function map(callbackfn /* , thisArg */) {
  9431. return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  9432. }
  9433. });
  9434. /***/ }),
  9435. /***/ "./node_modules/core-js/modules/es.array.reduce.js":
  9436. /*!*********************************************************!*\
  9437. !*** ./node_modules/core-js/modules/es.array.reduce.js ***!
  9438. \*********************************************************/
  9439. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9440. "use strict";
  9441. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9442. var $reduce = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js/internals/array-reduce.js").left;
  9443. var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
  9444. var CHROME_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
  9445. var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
  9446. var STRICT_METHOD = arrayMethodIsStrict('reduce');
  9447. // Chrome 80-82 has a critical bug
  9448. // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
  9449. var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
  9450. // `Array.prototype.reduce` method
  9451. // https://tc39.es/ecma262/#sec-array.prototype.reduce
  9452. $({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
  9453. reduce: function reduce(callbackfn /* , initialValue */) {
  9454. return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
  9455. }
  9456. });
  9457. /***/ }),
  9458. /***/ "./node_modules/core-js/modules/es.array.reverse.js":
  9459. /*!**********************************************************!*\
  9460. !*** ./node_modules/core-js/modules/es.array.reverse.js ***!
  9461. \**********************************************************/
  9462. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9463. "use strict";
  9464. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9465. var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
  9466. var nativeReverse = [].reverse;
  9467. var test = [1, 2];
  9468. // `Array.prototype.reverse` method
  9469. // https://tc39.es/ecma262/#sec-array.prototype.reverse
  9470. // fix for Safari 12.0 bug
  9471. // https://bugs.webkit.org/show_bug.cgi?id=188794
  9472. $({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {
  9473. reverse: function reverse() {
  9474. // eslint-disable-next-line no-self-assign -- dirty hack
  9475. if (isArray(this)) this.length = this.length;
  9476. return nativeReverse.call(this);
  9477. }
  9478. });
  9479. /***/ }),
  9480. /***/ "./node_modules/core-js/modules/es.array.slice.js":
  9481. /*!********************************************************!*\
  9482. !*** ./node_modules/core-js/modules/es.array.slice.js ***!
  9483. \********************************************************/
  9484. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9485. "use strict";
  9486. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9487. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  9488. var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
  9489. var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
  9490. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  9491. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  9492. var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
  9493. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9494. var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
  9495. var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
  9496. var SPECIES = wellKnownSymbol('species');
  9497. var nativeSlice = [].slice;
  9498. var max = Math.max;
  9499. // `Array.prototype.slice` method
  9500. // https://tc39.es/ecma262/#sec-array.prototype.slice
  9501. // fallback for not array-like ES3 strings and DOM objects
  9502. $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  9503. slice: function slice(start, end) {
  9504. var O = toIndexedObject(this);
  9505. var length = toLength(O.length);
  9506. var k = toAbsoluteIndex(start, length);
  9507. var fin = toAbsoluteIndex(end === undefined ? length : end, length);
  9508. // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
  9509. var Constructor, result, n;
  9510. if (isArray(O)) {
  9511. Constructor = O.constructor;
  9512. // cross-realm fallback
  9513. if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {
  9514. Constructor = undefined;
  9515. } else if (isObject(Constructor)) {
  9516. Constructor = Constructor[SPECIES];
  9517. if (Constructor === null) Constructor = undefined;
  9518. }
  9519. if (Constructor === Array || Constructor === undefined) {
  9520. return nativeSlice.call(O, k, fin);
  9521. }
  9522. }
  9523. result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
  9524. for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
  9525. result.length = n;
  9526. return result;
  9527. }
  9528. });
  9529. /***/ }),
  9530. /***/ "./node_modules/core-js/modules/es.array.some.js":
  9531. /*!*******************************************************!*\
  9532. !*** ./node_modules/core-js/modules/es.array.some.js ***!
  9533. \*******************************************************/
  9534. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9535. "use strict";
  9536. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9537. var $some = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").some;
  9538. var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
  9539. var STRICT_METHOD = arrayMethodIsStrict('some');
  9540. // `Array.prototype.some` method
  9541. // https://tc39.es/ecma262/#sec-array.prototype.some
  9542. $({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
  9543. some: function some(callbackfn /* , thisArg */) {
  9544. return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  9545. }
  9546. });
  9547. /***/ }),
  9548. /***/ "./node_modules/core-js/modules/es.map.js":
  9549. /*!************************************************!*\
  9550. !*** ./node_modules/core-js/modules/es.map.js ***!
  9551. \************************************************/
  9552. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  9553. "use strict";
  9554. var collection = __webpack_require__(/*! ../internals/collection */ "./node_modules/core-js/internals/collection.js");
  9555. var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/core-js/internals/collection-strong.js");
  9556. // `Map` constructor
  9557. // https://tc39.es/ecma262/#sec-map-objects
  9558. module.exports = collection('Map', function (init) {
  9559. return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
  9560. }, collectionStrong);
  9561. /***/ }),
  9562. /***/ "./node_modules/core-js/modules/es.number.constructor.js":
  9563. /*!***************************************************************!*\
  9564. !*** ./node_modules/core-js/modules/es.number.constructor.js ***!
  9565. \***************************************************************/
  9566. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9567. "use strict";
  9568. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  9569. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  9570. var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
  9571. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  9572. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  9573. var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
  9574. var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
  9575. var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
  9576. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9577. var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  9578. var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
  9579. var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
  9580. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  9581. var trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
  9582. var NUMBER = 'Number';
  9583. var NativeNumber = global[NUMBER];
  9584. var NumberPrototype = NativeNumber.prototype;
  9585. // Opera ~12 has broken Object#toString
  9586. var BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;
  9587. // `ToNumber` abstract operation
  9588. // https://tc39.es/ecma262/#sec-tonumber
  9589. var toNumber = function (argument) {
  9590. var it = toPrimitive(argument, false);
  9591. var first, third, radix, maxCode, digits, length, index, code;
  9592. if (typeof it == 'string' && it.length > 2) {
  9593. it = trim(it);
  9594. first = it.charCodeAt(0);
  9595. if (first === 43 || first === 45) {
  9596. third = it.charCodeAt(2);
  9597. if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
  9598. } else if (first === 48) {
  9599. switch (it.charCodeAt(1)) {
  9600. case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
  9601. case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
  9602. default: return +it;
  9603. }
  9604. digits = it.slice(2);
  9605. length = digits.length;
  9606. for (index = 0; index < length; index++) {
  9607. code = digits.charCodeAt(index);
  9608. // parseInt parses a string to a first unavailable symbol
  9609. // but ToNumber should return NaN if a string contains unavailable symbols
  9610. if (code < 48 || code > maxCode) return NaN;
  9611. } return parseInt(digits, radix);
  9612. }
  9613. } return +it;
  9614. };
  9615. // `Number` constructor
  9616. // https://tc39.es/ecma262/#sec-number-constructor
  9617. if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
  9618. var NumberWrapper = function Number(value) {
  9619. var it = arguments.length < 1 ? 0 : value;
  9620. var dummy = this;
  9621. return dummy instanceof NumberWrapper
  9622. // check on 1..constructor(foo) case
  9623. && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)
  9624. ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);
  9625. };
  9626. for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (
  9627. // ES3:
  9628. 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
  9629. // ES2015 (in case, if modules with ES2015 Number statics required before):
  9630. 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
  9631. 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,' +
  9632. // ESNext
  9633. 'fromString,range'
  9634. ).split(','), j = 0, key; keys.length > j; j++) {
  9635. if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {
  9636. defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));
  9637. }
  9638. }
  9639. NumberWrapper.prototype = NumberPrototype;
  9640. NumberPrototype.constructor = NumberWrapper;
  9641. redefine(global, NUMBER, NumberWrapper);
  9642. }
  9643. /***/ }),
  9644. /***/ "./node_modules/core-js/modules/es.object.get-own-property-descriptor.js":
  9645. /*!*******************************************************************************!*\
  9646. !*** ./node_modules/core-js/modules/es.object.get-own-property-descriptor.js ***!
  9647. \*******************************************************************************/
  9648. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9649. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9650. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9651. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  9652. var nativeGetOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
  9653. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  9654. var FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });
  9655. var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;
  9656. // `Object.getOwnPropertyDescriptor` method
  9657. // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
  9658. $({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {
  9659. getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
  9660. return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);
  9661. }
  9662. });
  9663. /***/ }),
  9664. /***/ "./node_modules/core-js/modules/es.object.get-own-property-descriptors.js":
  9665. /*!********************************************************************************!*\
  9666. !*** ./node_modules/core-js/modules/es.object.get-own-property-descriptors.js ***!
  9667. \********************************************************************************/
  9668. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9669. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9670. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  9671. var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js");
  9672. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  9673. var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
  9674. var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
  9675. // `Object.getOwnPropertyDescriptors` method
  9676. // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
  9677. $({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
  9678. getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
  9679. var O = toIndexedObject(object);
  9680. var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
  9681. var keys = ownKeys(O);
  9682. var result = {};
  9683. var index = 0;
  9684. var key, descriptor;
  9685. while (keys.length > index) {
  9686. descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);
  9687. if (descriptor !== undefined) createProperty(result, key, descriptor);
  9688. }
  9689. return result;
  9690. }
  9691. });
  9692. /***/ }),
  9693. /***/ "./node_modules/core-js/modules/es.object.keys.js":
  9694. /*!********************************************************!*\
  9695. !*** ./node_modules/core-js/modules/es.object.keys.js ***!
  9696. \********************************************************/
  9697. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9698. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9699. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  9700. var nativeKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
  9701. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  9702. var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });
  9703. // `Object.keys` method
  9704. // https://tc39.es/ecma262/#sec-object.keys
  9705. $({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
  9706. keys: function keys(it) {
  9707. return nativeKeys(toObject(it));
  9708. }
  9709. });
  9710. /***/ }),
  9711. /***/ "./node_modules/core-js/modules/es.promise.js":
  9712. /*!****************************************************!*\
  9713. !*** ./node_modules/core-js/modules/es.promise.js ***!
  9714. \****************************************************/
  9715. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  9716. "use strict";
  9717. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  9718. var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
  9719. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  9720. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  9721. var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js");
  9722. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  9723. var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
  9724. var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
  9725. var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
  9726. var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
  9727. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  9728. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  9729. var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
  9730. var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js");
  9731. var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
  9732. var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
  9733. var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
  9734. var task = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set;
  9735. var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/core-js/internals/microtask.js");
  9736. var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js");
  9737. var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "./node_modules/core-js/internals/host-report-errors.js");
  9738. var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
  9739. var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js");
  9740. var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
  9741. var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
  9742. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  9743. var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "./node_modules/core-js/internals/engine-is-browser.js");
  9744. var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
  9745. var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
  9746. var SPECIES = wellKnownSymbol('species');
  9747. var PROMISE = 'Promise';
  9748. var getInternalState = InternalStateModule.get;
  9749. var setInternalState = InternalStateModule.set;
  9750. var getInternalPromiseState = InternalStateModule.getterFor(PROMISE);
  9751. var NativePromisePrototype = NativePromise && NativePromise.prototype;
  9752. var PromiseConstructor = NativePromise;
  9753. var PromiseConstructorPrototype = NativePromisePrototype;
  9754. var TypeError = global.TypeError;
  9755. var document = global.document;
  9756. var process = global.process;
  9757. var newPromiseCapability = newPromiseCapabilityModule.f;
  9758. var newGenericPromiseCapability = newPromiseCapability;
  9759. var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
  9760. var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';
  9761. var UNHANDLED_REJECTION = 'unhandledrejection';
  9762. var REJECTION_HANDLED = 'rejectionhandled';
  9763. var PENDING = 0;
  9764. var FULFILLED = 1;
  9765. var REJECTED = 2;
  9766. var HANDLED = 1;
  9767. var UNHANDLED = 2;
  9768. var SUBCLASSING = false;
  9769. var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
  9770. var FORCED = isForced(PROMISE, function () {
  9771. var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);
  9772. // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
  9773. // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
  9774. // We can't detect it synchronously, so just check versions
  9775. if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;
  9776. // We need Promise#finally in the pure version for preventing prototype pollution
  9777. if (IS_PURE && !PromiseConstructorPrototype['finally']) return true;
  9778. // We can't use @@species feature detection in V8 since it causes
  9779. // deoptimization and performance degradation
  9780. // https://github.com/zloirock/core-js/issues/679
  9781. if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;
  9782. // Detect correctness of subclassing with @@species support
  9783. var promise = new PromiseConstructor(function (resolve) { resolve(1); });
  9784. var FakePromise = function (exec) {
  9785. exec(function () { /* empty */ }, function () { /* empty */ });
  9786. };
  9787. var constructor = promise.constructor = {};
  9788. constructor[SPECIES] = FakePromise;
  9789. SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
  9790. if (!SUBCLASSING) return true;
  9791. // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
  9792. return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;
  9793. });
  9794. var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {
  9795. PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
  9796. });
  9797. // helpers
  9798. var isThenable = function (it) {
  9799. var then;
  9800. return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
  9801. };
  9802. var notify = function (state, isReject) {
  9803. if (state.notified) return;
  9804. state.notified = true;
  9805. var chain = state.reactions;
  9806. microtask(function () {
  9807. var value = state.value;
  9808. var ok = state.state == FULFILLED;
  9809. var index = 0;
  9810. // variable length - can't use forEach
  9811. while (chain.length > index) {
  9812. var reaction = chain[index++];
  9813. var handler = ok ? reaction.ok : reaction.fail;
  9814. var resolve = reaction.resolve;
  9815. var reject = reaction.reject;
  9816. var domain = reaction.domain;
  9817. var result, then, exited;
  9818. try {
  9819. if (handler) {
  9820. if (!ok) {
  9821. if (state.rejection === UNHANDLED) onHandleUnhandled(state);
  9822. state.rejection = HANDLED;
  9823. }
  9824. if (handler === true) result = value;
  9825. else {
  9826. if (domain) domain.enter();
  9827. result = handler(value); // can throw
  9828. if (domain) {
  9829. domain.exit();
  9830. exited = true;
  9831. }
  9832. }
  9833. if (result === reaction.promise) {
  9834. reject(TypeError('Promise-chain cycle'));
  9835. } else if (then = isThenable(result)) {
  9836. then.call(result, resolve, reject);
  9837. } else resolve(result);
  9838. } else reject(value);
  9839. } catch (error) {
  9840. if (domain && !exited) domain.exit();
  9841. reject(error);
  9842. }
  9843. }
  9844. state.reactions = [];
  9845. state.notified = false;
  9846. if (isReject && !state.rejection) onUnhandled(state);
  9847. });
  9848. };
  9849. var dispatchEvent = function (name, promise, reason) {
  9850. var event, handler;
  9851. if (DISPATCH_EVENT) {
  9852. event = document.createEvent('Event');
  9853. event.promise = promise;
  9854. event.reason = reason;
  9855. event.initEvent(name, false, true);
  9856. global.dispatchEvent(event);
  9857. } else event = { promise: promise, reason: reason };
  9858. if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);
  9859. else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
  9860. };
  9861. var onUnhandled = function (state) {
  9862. task.call(global, function () {
  9863. var promise = state.facade;
  9864. var value = state.value;
  9865. var IS_UNHANDLED = isUnhandled(state);
  9866. var result;
  9867. if (IS_UNHANDLED) {
  9868. result = perform(function () {
  9869. if (IS_NODE) {
  9870. process.emit('unhandledRejection', value, promise);
  9871. } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
  9872. });
  9873. // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
  9874. state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;
  9875. if (result.error) throw result.value;
  9876. }
  9877. });
  9878. };
  9879. var isUnhandled = function (state) {
  9880. return state.rejection !== HANDLED && !state.parent;
  9881. };
  9882. var onHandleUnhandled = function (state) {
  9883. task.call(global, function () {
  9884. var promise = state.facade;
  9885. if (IS_NODE) {
  9886. process.emit('rejectionHandled', promise);
  9887. } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
  9888. });
  9889. };
  9890. var bind = function (fn, state, unwrap) {
  9891. return function (value) {
  9892. fn(state, value, unwrap);
  9893. };
  9894. };
  9895. var internalReject = function (state, value, unwrap) {
  9896. if (state.done) return;
  9897. state.done = true;
  9898. if (unwrap) state = unwrap;
  9899. state.value = value;
  9900. state.state = REJECTED;
  9901. notify(state, true);
  9902. };
  9903. var internalResolve = function (state, value, unwrap) {
  9904. if (state.done) return;
  9905. state.done = true;
  9906. if (unwrap) state = unwrap;
  9907. try {
  9908. if (state.facade === value) throw TypeError("Promise can't be resolved itself");
  9909. var then = isThenable(value);
  9910. if (then) {
  9911. microtask(function () {
  9912. var wrapper = { done: false };
  9913. try {
  9914. then.call(value,
  9915. bind(internalResolve, wrapper, state),
  9916. bind(internalReject, wrapper, state)
  9917. );
  9918. } catch (error) {
  9919. internalReject(wrapper, error, state);
  9920. }
  9921. });
  9922. } else {
  9923. state.value = value;
  9924. state.state = FULFILLED;
  9925. notify(state, false);
  9926. }
  9927. } catch (error) {
  9928. internalReject({ done: false }, error, state);
  9929. }
  9930. };
  9931. // constructor polyfill
  9932. if (FORCED) {
  9933. // 25.4.3.1 Promise(executor)
  9934. PromiseConstructor = function Promise(executor) {
  9935. anInstance(this, PromiseConstructor, PROMISE);
  9936. aFunction(executor);
  9937. Internal.call(this);
  9938. var state = getInternalState(this);
  9939. try {
  9940. executor(bind(internalResolve, state), bind(internalReject, state));
  9941. } catch (error) {
  9942. internalReject(state, error);
  9943. }
  9944. };
  9945. PromiseConstructorPrototype = PromiseConstructor.prototype;
  9946. // eslint-disable-next-line no-unused-vars -- required for `.length`
  9947. Internal = function Promise(executor) {
  9948. setInternalState(this, {
  9949. type: PROMISE,
  9950. done: false,
  9951. notified: false,
  9952. parent: false,
  9953. reactions: [],
  9954. rejection: false,
  9955. state: PENDING,
  9956. value: undefined
  9957. });
  9958. };
  9959. Internal.prototype = redefineAll(PromiseConstructorPrototype, {
  9960. // `Promise.prototype.then` method
  9961. // https://tc39.es/ecma262/#sec-promise.prototype.then
  9962. then: function then(onFulfilled, onRejected) {
  9963. var state = getInternalPromiseState(this);
  9964. var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));
  9965. reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
  9966. reaction.fail = typeof onRejected == 'function' && onRejected;
  9967. reaction.domain = IS_NODE ? process.domain : undefined;
  9968. state.parent = true;
  9969. state.reactions.push(reaction);
  9970. if (state.state != PENDING) notify(state, false);
  9971. return reaction.promise;
  9972. },
  9973. // `Promise.prototype.catch` method
  9974. // https://tc39.es/ecma262/#sec-promise.prototype.catch
  9975. 'catch': function (onRejected) {
  9976. return this.then(undefined, onRejected);
  9977. }
  9978. });
  9979. OwnPromiseCapability = function () {
  9980. var promise = new Internal();
  9981. var state = getInternalState(promise);
  9982. this.promise = promise;
  9983. this.resolve = bind(internalResolve, state);
  9984. this.reject = bind(internalReject, state);
  9985. };
  9986. newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
  9987. return C === PromiseConstructor || C === PromiseWrapper
  9988. ? new OwnPromiseCapability(C)
  9989. : newGenericPromiseCapability(C);
  9990. };
  9991. if (!IS_PURE && typeof NativePromise == 'function' && NativePromisePrototype !== Object.prototype) {
  9992. nativeThen = NativePromisePrototype.then;
  9993. if (!SUBCLASSING) {
  9994. // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
  9995. redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
  9996. var that = this;
  9997. return new PromiseConstructor(function (resolve, reject) {
  9998. nativeThen.call(that, resolve, reject);
  9999. }).then(onFulfilled, onRejected);
  10000. // https://github.com/zloirock/core-js/issues/640
  10001. }, { unsafe: true });
  10002. // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
  10003. redefine(NativePromisePrototype, 'catch', PromiseConstructorPrototype['catch'], { unsafe: true });
  10004. }
  10005. // make `.constructor === Promise` work for native promise-based APIs
  10006. try {
  10007. delete NativePromisePrototype.constructor;
  10008. } catch (error) { /* empty */ }
  10009. // make `instanceof Promise` work for native promise-based APIs
  10010. if (setPrototypeOf) {
  10011. setPrototypeOf(NativePromisePrototype, PromiseConstructorPrototype);
  10012. }
  10013. }
  10014. }
  10015. $({ global: true, wrap: true, forced: FORCED }, {
  10016. Promise: PromiseConstructor
  10017. });
  10018. setToStringTag(PromiseConstructor, PROMISE, false, true);
  10019. setSpecies(PROMISE);
  10020. PromiseWrapper = getBuiltIn(PROMISE);
  10021. // statics
  10022. $({ target: PROMISE, stat: true, forced: FORCED }, {
  10023. // `Promise.reject` method
  10024. // https://tc39.es/ecma262/#sec-promise.reject
  10025. reject: function reject(r) {
  10026. var capability = newPromiseCapability(this);
  10027. capability.reject.call(undefined, r);
  10028. return capability.promise;
  10029. }
  10030. });
  10031. $({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {
  10032. // `Promise.resolve` method
  10033. // https://tc39.es/ecma262/#sec-promise.resolve
  10034. resolve: function resolve(x) {
  10035. return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);
  10036. }
  10037. });
  10038. $({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {
  10039. // `Promise.all` method
  10040. // https://tc39.es/ecma262/#sec-promise.all
  10041. all: function all(iterable) {
  10042. var C = this;
  10043. var capability = newPromiseCapability(C);
  10044. var resolve = capability.resolve;
  10045. var reject = capability.reject;
  10046. var result = perform(function () {
  10047. var $promiseResolve = aFunction(C.resolve);
  10048. var values = [];
  10049. var counter = 0;
  10050. var remaining = 1;
  10051. iterate(iterable, function (promise) {
  10052. var index = counter++;
  10053. var alreadyCalled = false;
  10054. values.push(undefined);
  10055. remaining++;
  10056. $promiseResolve.call(C, promise).then(function (value) {
  10057. if (alreadyCalled) return;
  10058. alreadyCalled = true;
  10059. values[index] = value;
  10060. --remaining || resolve(values);
  10061. }, reject);
  10062. });
  10063. --remaining || resolve(values);
  10064. });
  10065. if (result.error) reject(result.value);
  10066. return capability.promise;
  10067. },
  10068. // `Promise.race` method
  10069. // https://tc39.es/ecma262/#sec-promise.race
  10070. race: function race(iterable) {
  10071. var C = this;
  10072. var capability = newPromiseCapability(C);
  10073. var reject = capability.reject;
  10074. var result = perform(function () {
  10075. var $promiseResolve = aFunction(C.resolve);
  10076. iterate(iterable, function (promise) {
  10077. $promiseResolve.call(C, promise).then(capability.resolve, reject);
  10078. });
  10079. });
  10080. if (result.error) reject(result.value);
  10081. return capability.promise;
  10082. }
  10083. });
  10084. /***/ }),
  10085. /***/ "./node_modules/core-js/modules/es.reflect.apply.js":
  10086. /*!**********************************************************!*\
  10087. !*** ./node_modules/core-js/modules/es.reflect.apply.js ***!
  10088. \**********************************************************/
  10089. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10090. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10091. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  10092. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  10093. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10094. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  10095. var nativeApply = getBuiltIn('Reflect', 'apply');
  10096. var functionApply = Function.apply;
  10097. // MS Edge argumentsList argument is optional
  10098. var OPTIONAL_ARGUMENTS_LIST = !fails(function () {
  10099. nativeApply(function () { /* empty */ });
  10100. });
  10101. // `Reflect.apply` method
  10102. // https://tc39.es/ecma262/#sec-reflect.apply
  10103. $({ target: 'Reflect', stat: true, forced: OPTIONAL_ARGUMENTS_LIST }, {
  10104. apply: function apply(target, thisArgument, argumentsList) {
  10105. aFunction(target);
  10106. anObject(argumentsList);
  10107. return nativeApply
  10108. ? nativeApply(target, thisArgument, argumentsList)
  10109. : functionApply.call(target, thisArgument, argumentsList);
  10110. }
  10111. });
  10112. /***/ }),
  10113. /***/ "./node_modules/core-js/modules/es.reflect.construct.js":
  10114. /*!**************************************************************!*\
  10115. !*** ./node_modules/core-js/modules/es.reflect.construct.js ***!
  10116. \**************************************************************/
  10117. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10118. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10119. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  10120. var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js");
  10121. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10122. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  10123. var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  10124. var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js");
  10125. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  10126. var nativeConstruct = getBuiltIn('Reflect', 'construct');
  10127. // `Reflect.construct` method
  10128. // https://tc39.es/ecma262/#sec-reflect.construct
  10129. // MS Edge supports only 2 arguments and argumentsList argument is optional
  10130. // FF Nightly sets third argument as `new.target`, but does not create `this` from it
  10131. var NEW_TARGET_BUG = fails(function () {
  10132. function F() { /* empty */ }
  10133. return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
  10134. });
  10135. var ARGS_BUG = !fails(function () {
  10136. nativeConstruct(function () { /* empty */ });
  10137. });
  10138. var FORCED = NEW_TARGET_BUG || ARGS_BUG;
  10139. $({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {
  10140. construct: function construct(Target, args /* , newTarget */) {
  10141. aFunction(Target);
  10142. anObject(args);
  10143. var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
  10144. if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
  10145. if (Target == newTarget) {
  10146. // w/o altered newTarget, optimization for 0-4 arguments
  10147. switch (args.length) {
  10148. case 0: return new Target();
  10149. case 1: return new Target(args[0]);
  10150. case 2: return new Target(args[0], args[1]);
  10151. case 3: return new Target(args[0], args[1], args[2]);
  10152. case 4: return new Target(args[0], args[1], args[2], args[3]);
  10153. }
  10154. // w/o altered newTarget, lot of arguments case
  10155. var $args = [null];
  10156. $args.push.apply($args, args);
  10157. return new (bind.apply(Target, $args))();
  10158. }
  10159. // with altered newTarget, not support built-in constructors
  10160. var proto = newTarget.prototype;
  10161. var instance = create(isObject(proto) ? proto : Object.prototype);
  10162. var result = Function.apply.call(Target, instance, args);
  10163. return isObject(result) ? result : instance;
  10164. }
  10165. });
  10166. /***/ }),
  10167. /***/ "./node_modules/core-js/modules/es.reflect.delete-property.js":
  10168. /*!********************************************************************!*\
  10169. !*** ./node_modules/core-js/modules/es.reflect.delete-property.js ***!
  10170. \********************************************************************/
  10171. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10172. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10173. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10174. var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
  10175. // `Reflect.deleteProperty` method
  10176. // https://tc39.es/ecma262/#sec-reflect.deleteproperty
  10177. $({ target: 'Reflect', stat: true }, {
  10178. deleteProperty: function deleteProperty(target, propertyKey) {
  10179. var descriptor = getOwnPropertyDescriptor(anObject(target), propertyKey);
  10180. return descriptor && !descriptor.configurable ? false : delete target[propertyKey];
  10181. }
  10182. });
  10183. /***/ }),
  10184. /***/ "./node_modules/core-js/modules/es.reflect.get-prototype-of.js":
  10185. /*!*********************************************************************!*\
  10186. !*** ./node_modules/core-js/modules/es.reflect.get-prototype-of.js ***!
  10187. \*********************************************************************/
  10188. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10189. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10190. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10191. var objectGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
  10192. var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js");
  10193. // `Reflect.getPrototypeOf` method
  10194. // https://tc39.es/ecma262/#sec-reflect.getprototypeof
  10195. $({ target: 'Reflect', stat: true, sham: !CORRECT_PROTOTYPE_GETTER }, {
  10196. getPrototypeOf: function getPrototypeOf(target) {
  10197. return objectGetPrototypeOf(anObject(target));
  10198. }
  10199. });
  10200. /***/ }),
  10201. /***/ "./node_modules/core-js/modules/es.string.includes.js":
  10202. /*!************************************************************!*\
  10203. !*** ./node_modules/core-js/modules/es.string.includes.js ***!
  10204. \************************************************************/
  10205. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10206. "use strict";
  10207. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10208. var notARegExp = __webpack_require__(/*! ../internals/not-a-regexp */ "./node_modules/core-js/internals/not-a-regexp.js");
  10209. var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
  10210. var correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/core-js/internals/correct-is-regexp-logic.js");
  10211. // `String.prototype.includes` method
  10212. // https://tc39.es/ecma262/#sec-string.prototype.includes
  10213. $({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {
  10214. includes: function includes(searchString /* , position = 0 */) {
  10215. return !!~String(requireObjectCoercible(this))
  10216. .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);
  10217. }
  10218. });
  10219. /***/ }),
  10220. /***/ "./node_modules/core-js/modules/es.string.iterator.js":
  10221. /*!************************************************************!*\
  10222. !*** ./node_modules/core-js/modules/es.string.iterator.js ***!
  10223. \************************************************************/
  10224. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10225. "use strict";
  10226. var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt;
  10227. var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
  10228. var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
  10229. var STRING_ITERATOR = 'String Iterator';
  10230. var setInternalState = InternalStateModule.set;
  10231. var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
  10232. // `String.prototype[@@iterator]` method
  10233. // https://tc39.es/ecma262/#sec-string.prototype-@@iterator
  10234. defineIterator(String, 'String', function (iterated) {
  10235. setInternalState(this, {
  10236. type: STRING_ITERATOR,
  10237. string: String(iterated),
  10238. index: 0
  10239. });
  10240. // `%StringIteratorPrototype%.next` method
  10241. // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
  10242. }, function next() {
  10243. var state = getInternalState(this);
  10244. var string = state.string;
  10245. var index = state.index;
  10246. var point;
  10247. if (index >= string.length) return { value: undefined, done: true };
  10248. point = charAt(string, index);
  10249. state.index += point.length;
  10250. return { value: point, done: false };
  10251. });
  10252. /***/ }),
  10253. /***/ "./node_modules/core-js/modules/es.string.match.js":
  10254. /*!*********************************************************!*\
  10255. !*** ./node_modules/core-js/modules/es.string.match.js ***!
  10256. \*********************************************************/
  10257. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10258. "use strict";
  10259. var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js");
  10260. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10261. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  10262. var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
  10263. var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js");
  10264. var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
  10265. // @@match logic
  10266. fixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {
  10267. return [
  10268. // `String.prototype.match` method
  10269. // https://tc39.es/ecma262/#sec-string.prototype.match
  10270. function match(regexp) {
  10271. var O = requireObjectCoercible(this);
  10272. var matcher = regexp == undefined ? undefined : regexp[MATCH];
  10273. return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
  10274. },
  10275. // `RegExp.prototype[@@match]` method
  10276. // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
  10277. function (regexp) {
  10278. var res = maybeCallNative(nativeMatch, regexp, this);
  10279. if (res.done) return res.value;
  10280. var rx = anObject(regexp);
  10281. var S = String(this);
  10282. if (!rx.global) return regExpExec(rx, S);
  10283. var fullUnicode = rx.unicode;
  10284. rx.lastIndex = 0;
  10285. var A = [];
  10286. var n = 0;
  10287. var result;
  10288. while ((result = regExpExec(rx, S)) !== null) {
  10289. var matchStr = String(result[0]);
  10290. A[n] = matchStr;
  10291. if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
  10292. n++;
  10293. }
  10294. return n === 0 ? null : A;
  10295. }
  10296. ];
  10297. });
  10298. /***/ }),
  10299. /***/ "./node_modules/core-js/modules/es.string.starts-with.js":
  10300. /*!***************************************************************!*\
  10301. !*** ./node_modules/core-js/modules/es.string.starts-with.js ***!
  10302. \***************************************************************/
  10303. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10304. "use strict";
  10305. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10306. var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
  10307. var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
  10308. var notARegExp = __webpack_require__(/*! ../internals/not-a-regexp */ "./node_modules/core-js/internals/not-a-regexp.js");
  10309. var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
  10310. var correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/core-js/internals/correct-is-regexp-logic.js");
  10311. var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
  10312. // eslint-disable-next-line es/no-string-prototype-startswith -- safe
  10313. var $startsWith = ''.startsWith;
  10314. var min = Math.min;
  10315. var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
  10316. // https://github.com/zloirock/core-js/pull/702
  10317. var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
  10318. var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
  10319. return descriptor && !descriptor.writable;
  10320. }();
  10321. // `String.prototype.startsWith` method
  10322. // https://tc39.es/ecma262/#sec-string.prototype.startswith
  10323. $({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
  10324. startsWith: function startsWith(searchString /* , position = 0 */) {
  10325. var that = String(requireObjectCoercible(this));
  10326. notARegExp(searchString);
  10327. var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
  10328. var search = String(searchString);
  10329. return $startsWith
  10330. ? $startsWith.call(that, search, index)
  10331. : that.slice(index, index + search.length) === search;
  10332. }
  10333. });
  10334. /***/ }),
  10335. /***/ "./node_modules/core-js/modules/es.string.trim.js":
  10336. /*!********************************************************!*\
  10337. !*** ./node_modules/core-js/modules/es.string.trim.js ***!
  10338. \********************************************************/
  10339. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10340. "use strict";
  10341. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10342. var $trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
  10343. var forcedStringTrimMethod = __webpack_require__(/*! ../internals/string-trim-forced */ "./node_modules/core-js/internals/string-trim-forced.js");
  10344. // `String.prototype.trim` method
  10345. // https://tc39.es/ecma262/#sec-string.prototype.trim
  10346. $({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {
  10347. trim: function trim() {
  10348. return $trim(this);
  10349. }
  10350. });
  10351. /***/ }),
  10352. /***/ "./node_modules/core-js/modules/es.symbol.description.js":
  10353. /*!***************************************************************!*\
  10354. !*** ./node_modules/core-js/modules/es.symbol.description.js ***!
  10355. \***************************************************************/
  10356. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10357. "use strict";
  10358. // `Symbol.prototype.description` getter
  10359. // https://tc39.es/ecma262/#sec-symbol.prototype.description
  10360. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10361. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  10362. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  10363. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  10364. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  10365. var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
  10366. var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js");
  10367. var NativeSymbol = global.Symbol;
  10368. if (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||
  10369. // Safari 12 bug
  10370. NativeSymbol().description !== undefined
  10371. )) {
  10372. var EmptyStringDescriptionStore = {};
  10373. // wrap Symbol constructor for correct work with undefined description
  10374. var SymbolWrapper = function Symbol() {
  10375. var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
  10376. var result = this instanceof SymbolWrapper
  10377. ? new NativeSymbol(description)
  10378. // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
  10379. : description === undefined ? NativeSymbol() : NativeSymbol(description);
  10380. if (description === '') EmptyStringDescriptionStore[result] = true;
  10381. return result;
  10382. };
  10383. copyConstructorProperties(SymbolWrapper, NativeSymbol);
  10384. var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
  10385. symbolPrototype.constructor = SymbolWrapper;
  10386. var symbolToString = symbolPrototype.toString;
  10387. var native = String(NativeSymbol('test')) == 'Symbol(test)';
  10388. var regexp = /^Symbol\((.*)\)[^)]+$/;
  10389. defineProperty(symbolPrototype, 'description', {
  10390. configurable: true,
  10391. get: function description() {
  10392. var symbol = isObject(this) ? this.valueOf() : this;
  10393. var string = symbolToString.call(symbol);
  10394. if (has(EmptyStringDescriptionStore, symbol)) return '';
  10395. var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');
  10396. return desc === '' ? undefined : desc;
  10397. }
  10398. });
  10399. $({ global: true, forced: true }, {
  10400. Symbol: SymbolWrapper
  10401. });
  10402. }
  10403. /***/ }),
  10404. /***/ "./node_modules/core-js/modules/es.symbol.iterator.js":
  10405. /*!************************************************************!*\
  10406. !*** ./node_modules/core-js/modules/es.symbol.iterator.js ***!
  10407. \************************************************************/
  10408. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10409. var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
  10410. // `Symbol.iterator` well-known symbol
  10411. // https://tc39.es/ecma262/#sec-symbol.iterator
  10412. defineWellKnownSymbol('iterator');
  10413. /***/ }),
  10414. /***/ "./node_modules/core-js/modules/es.symbol.js":
  10415. /*!***************************************************!*\
  10416. !*** ./node_modules/core-js/modules/es.symbol.js ***!
  10417. \***************************************************/
  10418. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10419. "use strict";
  10420. var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
  10421. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  10422. var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
  10423. var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
  10424. var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
  10425. var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js");
  10426. var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js");
  10427. var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
  10428. var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
  10429. var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
  10430. var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
  10431. var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
  10432. var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
  10433. var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
  10434. var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
  10435. var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
  10436. var nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
  10437. var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
  10438. var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js");
  10439. var getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js");
  10440. var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js");
  10441. var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
  10442. var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
  10443. var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js");
  10444. var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
  10445. var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
  10446. var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js");
  10447. var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
  10448. var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
  10449. var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
  10450. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  10451. var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js");
  10452. var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
  10453. var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
  10454. var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
  10455. var $forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
  10456. var HIDDEN = sharedKey('hidden');
  10457. var SYMBOL = 'Symbol';
  10458. var PROTOTYPE = 'prototype';
  10459. var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
  10460. var setInternalState = InternalStateModule.set;
  10461. var getInternalState = InternalStateModule.getterFor(SYMBOL);
  10462. var ObjectPrototype = Object[PROTOTYPE];
  10463. var $Symbol = global.Symbol;
  10464. var $stringify = getBuiltIn('JSON', 'stringify');
  10465. var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
  10466. var nativeDefineProperty = definePropertyModule.f;
  10467. var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
  10468. var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
  10469. var AllSymbols = shared('symbols');
  10470. var ObjectPrototypeSymbols = shared('op-symbols');
  10471. var StringToSymbolRegistry = shared('string-to-symbol-registry');
  10472. var SymbolToStringRegistry = shared('symbol-to-string-registry');
  10473. var WellKnownSymbolsStore = shared('wks');
  10474. var QObject = global.QObject;
  10475. // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
  10476. var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
  10477. // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
  10478. var setSymbolDescriptor = DESCRIPTORS && fails(function () {
  10479. return nativeObjectCreate(nativeDefineProperty({}, 'a', {
  10480. get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
  10481. })).a != 7;
  10482. }) ? function (O, P, Attributes) {
  10483. var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
  10484. if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
  10485. nativeDefineProperty(O, P, Attributes);
  10486. if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
  10487. nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
  10488. }
  10489. } : nativeDefineProperty;
  10490. var wrap = function (tag, description) {
  10491. var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);
  10492. setInternalState(symbol, {
  10493. type: SYMBOL,
  10494. tag: tag,
  10495. description: description
  10496. });
  10497. if (!DESCRIPTORS) symbol.description = description;
  10498. return symbol;
  10499. };
  10500. var isSymbol = USE_SYMBOL_AS_UID ? function (it) {
  10501. return typeof it == 'symbol';
  10502. } : function (it) {
  10503. return Object(it) instanceof $Symbol;
  10504. };
  10505. var $defineProperty = function defineProperty(O, P, Attributes) {
  10506. if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
  10507. anObject(O);
  10508. var key = toPrimitive(P, true);
  10509. anObject(Attributes);
  10510. if (has(AllSymbols, key)) {
  10511. if (!Attributes.enumerable) {
  10512. if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
  10513. O[HIDDEN][key] = true;
  10514. } else {
  10515. if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
  10516. Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
  10517. } return setSymbolDescriptor(O, key, Attributes);
  10518. } return nativeDefineProperty(O, key, Attributes);
  10519. };
  10520. var $defineProperties = function defineProperties(O, Properties) {
  10521. anObject(O);
  10522. var properties = toIndexedObject(Properties);
  10523. var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
  10524. $forEach(keys, function (key) {
  10525. if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
  10526. });
  10527. return O;
  10528. };
  10529. var $create = function create(O, Properties) {
  10530. return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
  10531. };
  10532. var $propertyIsEnumerable = function propertyIsEnumerable(V) {
  10533. var P = toPrimitive(V, true);
  10534. var enumerable = nativePropertyIsEnumerable.call(this, P);
  10535. if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
  10536. return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
  10537. };
  10538. var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
  10539. var it = toIndexedObject(O);
  10540. var key = toPrimitive(P, true);
  10541. if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
  10542. var descriptor = nativeGetOwnPropertyDescriptor(it, key);
  10543. if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
  10544. descriptor.enumerable = true;
  10545. }
  10546. return descriptor;
  10547. };
  10548. var $getOwnPropertyNames = function getOwnPropertyNames(O) {
  10549. var names = nativeGetOwnPropertyNames(toIndexedObject(O));
  10550. var result = [];
  10551. $forEach(names, function (key) {
  10552. if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
  10553. });
  10554. return result;
  10555. };
  10556. var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
  10557. var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
  10558. var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
  10559. var result = [];
  10560. $forEach(names, function (key) {
  10561. if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {
  10562. result.push(AllSymbols[key]);
  10563. }
  10564. });
  10565. return result;
  10566. };
  10567. // `Symbol` constructor
  10568. // https://tc39.es/ecma262/#sec-symbol-constructor
  10569. if (!NATIVE_SYMBOL) {
  10570. $Symbol = function Symbol() {
  10571. if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
  10572. var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);
  10573. var tag = uid(description);
  10574. var setter = function (value) {
  10575. if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
  10576. if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
  10577. setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
  10578. };
  10579. if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
  10580. return wrap(tag, description);
  10581. };
  10582. redefine($Symbol[PROTOTYPE], 'toString', function toString() {
  10583. return getInternalState(this).tag;
  10584. });
  10585. redefine($Symbol, 'withoutSetter', function (description) {
  10586. return wrap(uid(description), description);
  10587. });
  10588. propertyIsEnumerableModule.f = $propertyIsEnumerable;
  10589. definePropertyModule.f = $defineProperty;
  10590. getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
  10591. getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
  10592. getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;
  10593. wrappedWellKnownSymbolModule.f = function (name) {
  10594. return wrap(wellKnownSymbol(name), name);
  10595. };
  10596. if (DESCRIPTORS) {
  10597. // https://github.com/tc39/proposal-Symbol-description
  10598. nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
  10599. configurable: true,
  10600. get: function description() {
  10601. return getInternalState(this).description;
  10602. }
  10603. });
  10604. if (!IS_PURE) {
  10605. redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
  10606. }
  10607. }
  10608. }
  10609. $({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
  10610. Symbol: $Symbol
  10611. });
  10612. $forEach(objectKeys(WellKnownSymbolsStore), function (name) {
  10613. defineWellKnownSymbol(name);
  10614. });
  10615. $({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
  10616. // `Symbol.for` method
  10617. // https://tc39.es/ecma262/#sec-symbol.for
  10618. 'for': function (key) {
  10619. var string = String(key);
  10620. if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
  10621. var symbol = $Symbol(string);
  10622. StringToSymbolRegistry[string] = symbol;
  10623. SymbolToStringRegistry[symbol] = string;
  10624. return symbol;
  10625. },
  10626. // `Symbol.keyFor` method
  10627. // https://tc39.es/ecma262/#sec-symbol.keyfor
  10628. keyFor: function keyFor(sym) {
  10629. if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
  10630. if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
  10631. },
  10632. useSetter: function () { USE_SETTER = true; },
  10633. useSimple: function () { USE_SETTER = false; }
  10634. });
  10635. $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
  10636. // `Object.create` method
  10637. // https://tc39.es/ecma262/#sec-object.create
  10638. create: $create,
  10639. // `Object.defineProperty` method
  10640. // https://tc39.es/ecma262/#sec-object.defineproperty
  10641. defineProperty: $defineProperty,
  10642. // `Object.defineProperties` method
  10643. // https://tc39.es/ecma262/#sec-object.defineproperties
  10644. defineProperties: $defineProperties,
  10645. // `Object.getOwnPropertyDescriptor` method
  10646. // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
  10647. getOwnPropertyDescriptor: $getOwnPropertyDescriptor
  10648. });
  10649. $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
  10650. // `Object.getOwnPropertyNames` method
  10651. // https://tc39.es/ecma262/#sec-object.getownpropertynames
  10652. getOwnPropertyNames: $getOwnPropertyNames,
  10653. // `Object.getOwnPropertySymbols` method
  10654. // https://tc39.es/ecma262/#sec-object.getownpropertysymbols
  10655. getOwnPropertySymbols: $getOwnPropertySymbols
  10656. });
  10657. // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
  10658. // https://bugs.chromium.org/p/v8/issues/detail?id=3443
  10659. $({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {
  10660. getOwnPropertySymbols: function getOwnPropertySymbols(it) {
  10661. return getOwnPropertySymbolsModule.f(toObject(it));
  10662. }
  10663. });
  10664. // `JSON.stringify` method behavior with symbols
  10665. // https://tc39.es/ecma262/#sec-json.stringify
  10666. if ($stringify) {
  10667. var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {
  10668. var symbol = $Symbol();
  10669. // MS Edge converts symbol values to JSON as {}
  10670. return $stringify([symbol]) != '[null]'
  10671. // WebKit converts symbol values to JSON as null
  10672. || $stringify({ a: symbol }) != '{}'
  10673. // V8 throws on boxed symbols
  10674. || $stringify(Object(symbol)) != '{}';
  10675. });
  10676. $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
  10677. // eslint-disable-next-line no-unused-vars -- required for `.length`
  10678. stringify: function stringify(it, replacer, space) {
  10679. var args = [it];
  10680. var index = 1;
  10681. var $replacer;
  10682. while (arguments.length > index) args.push(arguments[index++]);
  10683. $replacer = replacer;
  10684. if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
  10685. if (!isArray(replacer)) replacer = function (key, value) {
  10686. if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
  10687. if (!isSymbol(value)) return value;
  10688. };
  10689. args[1] = replacer;
  10690. return $stringify.apply(null, args);
  10691. }
  10692. });
  10693. }
  10694. // `Symbol.prototype[@@toPrimitive]` method
  10695. // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
  10696. if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
  10697. createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
  10698. }
  10699. // `Symbol.prototype[@@toStringTag]` property
  10700. // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
  10701. setToStringTag($Symbol, SYMBOL);
  10702. hiddenKeys[HIDDEN] = true;
  10703. /***/ }),
  10704. /***/ "./node_modules/core-js/modules/web.dom-collections.for-each.js":
  10705. /*!**********************************************************************!*\
  10706. !*** ./node_modules/core-js/modules/web.dom-collections.for-each.js ***!
  10707. \**********************************************************************/
  10708. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10709. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  10710. var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js");
  10711. var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js");
  10712. var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
  10713. for (var COLLECTION_NAME in DOMIterables) {
  10714. var Collection = global[COLLECTION_NAME];
  10715. var CollectionPrototype = Collection && Collection.prototype;
  10716. // some Chrome versions have non-configurable methods on DOMTokenList
  10717. if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {
  10718. createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);
  10719. } catch (error) {
  10720. CollectionPrototype.forEach = forEach;
  10721. }
  10722. }
  10723. /***/ }),
  10724. /***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js":
  10725. /*!**********************************************************************!*\
  10726. !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***!
  10727. \**********************************************************************/
  10728. /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
  10729. var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
  10730. var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js");
  10731. var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
  10732. var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
  10733. var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
  10734. var ITERATOR = wellKnownSymbol('iterator');
  10735. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  10736. var ArrayValues = ArrayIteratorMethods.values;
  10737. for (var COLLECTION_NAME in DOMIterables) {
  10738. var Collection = global[COLLECTION_NAME];
  10739. var CollectionPrototype = Collection && Collection.prototype;
  10740. if (CollectionPrototype) {
  10741. // some Chrome versions have non-configurable methods on DOMTokenList
  10742. if (CollectionPrototype[ITERATOR] !== ArrayValues) try {
  10743. createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);
  10744. } catch (error) {
  10745. CollectionPrototype[ITERATOR] = ArrayValues;
  10746. }
  10747. if (!CollectionPrototype[TO_STRING_TAG]) {
  10748. createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
  10749. }
  10750. if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
  10751. // some Chrome versions have non-configurable methods on DOMTokenList
  10752. if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
  10753. createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
  10754. } catch (error) {
  10755. CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
  10756. }
  10757. }
  10758. }
  10759. }
  10760. /***/ }),
  10761. /***/ "./node_modules/performance-now/lib/performance-now.js":
  10762. /*!*************************************************************!*\
  10763. !*** ./node_modules/performance-now/lib/performance-now.js ***!
  10764. \*************************************************************/
  10765. /***/ (function(module) {
  10766. // Generated by CoffeeScript 1.12.2
  10767. (function() {
  10768. var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
  10769. if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
  10770. module.exports = function() {
  10771. return performance.now();
  10772. };
  10773. } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
  10774. module.exports = function() {
  10775. return (getNanoSeconds() - nodeLoadTime) / 1e6;
  10776. };
  10777. hrtime = process.hrtime;
  10778. getNanoSeconds = function() {
  10779. var hr;
  10780. hr = hrtime();
  10781. return hr[0] * 1e9 + hr[1];
  10782. };
  10783. moduleLoadTime = getNanoSeconds();
  10784. upTime = process.uptime() * 1e9;
  10785. nodeLoadTime = moduleLoadTime - upTime;
  10786. } else if (Date.now) {
  10787. module.exports = function() {
  10788. return Date.now() - loadTime;
  10789. };
  10790. loadTime = Date.now();
  10791. } else {
  10792. module.exports = function() {
  10793. return new Date().getTime() - loadTime;
  10794. };
  10795. loadTime = new Date().getTime();
  10796. }
  10797. }).call(this);
  10798. //# sourceMappingURL=performance-now.js.map
  10799. /***/ }),
  10800. /***/ "./node_modules/raf/index.js":
  10801. /*!***********************************!*\
  10802. !*** ./node_modules/raf/index.js ***!
  10803. \***********************************/
  10804. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  10805. var now = __webpack_require__(/*! performance-now */ "./node_modules/performance-now/lib/performance-now.js")
  10806. , root = typeof window === 'undefined' ? __webpack_require__.g : window
  10807. , vendors = ['moz', 'webkit']
  10808. , suffix = 'AnimationFrame'
  10809. , raf = root['request' + suffix]
  10810. , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]
  10811. for(var i = 0; !raf && i < vendors.length; i++) {
  10812. raf = root[vendors[i] + 'Request' + suffix]
  10813. caf = root[vendors[i] + 'Cancel' + suffix]
  10814. || root[vendors[i] + 'CancelRequest' + suffix]
  10815. }
  10816. // Some versions of FF have rAF but not cAF
  10817. if(!raf || !caf) {
  10818. var last = 0
  10819. , id = 0
  10820. , queue = []
  10821. , frameDuration = 1000 / 60
  10822. raf = function(callback) {
  10823. if(queue.length === 0) {
  10824. var _now = now()
  10825. , next = Math.max(0, frameDuration - (_now - last))
  10826. last = next + _now
  10827. setTimeout(function() {
  10828. var cp = queue.slice(0)
  10829. // Clear queue here to prevent
  10830. // callbacks from appending listeners
  10831. // to the current frame's queue
  10832. queue.length = 0
  10833. for(var i = 0; i < cp.length; i++) {
  10834. if(!cp[i].cancelled) {
  10835. try{
  10836. cp[i].callback(last)
  10837. } catch(e) {
  10838. setTimeout(function() { throw e }, 0)
  10839. }
  10840. }
  10841. }
  10842. }, Math.round(next))
  10843. }
  10844. queue.push({
  10845. handle: ++id,
  10846. callback: callback,
  10847. cancelled: false
  10848. })
  10849. return id
  10850. }
  10851. caf = function(handle) {
  10852. for(var i = 0; i < queue.length; i++) {
  10853. if(queue[i].handle === handle) {
  10854. queue[i].cancelled = true
  10855. }
  10856. }
  10857. }
  10858. }
  10859. module.exports = function(fn) {
  10860. // Wrap in a new function to prevent
  10861. // `cancel` potentially being assigned
  10862. // to the native rAF function
  10863. return raf.call(root, fn)
  10864. }
  10865. module.exports.cancel = function() {
  10866. caf.apply(root, arguments)
  10867. }
  10868. module.exports.polyfill = function(object) {
  10869. if (!object) {
  10870. object = root;
  10871. }
  10872. object.requestAnimationFrame = raf
  10873. object.cancelAnimationFrame = caf
  10874. }
  10875. /***/ }),
  10876. /***/ "./node_modules/regenerator-runtime/runtime.js":
  10877. /*!*****************************************************!*\
  10878. !*** ./node_modules/regenerator-runtime/runtime.js ***!
  10879. \*****************************************************/
  10880. /***/ ((module) => {
  10881. /**
  10882. * Copyright (c) 2014-present, Facebook, Inc.
  10883. *
  10884. * This source code is licensed under the MIT license found in the
  10885. * LICENSE file in the root directory of this source tree.
  10886. */
  10887. var runtime = (function (exports) {
  10888. "use strict";
  10889. var Op = Object.prototype;
  10890. var hasOwn = Op.hasOwnProperty;
  10891. var undefined; // More compressible than void 0.
  10892. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  10893. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  10894. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  10895. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  10896. function define(obj, key, value) {
  10897. Object.defineProperty(obj, key, {
  10898. value: value,
  10899. enumerable: true,
  10900. configurable: true,
  10901. writable: true
  10902. });
  10903. return obj[key];
  10904. }
  10905. try {
  10906. // IE 8 has a broken Object.defineProperty that only works on DOM objects.
  10907. define({}, "");
  10908. } catch (err) {
  10909. define = function(obj, key, value) {
  10910. return obj[key] = value;
  10911. };
  10912. }
  10913. function wrap(innerFn, outerFn, self, tryLocsList) {
  10914. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  10915. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  10916. var generator = Object.create(protoGenerator.prototype);
  10917. var context = new Context(tryLocsList || []);
  10918. // The ._invoke method unifies the implementations of the .next,
  10919. // .throw, and .return methods.
  10920. generator._invoke = makeInvokeMethod(innerFn, self, context);
  10921. return generator;
  10922. }
  10923. exports.wrap = wrap;
  10924. // Try/catch helper to minimize deoptimizations. Returns a completion
  10925. // record like context.tryEntries[i].completion. This interface could
  10926. // have been (and was previously) designed to take a closure to be
  10927. // invoked without arguments, but in all the cases we care about we
  10928. // already have an existing method we want to call, so there's no need
  10929. // to create a new function object. We can even get away with assuming
  10930. // the method takes exactly one argument, since that happens to be true
  10931. // in every case, so we don't have to touch the arguments object. The
  10932. // only additional allocation required is the completion record, which
  10933. // has a stable shape and so hopefully should be cheap to allocate.
  10934. function tryCatch(fn, obj, arg) {
  10935. try {
  10936. return { type: "normal", arg: fn.call(obj, arg) };
  10937. } catch (err) {
  10938. return { type: "throw", arg: err };
  10939. }
  10940. }
  10941. var GenStateSuspendedStart = "suspendedStart";
  10942. var GenStateSuspendedYield = "suspendedYield";
  10943. var GenStateExecuting = "executing";
  10944. var GenStateCompleted = "completed";
  10945. // Returning this object from the innerFn has the same effect as
  10946. // breaking out of the dispatch switch statement.
  10947. var ContinueSentinel = {};
  10948. // Dummy constructor functions that we use as the .constructor and
  10949. // .constructor.prototype properties for functions that return Generator
  10950. // objects. For full spec compliance, you may wish to configure your
  10951. // minifier not to mangle the names of these two functions.
  10952. function Generator() {}
  10953. function GeneratorFunction() {}
  10954. function GeneratorFunctionPrototype() {}
  10955. // This is a polyfill for %IteratorPrototype% for environments that
  10956. // don't natively support it.
  10957. var IteratorPrototype = {};
  10958. IteratorPrototype[iteratorSymbol] = function () {
  10959. return this;
  10960. };
  10961. var getProto = Object.getPrototypeOf;
  10962. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  10963. if (NativeIteratorPrototype &&
  10964. NativeIteratorPrototype !== Op &&
  10965. hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  10966. // This environment has a native %IteratorPrototype%; use it instead
  10967. // of the polyfill.
  10968. IteratorPrototype = NativeIteratorPrototype;
  10969. }
  10970. var Gp = GeneratorFunctionPrototype.prototype =
  10971. Generator.prototype = Object.create(IteratorPrototype);
  10972. GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  10973. GeneratorFunctionPrototype.constructor = GeneratorFunction;
  10974. GeneratorFunction.displayName = define(
  10975. GeneratorFunctionPrototype,
  10976. toStringTagSymbol,
  10977. "GeneratorFunction"
  10978. );
  10979. // Helper for defining the .next, .throw, and .return methods of the
  10980. // Iterator interface in terms of a single ._invoke method.
  10981. function defineIteratorMethods(prototype) {
  10982. ["next", "throw", "return"].forEach(function(method) {
  10983. define(prototype, method, function(arg) {
  10984. return this._invoke(method, arg);
  10985. });
  10986. });
  10987. }
  10988. exports.isGeneratorFunction = function(genFun) {
  10989. var ctor = typeof genFun === "function" && genFun.constructor;
  10990. return ctor
  10991. ? ctor === GeneratorFunction ||
  10992. // For the native GeneratorFunction constructor, the best we can
  10993. // do is to check its .name property.
  10994. (ctor.displayName || ctor.name) === "GeneratorFunction"
  10995. : false;
  10996. };
  10997. exports.mark = function(genFun) {
  10998. if (Object.setPrototypeOf) {
  10999. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  11000. } else {
  11001. genFun.__proto__ = GeneratorFunctionPrototype;
  11002. define(genFun, toStringTagSymbol, "GeneratorFunction");
  11003. }
  11004. genFun.prototype = Object.create(Gp);
  11005. return genFun;
  11006. };
  11007. // Within the body of any async function, `await x` is transformed to
  11008. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  11009. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  11010. // meant to be awaited.
  11011. exports.awrap = function(arg) {
  11012. return { __await: arg };
  11013. };
  11014. function AsyncIterator(generator, PromiseImpl) {
  11015. function invoke(method, arg, resolve, reject) {
  11016. var record = tryCatch(generator[method], generator, arg);
  11017. if (record.type === "throw") {
  11018. reject(record.arg);
  11019. } else {
  11020. var result = record.arg;
  11021. var value = result.value;
  11022. if (value &&
  11023. typeof value === "object" &&
  11024. hasOwn.call(value, "__await")) {
  11025. return PromiseImpl.resolve(value.__await).then(function(value) {
  11026. invoke("next", value, resolve, reject);
  11027. }, function(err) {
  11028. invoke("throw", err, resolve, reject);
  11029. });
  11030. }
  11031. return PromiseImpl.resolve(value).then(function(unwrapped) {
  11032. // When a yielded Promise is resolved, its final value becomes
  11033. // the .value of the Promise<{value,done}> result for the
  11034. // current iteration.
  11035. result.value = unwrapped;
  11036. resolve(result);
  11037. }, function(error) {
  11038. // If a rejected Promise was yielded, throw the rejection back
  11039. // into the async generator function so it can be handled there.
  11040. return invoke("throw", error, resolve, reject);
  11041. });
  11042. }
  11043. }
  11044. var previousPromise;
  11045. function enqueue(method, arg) {
  11046. function callInvokeWithMethodAndArg() {
  11047. return new PromiseImpl(function(resolve, reject) {
  11048. invoke(method, arg, resolve, reject);
  11049. });
  11050. }
  11051. return previousPromise =
  11052. // If enqueue has been called before, then we want to wait until
  11053. // all previous Promises have been resolved before calling invoke,
  11054. // so that results are always delivered in the correct order. If
  11055. // enqueue has not been called before, then it is important to
  11056. // call invoke immediately, without waiting on a callback to fire,
  11057. // so that the async generator function has the opportunity to do
  11058. // any necessary setup in a predictable way. This predictability
  11059. // is why the Promise constructor synchronously invokes its
  11060. // executor callback, and why async functions synchronously
  11061. // execute code before the first await. Since we implement simple
  11062. // async functions in terms of async generators, it is especially
  11063. // important to get this right, even though it requires care.
  11064. previousPromise ? previousPromise.then(
  11065. callInvokeWithMethodAndArg,
  11066. // Avoid propagating failures to Promises returned by later
  11067. // invocations of the iterator.
  11068. callInvokeWithMethodAndArg
  11069. ) : callInvokeWithMethodAndArg();
  11070. }
  11071. // Define the unified helper method that is used to implement .next,
  11072. // .throw, and .return (see defineIteratorMethods).
  11073. this._invoke = enqueue;
  11074. }
  11075. defineIteratorMethods(AsyncIterator.prototype);
  11076. AsyncIterator.prototype[asyncIteratorSymbol] = function () {
  11077. return this;
  11078. };
  11079. exports.AsyncIterator = AsyncIterator;
  11080. // Note that simple async functions are implemented on top of
  11081. // AsyncIterator objects; they just return a Promise for the value of
  11082. // the final result produced by the iterator.
  11083. exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {
  11084. if (PromiseImpl === void 0) PromiseImpl = Promise;
  11085. var iter = new AsyncIterator(
  11086. wrap(innerFn, outerFn, self, tryLocsList),
  11087. PromiseImpl
  11088. );
  11089. return exports.isGeneratorFunction(outerFn)
  11090. ? iter // If outerFn is a generator, return the full iterator.
  11091. : iter.next().then(function(result) {
  11092. return result.done ? result.value : iter.next();
  11093. });
  11094. };
  11095. function makeInvokeMethod(innerFn, self, context) {
  11096. var state = GenStateSuspendedStart;
  11097. return function invoke(method, arg) {
  11098. if (state === GenStateExecuting) {
  11099. throw new Error("Generator is already running");
  11100. }
  11101. if (state === GenStateCompleted) {
  11102. if (method === "throw") {
  11103. throw arg;
  11104. }
  11105. // Be forgiving, per 25.3.3.3.3 of the spec:
  11106. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  11107. return doneResult();
  11108. }
  11109. context.method = method;
  11110. context.arg = arg;
  11111. while (true) {
  11112. var delegate = context.delegate;
  11113. if (delegate) {
  11114. var delegateResult = maybeInvokeDelegate(delegate, context);
  11115. if (delegateResult) {
  11116. if (delegateResult === ContinueSentinel) continue;
  11117. return delegateResult;
  11118. }
  11119. }
  11120. if (context.method === "next") {
  11121. // Setting context._sent for legacy support of Babel's
  11122. // function.sent implementation.
  11123. context.sent = context._sent = context.arg;
  11124. } else if (context.method === "throw") {
  11125. if (state === GenStateSuspendedStart) {
  11126. state = GenStateCompleted;
  11127. throw context.arg;
  11128. }
  11129. context.dispatchException(context.arg);
  11130. } else if (context.method === "return") {
  11131. context.abrupt("return", context.arg);
  11132. }
  11133. state = GenStateExecuting;
  11134. var record = tryCatch(innerFn, self, context);
  11135. if (record.type === "normal") {
  11136. // If an exception is thrown from innerFn, we leave state ===
  11137. // GenStateExecuting and loop back for another invocation.
  11138. state = context.done
  11139. ? GenStateCompleted
  11140. : GenStateSuspendedYield;
  11141. if (record.arg === ContinueSentinel) {
  11142. continue;
  11143. }
  11144. return {
  11145. value: record.arg,
  11146. done: context.done
  11147. };
  11148. } else if (record.type === "throw") {
  11149. state = GenStateCompleted;
  11150. // Dispatch the exception by looping back around to the
  11151. // context.dispatchException(context.arg) call above.
  11152. context.method = "throw";
  11153. context.arg = record.arg;
  11154. }
  11155. }
  11156. };
  11157. }
  11158. // Call delegate.iterator[context.method](context.arg) and handle the
  11159. // result, either by returning a { value, done } result from the
  11160. // delegate iterator, or by modifying context.method and context.arg,
  11161. // setting context.delegate to null, and returning the ContinueSentinel.
  11162. function maybeInvokeDelegate(delegate, context) {
  11163. var method = delegate.iterator[context.method];
  11164. if (method === undefined) {
  11165. // A .throw or .return when the delegate iterator has no .throw
  11166. // method always terminates the yield* loop.
  11167. context.delegate = null;
  11168. if (context.method === "throw") {
  11169. // Note: ["return"] must be used for ES3 parsing compatibility.
  11170. if (delegate.iterator["return"]) {
  11171. // If the delegate iterator has a return method, give it a
  11172. // chance to clean up.
  11173. context.method = "return";
  11174. context.arg = undefined;
  11175. maybeInvokeDelegate(delegate, context);
  11176. if (context.method === "throw") {
  11177. // If maybeInvokeDelegate(context) changed context.method from
  11178. // "return" to "throw", let that override the TypeError below.
  11179. return ContinueSentinel;
  11180. }
  11181. }
  11182. context.method = "throw";
  11183. context.arg = new TypeError(
  11184. "The iterator does not provide a 'throw' method");
  11185. }
  11186. return ContinueSentinel;
  11187. }
  11188. var record = tryCatch(method, delegate.iterator, context.arg);
  11189. if (record.type === "throw") {
  11190. context.method = "throw";
  11191. context.arg = record.arg;
  11192. context.delegate = null;
  11193. return ContinueSentinel;
  11194. }
  11195. var info = record.arg;
  11196. if (! info) {
  11197. context.method = "throw";
  11198. context.arg = new TypeError("iterator result is not an object");
  11199. context.delegate = null;
  11200. return ContinueSentinel;
  11201. }
  11202. if (info.done) {
  11203. // Assign the result of the finished delegate to the temporary
  11204. // variable specified by delegate.resultName (see delegateYield).
  11205. context[delegate.resultName] = info.value;
  11206. // Resume execution at the desired location (see delegateYield).
  11207. context.next = delegate.nextLoc;
  11208. // If context.method was "throw" but the delegate handled the
  11209. // exception, let the outer generator proceed normally. If
  11210. // context.method was "next", forget context.arg since it has been
  11211. // "consumed" by the delegate iterator. If context.method was
  11212. // "return", allow the original .return call to continue in the
  11213. // outer generator.
  11214. if (context.method !== "return") {
  11215. context.method = "next";
  11216. context.arg = undefined;
  11217. }
  11218. } else {
  11219. // Re-yield the result returned by the delegate method.
  11220. return info;
  11221. }
  11222. // The delegate iterator is finished, so forget it and continue with
  11223. // the outer generator.
  11224. context.delegate = null;
  11225. return ContinueSentinel;
  11226. }
  11227. // Define Generator.prototype.{next,throw,return} in terms of the
  11228. // unified ._invoke helper method.
  11229. defineIteratorMethods(Gp);
  11230. define(Gp, toStringTagSymbol, "Generator");
  11231. // A Generator should always return itself as the iterator object when the
  11232. // @@iterator function is called on it. Some browsers' implementations of the
  11233. // iterator prototype chain incorrectly implement this, causing the Generator
  11234. // object to not be returned from this call. This ensures that doesn't happen.
  11235. // See https://github.com/facebook/regenerator/issues/274 for more details.
  11236. Gp[iteratorSymbol] = function() {
  11237. return this;
  11238. };
  11239. Gp.toString = function() {
  11240. return "[object Generator]";
  11241. };
  11242. function pushTryEntry(locs) {
  11243. var entry = { tryLoc: locs[0] };
  11244. if (1 in locs) {
  11245. entry.catchLoc = locs[1];
  11246. }
  11247. if (2 in locs) {
  11248. entry.finallyLoc = locs[2];
  11249. entry.afterLoc = locs[3];
  11250. }
  11251. this.tryEntries.push(entry);
  11252. }
  11253. function resetTryEntry(entry) {
  11254. var record = entry.completion || {};
  11255. record.type = "normal";
  11256. delete record.arg;
  11257. entry.completion = record;
  11258. }
  11259. function Context(tryLocsList) {
  11260. // The root entry object (effectively a try statement without a catch
  11261. // or a finally block) gives us a place to store values thrown from
  11262. // locations where there is no enclosing try statement.
  11263. this.tryEntries = [{ tryLoc: "root" }];
  11264. tryLocsList.forEach(pushTryEntry, this);
  11265. this.reset(true);
  11266. }
  11267. exports.keys = function(object) {
  11268. var keys = [];
  11269. for (var key in object) {
  11270. keys.push(key);
  11271. }
  11272. keys.reverse();
  11273. // Rather than returning an object with a next method, we keep
  11274. // things simple and return the next function itself.
  11275. return function next() {
  11276. while (keys.length) {
  11277. var key = keys.pop();
  11278. if (key in object) {
  11279. next.value = key;
  11280. next.done = false;
  11281. return next;
  11282. }
  11283. }
  11284. // To avoid creating an additional object, we just hang the .value
  11285. // and .done properties off the next function object itself. This
  11286. // also ensures that the minifier will not anonymize the function.
  11287. next.done = true;
  11288. return next;
  11289. };
  11290. };
  11291. function values(iterable) {
  11292. if (iterable) {
  11293. var iteratorMethod = iterable[iteratorSymbol];
  11294. if (iteratorMethod) {
  11295. return iteratorMethod.call(iterable);
  11296. }
  11297. if (typeof iterable.next === "function") {
  11298. return iterable;
  11299. }
  11300. if (!isNaN(iterable.length)) {
  11301. var i = -1, next = function next() {
  11302. while (++i < iterable.length) {
  11303. if (hasOwn.call(iterable, i)) {
  11304. next.value = iterable[i];
  11305. next.done = false;
  11306. return next;
  11307. }
  11308. }
  11309. next.value = undefined;
  11310. next.done = true;
  11311. return next;
  11312. };
  11313. return next.next = next;
  11314. }
  11315. }
  11316. // Return an iterator with no values.
  11317. return { next: doneResult };
  11318. }
  11319. exports.values = values;
  11320. function doneResult() {
  11321. return { value: undefined, done: true };
  11322. }
  11323. Context.prototype = {
  11324. constructor: Context,
  11325. reset: function(skipTempReset) {
  11326. this.prev = 0;
  11327. this.next = 0;
  11328. // Resetting context._sent for legacy support of Babel's
  11329. // function.sent implementation.
  11330. this.sent = this._sent = undefined;
  11331. this.done = false;
  11332. this.delegate = null;
  11333. this.method = "next";
  11334. this.arg = undefined;
  11335. this.tryEntries.forEach(resetTryEntry);
  11336. if (!skipTempReset) {
  11337. for (var name in this) {
  11338. // Not sure about the optimal order of these conditions:
  11339. if (name.charAt(0) === "t" &&
  11340. hasOwn.call(this, name) &&
  11341. !isNaN(+name.slice(1))) {
  11342. this[name] = undefined;
  11343. }
  11344. }
  11345. }
  11346. },
  11347. stop: function() {
  11348. this.done = true;
  11349. var rootEntry = this.tryEntries[0];
  11350. var rootRecord = rootEntry.completion;
  11351. if (rootRecord.type === "throw") {
  11352. throw rootRecord.arg;
  11353. }
  11354. return this.rval;
  11355. },
  11356. dispatchException: function(exception) {
  11357. if (this.done) {
  11358. throw exception;
  11359. }
  11360. var context = this;
  11361. function handle(loc, caught) {
  11362. record.type = "throw";
  11363. record.arg = exception;
  11364. context.next = loc;
  11365. if (caught) {
  11366. // If the dispatched exception was caught by a catch block,
  11367. // then let that catch block handle the exception normally.
  11368. context.method = "next";
  11369. context.arg = undefined;
  11370. }
  11371. return !! caught;
  11372. }
  11373. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  11374. var entry = this.tryEntries[i];
  11375. var record = entry.completion;
  11376. if (entry.tryLoc === "root") {
  11377. // Exception thrown outside of any try block that could handle
  11378. // it, so set the completion value of the entire function to
  11379. // throw the exception.
  11380. return handle("end");
  11381. }
  11382. if (entry.tryLoc <= this.prev) {
  11383. var hasCatch = hasOwn.call(entry, "catchLoc");
  11384. var hasFinally = hasOwn.call(entry, "finallyLoc");
  11385. if (hasCatch && hasFinally) {
  11386. if (this.prev < entry.catchLoc) {
  11387. return handle(entry.catchLoc, true);
  11388. } else if (this.prev < entry.finallyLoc) {
  11389. return handle(entry.finallyLoc);
  11390. }
  11391. } else if (hasCatch) {
  11392. if (this.prev < entry.catchLoc) {
  11393. return handle(entry.catchLoc, true);
  11394. }
  11395. } else if (hasFinally) {
  11396. if (this.prev < entry.finallyLoc) {
  11397. return handle(entry.finallyLoc);
  11398. }
  11399. } else {
  11400. throw new Error("try statement without catch or finally");
  11401. }
  11402. }
  11403. }
  11404. },
  11405. abrupt: function(type, arg) {
  11406. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  11407. var entry = this.tryEntries[i];
  11408. if (entry.tryLoc <= this.prev &&
  11409. hasOwn.call(entry, "finallyLoc") &&
  11410. this.prev < entry.finallyLoc) {
  11411. var finallyEntry = entry;
  11412. break;
  11413. }
  11414. }
  11415. if (finallyEntry &&
  11416. (type === "break" ||
  11417. type === "continue") &&
  11418. finallyEntry.tryLoc <= arg &&
  11419. arg <= finallyEntry.finallyLoc) {
  11420. // Ignore the finally entry if control is not jumping to a
  11421. // location outside the try/catch block.
  11422. finallyEntry = null;
  11423. }
  11424. var record = finallyEntry ? finallyEntry.completion : {};
  11425. record.type = type;
  11426. record.arg = arg;
  11427. if (finallyEntry) {
  11428. this.method = "next";
  11429. this.next = finallyEntry.finallyLoc;
  11430. return ContinueSentinel;
  11431. }
  11432. return this.complete(record);
  11433. },
  11434. complete: function(record, afterLoc) {
  11435. if (record.type === "throw") {
  11436. throw record.arg;
  11437. }
  11438. if (record.type === "break" ||
  11439. record.type === "continue") {
  11440. this.next = record.arg;
  11441. } else if (record.type === "return") {
  11442. this.rval = this.arg = record.arg;
  11443. this.method = "return";
  11444. this.next = "end";
  11445. } else if (record.type === "normal" && afterLoc) {
  11446. this.next = afterLoc;
  11447. }
  11448. return ContinueSentinel;
  11449. },
  11450. finish: function(finallyLoc) {
  11451. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  11452. var entry = this.tryEntries[i];
  11453. if (entry.finallyLoc === finallyLoc) {
  11454. this.complete(entry.completion, entry.afterLoc);
  11455. resetTryEntry(entry);
  11456. return ContinueSentinel;
  11457. }
  11458. }
  11459. },
  11460. "catch": function(tryLoc) {
  11461. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  11462. var entry = this.tryEntries[i];
  11463. if (entry.tryLoc === tryLoc) {
  11464. var record = entry.completion;
  11465. if (record.type === "throw") {
  11466. var thrown = record.arg;
  11467. resetTryEntry(entry);
  11468. }
  11469. return thrown;
  11470. }
  11471. }
  11472. // The context.catch method must only be called with a location
  11473. // argument that corresponds to a known catch block.
  11474. throw new Error("illegal catch attempt");
  11475. },
  11476. delegateYield: function(iterable, resultName, nextLoc) {
  11477. this.delegate = {
  11478. iterator: values(iterable),
  11479. resultName: resultName,
  11480. nextLoc: nextLoc
  11481. };
  11482. if (this.method === "next") {
  11483. // Deliberately forget the last sent value so that we don't
  11484. // accidentally pass it on to the delegate.
  11485. this.arg = undefined;
  11486. }
  11487. return ContinueSentinel;
  11488. }
  11489. };
  11490. // Regardless of whether this script is executing as a CommonJS module
  11491. // or not, return the runtime object so that we can declare the variable
  11492. // regeneratorRuntime in the outer scope, which allows this module to be
  11493. // injected easily by `bin/regenerator --include-runtime script.js`.
  11494. return exports;
  11495. }(
  11496. // If this script is executing as a CommonJS module, use module.exports
  11497. // as the regeneratorRuntime namespace. Otherwise create a new empty
  11498. // object. Either way, the resulting object will be used to initialize
  11499. // the regeneratorRuntime variable at the top of this file.
  11500. true ? module.exports : 0
  11501. ));
  11502. try {
  11503. regeneratorRuntime = runtime;
  11504. } catch (accidentalStrictMode) {
  11505. // This module should not be running in strict mode, so the above
  11506. // assignment should always work unless something is misconfigured. Just
  11507. // in case runtime.js accidentally runs in strict mode, we can escape
  11508. // strict mode using a global Function call. This could conceivably fail
  11509. // if a Content Security Policy forbids using Function, but in that case
  11510. // the proper solution is to fix the accidental strict mode problem. If
  11511. // you've misconfigured your bundler to force strict mode and applied a
  11512. // CSP to forbid Function, and you're not willing to fix either of those
  11513. // problems, please detail your unique predicament in a GitHub issue.
  11514. Function("r", "regeneratorRuntime = r")(runtime);
  11515. }
  11516. /***/ }),
  11517. /***/ "./node_modules/rgbcolor/index.js":
  11518. /*!****************************************!*\
  11519. !*** ./node_modules/rgbcolor/index.js ***!
  11520. \****************************************/
  11521. /***/ ((module) => {
  11522. /*
  11523. Based on rgbcolor.js by Stoyan Stefanov <sstoo@gmail.com>
  11524. http://www.phpied.com/rgb-color-parser-in-javascript/
  11525. */
  11526. module.exports = function(color_string) {
  11527. this.ok = false;
  11528. this.alpha = 1.0;
  11529. // strip any leading #
  11530. if (color_string.charAt(0) == '#') { // remove # if any
  11531. color_string = color_string.substr(1,6);
  11532. }
  11533. color_string = color_string.replace(/ /g,'');
  11534. color_string = color_string.toLowerCase();
  11535. // before getting into regexps, try simple matches
  11536. // and overwrite the input
  11537. var simple_colors = {
  11538. aliceblue: 'f0f8ff',
  11539. antiquewhite: 'faebd7',
  11540. aqua: '00ffff',
  11541. aquamarine: '7fffd4',
  11542. azure: 'f0ffff',
  11543. beige: 'f5f5dc',
  11544. bisque: 'ffe4c4',
  11545. black: '000000',
  11546. blanchedalmond: 'ffebcd',
  11547. blue: '0000ff',
  11548. blueviolet: '8a2be2',
  11549. brown: 'a52a2a',
  11550. burlywood: 'deb887',
  11551. cadetblue: '5f9ea0',
  11552. chartreuse: '7fff00',
  11553. chocolate: 'd2691e',
  11554. coral: 'ff7f50',
  11555. cornflowerblue: '6495ed',
  11556. cornsilk: 'fff8dc',
  11557. crimson: 'dc143c',
  11558. cyan: '00ffff',
  11559. darkblue: '00008b',
  11560. darkcyan: '008b8b',
  11561. darkgoldenrod: 'b8860b',
  11562. darkgray: 'a9a9a9',
  11563. darkgreen: '006400',
  11564. darkkhaki: 'bdb76b',
  11565. darkmagenta: '8b008b',
  11566. darkolivegreen: '556b2f',
  11567. darkorange: 'ff8c00',
  11568. darkorchid: '9932cc',
  11569. darkred: '8b0000',
  11570. darksalmon: 'e9967a',
  11571. darkseagreen: '8fbc8f',
  11572. darkslateblue: '483d8b',
  11573. darkslategray: '2f4f4f',
  11574. darkturquoise: '00ced1',
  11575. darkviolet: '9400d3',
  11576. deeppink: 'ff1493',
  11577. deepskyblue: '00bfff',
  11578. dimgray: '696969',
  11579. dodgerblue: '1e90ff',
  11580. feldspar: 'd19275',
  11581. firebrick: 'b22222',
  11582. floralwhite: 'fffaf0',
  11583. forestgreen: '228b22',
  11584. fuchsia: 'ff00ff',
  11585. gainsboro: 'dcdcdc',
  11586. ghostwhite: 'f8f8ff',
  11587. gold: 'ffd700',
  11588. goldenrod: 'daa520',
  11589. gray: '808080',
  11590. green: '008000',
  11591. greenyellow: 'adff2f',
  11592. honeydew: 'f0fff0',
  11593. hotpink: 'ff69b4',
  11594. indianred : 'cd5c5c',
  11595. indigo : '4b0082',
  11596. ivory: 'fffff0',
  11597. khaki: 'f0e68c',
  11598. lavender: 'e6e6fa',
  11599. lavenderblush: 'fff0f5',
  11600. lawngreen: '7cfc00',
  11601. lemonchiffon: 'fffacd',
  11602. lightblue: 'add8e6',
  11603. lightcoral: 'f08080',
  11604. lightcyan: 'e0ffff',
  11605. lightgoldenrodyellow: 'fafad2',
  11606. lightgrey: 'd3d3d3',
  11607. lightgreen: '90ee90',
  11608. lightpink: 'ffb6c1',
  11609. lightsalmon: 'ffa07a',
  11610. lightseagreen: '20b2aa',
  11611. lightskyblue: '87cefa',
  11612. lightslateblue: '8470ff',
  11613. lightslategray: '778899',
  11614. lightsteelblue: 'b0c4de',
  11615. lightyellow: 'ffffe0',
  11616. lime: '00ff00',
  11617. limegreen: '32cd32',
  11618. linen: 'faf0e6',
  11619. magenta: 'ff00ff',
  11620. maroon: '800000',
  11621. mediumaquamarine: '66cdaa',
  11622. mediumblue: '0000cd',
  11623. mediumorchid: 'ba55d3',
  11624. mediumpurple: '9370d8',
  11625. mediumseagreen: '3cb371',
  11626. mediumslateblue: '7b68ee',
  11627. mediumspringgreen: '00fa9a',
  11628. mediumturquoise: '48d1cc',
  11629. mediumvioletred: 'c71585',
  11630. midnightblue: '191970',
  11631. mintcream: 'f5fffa',
  11632. mistyrose: 'ffe4e1',
  11633. moccasin: 'ffe4b5',
  11634. navajowhite: 'ffdead',
  11635. navy: '000080',
  11636. oldlace: 'fdf5e6',
  11637. olive: '808000',
  11638. olivedrab: '6b8e23',
  11639. orange: 'ffa500',
  11640. orangered: 'ff4500',
  11641. orchid: 'da70d6',
  11642. palegoldenrod: 'eee8aa',
  11643. palegreen: '98fb98',
  11644. paleturquoise: 'afeeee',
  11645. palevioletred: 'd87093',
  11646. papayawhip: 'ffefd5',
  11647. peachpuff: 'ffdab9',
  11648. peru: 'cd853f',
  11649. pink: 'ffc0cb',
  11650. plum: 'dda0dd',
  11651. powderblue: 'b0e0e6',
  11652. purple: '800080',
  11653. rebeccapurple: '663399',
  11654. red: 'ff0000',
  11655. rosybrown: 'bc8f8f',
  11656. royalblue: '4169e1',
  11657. saddlebrown: '8b4513',
  11658. salmon: 'fa8072',
  11659. sandybrown: 'f4a460',
  11660. seagreen: '2e8b57',
  11661. seashell: 'fff5ee',
  11662. sienna: 'a0522d',
  11663. silver: 'c0c0c0',
  11664. skyblue: '87ceeb',
  11665. slateblue: '6a5acd',
  11666. slategray: '708090',
  11667. snow: 'fffafa',
  11668. springgreen: '00ff7f',
  11669. steelblue: '4682b4',
  11670. tan: 'd2b48c',
  11671. teal: '008080',
  11672. thistle: 'd8bfd8',
  11673. tomato: 'ff6347',
  11674. turquoise: '40e0d0',
  11675. violet: 'ee82ee',
  11676. violetred: 'd02090',
  11677. wheat: 'f5deb3',
  11678. white: 'ffffff',
  11679. whitesmoke: 'f5f5f5',
  11680. yellow: 'ffff00',
  11681. yellowgreen: '9acd32'
  11682. };
  11683. color_string = simple_colors[color_string] || color_string;
  11684. // emd of simple type-in colors
  11685. // array of color definition objects
  11686. var color_defs = [
  11687. {
  11688. re: /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,
  11689. example: ['rgba(123, 234, 45, 0.8)', 'rgba(255,234,245,1.0)'],
  11690. process: function (bits){
  11691. return [
  11692. parseInt(bits[1]),
  11693. parseInt(bits[2]),
  11694. parseInt(bits[3]),
  11695. parseFloat(bits[4])
  11696. ];
  11697. }
  11698. },
  11699. {
  11700. re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
  11701. example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
  11702. process: function (bits){
  11703. return [
  11704. parseInt(bits[1]),
  11705. parseInt(bits[2]),
  11706. parseInt(bits[3])
  11707. ];
  11708. }
  11709. },
  11710. {
  11711. re: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
  11712. example: ['#00ff00', '336699'],
  11713. process: function (bits){
  11714. return [
  11715. parseInt(bits[1], 16),
  11716. parseInt(bits[2], 16),
  11717. parseInt(bits[3], 16)
  11718. ];
  11719. }
  11720. },
  11721. {
  11722. re: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
  11723. example: ['#fb0', 'f0f'],
  11724. process: function (bits){
  11725. return [
  11726. parseInt(bits[1] + bits[1], 16),
  11727. parseInt(bits[2] + bits[2], 16),
  11728. parseInt(bits[3] + bits[3], 16)
  11729. ];
  11730. }
  11731. }
  11732. ];
  11733. // search through the definitions to find a match
  11734. for (var i = 0; i < color_defs.length; i++) {
  11735. var re = color_defs[i].re;
  11736. var processor = color_defs[i].process;
  11737. var bits = re.exec(color_string);
  11738. if (bits) {
  11739. var channels = processor(bits);
  11740. this.r = channels[0];
  11741. this.g = channels[1];
  11742. this.b = channels[2];
  11743. if (channels.length > 3) {
  11744. this.alpha = channels[3];
  11745. }
  11746. this.ok = true;
  11747. }
  11748. }
  11749. // validate/cleanup values
  11750. this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
  11751. this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
  11752. this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
  11753. this.alpha = (this.alpha < 0) ? 0 : ((this.alpha > 1.0 || isNaN(this.alpha)) ? 1.0 : this.alpha);
  11754. // some getters
  11755. this.toRGB = function () {
  11756. return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
  11757. }
  11758. this.toRGBA = function () {
  11759. return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.alpha + ')';
  11760. }
  11761. this.toHex = function () {
  11762. var r = this.r.toString(16);
  11763. var g = this.g.toString(16);
  11764. var b = this.b.toString(16);
  11765. if (r.length == 1) r = '0' + r;
  11766. if (g.length == 1) g = '0' + g;
  11767. if (b.length == 1) b = '0' + b;
  11768. return '#' + r + g + b;
  11769. }
  11770. // help
  11771. this.getHelpXML = function () {
  11772. var examples = new Array();
  11773. // add regexps
  11774. for (var i = 0; i < color_defs.length; i++) {
  11775. var example = color_defs[i].example;
  11776. for (var j = 0; j < example.length; j++) {
  11777. examples[examples.length] = example[j];
  11778. }
  11779. }
  11780. // add type-in colors
  11781. for (var sc in simple_colors) {
  11782. examples[examples.length] = sc;
  11783. }
  11784. var xml = document.createElement('ul');
  11785. xml.setAttribute('id', 'rgbcolor-examples');
  11786. for (var i = 0; i < examples.length; i++) {
  11787. try {
  11788. var list_item = document.createElement('li');
  11789. var list_color = new RGBColor(examples[i]);
  11790. var example_div = document.createElement('div');
  11791. example_div.style.cssText =
  11792. 'margin: 3px; '
  11793. + 'border: 1px solid black; '
  11794. + 'background:' + list_color.toHex() + '; '
  11795. + 'color:' + list_color.toHex()
  11796. ;
  11797. example_div.appendChild(document.createTextNode('test'));
  11798. var list_item_value = document.createTextNode(
  11799. ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
  11800. );
  11801. list_item.appendChild(example_div);
  11802. list_item.appendChild(list_item_value);
  11803. xml.appendChild(list_item);
  11804. } catch(e){}
  11805. }
  11806. return xml;
  11807. }
  11808. }
  11809. /***/ }),
  11810. /***/ "./node_modules/stackblur-canvas/dist/stackblur-es.js":
  11811. /*!************************************************************!*\
  11812. !*** ./node_modules/stackblur-canvas/dist/stackblur-es.js ***!
  11813. \************************************************************/
  11814. /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
  11815. "use strict";
  11816. __webpack_require__.r(__webpack_exports__);
  11817. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  11818. /* harmony export */ "BlurStack": () => (/* binding */ BlurStack),
  11819. /* harmony export */ "canvasRGB": () => (/* binding */ processCanvasRGB),
  11820. /* harmony export */ "canvasRGBA": () => (/* binding */ processCanvasRGBA),
  11821. /* harmony export */ "image": () => (/* binding */ processImage),
  11822. /* harmony export */ "imageDataRGB": () => (/* binding */ processImageDataRGB),
  11823. /* harmony export */ "imageDataRGBA": () => (/* binding */ processImageDataRGBA)
  11824. /* harmony export */ });
  11825. function _typeof(obj) {
  11826. "@babel/helpers - typeof";
  11827. if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
  11828. _typeof = function (obj) {
  11829. return typeof obj;
  11830. };
  11831. } else {
  11832. _typeof = function (obj) {
  11833. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  11834. };
  11835. }
  11836. return _typeof(obj);
  11837. }
  11838. function _classCallCheck(instance, Constructor) {
  11839. if (!(instance instanceof Constructor)) {
  11840. throw new TypeError("Cannot call a class as a function");
  11841. }
  11842. }
  11843. /* eslint-disable no-bitwise -- used for calculations */
  11844. /* eslint-disable unicorn/prefer-query-selector -- aiming at
  11845. backward-compatibility */
  11846. /**
  11847. * StackBlur - a fast almost Gaussian Blur For Canvas
  11848. *
  11849. * In case you find this class useful - especially in commercial projects -
  11850. * I am not totally unhappy for a small donation to my PayPal account
  11851. * mario@quasimondo.de
  11852. *
  11853. * Or support me on flattr:
  11854. * {@link https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript}.
  11855. *
  11856. * @module StackBlur
  11857. * @author Mario Klingemann
  11858. * Contact: mario@quasimondo.com
  11859. * Website: {@link http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html}
  11860. * Twitter: @quasimondo
  11861. *
  11862. * @copyright (c) 2010 Mario Klingemann
  11863. *
  11864. * Permission is hereby granted, free of charge, to any person
  11865. * obtaining a copy of this software and associated documentation
  11866. * files (the "Software"), to deal in the Software without
  11867. * restriction, including without limitation the rights to use,
  11868. * copy, modify, merge, publish, distribute, sublicense, and/or sell
  11869. * copies of the Software, and to permit persons to whom the
  11870. * Software is furnished to do so, subject to the following
  11871. * conditions:
  11872. *
  11873. * The above copyright notice and this permission notice shall be
  11874. * included in all copies or substantial portions of the Software.
  11875. *
  11876. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  11877. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  11878. * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  11879. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  11880. * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  11881. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  11882. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  11883. * OTHER DEALINGS IN THE SOFTWARE.
  11884. */
  11885. var mulTable = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];
  11886. var shgTable = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];
  11887. /**
  11888. * @param {string|HTMLImageElement} img
  11889. * @param {string|HTMLCanvasElement} canvas
  11890. * @param {Float} radius
  11891. * @param {boolean} blurAlphaChannel
  11892. * @param {boolean} useOffset
  11893. * @param {boolean} skipStyles
  11894. * @returns {undefined}
  11895. */
  11896. function processImage(img, canvas, radius, blurAlphaChannel, useOffset, skipStyles) {
  11897. if (typeof img === 'string') {
  11898. img = document.getElementById(img);
  11899. }
  11900. if (!img || !('naturalWidth' in img)) {
  11901. return;
  11902. }
  11903. var dimensionType = useOffset ? 'offset' : 'natural';
  11904. var w = img[dimensionType + 'Width'];
  11905. var h = img[dimensionType + 'Height'];
  11906. if (typeof canvas === 'string') {
  11907. canvas = document.getElementById(canvas);
  11908. }
  11909. if (!canvas || !('getContext' in canvas)) {
  11910. return;
  11911. }
  11912. if (!skipStyles) {
  11913. canvas.style.width = w + 'px';
  11914. canvas.style.height = h + 'px';
  11915. }
  11916. canvas.width = w;
  11917. canvas.height = h;
  11918. var context = canvas.getContext('2d');
  11919. context.clearRect(0, 0, w, h);
  11920. context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, w, h);
  11921. if (isNaN(radius) || radius < 1) {
  11922. return;
  11923. }
  11924. if (blurAlphaChannel) {
  11925. processCanvasRGBA(canvas, 0, 0, w, h, radius);
  11926. } else {
  11927. processCanvasRGB(canvas, 0, 0, w, h, radius);
  11928. }
  11929. }
  11930. /**
  11931. * @param {string|HTMLCanvasElement} canvas
  11932. * @param {Integer} topX
  11933. * @param {Integer} topY
  11934. * @param {Integer} width
  11935. * @param {Integer} height
  11936. * @throws {Error|TypeError}
  11937. * @returns {ImageData} See {@link https://html.spec.whatwg.org/multipage/canvas.html#imagedata}
  11938. */
  11939. function getImageDataFromCanvas(canvas, topX, topY, width, height) {
  11940. if (typeof canvas === 'string') {
  11941. canvas = document.getElementById(canvas);
  11942. }
  11943. if (!canvas || _typeof(canvas) !== 'object' || !('getContext' in canvas)) {
  11944. throw new TypeError('Expecting canvas with `getContext` method ' + 'in processCanvasRGB(A) calls!');
  11945. }
  11946. var context = canvas.getContext('2d');
  11947. try {
  11948. return context.getImageData(topX, topY, width, height);
  11949. } catch (e) {
  11950. throw new Error('unable to access image data: ' + e);
  11951. }
  11952. }
  11953. /**
  11954. * @param {HTMLCanvasElement} canvas
  11955. * @param {Integer} topX
  11956. * @param {Integer} topY
  11957. * @param {Integer} width
  11958. * @param {Integer} height
  11959. * @param {Float} radius
  11960. * @returns {undefined}
  11961. */
  11962. function processCanvasRGBA(canvas, topX, topY, width, height, radius) {
  11963. if (isNaN(radius) || radius < 1) {
  11964. return;
  11965. }
  11966. radius |= 0;
  11967. var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height);
  11968. imageData = processImageDataRGBA(imageData, topX, topY, width, height, radius);
  11969. canvas.getContext('2d').putImageData(imageData, topX, topY);
  11970. }
  11971. /**
  11972. * @param {ImageData} imageData
  11973. * @param {Integer} topX
  11974. * @param {Integer} topY
  11975. * @param {Integer} width
  11976. * @param {Integer} height
  11977. * @param {Float} radius
  11978. * @returns {ImageData}
  11979. */
  11980. function processImageDataRGBA(imageData, topX, topY, width, height, radius) {
  11981. var pixels = imageData.data;
  11982. var div = 2 * radius + 1; // const w4 = width << 2;
  11983. var widthMinus1 = width - 1;
  11984. var heightMinus1 = height - 1;
  11985. var radiusPlus1 = radius + 1;
  11986. var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
  11987. var stackStart = new BlurStack();
  11988. var stack = stackStart;
  11989. var stackEnd;
  11990. for (var i = 1; i < div; i++) {
  11991. stack = stack.next = new BlurStack();
  11992. if (i === radiusPlus1) {
  11993. stackEnd = stack;
  11994. }
  11995. }
  11996. stack.next = stackStart;
  11997. var stackIn = null,
  11998. stackOut = null,
  11999. yw = 0,
  12000. yi = 0;
  12001. var mulSum = mulTable[radius];
  12002. var shgSum = shgTable[radius];
  12003. for (var y = 0; y < height; y++) {
  12004. stack = stackStart;
  12005. var pr = pixels[yi],
  12006. pg = pixels[yi + 1],
  12007. pb = pixels[yi + 2],
  12008. pa = pixels[yi + 3];
  12009. for (var _i = 0; _i < radiusPlus1; _i++) {
  12010. stack.r = pr;
  12011. stack.g = pg;
  12012. stack.b = pb;
  12013. stack.a = pa;
  12014. stack = stack.next;
  12015. }
  12016. var rInSum = 0,
  12017. gInSum = 0,
  12018. bInSum = 0,
  12019. aInSum = 0,
  12020. rOutSum = radiusPlus1 * pr,
  12021. gOutSum = radiusPlus1 * pg,
  12022. bOutSum = radiusPlus1 * pb,
  12023. aOutSum = radiusPlus1 * pa,
  12024. rSum = sumFactor * pr,
  12025. gSum = sumFactor * pg,
  12026. bSum = sumFactor * pb,
  12027. aSum = sumFactor * pa;
  12028. for (var _i2 = 1; _i2 < radiusPlus1; _i2++) {
  12029. var p = yi + ((widthMinus1 < _i2 ? widthMinus1 : _i2) << 2);
  12030. var r = pixels[p],
  12031. g = pixels[p + 1],
  12032. b = pixels[p + 2],
  12033. a = pixels[p + 3];
  12034. var rbs = radiusPlus1 - _i2;
  12035. rSum += (stack.r = r) * rbs;
  12036. gSum += (stack.g = g) * rbs;
  12037. bSum += (stack.b = b) * rbs;
  12038. aSum += (stack.a = a) * rbs;
  12039. rInSum += r;
  12040. gInSum += g;
  12041. bInSum += b;
  12042. aInSum += a;
  12043. stack = stack.next;
  12044. }
  12045. stackIn = stackStart;
  12046. stackOut = stackEnd;
  12047. for (var x = 0; x < width; x++) {
  12048. var paInitial = aSum * mulSum >> shgSum;
  12049. pixels[yi + 3] = paInitial;
  12050. if (paInitial !== 0) {
  12051. var _a2 = 255 / paInitial;
  12052. pixels[yi] = (rSum * mulSum >> shgSum) * _a2;
  12053. pixels[yi + 1] = (gSum * mulSum >> shgSum) * _a2;
  12054. pixels[yi + 2] = (bSum * mulSum >> shgSum) * _a2;
  12055. } else {
  12056. pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
  12057. }
  12058. rSum -= rOutSum;
  12059. gSum -= gOutSum;
  12060. bSum -= bOutSum;
  12061. aSum -= aOutSum;
  12062. rOutSum -= stackIn.r;
  12063. gOutSum -= stackIn.g;
  12064. bOutSum -= stackIn.b;
  12065. aOutSum -= stackIn.a;
  12066. var _p = x + radius + 1;
  12067. _p = yw + (_p < widthMinus1 ? _p : widthMinus1) << 2;
  12068. rInSum += stackIn.r = pixels[_p];
  12069. gInSum += stackIn.g = pixels[_p + 1];
  12070. bInSum += stackIn.b = pixels[_p + 2];
  12071. aInSum += stackIn.a = pixels[_p + 3];
  12072. rSum += rInSum;
  12073. gSum += gInSum;
  12074. bSum += bInSum;
  12075. aSum += aInSum;
  12076. stackIn = stackIn.next;
  12077. var _stackOut = stackOut,
  12078. _r = _stackOut.r,
  12079. _g = _stackOut.g,
  12080. _b = _stackOut.b,
  12081. _a = _stackOut.a;
  12082. rOutSum += _r;
  12083. gOutSum += _g;
  12084. bOutSum += _b;
  12085. aOutSum += _a;
  12086. rInSum -= _r;
  12087. gInSum -= _g;
  12088. bInSum -= _b;
  12089. aInSum -= _a;
  12090. stackOut = stackOut.next;
  12091. yi += 4;
  12092. }
  12093. yw += width;
  12094. }
  12095. for (var _x = 0; _x < width; _x++) {
  12096. yi = _x << 2;
  12097. var _pr = pixels[yi],
  12098. _pg = pixels[yi + 1],
  12099. _pb = pixels[yi + 2],
  12100. _pa = pixels[yi + 3],
  12101. _rOutSum = radiusPlus1 * _pr,
  12102. _gOutSum = radiusPlus1 * _pg,
  12103. _bOutSum = radiusPlus1 * _pb,
  12104. _aOutSum = radiusPlus1 * _pa,
  12105. _rSum = sumFactor * _pr,
  12106. _gSum = sumFactor * _pg,
  12107. _bSum = sumFactor * _pb,
  12108. _aSum = sumFactor * _pa;
  12109. stack = stackStart;
  12110. for (var _i3 = 0; _i3 < radiusPlus1; _i3++) {
  12111. stack.r = _pr;
  12112. stack.g = _pg;
  12113. stack.b = _pb;
  12114. stack.a = _pa;
  12115. stack = stack.next;
  12116. }
  12117. var yp = width;
  12118. var _gInSum = 0,
  12119. _bInSum = 0,
  12120. _aInSum = 0,
  12121. _rInSum = 0;
  12122. for (var _i4 = 1; _i4 <= radius; _i4++) {
  12123. yi = yp + _x << 2;
  12124. var _rbs = radiusPlus1 - _i4;
  12125. _rSum += (stack.r = _pr = pixels[yi]) * _rbs;
  12126. _gSum += (stack.g = _pg = pixels[yi + 1]) * _rbs;
  12127. _bSum += (stack.b = _pb = pixels[yi + 2]) * _rbs;
  12128. _aSum += (stack.a = _pa = pixels[yi + 3]) * _rbs;
  12129. _rInSum += _pr;
  12130. _gInSum += _pg;
  12131. _bInSum += _pb;
  12132. _aInSum += _pa;
  12133. stack = stack.next;
  12134. if (_i4 < heightMinus1) {
  12135. yp += width;
  12136. }
  12137. }
  12138. yi = _x;
  12139. stackIn = stackStart;
  12140. stackOut = stackEnd;
  12141. for (var _y = 0; _y < height; _y++) {
  12142. var _p2 = yi << 2;
  12143. pixels[_p2 + 3] = _pa = _aSum * mulSum >> shgSum;
  12144. if (_pa > 0) {
  12145. _pa = 255 / _pa;
  12146. pixels[_p2] = (_rSum * mulSum >> shgSum) * _pa;
  12147. pixels[_p2 + 1] = (_gSum * mulSum >> shgSum) * _pa;
  12148. pixels[_p2 + 2] = (_bSum * mulSum >> shgSum) * _pa;
  12149. } else {
  12150. pixels[_p2] = pixels[_p2 + 1] = pixels[_p2 + 2] = 0;
  12151. }
  12152. _rSum -= _rOutSum;
  12153. _gSum -= _gOutSum;
  12154. _bSum -= _bOutSum;
  12155. _aSum -= _aOutSum;
  12156. _rOutSum -= stackIn.r;
  12157. _gOutSum -= stackIn.g;
  12158. _bOutSum -= stackIn.b;
  12159. _aOutSum -= stackIn.a;
  12160. _p2 = _x + ((_p2 = _y + radiusPlus1) < heightMinus1 ? _p2 : heightMinus1) * width << 2;
  12161. _rSum += _rInSum += stackIn.r = pixels[_p2];
  12162. _gSum += _gInSum += stackIn.g = pixels[_p2 + 1];
  12163. _bSum += _bInSum += stackIn.b = pixels[_p2 + 2];
  12164. _aSum += _aInSum += stackIn.a = pixels[_p2 + 3];
  12165. stackIn = stackIn.next;
  12166. _rOutSum += _pr = stackOut.r;
  12167. _gOutSum += _pg = stackOut.g;
  12168. _bOutSum += _pb = stackOut.b;
  12169. _aOutSum += _pa = stackOut.a;
  12170. _rInSum -= _pr;
  12171. _gInSum -= _pg;
  12172. _bInSum -= _pb;
  12173. _aInSum -= _pa;
  12174. stackOut = stackOut.next;
  12175. yi += width;
  12176. }
  12177. }
  12178. return imageData;
  12179. }
  12180. /**
  12181. * @param {HTMLCanvasElement} canvas
  12182. * @param {Integer} topX
  12183. * @param {Integer} topY
  12184. * @param {Integer} width
  12185. * @param {Integer} height
  12186. * @param {Float} radius
  12187. * @returns {undefined}
  12188. */
  12189. function processCanvasRGB(canvas, topX, topY, width, height, radius) {
  12190. if (isNaN(radius) || radius < 1) {
  12191. return;
  12192. }
  12193. radius |= 0;
  12194. var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height);
  12195. imageData = processImageDataRGB(imageData, topX, topY, width, height, radius);
  12196. canvas.getContext('2d').putImageData(imageData, topX, topY);
  12197. }
  12198. /**
  12199. * @param {ImageData} imageData
  12200. * @param {Integer} topX
  12201. * @param {Integer} topY
  12202. * @param {Integer} width
  12203. * @param {Integer} height
  12204. * @param {Float} radius
  12205. * @returns {ImageData}
  12206. */
  12207. function processImageDataRGB(imageData, topX, topY, width, height, radius) {
  12208. var pixels = imageData.data;
  12209. var div = 2 * radius + 1; // const w4 = width << 2;
  12210. var widthMinus1 = width - 1;
  12211. var heightMinus1 = height - 1;
  12212. var radiusPlus1 = radius + 1;
  12213. var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
  12214. var stackStart = new BlurStack();
  12215. var stack = stackStart;
  12216. var stackEnd;
  12217. for (var i = 1; i < div; i++) {
  12218. stack = stack.next = new BlurStack();
  12219. if (i === radiusPlus1) {
  12220. stackEnd = stack;
  12221. }
  12222. }
  12223. stack.next = stackStart;
  12224. var stackIn = null;
  12225. var stackOut = null;
  12226. var mulSum = mulTable[radius];
  12227. var shgSum = shgTable[radius];
  12228. var p, rbs;
  12229. var yw = 0,
  12230. yi = 0;
  12231. for (var y = 0; y < height; y++) {
  12232. var pr = pixels[yi],
  12233. pg = pixels[yi + 1],
  12234. pb = pixels[yi + 2],
  12235. rOutSum = radiusPlus1 * pr,
  12236. gOutSum = radiusPlus1 * pg,
  12237. bOutSum = radiusPlus1 * pb,
  12238. rSum = sumFactor * pr,
  12239. gSum = sumFactor * pg,
  12240. bSum = sumFactor * pb;
  12241. stack = stackStart;
  12242. for (var _i5 = 0; _i5 < radiusPlus1; _i5++) {
  12243. stack.r = pr;
  12244. stack.g = pg;
  12245. stack.b = pb;
  12246. stack = stack.next;
  12247. }
  12248. var rInSum = 0,
  12249. gInSum = 0,
  12250. bInSum = 0;
  12251. for (var _i6 = 1; _i6 < radiusPlus1; _i6++) {
  12252. p = yi + ((widthMinus1 < _i6 ? widthMinus1 : _i6) << 2);
  12253. rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - _i6);
  12254. gSum += (stack.g = pg = pixels[p + 1]) * rbs;
  12255. bSum += (stack.b = pb = pixels[p + 2]) * rbs;
  12256. rInSum += pr;
  12257. gInSum += pg;
  12258. bInSum += pb;
  12259. stack = stack.next;
  12260. }
  12261. stackIn = stackStart;
  12262. stackOut = stackEnd;
  12263. for (var x = 0; x < width; x++) {
  12264. pixels[yi] = rSum * mulSum >> shgSum;
  12265. pixels[yi + 1] = gSum * mulSum >> shgSum;
  12266. pixels[yi + 2] = bSum * mulSum >> shgSum;
  12267. rSum -= rOutSum;
  12268. gSum -= gOutSum;
  12269. bSum -= bOutSum;
  12270. rOutSum -= stackIn.r;
  12271. gOutSum -= stackIn.g;
  12272. bOutSum -= stackIn.b;
  12273. p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;
  12274. rInSum += stackIn.r = pixels[p];
  12275. gInSum += stackIn.g = pixels[p + 1];
  12276. bInSum += stackIn.b = pixels[p + 2];
  12277. rSum += rInSum;
  12278. gSum += gInSum;
  12279. bSum += bInSum;
  12280. stackIn = stackIn.next;
  12281. rOutSum += pr = stackOut.r;
  12282. gOutSum += pg = stackOut.g;
  12283. bOutSum += pb = stackOut.b;
  12284. rInSum -= pr;
  12285. gInSum -= pg;
  12286. bInSum -= pb;
  12287. stackOut = stackOut.next;
  12288. yi += 4;
  12289. }
  12290. yw += width;
  12291. }
  12292. for (var _x2 = 0; _x2 < width; _x2++) {
  12293. yi = _x2 << 2;
  12294. var _pr2 = pixels[yi],
  12295. _pg2 = pixels[yi + 1],
  12296. _pb2 = pixels[yi + 2],
  12297. _rOutSum2 = radiusPlus1 * _pr2,
  12298. _gOutSum2 = radiusPlus1 * _pg2,
  12299. _bOutSum2 = radiusPlus1 * _pb2,
  12300. _rSum2 = sumFactor * _pr2,
  12301. _gSum2 = sumFactor * _pg2,
  12302. _bSum2 = sumFactor * _pb2;
  12303. stack = stackStart;
  12304. for (var _i7 = 0; _i7 < radiusPlus1; _i7++) {
  12305. stack.r = _pr2;
  12306. stack.g = _pg2;
  12307. stack.b = _pb2;
  12308. stack = stack.next;
  12309. }
  12310. var _rInSum2 = 0,
  12311. _gInSum2 = 0,
  12312. _bInSum2 = 0;
  12313. for (var _i8 = 1, yp = width; _i8 <= radius; _i8++) {
  12314. yi = yp + _x2 << 2;
  12315. _rSum2 += (stack.r = _pr2 = pixels[yi]) * (rbs = radiusPlus1 - _i8);
  12316. _gSum2 += (stack.g = _pg2 = pixels[yi + 1]) * rbs;
  12317. _bSum2 += (stack.b = _pb2 = pixels[yi + 2]) * rbs;
  12318. _rInSum2 += _pr2;
  12319. _gInSum2 += _pg2;
  12320. _bInSum2 += _pb2;
  12321. stack = stack.next;
  12322. if (_i8 < heightMinus1) {
  12323. yp += width;
  12324. }
  12325. }
  12326. yi = _x2;
  12327. stackIn = stackStart;
  12328. stackOut = stackEnd;
  12329. for (var _y2 = 0; _y2 < height; _y2++) {
  12330. p = yi << 2;
  12331. pixels[p] = _rSum2 * mulSum >> shgSum;
  12332. pixels[p + 1] = _gSum2 * mulSum >> shgSum;
  12333. pixels[p + 2] = _bSum2 * mulSum >> shgSum;
  12334. _rSum2 -= _rOutSum2;
  12335. _gSum2 -= _gOutSum2;
  12336. _bSum2 -= _bOutSum2;
  12337. _rOutSum2 -= stackIn.r;
  12338. _gOutSum2 -= stackIn.g;
  12339. _bOutSum2 -= stackIn.b;
  12340. p = _x2 + ((p = _y2 + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;
  12341. _rSum2 += _rInSum2 += stackIn.r = pixels[p];
  12342. _gSum2 += _gInSum2 += stackIn.g = pixels[p + 1];
  12343. _bSum2 += _bInSum2 += stackIn.b = pixels[p + 2];
  12344. stackIn = stackIn.next;
  12345. _rOutSum2 += _pr2 = stackOut.r;
  12346. _gOutSum2 += _pg2 = stackOut.g;
  12347. _bOutSum2 += _pb2 = stackOut.b;
  12348. _rInSum2 -= _pr2;
  12349. _gInSum2 -= _pg2;
  12350. _bInSum2 -= _pb2;
  12351. stackOut = stackOut.next;
  12352. yi += width;
  12353. }
  12354. }
  12355. return imageData;
  12356. }
  12357. /**
  12358. *
  12359. */
  12360. var BlurStack =
  12361. /**
  12362. * Set properties.
  12363. */
  12364. function BlurStack() {
  12365. _classCallCheck(this, BlurStack);
  12366. this.r = 0;
  12367. this.g = 0;
  12368. this.b = 0;
  12369. this.a = 0;
  12370. this.next = null;
  12371. };
  12372. /***/ })
  12373. }]);
  12374. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFtY2hhcnRzL2FtY2hhcnRzNC8uaW50ZXJuYWwvY2FudmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3N1cGVyUHJvcEJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29tZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGVyZm9ybWFuY2Utbm93L2xpYi9wZXJmb3JtYW5jZS1ub3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JhZi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZ2Jjb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RhY2tibHVyLWNhbnZhcy9kaXN0L3N0YWNrYmx1ci1lcy5qcyJdLCJu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QUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsNkVBQWM7QUFDaEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFD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Q3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLElBQUksK0VBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsNEVBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLCtFQUFlOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSw0RUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLElBQUksK0VBQWU7O0FBRW5CO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsRUFBRSw0RUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSSwrRUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSw0RUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyw2RUFBYzs7QUFFL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSwrRUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSw0RUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLFNBQVM7QUFDckM7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpR0FBaUc7QUFDakc7QUFDQTs7O0FBR0EscUJBQXFCOztBQUVy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RUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsK0JBQStCO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDLDZDQUE2Qzs7QUFFN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxHQUFHO0FBQ0g7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWU7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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eURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxLQUEwQixvQkFBb0IsQ0FBRTtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDM3VCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDJCQUEyQixJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUk7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLCtCQUErQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLCtCQUErQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFD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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUV3TCIsImZpbGUiOiJjYW52Zy41ZTA0YjIzZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4nO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheSc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaCc7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tICdAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvcic7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yJztcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eSc7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5ldmVyeSc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCc7XG5pbXBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGZyb20gJ3JhZic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lJztcbmltcG9ydCBSR0JDb2xvciBmcm9tICdyZ2Jjb2xvcic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmNvbnN0cnVjdCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mJztcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cyc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvbWUnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbSc7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXknO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZSc7XG5pbXBvcnQgX2dldCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3InO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsbCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eSc7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZCc7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbic7XG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UnO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMubWFwJztcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHknO1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJztcbmltcG9ydCB7IGNhbnZhc1JHQkEgfSBmcm9tICdzdGFja2JsdXItY2FudmFzJztcblxuLyoqXG4gKiBIVE1MLXNhZmUgY29tcHJlc3Mgd2hpdGUtc3BhY2VzLlxuICogQHBhcmFtIHN0ciAtIFN0cmluZyB0byBjb21wcmVzcy5cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NTcGFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKD8hXFx1MzAwMClcXHMrL2dtLCAnICcpO1xufVxuLyoqXG4gKiBIVE1MLXNhZmUgbGVmdCB0cmltLlxuICogQHBhcmFtIHN0ciAtIFN0cmluZyB0byB0cmltLlxuICovXG5cbmZ1bmN0aW9uIHRyaW1MZWZ0KHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bXFxuIFxcdF0rLywgJycpO1xufVxuLyoqXG4gKiBIVE1MLXNhZmUgcmlnaHQgdHJpbS5cbiAqIEBwYXJhbSBzdHIgLSBTdHJpbmcgdG8gdHJpbS5cbiAqL1xuXG5mdW5jdGlvbiB0cmltUmlnaHQoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvW1xcbiBcXHRdKyQvLCAnJyk7XG59XG4vKipcbiAqIFN0cmluZyB0byBudW1iZXJzIGFycmF5LlxuICogQHBhcmFtIHN0ciAtIE51bWJlcnMgc3RyaW5nLlxuICovXG5cbmZ1bmN0aW9uIHRvTnVtYmVycyhzdHIpIHtcbiAgdmFyIG1hdGNoZXMgPSAoc3RyIHx8ICcnKS5tYXRjaCgvLT8oXFxkKyg/OlxcLlxcZCooPzpbZUVdWystXT9cXGQrKT8pP3xcXC5cXGQrKSg/PVxcRHwkKS9nbSkgfHwgW107XG4gIHJldHVybiBtYXRjaGVzLm1hcChwYXJzZUZsb2F0KTtcbn0gLy8gTWljcm9zb2Z0IEVkZ2UgZml4XG5cbnZhciBhbGxVcHBlcmNhc2UgPSAvXltBLVotXSskLztcbi8qKlxuICogTm9ybWFsaXplIGF0dHJpYnV0ZSBuYW1lLlxuICogQHBhcmFtIG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVBdHRyaWJ1dGVOYW1lKG5hbWUpIHtcbiAgaWYgKGFsbFVwcGVyY2FzZS50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lO1xufVxuLyoqXG4gKiBQYXJzZSBleHRlcm5hbCBVUkwuXG4gKiBAcGFyYW0gdXJsIC0gQ1NTIHVybCBzdHJpbmcuXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VFeHRlcm5hbFVybCh1cmwpIHtcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBxdW90ZXMgWzJdXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICBkb3VibGUgcXVvdGVzIFszXVxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgdiAgICAgICAgbm8gcXVvdGVzIFs0XVxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgdiAgICAgICAgdlxuICB2YXIgdXJsTWF0Y2ggPSB1cmwubWF0Y2goL3VybFxcKCgnKFteJ10rKSd8XCIoW15cIl0rKVwifChbXidcIlxcKV0rKSlcXCkvKSB8fCBbXTtcbiAgcmV0dXJuIHVybE1hdGNoWzJdIHx8IHVybE1hdGNoWzNdIHx8IHVybE1hdGNoWzRdO1xufVxuLyoqXG4gKiBUcmFuc2Zvcm0gZmxvYXRzIHRvIGludGVnZXJzIGluIHJnYiBjb2xvcnMuXG4gKiBAcGFyYW0gY29sb3IgLSBDb2xvciB0byBub3JtYWxpemUuXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29sb3IoY29sb3IpIHtcbiAgaWYgKCFjb2xvci5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHZhciByZ2JQYXJ0cyA9IDM7XG4gIHZhciBub3JtYWxpemVkQ29sb3IgPSBjb2xvci5yZXBsYWNlKC9cXGQrKFxcLlxcZCspPy9nLCBmdW5jdGlvbiAobnVtLCBpc0Zsb2F0KSB7XG4gICAgcmV0dXJuIHJnYlBhcnRzLS0gJiYgaXNGbG9hdCA/IFN0cmluZyhNYXRoLnJvdW5kKHBhcnNlRmxvYXQobnVtKSkpIDogbnVtO1xuICB9KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRDb2xvcjtcbn1cblxuLy8gc2xpZ2h0bHkgbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2VlZ2Fuc3RyZWV0L3NwZWNpZmljaXR5L2Jsb2IvbWFzdGVyL3NwZWNpZmljaXR5LmpzXG52YXIgYXR0cmlidXRlUmVnZXggPSAvKFxcW1teXFxdXStcXF0pL2c7XG52YXIgaWRSZWdleCA9IC8oI1teXFxzXFwrPn5cXC5cXFs6XSspL2c7XG52YXIgY2xhc3NSZWdleCA9IC8oXFwuW15cXHNcXCs+flxcLlxcWzpdKykvZztcbnZhciBwc2V1ZG9FbGVtZW50UmVnZXggPSAvKDo6W15cXHNcXCs+flxcLlxcWzpdK3w6Zmlyc3QtbGluZXw6Zmlyc3QtbGV0dGVyfDpiZWZvcmV8OmFmdGVyKS9naTtcbnZhciBwc2V1ZG9DbGFzc1dpdGhCcmFja2V0c1JlZ2V4ID0gLyg6W1xcdy1dK1xcKFteXFwpXSpcXCkpL2dpO1xudmFyIHBzZXVkb0NsYXNzUmVnZXggPSAvKDpbXlxcc1xcKz5+XFwuXFxbOl0rKS9nO1xudmFyIGVsZW1lbnRSZWdleCA9IC8oW15cXHNcXCs+flxcLlxcWzpdKykvZztcblxuZnVuY3Rpb24gZmluZFNlbGVjdG9yTWF0Y2goc2VsZWN0b3IsIHJlZ2V4KSB7XG4gIHZhciBtYXRjaGVzID0gc2VsZWN0b3IubWF0Y2gocmVnZXgpO1xuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHJldHVybiBbc2VsZWN0b3IsIDBdO1xuICB9XG5cbiAgcmV0dXJuIFtzZWxlY3Rvci5yZXBsYWNlKHJlZ2V4LCAnICcpLCBtYXRjaGVzLmxlbmd0aF07XG59XG4vKipcbiAqIE1lYXN1cmUgc2VsZWN0b3Igc3BlY2lmaWNpdHkuXG4gKiBAcGFyYW0gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtZWFzdXJlLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JTcGVjaWZpY2l0eShzZWxlY3Rvcikge1xuICB2YXIgc3BlY2lmaWNpdHkgPSBbMCwgMCwgMF07XG4gIHZhciBjdXJyZW50U2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC86bm90XFwoKFteXFwpXSopXFwpL2csICcgICAgICQxICcpLnJlcGxhY2UoL3tbXFxzXFxTXSovZ20sICcgJyk7XG4gIHZhciBkZWx0YSA9IDA7XG5cbiAgdmFyIF9maW5kU2VsZWN0b3JNYXRjaCA9IGZpbmRTZWxlY3Rvck1hdGNoKGN1cnJlbnRTZWxlY3RvciwgYXR0cmlidXRlUmVnZXgpO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2gyID0gX3NsaWNlZFRvQXJyYXkoX2ZpbmRTZWxlY3Rvck1hdGNoLCAyKTtcblxuICBjdXJyZW50U2VsZWN0b3IgPSBfZmluZFNlbGVjdG9yTWF0Y2gyWzBdO1xuICBkZWx0YSA9IF9maW5kU2VsZWN0b3JNYXRjaDJbMV07XG4gIHNwZWNpZmljaXR5WzFdICs9IGRlbHRhO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2gzID0gZmluZFNlbGVjdG9yTWF0Y2goY3VycmVudFNlbGVjdG9yLCBpZFJlZ2V4KTtcblxuICB2YXIgX2ZpbmRTZWxlY3Rvck1hdGNoNCA9IF9zbGljZWRUb0FycmF5KF9maW5kU2VsZWN0b3JNYXRjaDMsIDIpO1xuXG4gIGN1cnJlbnRTZWxlY3RvciA9IF9maW5kU2VsZWN0b3JNYXRjaDRbMF07XG4gIGRlbHRhID0gX2ZpbmRTZWxlY3Rvck1hdGNoNFsxXTtcbiAgc3BlY2lmaWNpdHlbMF0gKz0gZGVsdGE7XG5cbiAgdmFyIF9maW5kU2VsZWN0b3JNYXRjaDUgPSBmaW5kU2VsZWN0b3JNYXRjaChjdXJyZW50U2VsZWN0b3IsIGNsYXNzUmVnZXgpO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2g2ID0gX3NsaWNlZFRvQXJyYXkoX2ZpbmRTZWxlY3Rvck1hdGNoNSwgMik7XG5cbiAgY3VycmVudFNlbGVjdG9yID0gX2ZpbmRTZWxlY3Rvck1hdGNoNlswXTtcbiAgZGVsdGEgPSBfZmluZFNlbGVjdG9yTWF0Y2g2WzFdO1xuICBzcGVjaWZpY2l0eVsxXSArPSBkZWx0YTtcblxuICB2YXIgX2ZpbmRTZWxlY3Rvck1hdGNoNyA9IGZpbmRTZWxlY3Rvck1hdGNoKGN1cnJlbnRTZWxlY3RvciwgcHNldWRvRWxlbWVudFJlZ2V4KTtcblxuICB2YXIgX2ZpbmRTZWxlY3Rvck1hdGNoOCA9IF9zbGljZWRUb0FycmF5KF9maW5kU2VsZWN0b3JNYXRjaDcsIDIpO1xuXG4gIGN1cnJlbnRTZWxlY3RvciA9IF9maW5kU2VsZWN0b3JNYXRjaDhbMF07XG4gIGRlbHRhID0gX2ZpbmRTZWxlY3Rvck1hdGNoOFsxXTtcbiAgc3BlY2lmaWNpdHlbMl0gKz0gZGVsdGE7XG5cbiAgdmFyIF9maW5kU2VsZWN0b3JNYXRjaDkgPSBmaW5kU2VsZWN0b3JNYXRjaChjdXJyZW50U2VsZWN0b3IsIHBzZXVkb0NsYXNzV2l0aEJyYWNrZXRzUmVnZXgpO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2gxMCA9IF9zbGljZWRUb0FycmF5KF9maW5kU2VsZWN0b3JNYXRjaDksIDIpO1xuXG4gIGN1cnJlbnRTZWxlY3RvciA9IF9maW5kU2VsZWN0b3JNYXRjaDEwWzBdO1xuICBkZWx0YSA9IF9maW5kU2VsZWN0b3JNYXRjaDEwWzFdO1xuICBzcGVjaWZpY2l0eVsxXSArPSBkZWx0YTtcblxuICB2YXIgX2ZpbmRTZWxlY3Rvck1hdGNoMTEgPSBmaW5kU2VsZWN0b3JNYXRjaChjdXJyZW50U2VsZWN0b3IsIHBzZXVkb0NsYXNzUmVnZXgpO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2gxMiA9IF9zbGljZWRUb0FycmF5KF9maW5kU2VsZWN0b3JNYXRjaDExLCAyKTtcblxuICBjdXJyZW50U2VsZWN0b3IgPSBfZmluZFNlbGVjdG9yTWF0Y2gxMlswXTtcbiAgZGVsdGEgPSBfZmluZFNlbGVjdG9yTWF0Y2gxMlsxXTtcbiAgc3BlY2lmaWNpdHlbMV0gKz0gZGVsdGE7XG4gIGN1cnJlbnRTZWxlY3RvciA9IGN1cnJlbnRTZWxlY3Rvci5yZXBsYWNlKC9bXFwqXFxzXFwrPn5dL2csICcgJykucmVwbGFjZSgvWyNcXC5dL2csICcgJyk7XG5cbiAgdmFyIF9maW5kU2VsZWN0b3JNYXRjaDEzID0gZmluZFNlbGVjdG9yTWF0Y2goY3VycmVudFNlbGVjdG9yLCBlbGVtZW50UmVnZXgpO1xuXG4gIHZhciBfZmluZFNlbGVjdG9yTWF0Y2gxNCA9IF9zbGljZWRUb0FycmF5KF9maW5kU2VsZWN0b3JNYXRjaDEzLCAyKTtcblxuICBjdXJyZW50U2VsZWN0b3IgPSBfZmluZFNlbGVjdG9yTWF0Y2gxNFswXTtcbiAgZGVsdGEgPSBfZmluZFNlbGVjdG9yTWF0Y2gxNFsxXTtcbiAgLy8gbGd0bSBbanMvdXNlbGVzcy1hc3NpZ25tZW50LXRvLWxvY2FsXVxuICBzcGVjaWZpY2l0eVsyXSArPSBkZWx0YTtcbiAgcmV0dXJuIHNwZWNpZmljaXR5LmpvaW4oJycpO1xufVxuXG52YXIgUFNFVURPX1pFUk8gPSAuMDAwMDAwMDE7XG4vKipcbiAqIFZlY3RvciBtYWduaXR1ZGUuXG4gKi9cblxuZnVuY3Rpb24gdmVjdG9yTWFnbml0dWRlKHYpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh2WzBdLCAyKSArIE1hdGgucG93KHZbMV0sIDIpKTtcbn1cbi8qKlxuICogUmF0aW8gYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqL1xuXG5mdW5jdGlvbiB2ZWN0b3JzUmF0aW8odSwgdikge1xuICByZXR1cm4gKHVbMF0gKiB2WzBdICsgdVsxXSAqIHZbMV0pIC8gKHZlY3Rvck1hZ25pdHVkZSh1KSAqIHZlY3Rvck1hZ25pdHVkZSh2KSk7XG59XG4vKipcbiAqIEFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnMuXG4gKi9cblxuZnVuY3Rpb24gdmVjdG9yc0FuZ2xlKHUsIHYpIHtcbiAgcmV0dXJuICh1WzBdICogdlsxXSA8IHVbMV0gKiB2WzBdID8gLTEgOiAxKSAqIE1hdGguYWNvcyh2ZWN0b3JzUmF0aW8odSwgdikpO1xufVxuZnVuY3Rpb24gQ0IxKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cbmZ1bmN0aW9uIENCMih0KSB7XG4gIHJldHVybiAzICogdCAqIHQgKiAoMSAtIHQpO1xufVxuZnVuY3Rpb24gQ0IzKHQpIHtcbiAgcmV0dXJuIDMgKiB0ICogKDEgLSB0KSAqICgxIC0gdCk7XG59XG5mdW5jdGlvbiBDQjQodCkge1xuICByZXR1cm4gKDEgLSB0KSAqICgxIC0gdCkgKiAoMSAtIHQpO1xufVxuZnVuY3Rpb24gUUIxKHQpIHtcbiAgcmV0dXJuIHQgKiB0O1xufVxuZnVuY3Rpb24gUUIyKHQpIHtcbiAgcmV0dXJuIDIgKiB0ICogKDEgLSB0KTtcbn1cbmZ1bmN0aW9uIFFCMyh0KSB7XG4gIHJldHVybiAoMSAtIHQpICogKDEgLSB0KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbnZhciBydW50aW1lXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8qKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAgICpcbiAgICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAgICovXG4gIHZhciBydW50aW1lID0gZnVuY3Rpb24gKGV4cG9ydHMpIHtcblxuICAgIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gICAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICAgIHZhciB1bmRlZmluZWQkMTsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG5cbiAgICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICAgIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gICAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gICAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuXG4gICAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICAgIH1cblxuICAgIGV4cG9ydHMud3JhcCA9IHdyYXA7IC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAgIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAgIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAgIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gICAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAgIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gICAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gICAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAgIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cblxuICAgIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwidGhyb3dcIixcbiAgICAgICAgICBhcmc6IGVyclxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICAgIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICAgIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gICAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjsgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAgIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cblxuICAgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307IC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAgIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAgIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gICAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cblxuICAgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG5cbiAgICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG5cbiAgICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9IC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuXG5cbiAgICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuICAgIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gICAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuXG4gICAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9IEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiOyAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAgIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG5cbiAgICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuIGN0b3IgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgOiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG5cbiAgICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgICAgcmV0dXJuIGdlbkZ1bjtcbiAgICB9OyAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAgIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuXG5cbiAgICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19hd2FpdDogYXJnXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuXG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcblxuICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkge1xuICAgICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgICB9IC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cblxuXG4gICAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICAgIH1cblxuICAgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG5cbiAgICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yOyAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gICAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG5cbiAgICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcbiAgICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTtcbiAgICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgICAgfSAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcblxuXG4gICAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG5cbiAgICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IEdlblN0YXRlQ29tcGxldGVkIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkOyAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuXG4gICAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gICAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gICAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG5cblxuICAgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG5cbiAgICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCQxKSB7XG4gICAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCQxO1xuICAgICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7IC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cblxuICAgICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jOyAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQkMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgIH0gLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG5cblxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9IC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gICAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuXG5cbiAgICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuICAgIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7IC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gICAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAgIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gICAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHRyeUxvYzogbG9jc1swXVxuICAgICAgfTtcblxuICAgICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgICB9XG5cbiAgICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgICAgdHJ5TG9jOiBcInJvb3RcIlxuICAgICAgfV07XG4gICAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgICB0aGlzLnJlc2V0KHRydWUpO1xuICAgIH1cblxuICAgIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIHZhciBrZXlzID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleXMucmV2ZXJzZSgpOyAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuXG4gICAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG5cblxuICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcblxuICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQkMTtcbiAgICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGRvbmVSZXN1bHRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCQxLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cblxuICAgIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsXG4gICAgICByZXNldDogZnVuY3Rpb24gKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgICAgdGhpcy5uZXh0ID0gMDsgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cblxuICAgICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkJDE7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQkMTtcbiAgICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQkMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgICAgfSxcbiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiAoZXhjZXB0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCQxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhIWNhdWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWJydXB0OiBmdW5jdGlvbiAodHlwZSwgYXJnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG5cbiAgICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYgKHR5cGUgPT09IFwiYnJlYWtcIiB8fCB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgICAgfSxcbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fCByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9LFxuICAgICAgZmluaXNoOiBmdW5jdGlvbiAoZmluYWxseUxvYykge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuXG4gICAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImNhdGNoXCI6IGZ1bmN0aW9uICh0cnlMb2MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcblxuICAgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cblxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICAgIH0sXG4gICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiAoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQkMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuICAgIH07IC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuXG4gICAgcmV0dXJuIGV4cG9ydHM7XG4gIH0oIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgIG1vZHVsZS5leHBvcnRzICk7XG5cbiAgdHJ5IHtcbiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAgIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gICAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gICAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gICAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gICAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gICAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAgIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAgIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn0pO1xuXG52YXIgUHJvcGVydHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQcm9wZXJ0eShkb2N1bWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvcGVydHkpO1xuXG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaXNOb3JtYWxpemVkQ29sb3IgPSBmYWxzZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQcm9wZXJ0eSwgW3tcbiAgICBrZXk6IFwiaGFzVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzVmFsdWUoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJyAmJiB2YWx1ZSAhPT0gMCAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N0cmluZyhyZWdleHApIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB2YXIgcmVzdWx0ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlZ2V4cCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnZXhwLnRlc3QodmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1VybERlZmluaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNVcmxEZWZpbml0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTdHJpbmcoL151cmxcXCgvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNQaXhlbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNQaXhlbHMoKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzVmFsdWUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBhc1N0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlIC9weCQvLnRlc3QoYXNTdHJpbmcpOlxuICAgICAgICBjYXNlIC9eWzAtOV0rJC8udGVzdChhc1N0cmluZyk6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoZGVmKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZiA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXROdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyKGRlZikge1xuICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChkZWYpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgaWYgKHRoaXMuaXNTdHJpbmcoLyUkLykpIHtcbiAgICAgICAgbiA9IG4gLyAxMDAuMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdHJpbmcoZGVmKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZiA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyhkZWYpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb2xvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb2xvcihkZWYpIHtcbiAgICAgIHZhciBjb2xvciA9IHRoaXMuZ2V0U3RyaW5nKGRlZik7XG5cbiAgICAgIGlmICh0aGlzLmlzTm9ybWFsaXplZENvbG9yKSB7XG4gICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc05vcm1hbGl6ZWRDb2xvciA9IHRydWU7XG4gICAgICBjb2xvciA9IG5vcm1hbGl6ZUNvbG9yKGNvbG9yKTtcbiAgICAgIHRoaXMudmFsdWUgPSBjb2xvcjtcbiAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHBpXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERwaSgpIHtcbiAgICAgIHJldHVybiA5Ni4wOyAvLyBUT0RPOiBjb21wdXRlP1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQucm9vdEVtU2l6ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5lbVNpemU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFVuaXRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFVuaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCkucmVwbGFjZSgvWzAtOVxcLlxcLV0vZywgJycpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQaXhlbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGl4ZWxzKGF4aXNPcklzRm9udFNpemUpIHtcbiAgICAgIHZhciBwcm9jZXNzUGVyY2VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3JlZiA9IHR5cGVvZiBheGlzT3JJc0ZvbnRTaXplID09PSAnYm9vbGVhbicgPyBbdW5kZWZpbmVkLCBheGlzT3JJc0ZvbnRTaXplXSA6IFtheGlzT3JJc0ZvbnRTaXplXSxcbiAgICAgICAgICBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICAgIGF4aXMgPSBfcmVmMlswXSxcbiAgICAgICAgICBpc0ZvbnRTaXplID0gX3JlZjJbMV07XG5cbiAgICAgIHZhciB2aWV3UG9ydCA9IHRoaXMuZG9jdW1lbnQuc2NyZWVuLnZpZXdQb3J0O1xuXG4gICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC92bWluJC8pOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpIC8gMTAwLjAgKiBNYXRoLm1pbih2aWV3UG9ydC5jb21wdXRlU2l6ZSgneCcpLCB2aWV3UG9ydC5jb21wdXRlU2l6ZSgneScpKTtcblxuICAgICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL3ZtYXgkLyk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgLyAxMDAuMCAqIE1hdGgubWF4KHZpZXdQb3J0LmNvbXB1dGVTaXplKCd4JyksIHZpZXdQb3J0LmNvbXB1dGVTaXplKCd5JykpO1xuXG4gICAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvdnckLyk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgLyAxMDAuMCAqIHZpZXdQb3J0LmNvbXB1dGVTaXplKCd4Jyk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC92aCQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAvIDEwMC4wICogdmlld1BvcnQuY29tcHV0ZVNpemUoJ3knKTtcblxuICAgICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL3JlbSQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0UmVtKCk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9lbSQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0RW0oKTtcblxuICAgICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL2V4JC8pOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogdGhpcy5nZXRFbSgpIC8gMi4wO1xuXG4gICAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvcHgkLyk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9wdCQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0RHBpKCkgKiAoMS4wIC8gNzIuMCk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9wYyQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIDE1O1xuXG4gICAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvY20kLyk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldERwaSgpIC8gMi41NDtcblxuICAgICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL21tJC8pOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogdGhpcy5nZXREcGkoKSAvIDI1LjQ7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC9pbiQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIHRoaXMuZ2V0RHBpKCk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC8lJC8pICYmIGlzRm9udFNpemU6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiB0aGlzLmdldEVtKCk7XG5cbiAgICAgICAgY2FzZSB0aGlzLmlzU3RyaW5nKC8lJC8pOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogdmlld1BvcnQuY29tcHV0ZVNpemUoYXhpcyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbiA9IHRoaXMuZ2V0TnVtYmVyKCk7XG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzUGVyY2VudCAmJiBuIDwgMS4wKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuICogdmlld1BvcnQuY29tcHV0ZVNpemUoYXhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TWlsbGlzZWNvbmRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcygpIHtcbiAgICAgIGlmICghdGhpcy5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1N0cmluZygvbXMkLykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpICogMTAwMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmFkaWFuc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSYWRpYW5zKCkge1xuICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlIHRoaXMuaXNTdHJpbmcoL2RlZyQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIChNYXRoLlBJIC8gMTgwLjApO1xuXG4gICAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvZ3JhZCQvKTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKSAqIChNYXRoLlBJIC8gMjAwLjApO1xuXG4gICAgICAgIGNhc2UgdGhpcy5pc1N0cmluZygvcmFkJC8pOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkgKiAoTWF0aC5QSSAvIDE4MC4wKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RGVmaW5pdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWZpbml0aW9uKCkge1xuICAgICAgdmFyIGFzU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcbiAgICAgIHZhciBuYW1lID0gYXNTdHJpbmcubWF0Y2goLyMoW15cXCknXCJdKykvKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgbmFtZSA9IG5hbWVbMV07XG4gICAgICB9XG5cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBuYW1lID0gYXNTdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmRlZmluaXRpb25zW25hbWVdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGaWxsU3R5bGVEZWZpbml0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpbGxTdHlsZURlZmluaXRpb24oZWxlbWVudCwgb3BhY2l0eSkge1xuICAgICAgdmFyIGRlZiA9IHRoaXMuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICBpZiAoIWRlZikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gLy8gZ3JhZGllbnRcblxuXG4gICAgICBpZiAodHlwZW9mIGRlZi5jcmVhdGVHcmFkaWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZGVmLmNyZWF0ZUdyYWRpZW50KHRoaXMuZG9jdW1lbnQuY3R4LCBlbGVtZW50LCBvcGFjaXR5KTtcbiAgICAgIH0gLy8gcGF0dGVyblxuXG5cbiAgICAgIGlmICh0eXBlb2YgZGVmLmNyZWF0ZVBhdHRlcm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGRlZi5nZXRIcmVmQXR0cmlidXRlKCkuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHZhciBwYXR0ZXJuVHJhbnNmb3JtID0gZGVmLmdldEF0dHJpYnV0ZSgncGF0dGVyblRyYW5zZm9ybScpO1xuICAgICAgICAgIGRlZiA9IGRlZi5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICAgICAgaWYgKHBhdHRlcm5UcmFuc2Zvcm0uaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgZGVmLmdldEF0dHJpYnV0ZSgncGF0dGVyblRyYW5zZm9ybScsIHRydWUpLnNldFZhbHVlKHBhdHRlcm5UcmFuc2Zvcm0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWYuY3JlYXRlUGF0dGVybih0aGlzLmRvY3VtZW50LmN0eCwgZWxlbWVudCwgb3BhY2l0eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRUZXh0QmFzZWxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGV4dEJhc2VsaW5lKCkge1xuICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9wZXJ0eS50ZXh0QmFzZWxpbmVNYXBwaW5nW3RoaXMuZ2V0U3RyaW5nKCldO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRPcGFjaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZE9wYWNpdHkob3BhY2l0eSkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRDb2xvcigpO1xuICAgICAgdmFyIGxlbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgIHZhciBjb21tYXMgPSAwOyAvLyBTaW11bGF0ZSBvbGQgUkdCQ29sb3IgdmVyc2lvbiwgd2hpY2ggY2FuJ3QgcGFyc2UgcmdiYS5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAodmFsdWVbaV0gPT09ICcsJykge1xuICAgICAgICAgIGNvbW1hcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hcyA9PT0gMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcGFjaXR5Lmhhc1ZhbHVlKCkgJiYgdGhpcy5pc1N0cmluZygpICYmIGNvbW1hcyAhPT0gMykge1xuICAgICAgICB2YXIgY29sb3IgPSBuZXcgUkdCQ29sb3IodmFsdWUpO1xuXG4gICAgICAgIGlmIChjb2xvci5vaykge1xuICAgICAgICAgIGNvbG9yLmFscGhhID0gb3BhY2l0eS5nZXROdW1iZXIoKTtcbiAgICAgICAgICB2YWx1ZSA9IGNvbG9yLnRvUkdCQSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgdGhpcy5uYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW1wdHkoZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdFTVBUWScsICcnKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUHJvcGVydHk7XG59KCk7XG5Qcm9wZXJ0eS50ZXh0QmFzZWxpbmVNYXBwaW5nID0ge1xuICAnYmFzZWxpbmUnOiAnYWxwaGFiZXRpYycsXG4gICdiZWZvcmUtZWRnZSc6ICd0b3AnLFxuICAndGV4dC1iZWZvcmUtZWRnZSc6ICd0b3AnLFxuICAnbWlkZGxlJzogJ21pZGRsZScsXG4gICdjZW50cmFsJzogJ21pZGRsZScsXG4gICdhZnRlci1lZGdlJzogJ2JvdHRvbScsXG4gICd0ZXh0LWFmdGVyLWVkZ2UnOiAnYm90dG9tJyxcbiAgJ2lkZW9ncmFwaGljJzogJ2lkZW9ncmFwaGljJyxcbiAgJ2FscGhhYmV0aWMnOiAnYWxwaGFiZXRpYycsXG4gICdoYW5naW5nJzogJ2hhbmdpbmcnLFxuICAnbWF0aGVtYXRpY2FsJzogJ2FscGhhYmV0aWMnXG59O1xuXG52YXIgVmlld1BvcnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWaWV3UG9ydCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlld1BvcnQpO1xuXG4gICAgdGhpcy52aWV3UG9ydHMgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWV3UG9ydCwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLnZpZXdQb3J0cyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDdXJyZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEN1cnJlbnQod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy52aWV3UG9ydHMucHVzaCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVDdXJyZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUN1cnJlbnQoKSB7XG4gICAgICB0aGlzLnZpZXdQb3J0cy5wb3AoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50KCkge1xuICAgICAgdmFyIHZpZXdQb3J0cyA9IHRoaXMudmlld1BvcnRzO1xuICAgICAgcmV0dXJuIHZpZXdQb3J0c1t2aWV3UG9ydHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXB1dGVTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXB1dGVTaXplKGQpIHtcbiAgICAgIGlmICh0eXBlb2YgZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkID09PSAneCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChkID09PSAneScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMud2lkdGgsIDIpICsgTWF0aC5wb3codGhpcy5oZWlnaHQsIDIpKSAvIE1hdGguc3FydCgyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnQoKS53aWR0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50KCkuaGVpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWV3UG9ydDtcbn0oKTtcblxudmFyIFBvaW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb2ludCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUG9pbnQsIFt7XG4gICAga2V5OiBcImFuZ2xlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW5nbGVUbyhwb2ludCkge1xuICAgICAgcmV0dXJuIE1hdGguYXRhbjIocG9pbnQueSAtIHRoaXMueSwgcG9pbnQueCAtIHRoaXMueCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5VHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICAgICAgdmFyIHggPSB0aGlzLngsXG4gICAgICAgICAgeSA9IHRoaXMueTtcbiAgICAgIHZhciB4cCA9IHggKiB0cmFuc2Zvcm1bMF0gKyB5ICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzRdO1xuICAgICAgdmFyIHlwID0geCAqIHRyYW5zZm9ybVsxXSArIHkgKiB0cmFuc2Zvcm1bM10gKyB0cmFuc2Zvcm1bNV07XG4gICAgICB0aGlzLnggPSB4cDtcbiAgICAgIHRoaXMueSA9IHlwO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcInBhcnNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlKHBvaW50KSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuXG4gICAgICB2YXIgX3RvTnVtYmVycyA9IHRvTnVtYmVycyhwb2ludCksXG4gICAgICAgICAgX3RvTnVtYmVyczIgPSBfc2xpY2VkVG9BcnJheShfdG9OdW1iZXJzLCAyKSxcbiAgICAgICAgICBfdG9OdW1iZXJzMiQgPSBfdG9OdW1iZXJzMlswXSxcbiAgICAgICAgICB4ID0gX3RvTnVtYmVyczIkID09PSB2b2lkIDAgPyBkZWZhdWx0VmFsdWUgOiBfdG9OdW1iZXJzMiQsXG4gICAgICAgICAgX3RvTnVtYmVyczIkMiA9IF90b051bWJlcnMyWzFdLFxuICAgICAgICAgIHkgPSBfdG9OdW1iZXJzMiQyID09PSB2b2lkIDAgPyBkZWZhdWx0VmFsdWUgOiBfdG9OdW1iZXJzMiQyO1xuXG4gICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVNjYWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlU2NhbGUoc2NhbGUpIHtcbiAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG5cbiAgICAgIHZhciBfdG9OdW1iZXJzMyA9IHRvTnVtYmVycyhzY2FsZSksXG4gICAgICAgICAgX3RvTnVtYmVyczQgPSBfc2xpY2VkVG9BcnJheShfdG9OdW1iZXJzMywgMiksXG4gICAgICAgICAgX3RvTnVtYmVyczQkID0gX3RvTnVtYmVyczRbMF0sXG4gICAgICAgICAgeCA9IF90b051bWJlcnM0JCA9PT0gdm9pZCAwID8gZGVmYXVsdFZhbHVlIDogX3RvTnVtYmVyczQkLFxuICAgICAgICAgIF90b051bWJlcnM0JDIgPSBfdG9OdW1iZXJzNFsxXSxcbiAgICAgICAgICB5ID0gX3RvTnVtYmVyczQkMiA9PT0gdm9pZCAwID8geCA6IF90b051bWJlcnM0JDI7XG5cbiAgICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlUGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICAgICAgdmFyIHBvaW50cyA9IHRvTnVtYmVycyhwYXRoKTtcbiAgICAgIHZhciBsZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgICAgdmFyIHBhdGhQb2ludHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgICAgICBwYXRoUG9pbnRzLnB1c2gobmV3IFBvaW50KHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGF0aFBvaW50cztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9pbnQ7XG59KCk7XG5cbnZhciBNb3VzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1vdXNlKHNjcmVlbikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb3VzZSk7XG5cbiAgICB0aGlzLnNjcmVlbiA9IHNjcmVlbjtcbiAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIHRoaXMuZXZlbnRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Nb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTW91c2UsIFt7XG4gICAga2V5OiBcImlzV29ya2luZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1dvcmtpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy53b3JraW5nO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgIGlmICh0aGlzLndvcmtpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2NyZWVuID0gdGhpcy5zY3JlZW4sXG4gICAgICAgICAgb25DbGljayA9IHRoaXMub25DbGljayxcbiAgICAgICAgICBvbk1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmU7XG4gICAgICB2YXIgY2FudmFzID0gc2NyZWVuLmN0eC5jYW52YXM7XG4gICAgICBjYW52YXMub25jbGljayA9IG9uQ2xpY2s7XG4gICAgICBjYW52YXMub25tb3VzZW1vdmUgPSBvbk1vdXNlTW92ZTtcbiAgICAgIHRoaXMud29ya2luZyA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmICghdGhpcy53b3JraW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuc2NyZWVuLmN0eC5jYW52YXM7XG4gICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgIGNhbnZhcy5vbmNsaWNrID0gbnVsbDtcbiAgICAgIGNhbnZhcy5vbm1vdXNlbW92ZSA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0V2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNFdmVudHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy53b3JraW5nICYmIHRoaXMuZXZlbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJ1bkV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW5FdmVudHMoKSB7XG4gICAgICBpZiAoIXRoaXMud29ya2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMuc2NyZWVuLFxuICAgICAgICAgIGV2ZW50cyA9IHRoaXMuZXZlbnRzLFxuICAgICAgICAgIGV2ZW50RWxlbWVudHMgPSB0aGlzLmV2ZW50RWxlbWVudHM7XG4gICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jdHguY2FudmFzLnN0eWxlO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmLCBpKSB7XG4gICAgICAgIHZhciBydW4gPSBfcmVmLnJ1bjtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBldmVudEVsZW1lbnRzW2ldO1xuXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XG4gICAgICAgICAgcnVuKGVsZW1lbnQpO1xuICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIGRvbmUgcnVubmluZywgY2xlYXJcblxuICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICAgIHRoaXMuZXZlbnRFbGVtZW50cyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaGVja1BhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hlY2tQYXRoKGVsZW1lbnQsIGN0eCkge1xuICAgICAgaWYgKCF0aGlzLndvcmtpbmcgfHwgIWN0eCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cyxcbiAgICAgICAgICBldmVudEVsZW1lbnRzID0gdGhpcy5ldmVudEVsZW1lbnRzO1xuICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyLCBpKSB7XG4gICAgICAgIHZhciB4ID0gX3JlZjIueCxcbiAgICAgICAgICAgIHkgPSBfcmVmMi55O1xuXG4gICAgICAgIGlmICghZXZlbnRFbGVtZW50c1tpXSAmJiBjdHguaXNQb2ludEluUGF0aCAmJiBjdHguaXNQb2ludEluUGF0aCh4LCB5KSkge1xuICAgICAgICAgIGV2ZW50RWxlbWVudHNbaV0gPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2hlY2tCb3VuZGluZ0JveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGVja0JvdW5kaW5nQm94KGVsZW1lbnQsIGJvdW5kaW5nQm94KSB7XG4gICAgICBpZiAoIXRoaXMud29ya2luZyB8fCAhYm91bmRpbmdCb3gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZlbnRzID0gdGhpcy5ldmVudHMsXG4gICAgICAgICAgZXZlbnRFbGVtZW50cyA9IHRoaXMuZXZlbnRFbGVtZW50cztcbiAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMywgaSkge1xuICAgICAgICB2YXIgeCA9IF9yZWYzLngsXG4gICAgICAgICAgICB5ID0gX3JlZjMueTtcblxuICAgICAgICBpZiAoIWV2ZW50RWxlbWVudHNbaV0gJiYgYm91bmRpbmdCb3guaXNQb2ludEluQm94KHgsIHkpKSB7XG4gICAgICAgICAgZXZlbnRFbGVtZW50c1tpXSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXBYWVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXBYWSh4LCB5KSB7XG4gICAgICB2YXIgX3RoaXMkc2NyZWVuID0gdGhpcy5zY3JlZW4sXG4gICAgICAgICAgd2luZG93ID0gX3RoaXMkc2NyZWVuLndpbmRvdyxcbiAgICAgICAgICBjdHggPSBfdGhpcyRzY3JlZW4uY3R4O1xuICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHgsIHkpO1xuICAgICAgdmFyIGVsZW1lbnQgPSBjdHguY2FudmFzO1xuXG4gICAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICBwb2ludC54IC09IGVsZW1lbnQub2Zmc2V0TGVmdDtcbiAgICAgICAgcG9pbnQueSAtPSBlbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAod2luZG93LnNjcm9sbFgpIHtcbiAgICAgICAgcG9pbnQueCArPSB3aW5kb3cuc2Nyb2xsWDtcbiAgICAgIH1cblxuICAgICAgaWYgKHdpbmRvdy5zY3JvbGxZKSB7XG4gICAgICAgIHBvaW50LnkgKz0gd2luZG93LnNjcm9sbFk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwb2ludDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNsaWNrKGV2dCkge1xuICAgICAgdmFyIF90aGlzJG1hcFhZID0gdGhpcy5tYXBYWSgoZXZ0IHx8IGV2ZW50KS5jbGllbnRYLCAoZXZ0IHx8IGV2ZW50KS5jbGllbnRZKSxcbiAgICAgICAgICB4ID0gX3RoaXMkbWFwWFkueCxcbiAgICAgICAgICB5ID0gX3RoaXMkbWFwWFkueTtcblxuICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdvbmNsaWNrJyxcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgcnVuOiBmdW5jdGlvbiBydW4oZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQub25DbGljaykge1xuICAgICAgICAgICAgZXZlbnQub25DbGljaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uTW91c2VNb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2dCkge1xuICAgICAgdmFyIF90aGlzJG1hcFhZMiA9IHRoaXMubWFwWFkoKGV2dCB8fCBldmVudCkuY2xpZW50WCwgKGV2dCB8fCBldmVudCkuY2xpZW50WSksXG4gICAgICAgICAgeCA9IF90aGlzJG1hcFhZMi54LFxuICAgICAgICAgIHkgPSBfdGhpcyRtYXBYWTIueTtcblxuICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdvbm1vdXNlbW92ZScsXG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHJ1bjogZnVuY3Rpb24gcnVuKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm9uTW91c2VNb3ZlKSB7XG4gICAgICAgICAgICBldmVudC5vbk1vdXNlTW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vdXNlO1xufSgpO1xuXG52YXIgZGVmYXVsdFdpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogbnVsbDtcbnZhciBkZWZhdWx0RmV0Y2ggPSB0eXBlb2YgZmV0Y2ggIT09ICd1bmRlZmluZWQnID8gZmV0Y2guYmluZCh2b2lkIDApIC8vIGBmZXRjaGAgZGVwZW5kcyBvbiBjb250ZXh0OiBgc29tZU9iamVjdC5mZXRjaCguLi4pYCB3aWxsIHRocm93IGVycm9yLlxuOiBudWxsO1xuXG52YXIgU2NyZWVuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2NyZWVuKGN0eCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZiRmZXRjaCA9IF9yZWYuZmV0Y2gsXG4gICAgICAgIGZldGNoID0gX3JlZiRmZXRjaCA9PT0gdm9pZCAwID8gZGVmYXVsdEZldGNoIDogX3JlZiRmZXRjaCxcbiAgICAgICAgX3JlZiR3aW5kb3cgPSBfcmVmLndpbmRvdyxcbiAgICAgICAgd2luZG93ID0gX3JlZiR3aW5kb3cgPT09IHZvaWQgMCA/IGRlZmF1bHRXaW5kb3cgOiBfcmVmJHdpbmRvdztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY3JlZW4pO1xuXG4gICAgdGhpcy5jdHggPSBjdHg7XG4gICAgdGhpcy5GUkFNRVJBVEUgPSAzMDtcbiAgICB0aGlzLk1BWF9WSVJUVUFMX1BJWEVMUyA9IDMwMDAwO1xuICAgIHRoaXMuQ0xJRU5UX1dJRFRIID0gODAwO1xuICAgIHRoaXMuQ0xJRU5UX0hFSUdIVCA9IDYwMDtcbiAgICB0aGlzLnZpZXdQb3J0ID0gbmV3IFZpZXdQb3J0KCk7XG4gICAgdGhpcy5tb3VzZSA9IG5ldyBNb3VzZSh0aGlzKTtcbiAgICB0aGlzLmFuaW1hdGlvbnMgPSBbXTtcbiAgICB0aGlzLndhaXRzID0gW107XG4gICAgdGhpcy5mcmFtZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLmlzUmVhZHlMb2NrID0gZmFsc2U7XG4gICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gdHJ1ZTtcbiAgICB0aGlzLmludGVydmFsSWQgPSBudWxsO1xuICAgIHRoaXMud2luZG93ID0gd2luZG93O1xuICAgIHRoaXMuZmV0Y2ggPSBmZXRjaDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTY3JlZW4sIFt7XG4gICAga2V5OiBcIndhaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2FpdChjaGVja2VyKSB7XG4gICAgICB0aGlzLndhaXRzLnB1c2goY2hlY2tlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWR5KCkge1xuICAgICAgaWYgKCF0aGlzLnJlYWR5UHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJlYWR5UHJvbWlzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNSZWFkeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1JlYWR5KCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWFkeUxvY2spIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc1JlYWR5TG9jayA9IHRoaXMud2FpdHMuZXZlcnkoZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgcmV0dXJuIF8oKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNSZWFkeUxvY2spIHtcbiAgICAgICAgdGhpcy53YWl0cyA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVSZWFkeSkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZVJlYWR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1JlYWR5TG9jayA9IGlzUmVhZHlMb2NrO1xuICAgICAgcmV0dXJuIGlzUmVhZHlMb2NrO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXREZWZhdWx0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWZhdWx0cyhjdHgpIHtcbiAgICAgIC8vIGluaXRpYWwgdmFsdWVzIGFuZCBkZWZhdWx0c1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JnYmEoMCwwLDAsMCknO1xuICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgICBjdHgubGluZUpvaW4gPSAnbWl0ZXInO1xuICAgICAgY3R4Lm1pdGVyTGltaXQgPSA0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWaWV3Qm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZpZXdCb3goX3JlZjIpIHtcbiAgICAgIHZhciBkb2N1bWVudCA9IF9yZWYyLmRvY3VtZW50LFxuICAgICAgICAgIGN0eCA9IF9yZWYyLmN0eCxcbiAgICAgICAgICBhc3BlY3RSYXRpbyA9IF9yZWYyLmFzcGVjdFJhdGlvLFxuICAgICAgICAgIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgICAgZGVzaXJlZFdpZHRoID0gX3JlZjIuZGVzaXJlZFdpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodCxcbiAgICAgICAgICBkZXNpcmVkSGVpZ2h0ID0gX3JlZjIuZGVzaXJlZEhlaWdodCxcbiAgICAgICAgICBfcmVmMiRtaW5YID0gX3JlZjIubWluWCxcbiAgICAgICAgICBtaW5YID0gX3JlZjIkbWluWCA9PT0gdm9pZCAwID8gMCA6IF9yZWYyJG1pblgsXG4gICAgICAgICAgX3JlZjIkbWluWSA9IF9yZWYyLm1pblksXG4gICAgICAgICAgbWluWSA9IF9yZWYyJG1pblkgPT09IHZvaWQgMCA/IDAgOiBfcmVmMiRtaW5ZLFxuICAgICAgICAgIHJlZlggPSBfcmVmMi5yZWZYLFxuICAgICAgICAgIHJlZlkgPSBfcmVmMi5yZWZZLFxuICAgICAgICAgIF9yZWYyJGNsaXAgPSBfcmVmMi5jbGlwLFxuICAgICAgICAgIGNsaXAgPSBfcmVmMiRjbGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGNsaXAsXG4gICAgICAgICAgX3JlZjIkY2xpcFggPSBfcmVmMi5jbGlwWCxcbiAgICAgICAgICBjbGlwWCA9IF9yZWYyJGNsaXBYID09PSB2b2lkIDAgPyAwIDogX3JlZjIkY2xpcFgsXG4gICAgICAgICAgX3JlZjIkY2xpcFkgPSBfcmVmMi5jbGlwWSxcbiAgICAgICAgICBjbGlwWSA9IF9yZWYyJGNsaXBZID09PSB2b2lkIDAgPyAwIDogX3JlZjIkY2xpcFk7XG4gICAgICAvLyBhc3BlY3QgcmF0aW8gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvY29vcmRzLmh0bWwjUHJlc2VydmVBc3BlY3RSYXRpb0F0dHJpYnV0ZVxuICAgICAgdmFyIGNsZWFuQXNwZWN0UmF0aW8gPSBjb21wcmVzc1NwYWNlcyhhc3BlY3RSYXRpbykucmVwbGFjZSgvXmRlZmVyXFxzLywgJycpOyAvLyBpZ25vcmUgZGVmZXJcblxuICAgICAgdmFyIF9jbGVhbkFzcGVjdFJhdGlvJHNwbCA9IGNsZWFuQXNwZWN0UmF0aW8uc3BsaXQoJyAnKSxcbiAgICAgICAgICBfY2xlYW5Bc3BlY3RSYXRpbyRzcGwyID0gX3NsaWNlZFRvQXJyYXkoX2NsZWFuQXNwZWN0UmF0aW8kc3BsLCAyKSxcbiAgICAgICAgICBhc3BlY3RSYXRpb0FsaWduID0gX2NsZWFuQXNwZWN0UmF0aW8kc3BsMlswXSxcbiAgICAgICAgICBhc3BlY3RSYXRpb01lZXRPclNsaWNlID0gX2NsZWFuQXNwZWN0UmF0aW8kc3BsMlsxXTtcblxuICAgICAgdmFyIGFsaWduID0gYXNwZWN0UmF0aW9BbGlnbiB8fCAneE1pZFlNaWQnO1xuICAgICAgdmFyIG1lZXRPclNsaWNlID0gYXNwZWN0UmF0aW9NZWV0T3JTbGljZSB8fCAnbWVldCc7IC8vIGNhbGN1bGF0ZSBzY2FsZVxuXG4gICAgICB2YXIgc2NhbGVYID0gd2lkdGggLyBkZXNpcmVkV2lkdGg7XG4gICAgICB2YXIgc2NhbGVZID0gaGVpZ2h0IC8gZGVzaXJlZEhlaWdodDtcbiAgICAgIHZhciBzY2FsZU1pbiA9IE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIHZhciBzY2FsZU1heCA9IE1hdGgubWF4KHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIHZhciBmaW5hbERlc2lyZWRXaWR0aCA9IGRlc2lyZWRXaWR0aDtcbiAgICAgIHZhciBmaW5hbERlc2lyZWRIZWlnaHQgPSBkZXNpcmVkSGVpZ2h0O1xuXG4gICAgICBpZiAobWVldE9yU2xpY2UgPT09ICdtZWV0Jykge1xuICAgICAgICBmaW5hbERlc2lyZWRXaWR0aCAqPSBzY2FsZU1pbjtcbiAgICAgICAgZmluYWxEZXNpcmVkSGVpZ2h0ICo9IHNjYWxlTWluO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVldE9yU2xpY2UgPT09ICdzbGljZScpIHtcbiAgICAgICAgZmluYWxEZXNpcmVkV2lkdGggKj0gc2NhbGVNYXg7XG4gICAgICAgIGZpbmFsRGVzaXJlZEhlaWdodCAqPSBzY2FsZU1heDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZlhQcm9wID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAncmVmWCcsIHJlZlgpO1xuICAgICAgdmFyIHJlZllQcm9wID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAncmVmWScsIHJlZlkpO1xuICAgICAgdmFyIGhhc1JlZnMgPSByZWZYUHJvcC5oYXNWYWx1ZSgpICYmIHJlZllQcm9wLmhhc1ZhbHVlKCk7XG5cbiAgICAgIGlmIChoYXNSZWZzKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoLXNjYWxlTWluICogcmVmWFByb3AuZ2V0UGl4ZWxzKCd4JyksIC1zY2FsZU1pbiAqIHJlZllQcm9wLmdldFBpeGVscygneScpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNsaXApIHtcbiAgICAgICAgdmFyIHNjYWxlZENsaXBYID0gc2NhbGVNaW4gKiBjbGlwWDtcbiAgICAgICAgdmFyIHNjYWxlZENsaXBZID0gc2NhbGVNaW4gKiBjbGlwWTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHNjYWxlZENsaXBYLCBzY2FsZWRDbGlwWSk7XG4gICAgICAgIGN0eC5saW5lVG8od2lkdGgsIHNjYWxlZENsaXBZKTtcbiAgICAgICAgY3R4LmxpbmVUbyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmxpbmVUbyhzY2FsZWRDbGlwWCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc1JlZnMpIHtcbiAgICAgICAgdmFyIGlzTWVldE1pblkgPSBtZWV0T3JTbGljZSA9PT0gJ21lZXQnICYmIHNjYWxlTWluID09PSBzY2FsZVk7XG4gICAgICAgIHZhciBpc1NsaWNlTWF4WSA9IG1lZXRPclNsaWNlID09PSAnc2xpY2UnICYmIHNjYWxlTWF4ID09PSBzY2FsZVk7XG4gICAgICAgIHZhciBpc01lZXRNaW5YID0gbWVldE9yU2xpY2UgPT09ICdtZWV0JyAmJiBzY2FsZU1pbiA9PT0gc2NhbGVYO1xuICAgICAgICB2YXIgaXNTbGljZU1heFggPSBtZWV0T3JTbGljZSA9PT0gJ3NsaWNlJyAmJiBzY2FsZU1heCA9PT0gc2NhbGVYO1xuXG4gICAgICAgIGlmICgvXnhNaWQvLnRlc3QoYWxpZ24pICYmIChpc01lZXRNaW5ZIHx8IGlzU2xpY2VNYXhZKSkge1xuICAgICAgICAgIGN0eC50cmFuc2xhdGUod2lkdGggLyAyLjAgLSBmaW5hbERlc2lyZWRXaWR0aCAvIDIuMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL1lNaWQkLy50ZXN0KGFsaWduKSAmJiAoaXNNZWV0TWluWCB8fCBpc1NsaWNlTWF4WCkpIHtcbiAgICAgICAgICBjdHgudHJhbnNsYXRlKDAsIGhlaWdodCAvIDIuMCAtIGZpbmFsRGVzaXJlZEhlaWdodCAvIDIuMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL154TWF4Ly50ZXN0KGFsaWduKSAmJiAoaXNNZWV0TWluWSB8fCBpc1NsaWNlTWF4WSkpIHtcbiAgICAgICAgICBjdHgudHJhbnNsYXRlKHdpZHRoIC0gZmluYWxEZXNpcmVkV2lkdGgsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9ZTWF4JC8udGVzdChhbGlnbikgJiYgKGlzTWVldE1pblggfHwgaXNTbGljZU1heFgpKSB7XG4gICAgICAgICAgY3R4LnRyYW5zbGF0ZSgwLCBoZWlnaHQgLSBmaW5hbERlc2lyZWRIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IC8vIHNjYWxlXG5cblxuICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgIGNhc2UgYWxpZ24gPT09ICdub25lJzpcbiAgICAgICAgICBjdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgbWVldE9yU2xpY2UgPT09ICdtZWV0JzpcbiAgICAgICAgICBjdHguc2NhbGUoc2NhbGVNaW4sIHNjYWxlTWluKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIG1lZXRPclNsaWNlID09PSAnc2xpY2UnOlxuICAgICAgICAgIGN0eC5zY2FsZShzY2FsZU1heCwgc2NhbGVNYXgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyB0cmFuc2xhdGVcblxuXG4gICAgICBjdHgudHJhbnNsYXRlKC1taW5YLCAtbWluWSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KGVsZW1lbnQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBfcmVmMyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgICAgX3JlZjMkZW5hYmxlUmVkcmF3ID0gX3JlZjMuZW5hYmxlUmVkcmF3LFxuICAgICAgICAgIGVuYWJsZVJlZHJhdyA9IF9yZWYzJGVuYWJsZVJlZHJhdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRlbmFibGVSZWRyYXcsXG4gICAgICAgICAgX3JlZjMkaWdub3JlTW91c2UgPSBfcmVmMy5pZ25vcmVNb3VzZSxcbiAgICAgICAgICBpZ25vcmVNb3VzZSA9IF9yZWYzJGlnbm9yZU1vdXNlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGlnbm9yZU1vdXNlLFxuICAgICAgICAgIF9yZWYzJGlnbm9yZUFuaW1hdGlvbiA9IF9yZWYzLmlnbm9yZUFuaW1hdGlvbixcbiAgICAgICAgICBpZ25vcmVBbmltYXRpb24gPSBfcmVmMyRpZ25vcmVBbmltYXRpb24gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMkaWdub3JlQW5pbWF0aW9uLFxuICAgICAgICAgIF9yZWYzJGlnbm9yZURpbWVuc2lvbiA9IF9yZWYzLmlnbm9yZURpbWVuc2lvbnMsXG4gICAgICAgICAgaWdub3JlRGltZW5zaW9ucyA9IF9yZWYzJGlnbm9yZURpbWVuc2lvbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRpZ25vcmVEaW1lbnNpb24sXG4gICAgICAgICAgX3JlZjMkaWdub3JlQ2xlYXIgPSBfcmVmMy5pZ25vcmVDbGVhcixcbiAgICAgICAgICBpZ25vcmVDbGVhciA9IF9yZWYzJGlnbm9yZUNsZWFyID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGlnbm9yZUNsZWFyLFxuICAgICAgICAgIGZvcmNlUmVkcmF3ID0gX3JlZjMuZm9yY2VSZWRyYXcsXG4gICAgICAgICAgc2NhbGVXaWR0aCA9IF9yZWYzLnNjYWxlV2lkdGgsXG4gICAgICAgICAgc2NhbGVIZWlnaHQgPSBfcmVmMy5zY2FsZUhlaWdodCxcbiAgICAgICAgICBvZmZzZXRYID0gX3JlZjMub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX3JlZjMub2Zmc2V0WTtcblxuICAgICAgdmFyIEZSQU1FUkFURSA9IHRoaXMuRlJBTUVSQVRFLFxuICAgICAgICAgIG1vdXNlID0gdGhpcy5tb3VzZTtcbiAgICAgIHZhciBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIEZSQU1FUkFURTtcbiAgICAgIHRoaXMuZnJhbWVEdXJhdGlvbiA9IGZyYW1lRHVyYXRpb247XG4gICAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzLnJlc29sdmVSZWFkeSA9IHJlc29sdmU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyKGVsZW1lbnQsIGlnbm9yZURpbWVuc2lvbnMsIGlnbm9yZUNsZWFyLCBzY2FsZVdpZHRoLCBzY2FsZUhlaWdodCwgb2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW5hYmxlUmVkcmF3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICB2YXIgdGhlbiA9IG5vdztcbiAgICAgIHZhciBkZWx0YSA9IDA7XG5cbiAgICAgIHZhciB0aWNrID0gZnVuY3Rpb24gdGljaygpIHtcbiAgICAgICAgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZGVsdGEgPSBub3cgLSB0aGVuO1xuXG4gICAgICAgIGlmIChkZWx0YSA+PSBmcmFtZUR1cmF0aW9uKSB7XG4gICAgICAgICAgdGhlbiA9IG5vdyAtIGRlbHRhICUgZnJhbWVEdXJhdGlvbjtcblxuICAgICAgICAgIGlmIChfdGhpcy5zaG91bGRVcGRhdGUoaWdub3JlQW5pbWF0aW9uLCBmb3JjZVJlZHJhdykpIHtcbiAgICAgICAgICAgIF90aGlzLnJlbmRlcihlbGVtZW50LCBpZ25vcmVEaW1lbnNpb25zLCBpZ25vcmVDbGVhciwgc2NhbGVXaWR0aCwgc2NhbGVIZWlnaHQsIG9mZnNldFgsIG9mZnNldFkpO1xuXG4gICAgICAgICAgICBtb3VzZS5ydW5FdmVudHMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5pbnRlcnZhbElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFpZ25vcmVNb3VzZSkge1xuICAgICAgICBtb3VzZS5zdGFydCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmludGVydmFsSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLmNhbmNlbCh0aGlzLmludGVydmFsSWQpO1xuICAgICAgICB0aGlzLmludGVydmFsSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1vdXNlLnN0b3AoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZShpZ25vcmVBbmltYXRpb24sIGZvcmNlUmVkcmF3KSB7XG4gICAgICAvLyBuZWVkIHVwZGF0ZSBmcm9tIGFuaW1hdGlvbnM/XG4gICAgICBpZiAoIWlnbm9yZUFuaW1hdGlvbikge1xuICAgICAgICB2YXIgZnJhbWVEdXJhdGlvbiA9IHRoaXMuZnJhbWVEdXJhdGlvbjtcbiAgICAgICAgdmFyIHNob3VsZFVwZGF0ZSA9IHRoaXMuYW5pbWF0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHNob3VsZFVwZGF0ZSwgYW5pbWF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGFuaW1hdGlvbi51cGRhdGUoZnJhbWVEdXJhdGlvbikgfHwgc2hvdWxkVXBkYXRlO1xuICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIG5lZWQgdXBkYXRlIGZyb20gcmVkcmF3P1xuXG5cbiAgICAgIGlmICh0eXBlb2YgZm9yY2VSZWRyYXcgPT09ICdmdW5jdGlvbicgJiYgZm9yY2VSZWRyYXcoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmlzUmVhZHlMb2NrICYmIHRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBuZWVkIHVwZGF0ZSBmcm9tIG1vdXNlIGV2ZW50cz9cblxuXG4gICAgICBpZiAodGhpcy5tb3VzZS5oYXNFdmVudHMoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGlnbm9yZURpbWVuc2lvbnMsIGlnbm9yZUNsZWFyLCBzY2FsZVdpZHRoLCBzY2FsZUhlaWdodCwgb2Zmc2V0WCwgb2Zmc2V0WSkge1xuICAgICAgdmFyIENMSUVOVF9XSURUSCA9IHRoaXMuQ0xJRU5UX1dJRFRILFxuICAgICAgICAgIENMSUVOVF9IRUlHSFQgPSB0aGlzLkNMSUVOVF9IRUlHSFQsXG4gICAgICAgICAgdmlld1BvcnQgPSB0aGlzLnZpZXdQb3J0LFxuICAgICAgICAgIGN0eCA9IHRoaXMuY3R4LFxuICAgICAgICAgIGlzRmlyc3RSZW5kZXIgPSB0aGlzLmlzRmlyc3RSZW5kZXI7XG4gICAgICB2YXIgY2FudmFzID0gY3R4LmNhbnZhcztcbiAgICAgIHZpZXdQb3J0LmNsZWFyKCk7XG5cbiAgICAgIGlmIChjYW52YXMud2lkdGggJiYgY2FudmFzLmhlaWdodCkge1xuICAgICAgICB2aWV3UG9ydC5zZXRDdXJyZW50KGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3UG9ydC5zZXRDdXJyZW50KENMSUVOVF9XSURUSCwgQ0xJRU5UX0hFSUdIVCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB3aWR0aFN0eWxlID0gZWxlbWVudC5nZXRTdHlsZSgnd2lkdGgnKTtcbiAgICAgIHZhciBoZWlnaHRTdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2hlaWdodCcpO1xuXG4gICAgICBpZiAoIWlnbm9yZURpbWVuc2lvbnMgJiYgKGlzRmlyc3RSZW5kZXIgfHwgdHlwZW9mIHNjYWxlV2lkdGggIT09ICdudW1iZXInICYmIHR5cGVvZiBzY2FsZUhlaWdodCAhPT0gJ251bWJlcicpKSB7XG4gICAgICAgIC8vIHNldCBjYW52YXMgc2l6ZVxuICAgICAgICBpZiAod2lkdGhTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGhTdHlsZS5nZXRQaXhlbHMoJ3gnKTtcblxuICAgICAgICAgIGlmIChjYW52YXMuc3R5bGUpIHtcbiAgICAgICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KGNhbnZhcy53aWR0aCwgXCJweFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVpZ2h0U3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRTdHlsZS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgICAgIGlmIChjYW52YXMuc3R5bGUpIHtcbiAgICAgICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdChjYW52YXMuaGVpZ2h0LCBcInB4XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgY1dpZHRoID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IGNhbnZhcy53aWR0aDtcbiAgICAgIHZhciBjSGVpZ2h0ID0gY2FudmFzLmNsaWVudEhlaWdodCB8fCBjYW52YXMuaGVpZ2h0O1xuXG4gICAgICBpZiAoaWdub3JlRGltZW5zaW9ucyAmJiB3aWR0aFN0eWxlLmhhc1ZhbHVlKCkgJiYgaGVpZ2h0U3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICBjV2lkdGggPSB3aWR0aFN0eWxlLmdldFBpeGVscygneCcpO1xuICAgICAgICBjSGVpZ2h0ID0gaGVpZ2h0U3R5bGUuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgICB9XG5cbiAgICAgIHZpZXdQb3J0LnNldEN1cnJlbnQoY1dpZHRoLCBjSGVpZ2h0KTtcblxuICAgICAgaWYgKHR5cGVvZiBvZmZzZXRYID09PSAnbnVtYmVyJykge1xuICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgneCcsIHRydWUpLnNldFZhbHVlKG9mZnNldFgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9mZnNldFkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd5JywgdHJ1ZSkuc2V0VmFsdWUob2Zmc2V0WSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NhbGVXaWR0aCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHNjYWxlSGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgdmlld0JveCA9IHRvTnVtYmVycyhlbGVtZW50LmdldEF0dHJpYnV0ZSgndmlld0JveCcpLmdldFN0cmluZygpKTtcbiAgICAgICAgdmFyIHhSYXRpbyA9IDA7XG4gICAgICAgIHZhciB5UmF0aW8gPSAwO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2NhbGVXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB2YXIgX3dpZHRoU3R5bGUgPSBlbGVtZW50LmdldFN0eWxlKCd3aWR0aCcpO1xuXG4gICAgICAgICAgaWYgKF93aWR0aFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgIHhSYXRpbyA9IF93aWR0aFN0eWxlLmdldFBpeGVscygneCcpIC8gc2NhbGVXaWR0aDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTih2aWV3Qm94WzJdKSkge1xuICAgICAgICAgICAgeFJhdGlvID0gdmlld0JveFsyXSAvIHNjYWxlV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2FsZUhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB2YXIgX2hlaWdodFN0eWxlID0gZWxlbWVudC5nZXRTdHlsZSgnaGVpZ2h0Jyk7XG5cbiAgICAgICAgICBpZiAoX2hlaWdodFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgIHlSYXRpbyA9IF9oZWlnaHRTdHlsZS5nZXRQaXhlbHMoJ3knKSAvIHNjYWxlSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHZpZXdCb3hbM10pKSB7XG4gICAgICAgICAgICB5UmF0aW8gPSB2aWV3Qm94WzNdIC8gc2NhbGVIZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF4UmF0aW8pIHtcbiAgICAgICAgICB4UmF0aW8gPSB5UmF0aW87XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXlSYXRpbykge1xuICAgICAgICAgIHlSYXRpbyA9IHhSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWR0aCcsIHRydWUpLnNldFZhbHVlKHNjYWxlV2lkdGgpO1xuICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdHJ1ZSkuc2V0VmFsdWUoc2NhbGVIZWlnaHQpO1xuICAgICAgICB2YXIgdHJhbnNmb3JtU3R5bGUgPSBlbGVtZW50LmdldFN0eWxlKCd0cmFuc2Zvcm0nLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdHJhbnNmb3JtU3R5bGUuc2V0VmFsdWUoXCJcIi5jb25jYXQodHJhbnNmb3JtU3R5bGUuZ2V0U3RyaW5nKCksIFwiIHNjYWxlKFwiKS5jb25jYXQoMS4wIC8geFJhdGlvLCBcIiwgXCIpLmNvbmNhdCgxLjAgLyB5UmF0aW8sIFwiKVwiKSk7XG4gICAgICB9IC8vIGNsZWFyIGFuZCByZW5kZXJcblxuXG4gICAgICBpZiAoIWlnbm9yZUNsZWFyKSB7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY1dpZHRoLCBjSGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5yZW5kZXIoY3R4KTtcblxuICAgICAgaWYgKGlzRmlyc3RSZW5kZXIpIHtcbiAgICAgICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjcmVlbjtcbn0oKTtcblNjcmVlbi5kZWZhdWx0V2luZG93ID0gZGVmYXVsdFdpbmRvdztcblNjcmVlbi5kZWZhdWx0RmV0Y2ggPSBkZWZhdWx0RmV0Y2g7XG5cbnZhciBkZWZhdWx0RmV0Y2gkMSA9IFNjcmVlbi5kZWZhdWx0RmV0Y2g7XG52YXIgRGVmYXVsdERPTVBhcnNlciA9IHR5cGVvZiBET01QYXJzZXIgIT09ICd1bmRlZmluZWQnID8gRE9NUGFyc2VyIDogbnVsbDtcblxudmFyIFBhcnNlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBhcnNlcigpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWYkZmV0Y2ggPSBfcmVmLmZldGNoLFxuICAgICAgICBmZXRjaCA9IF9yZWYkZmV0Y2ggPT09IHZvaWQgMCA/IGRlZmF1bHRGZXRjaCQxIDogX3JlZiRmZXRjaCxcbiAgICAgICAgX3JlZiRET01QYXJzZXIgPSBfcmVmLkRPTVBhcnNlcixcbiAgICAgICAgRE9NUGFyc2VyID0gX3JlZiRET01QYXJzZXIgPT09IHZvaWQgMCA/IERlZmF1bHRET01QYXJzZXIgOiBfcmVmJERPTVBhcnNlcjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJzZXIpO1xuXG4gICAgdGhpcy5mZXRjaCA9IGZldGNoO1xuICAgIHRoaXMuRE9NUGFyc2VyID0gRE9NUGFyc2VyO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBhcnNlciwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9wYXJzZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoIS9ePC8udGVzdChyZXNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB0aGlzLnBhcnNlRnJvbVN0cmluZyhyZXNvdXJjZSkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRoaXMubG9hZChyZXNvdXJjZSkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gcGFyc2UoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2U7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VGcm9tU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlRnJvbVN0cmluZyh4bWwpIHtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgdGhpcy5ET01QYXJzZXIoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEb2N1bWVudChwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbCwgJ2ltYWdlL3N2Zyt4bWwnKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEb2N1bWVudChwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbCwgJ3RleHQveG1sJykpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaGVja0RvY3VtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrRG9jdW1lbnQoZG9jdW1lbnQpIHtcbiAgICAgIHZhciBwYXJzZXJFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJzZXJlcnJvcicpWzBdO1xuXG4gICAgICBpZiAocGFyc2VyRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBhcnNlckVycm9yLnRleHRDb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbG9hZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHVybCkge1xuICAgICAgICB2YXIgcmVzcG9uc2UsIHhtbDtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoKHVybCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA1O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHhtbCA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHRoaXMucGFyc2VGcm9tU3RyaW5nKHhtbCkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBsb2FkKF94Mikge1xuICAgICAgICByZXR1cm4gX2xvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWQ7XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gUGFyc2VyO1xufSgpO1xuXG52YXIgVHJhbnNsYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNsYXRlKF8sIHBvaW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zbGF0ZSk7XG5cbiAgICB0aGlzLnR5cGUgPSAndHJhbnNsYXRlJztcbiAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnBvaW50ID0gUG9pbnQucGFyc2UocG9pbnQpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zbGF0ZSwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gICAgICB2YXIgX3RoaXMkcG9pbnQgPSB0aGlzLnBvaW50LFxuICAgICAgICAgIHggPSBfdGhpcyRwb2ludC54LFxuICAgICAgICAgIHkgPSBfdGhpcyRwb2ludC55O1xuICAgICAgY3R4LnRyYW5zbGF0ZSh4IHx8IDAuMCwgeSB8fCAwLjApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuYXBwbHkoY3R4KSB7XG4gICAgICB2YXIgX3RoaXMkcG9pbnQyID0gdGhpcy5wb2ludCxcbiAgICAgICAgICB4ID0gX3RoaXMkcG9pbnQyLngsXG4gICAgICAgICAgeSA9IF90aGlzJHBvaW50Mi55O1xuICAgICAgY3R4LnRyYW5zbGF0ZSgtMS4wICogeCB8fCAwLjAsIC0xLjAgKiB5IHx8IDAuMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5VG9Qb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseVRvUG9pbnQocG9pbnQpIHtcbiAgICAgIHZhciBfdGhpcyRwb2ludDMgPSB0aGlzLnBvaW50LFxuICAgICAgICAgIHggPSBfdGhpcyRwb2ludDMueCxcbiAgICAgICAgICB5ID0gX3RoaXMkcG9pbnQzLnk7XG4gICAgICBwb2ludC5hcHBseVRyYW5zZm9ybShbMSwgMCwgMCwgMSwgeCB8fCAwLjAsIHkgfHwgMC4wXSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRyYW5zbGF0ZTtcbn0oKTtcblxudmFyIFJvdGF0ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJvdGF0ZShkb2N1bWVudCwgcm90YXRlKSB7XG4gICAgdmFyIHRyYW5zZm9ybU9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm90YXRlKTtcblxuICAgIHRoaXMudHlwZSA9ICdyb3RhdGUnO1xuICAgIHRoaXMuYW5nbGUgPSBudWxsO1xuICAgIHRoaXMuY3ggPSAwO1xuICAgIHRoaXMuY3kgPSAwO1xuICAgIHZhciBudW1iZXJzID0gdG9OdW1iZXJzKHJvdGF0ZSk7XG4gICAgdGhpcy5hbmdsZSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2FuZ2xlJywgbnVtYmVyc1swXSk7XG4gICAgdGhpcy5jeCA9IChudW1iZXJzWzFdIHx8IDApICsgKHRyYW5zZm9ybU9yaWdpblswXSB8fCAwKTtcbiAgICB0aGlzLmN5ID0gKG51bWJlcnNbMl0gfHwgMCkgKyAodHJhbnNmb3JtT3JpZ2luWzFdIHx8IDApO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJvdGF0ZSwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gICAgICB2YXIgY3ggPSB0aGlzLmN4LFxuICAgICAgICAgIGN5ID0gdGhpcy5jeSxcbiAgICAgICAgICBhbmdsZSA9IHRoaXMuYW5nbGU7XG4gICAgICBjdHgudHJhbnNsYXRlKGN4LCBjeSk7XG4gICAgICBjdHgucm90YXRlKGFuZ2xlLmdldFJhZGlhbnMoKSk7XG4gICAgICBjdHgudHJhbnNsYXRlKC1jeCwgLWN5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5hcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmFwcGx5KGN0eCkge1xuICAgICAgdmFyIGN4ID0gdGhpcy5jeCxcbiAgICAgICAgICBjeSA9IHRoaXMuY3ksXG4gICAgICAgICAgYW5nbGUgPSB0aGlzLmFuZ2xlO1xuICAgICAgY3R4LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgY3R4LnJvdGF0ZSgtMS4wICogYW5nbGUuZ2V0UmFkaWFucygpKTtcbiAgICAgIGN0eC50cmFuc2xhdGUoLWN4LCAtY3kpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVRvUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgICB2YXIgY3ggPSB0aGlzLmN4LFxuICAgICAgICAgIGN5ID0gdGhpcy5jeSxcbiAgICAgICAgICBhbmdsZSA9IHRoaXMuYW5nbGU7XG4gICAgICB2YXIgcmFkID0gYW5nbGUuZ2V0UmFkaWFucygpO1xuICAgICAgcG9pbnQuYXBwbHlUcmFuc2Zvcm0oWzEsIDAsIDAsIDEsIGN4IHx8IDAuMCwgY3kgfHwgMC4wIC8vIHRoaXMucC55XG4gICAgICBdKTtcbiAgICAgIHBvaW50LmFwcGx5VHJhbnNmb3JtKFtNYXRoLmNvcyhyYWQpLCBNYXRoLnNpbihyYWQpLCAtTWF0aC5zaW4ocmFkKSwgTWF0aC5jb3MocmFkKSwgMCwgMF0pO1xuICAgICAgcG9pbnQuYXBwbHlUcmFuc2Zvcm0oWzEsIDAsIDAsIDEsIC1jeCB8fCAwLjAsIC1jeSB8fCAwLjAgLy8gLXRoaXMucC55XG4gICAgICBdKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUm90YXRlO1xufSgpO1xuXG52YXIgU2NhbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTY2FsZShfLCBzY2FsZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2FsZSk7XG5cbiAgICB0aGlzLnR5cGUgPSAnc2NhbGUnO1xuICAgIHRoaXMuc2NhbGUgPSBudWxsO1xuICAgIHZhciBzY2FsZVNpemUgPSBQb2ludC5wYXJzZVNjYWxlKHNjYWxlKTsgLy8gV29ya2Fyb3VuZCBmb3Igbm9kZS1jYW52YXNcblxuICAgIGlmIChzY2FsZVNpemUueCA9PT0gMCB8fCBzY2FsZVNpemUueSA9PT0gMCkge1xuICAgICAgc2NhbGVTaXplLnggPSBQU0VVRE9fWkVSTztcbiAgICAgIHNjYWxlU2l6ZS55ID0gUFNFVURPX1pFUk87XG4gICAgfVxuXG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlU2l6ZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTY2FsZSwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gICAgICB2YXIgX3RoaXMkc2NhbGUgPSB0aGlzLnNjYWxlLFxuICAgICAgICAgIHggPSBfdGhpcyRzY2FsZS54LFxuICAgICAgICAgIHkgPSBfdGhpcyRzY2FsZS55O1xuICAgICAgY3R4LnNjYWxlKHgsIHkgfHwgeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5hcHBseShjdHgpIHtcbiAgICAgIHZhciBfdGhpcyRzY2FsZTIgPSB0aGlzLnNjYWxlLFxuICAgICAgICAgIHggPSBfdGhpcyRzY2FsZTIueCxcbiAgICAgICAgICB5ID0gX3RoaXMkc2NhbGUyLnk7XG4gICAgICBjdHguc2NhbGUoMS4wIC8geCwgMS4wIC8geSB8fCB4KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlUb1BvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5VG9Qb2ludChwb2ludCkge1xuICAgICAgdmFyIF90aGlzJHNjYWxlMyA9IHRoaXMuc2NhbGUsXG4gICAgICAgICAgeCA9IF90aGlzJHNjYWxlMy54LFxuICAgICAgICAgIHkgPSBfdGhpcyRzY2FsZTMueTtcbiAgICAgIHBvaW50LmFwcGx5VHJhbnNmb3JtKFt4IHx8IDAuMCwgMCwgMCwgeSB8fCAwLjAsIDAsIDBdKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NhbGU7XG59KCk7XG5cbnZhciBNYXRyaXggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXRyaXgoXywgbWF0cml4KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hdHJpeCk7XG5cbiAgICB0aGlzLnR5cGUgPSAnbWF0cml4JztcbiAgICB0aGlzLm1hdHJpeCA9IFtdO1xuICAgIHRoaXMubWF0cml4ID0gdG9OdW1iZXJzKG1hdHJpeCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWF0cml4LCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShjdHgpIHtcbiAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcbiAgICAgIGN0eC50cmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5hcHBseShjdHgpIHtcbiAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcbiAgICAgIHZhciBhID0gbWF0cml4WzBdO1xuICAgICAgdmFyIGIgPSBtYXRyaXhbMl07XG4gICAgICB2YXIgYyA9IG1hdHJpeFs0XTtcbiAgICAgIHZhciBkID0gbWF0cml4WzFdO1xuICAgICAgdmFyIGUgPSBtYXRyaXhbM107XG4gICAgICB2YXIgZiA9IG1hdHJpeFs1XTtcbiAgICAgIHZhciBnID0gMC4wO1xuICAgICAgdmFyIGggPSAwLjA7XG4gICAgICB2YXIgaSA9IDEuMDtcbiAgICAgIHZhciBkZXQgPSAxIC8gKGEgKiAoZSAqIGkgLSBmICogaCkgLSBiICogKGQgKiBpIC0gZiAqIGcpICsgYyAqIChkICogaCAtIGUgKiBnKSk7XG4gICAgICBjdHgudHJhbnNmb3JtKGRldCAqIChlICogaSAtIGYgKiBoKSwgZGV0ICogKGYgKiBnIC0gZCAqIGkpLCBkZXQgKiAoYyAqIGggLSBiICogaSksIGRldCAqIChhICogaSAtIGMgKiBnKSwgZGV0ICogKGIgKiBmIC0gYyAqIGUpLCBkZXQgKiAoYyAqIGQgLSBhICogZikpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVRvUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgICBwb2ludC5hcHBseVRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hdHJpeDtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBTa2V3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTWF0cml4KSB7XG4gIF9pbmhlcml0cyhTa2V3LCBfTWF0cml4KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFNrZXcpO1xuXG4gIGZ1bmN0aW9uIFNrZXcoZG9jdW1lbnQsIHNrZXcpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2tldyk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBza2V3KTtcbiAgICBfdGhpcy50eXBlID0gJ3NrZXcnO1xuICAgIF90aGlzLmFuZ2xlID0gbnVsbDtcbiAgICBfdGhpcy5hbmdsZSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2FuZ2xlJywgc2tldyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFNrZXc7XG59KE1hdHJpeCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQxKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDEoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgU2tld1ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ta2V3KSB7XG4gIF9pbmhlcml0cyhTa2V3WCwgX1NrZXcpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkMShTa2V3WCk7XG5cbiAgZnVuY3Rpb24gU2tld1goZG9jdW1lbnQsIHNrZXcpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2tld1gpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkb2N1bWVudCwgc2tldyk7XG4gICAgX3RoaXMudHlwZSA9ICdza2V3WCc7XG4gICAgX3RoaXMubWF0cml4ID0gWzEsIDAsIE1hdGgudGFuKF90aGlzLmFuZ2xlLmdldFJhZGlhbnMoKSksIDEsIDAsIDBdO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBTa2V3WDtcbn0oU2tldyk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQyKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDIoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgU2tld1kgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ta2V3KSB7XG4gIF9pbmhlcml0cyhTa2V3WSwgX1NrZXcpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkMihTa2V3WSk7XG5cbiAgZnVuY3Rpb24gU2tld1koZG9jdW1lbnQsIHNrZXcpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2tld1kpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkb2N1bWVudCwgc2tldyk7XG4gICAgX3RoaXMudHlwZSA9ICdza2V3WSc7XG4gICAgX3RoaXMubWF0cml4ID0gWzEsIE1hdGgudGFuKF90aGlzLmFuZ2xlLmdldFJhZGlhbnMoKSksIDAsIDEsIDAsIDBdO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBTa2V3WTtcbn0oU2tldyk7XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3Jtcyh0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGNvbXByZXNzU3BhY2VzKHRyYW5zZm9ybSkudHJpbSgpLnJlcGxhY2UoL1xcKShbYS16QS1aXSkvZywgJykgJDEnKS5yZXBsYWNlKC9cXCkoXFxzPyxcXHM/KS9nLCAnKSAnKS5zcGxpdCgvXFxzKD89W2Etel0pLyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICB2YXIgX3RyYW5zZm9ybSRzcGxpdCA9IHRyYW5zZm9ybS5zcGxpdCgnKCcpLFxuICAgICAgX3RyYW5zZm9ybSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfdHJhbnNmb3JtJHNwbGl0LCAyKSxcbiAgICAgIHR5cGUgPSBfdHJhbnNmb3JtJHNwbGl0MlswXSxcbiAgICAgIHZhbHVlID0gX3RyYW5zZm9ybSRzcGxpdDJbMV07XG5cbiAgcmV0dXJuIFt0eXBlLnRyaW0oKSwgdmFsdWUudHJpbSgpLnJlcGxhY2UoJyknLCAnJyldO1xufVxuXG52YXIgVHJhbnNmb3JtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVHJhbnNmb3JtKGRvY3VtZW50LCB0cmFuc2Zvcm0sIHRyYW5zZm9ybU9yaWdpbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNmb3JtKTtcblxuICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICB0aGlzLnRyYW5zZm9ybXMgPSBbXTtcbiAgICB2YXIgZGF0YSA9IHBhcnNlVHJhbnNmb3Jtcyh0cmFuc2Zvcm0pO1xuICAgIHZhciBvcmlnaW5Db29yZHMgPSB0cmFuc2Zvcm1PcmlnaW4gPyB0b051bWJlcnModHJhbnNmb3JtT3JpZ2luKSA6IFtdO1xuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAodHJhbnNmb3JtKSB7XG4gICAgICBpZiAodHJhbnNmb3JtID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3BhcnNlVHJhbnNmb3JtID0gcGFyc2VUcmFuc2Zvcm0odHJhbnNmb3JtKSxcbiAgICAgICAgICBfcGFyc2VUcmFuc2Zvcm0yID0gX3NsaWNlZFRvQXJyYXkoX3BhcnNlVHJhbnNmb3JtLCAyKSxcbiAgICAgICAgICB0eXBlID0gX3BhcnNlVHJhbnNmb3JtMlswXSxcbiAgICAgICAgICB2YWx1ZSA9IF9wYXJzZVRyYW5zZm9ybTJbMV07XG5cbiAgICAgIHZhciBUcmFuc2Zvcm1UeXBlID0gVHJhbnNmb3JtLnRyYW5zZm9ybVR5cGVzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIFRyYW5zZm9ybVR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIF90aGlzLnRyYW5zZm9ybXMucHVzaChuZXcgVHJhbnNmb3JtVHlwZShfdGhpcy5kb2N1bWVudCwgdmFsdWUsIG9yaWdpbkNvb3JkcykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zZm9ybSwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gICAgICB2YXIgdHJhbnNmb3JtcyA9IHRoaXMudHJhbnNmb3JtcztcbiAgICAgIHZhciBsZW4gPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0cmFuc2Zvcm1zW2ldLmFwcGx5KGN0eCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5hcHBseShjdHgpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1zID0gdGhpcy50cmFuc2Zvcm1zO1xuICAgICAgdmFyIGxlbiA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdHJhbnNmb3Jtc1tpXS51bmFwcGx5KGN0eCk7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBhcHBseVRvUG9pbnQgdW51c2VkIC4uLiByZW1vdmU/XG5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVRvUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlUb1BvaW50KHBvaW50KSB7XG4gICAgICB2YXIgdHJhbnNmb3JtcyA9IHRoaXMudHJhbnNmb3JtcztcbiAgICAgIHZhciBsZW4gPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0cmFuc2Zvcm1zW2ldLmFwcGx5VG9Qb2ludChwb2ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbUVsZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUVsZW1lbnQoZG9jdW1lbnQsIGVsZW1lbnQpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1TdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3RyYW5zZm9ybScsIGZhbHNlLCB0cnVlKTtcbiAgICAgIHZhciB0cmFuc2Zvcm1PcmlnaW5TdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3RyYW5zZm9ybS1vcmlnaW4nLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm1TdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKGRvY3VtZW50LCB0cmFuc2Zvcm1TdHlsZS5nZXRTdHJpbmcoKSwgdHJhbnNmb3JtT3JpZ2luU3R5bGUuZ2V0U3RyaW5nKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNmb3JtO1xufSgpO1xuVHJhbnNmb3JtLnRyYW5zZm9ybVR5cGVzID0ge1xuICB0cmFuc2xhdGU6IFRyYW5zbGF0ZSxcbiAgcm90YXRlOiBSb3RhdGUsXG4gIHNjYWxlOiBTY2FsZSxcbiAgbWF0cml4OiBNYXRyaXgsXG4gIHNrZXdYOiBTa2V3WCxcbiAgc2tld1k6IFNrZXdZXG59O1xuXG52YXIgRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVsZW1lbnQoZG9jdW1lbnQsIG5vZGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNhcHR1cmVUZXh0Tm9kZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVsZW1lbnQpO1xuXG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgdGhpcy5jYXB0dXJlVGV4dE5vZGVzID0gY2FwdHVyZVRleHROb2RlcztcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgIHRoaXMuc3R5bGVzU3BlY2lmaWNpdHkgPSB7fTtcbiAgICB0aGlzLmFuaW1hdGlvbkZyb3plbiA9IGZhbHNlO1xuICAgIHRoaXMuYW5pbWF0aW9uRnJvemVuVmFsdWUgPSAnJztcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuXG4gICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgIC8vIEVMRU1FTlRfTk9ERVxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gYWRkIGF0dHJpYnV0ZXNcblxuXG4gICAgQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgdmFyIG5vZGVOYW1lID0gbm9ybWFsaXplQXR0cmlidXRlTmFtZShhdHRyaWJ1dGUubm9kZU5hbWUpO1xuICAgICAgX3RoaXMuYXR0cmlidXRlc1tub2RlTmFtZV0gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkU3R5bGVzRnJvbVN0eWxlRGVmaW5pdGlvbigpOyAvLyBhZGQgaW5saW5lIHN0eWxlc1xuXG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpLmhhc1ZhbHVlKCkpIHtcbiAgICAgIHZhciBzdHlsZXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnc3R5bGUnKS5nZXRTdHJpbmcoKS5zcGxpdCgnOycpLm1hcChmdW5jdGlvbiAoXykge1xuICAgICAgICByZXR1cm4gXy50cmltKCk7XG4gICAgICB9KTtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdHlsZSRzcGxpdCRtYXAgPSBzdHlsZS5zcGxpdCgnOicpLm1hcChmdW5jdGlvbiAoXykge1xuICAgICAgICAgIHJldHVybiBfLnRyaW0oKTtcbiAgICAgICAgfSksXG4gICAgICAgICAgICBfc3R5bGUkc3BsaXQkbWFwMiA9IF9zbGljZWRUb0FycmF5KF9zdHlsZSRzcGxpdCRtYXAsIDIpLFxuICAgICAgICAgICAgbmFtZSA9IF9zdHlsZSRzcGxpdCRtYXAyWzBdLFxuICAgICAgICAgICAgdmFsdWUgPSBfc3R5bGUkc3BsaXQkbWFwMlsxXTtcblxuICAgICAgICBfdGhpcy5zdHlsZXNbbmFtZV0gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBkZWZpbml0aW9ucyA9IGRvY3VtZW50LmRlZmluaXRpb25zO1xuICAgIHZhciBpZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZCcpOyAvLyBhZGQgaWRcblxuICAgIGlmIChpZC5oYXNWYWx1ZSgpKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb25zW2lkLmdldFZhbHVlKCldKSB7XG4gICAgICAgIGRlZmluaXRpb25zW2lkLmdldFZhbHVlKCldID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGROb2RlKSB7XG4gICAgICBpZiAoY2hpbGROb2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIF90aGlzLmFkZENoaWxkKGNoaWxkTm9kZSk7IC8vIEVMRU1FTlRfTk9ERVxuXG4gICAgICB9IGVsc2UgaWYgKGNhcHR1cmVUZXh0Tm9kZXMgJiYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gMyB8fCBjaGlsZE5vZGUubm9kZVR5cGUgPT09IDQpKSB7XG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkTm9kZSk7XG5cbiAgICAgICAgaWYgKHRleHROb2RlLmdldFRleHQoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgX3RoaXMuYWRkQ2hpbGQodGV4dE5vZGUpOyAvLyBURVhUX05PREVcblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0QXR0cmlidXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgICB2YXIgY3JlYXRlSWZOb3RFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIGF0dHIgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICghYXR0ciAmJiBjcmVhdGVJZk5vdEV4aXN0cykge1xuICAgICAgICB2YXIgX2F0dHIgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgbmFtZSwgJycpO1xuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IF9hdHRyO1xuICAgICAgICByZXR1cm4gX2F0dHI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyIHx8IFByb3BlcnR5LmVtcHR5KHRoaXMuZG9jdW1lbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRIcmVmQXR0cmlidXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEhyZWZBdHRyaWJ1dGUoKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdocmVmJyB8fCAvOmhyZWYkLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb3BlcnR5LmVtcHR5KHRoaXMuZG9jdW1lbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdHlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdHlsZShuYW1lKSB7XG4gICAgICB2YXIgY3JlYXRlSWZOb3RFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIHNraXBBbmNlc3RvcnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgICAgdmFyIHN0eWxlID0gdGhpcy5zdHlsZXNbbmFtZV07XG5cbiAgICAgIGlmIChzdHlsZSkge1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICAgIGlmIChhdHRyICYmIGF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tuYW1lXSA9IGF0dHI7IC8vIG1vdmUgdXAgdG8gbWUgdG8gY2FjaGVcblxuICAgICAgICByZXR1cm4gYXR0cjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFza2lwQW5jZXN0b3JzKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgdmFyIHBhcmVudFN0eWxlID0gcGFyZW50LmdldFN0eWxlKG5hbWUpO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0eWxlICYmIHBhcmVudFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRTdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3RzKSB7XG4gICAgICAgIHZhciBfc3R5bGUgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgbmFtZSwgJycpO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gX3N0eWxlO1xuICAgICAgICByZXR1cm4gX3N0eWxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGUgfHwgUHJvcGVydHkuZW1wdHkodGhpcy5kb2N1bWVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoY3R4KSB7XG4gICAgICAvLyBkb24ndCByZW5kZXIgZGlzcGxheT1ub25lXG4gICAgICAvLyBkb24ndCByZW5kZXIgdmlzaWJpbGl0eT1oaWRkZW5cbiAgICAgIGlmICh0aGlzLmdldFN0eWxlKCdkaXNwbGF5JykuZ2V0U3RyaW5nKCkgPT09ICdub25lJyB8fCB0aGlzLmdldFN0eWxlKCd2aXNpYmlsaXR5JykuZ2V0U3RyaW5nKCkgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgaWYgKHRoaXMuZ2V0U3R5bGUoJ21hc2snKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIC8vIG1hc2tcbiAgICAgICAgdmFyIG1hc2sgPSB0aGlzLmdldFN0eWxlKCdtYXNrJykuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgICAgdGhpcy5hcHBseUVmZmVjdHMoY3R4KTtcbiAgICAgICAgICBtYXNrLmFwcGx5KGN0eCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRTdHlsZSgnZmlsdGVyJykuZ2V0VmFsdWUoJ25vbmUnKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIC8vIGZpbHRlclxuICAgICAgICB2YXIgZmlsdGVyID0gdGhpcy5nZXRTdHlsZSgnZmlsdGVyJykuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5RWZmZWN0cyhjdHgpO1xuICAgICAgICAgIGZpbHRlci5hcHBseShjdHgsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldENvbnRleHQoY3R4KTtcbiAgICAgICAgdGhpcy5yZW5kZXJDaGlsZHJlbihjdHgpO1xuICAgICAgICB0aGlzLmNsZWFyQ29udGV4dChjdHgpO1xuICAgICAgfVxuXG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRleHQoXykge31cbiAgfSwge1xuICAgIGtleTogXCJhcHBseUVmZmVjdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlFZmZlY3RzKGN0eCkge1xuICAgICAgLy8gdHJhbnNmb3JtXG4gICAgICB2YXIgdHJhbnNmb3JtID0gVHJhbnNmb3JtLmZyb21FbGVtZW50KHRoaXMuZG9jdW1lbnQsIHRoaXMpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgIHRyYW5zZm9ybS5hcHBseShjdHgpO1xuICAgICAgfSAvLyBjbGlwXG5cblxuICAgICAgdmFyIGNsaXBQYXRoU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnY2xpcC1wYXRoJywgZmFsc2UsIHRydWUpO1xuXG4gICAgICBpZiAoY2xpcFBhdGhTdHlsZVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICB2YXIgY2xpcCA9IGNsaXBQYXRoU3R5bGVQcm9wLmdldERlZmluaXRpb24oKTtcblxuICAgICAgICBpZiAoY2xpcCkge1xuICAgICAgICAgIGNsaXAuYXBwbHkoY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhckNvbnRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJDb250ZXh0KF8pIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2hpbGRyZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLnJlbmRlcihjdHgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZENoaWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENoaWxkKGNoaWxkTm9kZSkge1xuICAgICAgdmFyIGNoaWxkID0gY2hpbGROb2RlIGluc3RhbmNlb2YgRWxlbWVudCA/IGNoaWxkTm9kZSA6IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjaGlsZE5vZGUpO1xuICAgICAgY2hpbGQucGFyZW50ID0gdGhpcztcblxuICAgICAgaWYgKCFFbGVtZW50Lmlnbm9yZUNoaWxkVHlwZXMuaW5jbHVkZXMoY2hpbGQudHlwZSkpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWF0Y2hlc1NlbGVjdG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5tYXRjaGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVDbGFzc2VzID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7XG5cbiAgICAgIGlmICghc3R5bGVDbGFzc2VzIHx8IHN0eWxlQ2xhc3NlcyA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGVDbGFzc2VzLnNwbGl0KCcgJykuc29tZShmdW5jdGlvbiAoc3R5bGVDbGFzcykge1xuICAgICAgICBpZiAoXCIuXCIuY29uY2F0KHN0eWxlQ2xhc3MpID09PSBzZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkU3R5bGVzRnJvbVN0eWxlRGVmaW5pdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRTdHlsZXNGcm9tU3R5bGVEZWZpbml0aW9uKCkge1xuICAgICAgdmFyIF90aGlzJGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudCxcbiAgICAgICAgICBzdHlsZXMgPSBfdGhpcyRkb2N1bWVudC5zdHlsZXMsXG4gICAgICAgICAgc3R5bGVzU3BlY2lmaWNpdHkgPSBfdGhpcyRkb2N1bWVudC5zdHlsZXNTcGVjaWZpY2l0eTtcblxuICAgICAgZm9yICh2YXIgc2VsZWN0b3IgaW4gc3R5bGVzKSB7XG4gICAgICAgIGlmIChzZWxlY3RvclswXSAhPT0gJ0AnICYmIHRoaXMubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHZhciBzdHlsZSA9IHN0eWxlc1tzZWxlY3Rvcl07XG4gICAgICAgICAgdmFyIHNwZWNpZmljaXR5ID0gc3R5bGVzU3BlY2lmaWNpdHlbc2VsZWN0b3JdO1xuXG4gICAgICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgICAgIHZhciBleGlzdGluZ1NwZWNpZmljaXR5ID0gdGhpcy5zdHlsZXNTcGVjaWZpY2l0eVtuYW1lXTtcblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nU3BlY2lmaWNpdHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdTcGVjaWZpY2l0eSA9ICcwMDAnO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHNwZWNpZmljaXR5ID49IGV4aXN0aW5nU3BlY2lmaWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc1tuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzU3BlY2lmaWNpdHlbbmFtZV0gPSBzcGVjaWZpY2l0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVTdHlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlU3R5bGVzKGVsZW1lbnQsIGlnbm9yZVN0eWxlcykge1xuICAgICAgdmFyIHRvUmVzdG9yZSA9IGlnbm9yZVN0eWxlcy5yZWR1Y2UoZnVuY3Rpb24gKHRvUmVzdG9yZSwgbmFtZSkge1xuICAgICAgICB2YXIgc3R5bGVQcm9wID0gZWxlbWVudC5nZXRTdHlsZShuYW1lKTtcblxuICAgICAgICBpZiAoIXN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRvUmVzdG9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlUHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgICAgc3R5bGVQcm9wLnNldFZhbHVlKCcnKTtcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodG9SZXN0b3JlKSwgW1tuYW1lLCB2YWx1ZV1dKTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHJldHVybiB0b1Jlc3RvcmU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc3RvcmVTdHlsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdG9yZVN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICAgICAgbmFtZSA9IF9yZWYyWzBdLFxuICAgICAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgICAgICBlbGVtZW50LmdldFN0eWxlKG5hbWUsIHRydWUpLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFbGVtZW50O1xufSgpO1xuRWxlbWVudC5pZ25vcmVDaGlsZFR5cGVzID0gWyd0aXRsZSddO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkMyhEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQzKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDMoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFVua25vd25FbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoVW5rbm93bkVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJDMoVW5rbm93bkVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIFVua25vd25FbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVua25vd25FbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFVua25vd25FbGVtZW50O1xufShFbGVtZW50KTtcblxuZnVuY3Rpb24gd3JhcEZvbnRGYW1pbHkoZm9udEZhbWlseSkge1xuICB2YXIgdHJpbW1lZCA9IGZvbnRGYW1pbHkudHJpbSgpO1xuICByZXR1cm4gL14oJ3xcIikvLnRlc3QodHJpbW1lZCkgPyB0cmltbWVkIDogXCJcXFwiXCIuY29uY2F0KHRyaW1tZWQsIFwiXFxcIlwiKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUZvbnRGYW1pbHkoZm9udEZhbWlseSkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnID8gZm9udEZhbWlseSA6IGZvbnRGYW1pbHkudHJpbSgpLnNwbGl0KCcsJykubWFwKHdyYXBGb250RmFtaWx5KS5qb2luKCcsJyk7XG59XG4vKipcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LXN0eWxlXG4gKi9cblxuXG5mdW5jdGlvbiBwcmVwYXJlRm9udFN0eWxlKGZvbnRTdHlsZSkge1xuICBpZiAoIWZvbnRTdHlsZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciB0YXJnZXRGb250U3R5bGUgPSBmb250U3R5bGUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoICh0YXJnZXRGb250U3R5bGUpIHtcbiAgICBjYXNlICdub3JtYWwnOlxuICAgIGNhc2UgJ2l0YWxpYyc6XG4gICAgY2FzZSAnb2JsaXF1ZSc6XG4gICAgY2FzZSAnaW5oZXJpdCc6XG4gICAgY2FzZSAnaW5pdGlhbCc6XG4gICAgY2FzZSAndW5zZXQnOlxuICAgICAgcmV0dXJuIHRhcmdldEZvbnRTdHlsZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoL15vYmxpcXVlXFxzKygtfClcXGQrZGVnJC8udGVzdCh0YXJnZXRGb250U3R5bGUpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRGb250U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC13ZWlnaHRcbiAqL1xuXG5cbmZ1bmN0aW9uIHByZXBhcmVGb250V2VpZ2h0KGZvbnRXZWlnaHQpIHtcbiAgaWYgKCFmb250V2VpZ2h0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdmFyIHRhcmdldEZvbnRXZWlnaHQgPSBmb250V2VpZ2h0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHN3aXRjaCAodGFyZ2V0Rm9udFdlaWdodCkge1xuICAgIGNhc2UgJ25vcm1hbCc6XG4gICAgY2FzZSAnYm9sZCc6XG4gICAgY2FzZSAnbGlnaHRlcic6XG4gICAgY2FzZSAnYm9sZGVyJzpcbiAgICBjYXNlICdpbmhlcml0JzpcbiAgICBjYXNlICdpbml0aWFsJzpcbiAgICBjYXNlICd1bnNldCc6XG4gICAgICByZXR1cm4gdGFyZ2V0Rm9udFdlaWdodDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoL15bXFxkLl0rJC8udGVzdCh0YXJnZXRGb250V2VpZ2h0KSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0Rm9udFdlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBGb250ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRm9udChmb250U3R5bGUsIGZvbnRWYXJpYW50LCBmb250V2VpZ2h0LCBmb250U2l6ZSwgZm9udEZhbWlseSwgaW5oZXJpdCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb250KTtcblxuICAgIHZhciBpbmhlcml0Rm9udCA9IGluaGVyaXQgPyB0eXBlb2YgaW5oZXJpdCA9PT0gJ3N0cmluZycgPyBGb250LnBhcnNlKGluaGVyaXQpIDogaW5oZXJpdCA6IHt9O1xuICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHkgfHwgaW5oZXJpdEZvbnQuZm9udEZhbWlseTtcbiAgICB0aGlzLmZvbnRTaXplID0gZm9udFNpemUgfHwgaW5oZXJpdEZvbnQuZm9udFNpemU7XG4gICAgdGhpcy5mb250U3R5bGUgPSBmb250U3R5bGUgfHwgaW5oZXJpdEZvbnQuZm9udFN0eWxlO1xuICAgIHRoaXMuZm9udFdlaWdodCA9IGZvbnRXZWlnaHQgfHwgaW5oZXJpdEZvbnQuZm9udFdlaWdodDtcbiAgICB0aGlzLmZvbnRWYXJpYW50ID0gZm9udFZhcmlhbnQgfHwgaW5oZXJpdEZvbnQuZm9udFZhcmlhbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRm9udCwgW3tcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gW3ByZXBhcmVGb250U3R5bGUodGhpcy5mb250U3R5bGUpLCB0aGlzLmZvbnRWYXJpYW50LCBwcmVwYXJlRm9udFdlaWdodCh0aGlzLmZvbnRXZWlnaHQpLCB0aGlzLmZvbnRTaXplLCAvLyBXcmFwIGZvbnRGYW1pbHkgb25seSBvbiBub2RlanMgYW5kIG9ubHkgZm9yIGNhbnZhcy5jdHhcbiAgICAgIHByZXBhcmVGb250RmFtaWx5KHRoaXMuZm9udEZhbWlseSldLmpvaW4oJyAnKS50cmltKCk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgICB2YXIgZm9udCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgICB2YXIgaW5oZXJpdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGZvbnRTdHlsZSA9ICcnO1xuICAgICAgdmFyIGZvbnRWYXJpYW50ID0gJyc7XG4gICAgICB2YXIgZm9udFdlaWdodCA9ICcnO1xuICAgICAgdmFyIGZvbnRTaXplID0gJyc7XG4gICAgICB2YXIgZm9udEZhbWlseSA9ICcnO1xuICAgICAgdmFyIHBhcnRzID0gY29tcHJlc3NTcGFjZXMoZm9udCkudHJpbSgpLnNwbGl0KCcgJyk7XG4gICAgICB2YXIgc2V0ID0ge1xuICAgICAgICBmb250U2l6ZTogZmFsc2UsXG4gICAgICAgIGZvbnRTdHlsZTogZmFsc2UsXG4gICAgICAgIGZvbnRXZWlnaHQ6IGZhbHNlLFxuICAgICAgICBmb250VmFyaWFudDogZmFsc2VcbiAgICAgIH07XG4gICAgICBwYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgIGNhc2UgIXNldC5mb250U3R5bGUgJiYgRm9udC5zdHlsZXMuaW5jbHVkZXMocGFydCk6XG4gICAgICAgICAgICBpZiAocGFydCAhPT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICAgIGZvbnRTdHlsZSA9IHBhcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldC5mb250U3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICFzZXQuZm9udFZhcmlhbnQgJiYgRm9udC52YXJpYW50cy5pbmNsdWRlcyhwYXJ0KTpcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgICAgZm9udFZhcmlhbnQgPSBwYXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXQuZm9udFN0eWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldC5mb250VmFyaWFudCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgIXNldC5mb250V2VpZ2h0ICYmIEZvbnQud2VpZ2h0cy5pbmNsdWRlcyhwYXJ0KTpcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgICAgZm9udFdlaWdodCA9IHBhcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldC5mb250U3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgc2V0LmZvbnRWYXJpYW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldC5mb250V2VpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAhc2V0LmZvbnRTaXplOlxuICAgICAgICAgICAgaWYgKHBhcnQgIT09ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgICB2YXIgX3BhcnQkc3BsaXQgPSBwYXJ0LnNwbGl0KCcvJyk7XG5cbiAgICAgICAgICAgICAgdmFyIF9wYXJ0JHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9wYXJ0JHNwbGl0LCAxKTtcblxuICAgICAgICAgICAgICBmb250U2l6ZSA9IF9wYXJ0JHNwbGl0MlswXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0LmZvbnRTdHlsZSA9IHRydWU7XG4gICAgICAgICAgICBzZXQuZm9udFZhcmlhbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0LmZvbnRXZWlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0LmZvbnRTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseSArPSBwYXJ0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBGb250KGZvbnRTdHlsZSwgZm9udFZhcmlhbnQsIGZvbnRXZWlnaHQsIGZvbnRTaXplLCBmb250RmFtaWx5LCBpbmhlcml0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9udDtcbn0oKTtcbkZvbnQuc3R5bGVzID0gJ25vcm1hbHxpdGFsaWN8b2JsaXF1ZXxpbmhlcml0JztcbkZvbnQudmFyaWFudHMgPSAnbm9ybWFsfHNtYWxsLWNhcHN8aW5oZXJpdCc7XG5Gb250LndlaWdodHMgPSAnbm9ybWFsfGJvbGR8Ym9sZGVyfGxpZ2h0ZXJ8MTAwfDIwMHwzMDB8NDAwfDUwMHw2MDB8NzAwfDgwMHw5MDB8aW5oZXJpdCc7XG5cbnZhciBCb3VuZGluZ0JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJvdW5kaW5nQm94KCkge1xuICAgIHZhciB4MSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogTnVtYmVyLk5hTjtcbiAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE51bWJlci5OYU47XG4gICAgdmFyIHgyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBOdW1iZXIuTmFOO1xuICAgIHZhciB5MiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogTnVtYmVyLk5hTjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCb3VuZGluZ0JveCk7XG5cbiAgICB0aGlzLngxID0geDE7XG4gICAgdGhpcy55MSA9IHkxO1xuICAgIHRoaXMueDIgPSB4MjtcbiAgICB0aGlzLnkyID0geTI7XG4gICAgdGhpcy5hZGRQb2ludCh4MSwgeTEpO1xuICAgIHRoaXMuYWRkUG9pbnQoeDIsIHkyKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCb3VuZGluZ0JveCwgW3tcbiAgICBrZXk6IFwiYWRkUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUG9pbnQoeCwgeSkge1xuICAgICAgaWYgKHR5cGVvZiB4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoaXNOYU4odGhpcy54MSkgfHwgaXNOYU4odGhpcy54MikpIHtcbiAgICAgICAgICB0aGlzLngxID0geDtcbiAgICAgICAgICB0aGlzLngyID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh4IDwgdGhpcy54MSkge1xuICAgICAgICAgIHRoaXMueDEgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHggPiB0aGlzLngyKSB7XG4gICAgICAgICAgdGhpcy54MiA9IHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoaXNOYU4odGhpcy55MSkgfHwgaXNOYU4odGhpcy55MikpIHtcbiAgICAgICAgICB0aGlzLnkxID0geTtcbiAgICAgICAgICB0aGlzLnkyID0geTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh5IDwgdGhpcy55MSkge1xuICAgICAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHkgPiB0aGlzLnkyKSB7XG4gICAgICAgICAgdGhpcy55MiA9IHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkWFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRYKHgpIHtcbiAgICAgIHRoaXMuYWRkUG9pbnQoeCwgbnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkWSh5KSB7XG4gICAgICB0aGlzLmFkZFBvaW50KG51bGwsIHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRCb3VuZGluZ0JveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRCb3VuZGluZ0JveChib3VuZGluZ0JveCkge1xuICAgICAgaWYgKCFib3VuZGluZ0JveCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB4MSA9IGJvdW5kaW5nQm94LngxLFxuICAgICAgICAgIHkxID0gYm91bmRpbmdCb3gueTEsXG4gICAgICAgICAgeDIgPSBib3VuZGluZ0JveC54MixcbiAgICAgICAgICB5MiA9IGJvdW5kaW5nQm94LnkyO1xuICAgICAgdGhpcy5hZGRQb2ludCh4MSwgeTEpO1xuICAgICAgdGhpcy5hZGRQb2ludCh4MiwgeTIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdW1DdWJpY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdW1DdWJpYyh0LCBwMCwgcDEsIHAyLCBwMykge1xuICAgICAgcmV0dXJuIE1hdGgucG93KDEgLSB0LCAzKSAqIHAwICsgMyAqIE1hdGgucG93KDEgLSB0LCAyKSAqIHQgKiBwMSArIDMgKiAoMSAtIHQpICogTWF0aC5wb3codCwgMikgKiBwMiArIE1hdGgucG93KHQsIDMpICogcDM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJlemllckN1cnZlQWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJlemllckN1cnZlQWRkKGZvclgsIHAwLCBwMSwgcDIsIHAzKSB7XG4gICAgICB2YXIgYiA9IDYgKiBwMCAtIDEyICogcDEgKyA2ICogcDI7XG4gICAgICB2YXIgYSA9IC0zICogcDAgKyA5ICogcDEgLSA5ICogcDIgKyAzICogcDM7XG4gICAgICB2YXIgYyA9IDMgKiBwMSAtIDMgKiBwMDtcblxuICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgaWYgKGIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IC1jIC8gYjtcblxuICAgICAgICBpZiAoMCA8IHQgJiYgdCA8IDEpIHtcbiAgICAgICAgICBpZiAoZm9yWCkge1xuICAgICAgICAgICAgdGhpcy5hZGRYKHRoaXMuc3VtQ3ViaWModCwgcDAsIHAxLCBwMiwgcDMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRZKHRoaXMuc3VtQ3ViaWModCwgcDAsIHAxLCBwMiwgcDMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBiMmFjID0gTWF0aC5wb3coYiwgMikgLSA0ICogYyAqIGE7XG5cbiAgICAgIGlmIChiMmFjIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuXG4gICAgICBpZiAoMCA8IHQxICYmIHQxIDwgMSkge1xuICAgICAgICBpZiAoZm9yWCkge1xuICAgICAgICAgIHRoaXMuYWRkWCh0aGlzLnN1bUN1YmljKHQxLCBwMCwgcDEsIHAyLCBwMykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWRkWSh0aGlzLnN1bUN1YmljKHQxLCBwMCwgcDEsIHAyLCBwMykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuXG4gICAgICBpZiAoMCA8IHQyICYmIHQyIDwgMSkge1xuICAgICAgICBpZiAoZm9yWCkge1xuICAgICAgICAgIHRoaXMuYWRkWCh0aGlzLnN1bUN1YmljKHQyLCBwMCwgcDEsIHAyLCBwMykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWRkWSh0aGlzLnN1bUN1YmljKHQyLCBwMCwgcDEsIHAyLCBwMykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBmcm9tIGh0dHA6Ly9ibG9nLmhhY2tlcnMtY2FmZS5uZXQvMjAwOS8wNi9ob3ctdG8tY2FsY3VsYXRlLWJlemllci1jdXJ2ZXMtYm91bmRpbmcuaHRtbFxuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQmV6aWVyQ3VydmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQmV6aWVyQ3VydmUocDB4LCBwMHksIHAxeCwgcDF5LCBwMngsIHAyeSwgcDN4LCBwM3kpIHtcbiAgICAgIHRoaXMuYWRkUG9pbnQocDB4LCBwMHkpO1xuICAgICAgdGhpcy5hZGRQb2ludChwM3gsIHAzeSk7XG4gICAgICB0aGlzLmJlemllckN1cnZlQWRkKHRydWUsIHAweCwgcDF4LCBwMngsIHAzeCk7XG4gICAgICB0aGlzLmJlemllckN1cnZlQWRkKGZhbHNlLCBwMHksIHAxeSwgcDJ5LCBwM3kpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRRdWFkcmF0aWNDdXJ2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRRdWFkcmF0aWNDdXJ2ZShwMHgsIHAweSwgcDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgICB2YXIgY3AxeCA9IHAweCArIDIgLyAzICogKHAxeCAtIHAweCk7IC8vIENQMSA9IFFQMCArIDIvMyAqKFFQMS1RUDApXG5cbiAgICAgIHZhciBjcDF5ID0gcDB5ICsgMiAvIDMgKiAocDF5IC0gcDB5KTsgLy8gQ1AxID0gUVAwICsgMi8zICooUVAxLVFQMClcblxuICAgICAgdmFyIGNwMnggPSBjcDF4ICsgMSAvIDMgKiAocDJ4IC0gcDB4KTsgLy8gQ1AyID0gQ1AxICsgMS8zICooUVAyLVFQMClcblxuICAgICAgdmFyIGNwMnkgPSBjcDF5ICsgMSAvIDMgKiAocDJ5IC0gcDB5KTsgLy8gQ1AyID0gQ1AxICsgMS8zICooUVAyLVFQMClcblxuICAgICAgdGhpcy5hZGRCZXppZXJDdXJ2ZShwMHgsIHAweSwgY3AxeCwgY3AyeCwgY3AxeSwgY3AyeSwgcDJ4LCBwMnkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1BvaW50SW5Cb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNQb2ludEluQm94KHgsIHkpIHtcbiAgICAgIHZhciB4MSA9IHRoaXMueDEsXG4gICAgICAgICAgeTEgPSB0aGlzLnkxLFxuICAgICAgICAgIHgyID0gdGhpcy54MixcbiAgICAgICAgICB5MiA9IHRoaXMueTI7XG4gICAgICByZXR1cm4geDEgPD0geCAmJiB4IDw9IHgyICYmIHkxIDw9IHkgJiYgeSA8PSB5MjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwieFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMueDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnkxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMueDIgLSB0aGlzLngxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnkyIC0gdGhpcy55MTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQm91bmRpbmdCb3g7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQ0KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDQoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkNCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUmVuZGVyZWRFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoUmVuZGVyZWRFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQ0KFJlbmRlcmVkRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gUmVuZGVyZWRFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZW5kZXJlZEVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy5tb2RpZmllZEVtU2l6ZVN0YWNrID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlbmRlcmVkRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiY2FsY3VsYXRlT3BhY2l0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjdWxhdGVPcGFjaXR5KCkge1xuICAgICAgdmFyIG9wYWNpdHkgPSAxLjA7IC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdGhpcy1hc3NpZ25tZW50XG5cbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcztcblxuICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG9wYWNpdHlTdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ29wYWNpdHknLCBmYWxzZSwgdHJ1ZSk7IC8vIG5vIGFuY2VzdG9ycyBvbiBzdHlsZSBjYWxsXG5cbiAgICAgICAgaWYgKG9wYWNpdHlTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgb3BhY2l0eSAqPSBvcGFjaXR5U3R5bGUuZ2V0TnVtYmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcGFjaXR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRleHQoY3R4KSB7XG4gICAgICB2YXIgZnJvbU1lYXN1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgICBpZiAoIWZyb21NZWFzdXJlKSB7XG4gICAgICAgIC8vIGNhdXNlcyBzdGFjayBvdmVyZmxvdyB3aGVuIG1lYXN1cmluZyB0ZXh0IHdpdGggZ3JhZGllbnRzXG4gICAgICAgIC8vIGZpbGxcbiAgICAgICAgdmFyIGZpbGxTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmaWxsJyk7XG4gICAgICAgIHZhciBmaWxsT3BhY2l0eVN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ2ZpbGwtb3BhY2l0eScpO1xuICAgICAgICB2YXIgc3Ryb2tlU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnc3Ryb2tlJyk7XG4gICAgICAgIHZhciBzdHJva2VPcGFjaXR5UHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1vcGFjaXR5Jyk7XG5cbiAgICAgICAgaWYgKGZpbGxTdHlsZVByb3AuaXNVcmxEZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICB2YXIgZmlsbFN0eWxlID0gZmlsbFN0eWxlUHJvcC5nZXRGaWxsU3R5bGVEZWZpbml0aW9uKHRoaXMsIGZpbGxPcGFjaXR5U3R5bGVQcm9wKTtcblxuICAgICAgICAgIGlmIChmaWxsU3R5bGUpIHtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIGlmIChmaWxsU3R5bGVQcm9wLmdldFN0cmluZygpID09PSAnY3VycmVudENvbG9yJykge1xuICAgICAgICAgICAgZmlsbFN0eWxlUHJvcC5zZXRWYWx1ZSh0aGlzLmdldFN0eWxlKCdjb2xvcicpLmdldENvbG9yKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfZmlsbFN0eWxlID0gZmlsbFN0eWxlUHJvcC5nZXRDb2xvcigpO1xuXG4gICAgICAgICAgaWYgKF9maWxsU3R5bGUgIT09ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IF9maWxsU3R5bGUgPT09ICdub25lJyA/ICdyZ2JhKDAsMCwwLDApJyA6IF9maWxsU3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGxPcGFjaXR5U3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICB2YXIgX2ZpbGxTdHlsZTIgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ2ZpbGwnLCBjdHguZmlsbFN0eWxlKS5hZGRPcGFjaXR5KGZpbGxPcGFjaXR5U3R5bGVQcm9wKS5nZXRDb2xvcigpO1xuXG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IF9maWxsU3R5bGUyO1xuICAgICAgICB9IC8vIHN0cm9rZVxuXG5cbiAgICAgICAgaWYgKHN0cm9rZVN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICAgIHZhciBzdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlUHJvcC5nZXRGaWxsU3R5bGVEZWZpbml0aW9uKHRoaXMsIHN0cm9rZU9wYWNpdHlQcm9wKTtcblxuICAgICAgICAgIGlmIChzdHJva2VTdHlsZSkge1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0cm9rZVN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgaWYgKHN0cm9rZVN0eWxlUHJvcC5nZXRTdHJpbmcoKSA9PT0gJ2N1cnJlbnRDb2xvcicpIHtcbiAgICAgICAgICAgIHN0cm9rZVN0eWxlUHJvcC5zZXRWYWx1ZSh0aGlzLmdldFN0eWxlKCdjb2xvcicpLmdldENvbG9yKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVByb3AuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgICBpZiAoX3N0cm9rZVN0eWxlICE9PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IF9zdHJva2VTdHlsZSA9PT0gJ25vbmUnID8gJ3JnYmEoMCwwLDAsMCknIDogX3N0cm9rZVN0eWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJva2VPcGFjaXR5UHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgdmFyIF9zdHJva2VTdHlsZTIgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3N0cm9rZScsIGN0eC5zdHJva2VTdHlsZSkuYWRkT3BhY2l0eShzdHJva2VPcGFjaXR5UHJvcCkuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBfc3Ryb2tlU3R5bGUyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0cm9rZVdpZHRoU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnc3Ryb2tlLXdpZHRoJyk7XG5cbiAgICAgICAgaWYgKHN0cm9rZVdpZHRoU3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICB2YXIgbmV3TGluZVdpZHRoID0gc3Ryb2tlV2lkdGhTdHlsZVByb3AuZ2V0UGl4ZWxzKCk7XG4gICAgICAgICAgY3R4LmxpbmVXaWR0aCA9ICFuZXdMaW5lV2lkdGggPyBQU0VVRE9fWkVSTyAvLyBicm93c2VycyBkb24ndCByZXNwZWN0IDAgKG9yIG5vZGUtY2FudmFzPyA6LSlcbiAgICAgICAgICA6IG5ld0xpbmVXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdHJva2VMaW5lY2FwU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnc3Ryb2tlLWxpbmVjYXAnKTtcbiAgICAgICAgdmFyIHN0cm9rZUxpbmVqb2luU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnc3Ryb2tlLWxpbmVqb2luJyk7XG4gICAgICAgIHZhciBzdHJva2VNaXRlcmxpbWl0UHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1taXRlcmxpbWl0Jyk7XG4gICAgICAgIHZhciBwb2ludE9yZGVyU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgncGFpbnQtb3JkZXInKTtcbiAgICAgICAgdmFyIHN0cm9rZURhc2hhcnJheVN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknKTtcbiAgICAgICAgdmFyIHN0cm9rZURhc2hvZmZzZXRQcm9wID0gdGhpcy5nZXRTdHlsZSgnc3Ryb2tlLWRhc2hvZmZzZXQnKTtcblxuICAgICAgICBpZiAoc3Ryb2tlTGluZWNhcFN0eWxlUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgY3R4LmxpbmVDYXAgPSBzdHJva2VMaW5lY2FwU3R5bGVQcm9wLmdldFN0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cm9rZUxpbmVqb2luU3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBjdHgubGluZUpvaW4gPSBzdHJva2VMaW5lam9pblN0eWxlUHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJva2VNaXRlcmxpbWl0UHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgY3R4Lm1pdGVyTGltaXQgPSBzdHJva2VNaXRlcmxpbWl0UHJvcC5nZXROdW1iZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludE9yZGVyU3R5bGVQcm9wLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAvLyA/XG4gICAgICAgICAgY3R4LnBhaW50T3JkZXIgPSBwb2ludE9yZGVyU3R5bGVQcm9wLmdldFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3Ryb2tlRGFzaGFycmF5U3R5bGVQcm9wLmhhc1ZhbHVlKCkgJiYgc3Ryb2tlRGFzaGFycmF5U3R5bGVQcm9wLmdldFN0cmluZygpICE9PSAnbm9uZScpIHtcbiAgICAgICAgICB2YXIgZ2FwcyA9IHRvTnVtYmVycyhzdHJva2VEYXNoYXJyYXlTdHlsZVByb3AuZ2V0U3RyaW5nKCkpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdHguc2V0TGluZURhc2ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdHguc2V0TGluZURhc2goZ2Fwcyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY3R4LndlYmtpdExpbmVEYXNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3R4LndlYmtpdExpbmVEYXNoID0gZ2FwcztcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdHgubW96RGFzaCAhPT0gJ3VuZGVmaW5lZCcgJiYgIShnYXBzLmxlbmd0aCA9PT0gMSAmJiBnYXBzWzBdID09PSAwKSkge1xuICAgICAgICAgICAgY3R4Lm1vekRhc2ggPSBnYXBzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBvZmZzZXQgPSBzdHJva2VEYXNob2Zmc2V0UHJvcC5nZXRQaXhlbHMoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgY3R4LmxpbmVEYXNoT2Zmc2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGN0eC53ZWJraXRMaW5lRGFzaE9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN0eC53ZWJraXRMaW5lRGFzaE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdHgubW96RGFzaE9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN0eC5tb3pEYXNoT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBmb250XG5cblxuICAgICAgdGhpcy5tb2RpZmllZEVtU2l6ZVN0YWNrID0gZmFsc2U7XG5cbiAgICAgIGlmICh0eXBlb2YgY3R4LmZvbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBmb250U3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZm9udCcpO1xuICAgICAgICB2YXIgZm9udFN0eWxlU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZm9udC1zdHlsZScpO1xuICAgICAgICB2YXIgZm9udFZhcmlhbnRTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmb250LXZhcmlhbnQnKTtcbiAgICAgICAgdmFyIGZvbnRXZWlnaHRTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmb250LXdlaWdodCcpO1xuICAgICAgICB2YXIgZm9udFNpemVTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmb250LXNpemUnKTtcbiAgICAgICAgdmFyIGZvbnRGYW1pbHlTdHlsZVByb3AgPSB0aGlzLmdldFN0eWxlKCdmb250LWZhbWlseScpO1xuICAgICAgICB2YXIgZm9udCA9IG5ldyBGb250KGZvbnRTdHlsZVN0eWxlUHJvcC5nZXRTdHJpbmcoKSwgZm9udFZhcmlhbnRTdHlsZVByb3AuZ2V0U3RyaW5nKCksIGZvbnRXZWlnaHRTdHlsZVByb3AuZ2V0U3RyaW5nKCksIGZvbnRTaXplU3R5bGVQcm9wLmhhc1ZhbHVlKCkgPyBcIlwiLmNvbmNhdChmb250U2l6ZVN0eWxlUHJvcC5nZXRQaXhlbHModHJ1ZSksIFwicHhcIikgOiAnJywgZm9udEZhbWlseVN0eWxlUHJvcC5nZXRTdHJpbmcoKSwgRm9udC5wYXJzZShmb250U3R5bGVQcm9wLmdldFN0cmluZygpLCBjdHguZm9udCkpO1xuICAgICAgICBmb250U3R5bGVTdHlsZVByb3Auc2V0VmFsdWUoZm9udC5mb250U3R5bGUpO1xuICAgICAgICBmb250VmFyaWFudFN0eWxlUHJvcC5zZXRWYWx1ZShmb250LmZvbnRWYXJpYW50KTtcbiAgICAgICAgZm9udFdlaWdodFN0eWxlUHJvcC5zZXRWYWx1ZShmb250LmZvbnRXZWlnaHQpO1xuICAgICAgICBmb250U2l6ZVN0eWxlUHJvcC5zZXRWYWx1ZShmb250LmZvbnRTaXplKTtcbiAgICAgICAgZm9udEZhbWlseVN0eWxlUHJvcC5zZXRWYWx1ZShmb250LmZvbnRGYW1pbHkpO1xuICAgICAgICBjdHguZm9udCA9IGZvbnQudG9TdHJpbmcoKTtcblxuICAgICAgICBpZiAoZm9udFNpemVTdHlsZVByb3AuaXNQaXhlbHMoKSkge1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnQuZW1TaXplID0gZm9udFNpemVTdHlsZVByb3AuZ2V0UGl4ZWxzKCk7XG4gICAgICAgICAgdGhpcy5tb2RpZmllZEVtU2l6ZVN0YWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZyb21NZWFzdXJlKSB7XG4gICAgICAgIC8vIGVmZmVjdHNcbiAgICAgICAgdGhpcy5hcHBseUVmZmVjdHMoY3R4KTsgLy8gb3BhY2l0eVxuXG4gICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY2FsY3VsYXRlT3BhY2l0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhckNvbnRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJDb250ZXh0KGN0eCkge1xuICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoUmVuZGVyZWRFbGVtZW50LnByb3RvdHlwZSksIFwiY2xlYXJDb250ZXh0XCIsIHRoaXMpLmNhbGwodGhpcywgY3R4KTtcblxuICAgICAgaWYgKHRoaXMubW9kaWZpZWRFbVNpemVTdGFjaykge1xuICAgICAgICB0aGlzLmRvY3VtZW50LnBvcEVtU2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZW5kZXJlZEVsZW1lbnQ7XG59KEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkNShEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQ1KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDUoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFRleHRFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVuZGVyZWRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhUZXh0RWxlbWVudCwgX1JlbmRlcmVkRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQ1KFRleHRFbGVtZW50KTtcblxuICBmdW5jdGlvbiBUZXh0RWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0RWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCAodGhpcyBpbnN0YW5jZW9mIFRleHRFbGVtZW50ID8gdGhpcy5jb25zdHJ1Y3RvciA6IHZvaWQgMCkgPT09IFRleHRFbGVtZW50ID8gdHJ1ZSA6IGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAndGV4dCc7XG4gICAgX3RoaXMueCA9IDA7XG4gICAgX3RoaXMueSA9IDA7XG4gICAgX3RoaXMubWVhc3VyZUNhY2hlID0gLTE7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRFbGVtZW50LCBbe1xuICAgIGtleTogXCJzZXRDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRleHQoY3R4KSB7XG4gICAgICB2YXIgZnJvbU1lYXN1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgICBfZ2V0KF9nZXRQcm90b3R5cGVPZihUZXh0RWxlbWVudC5wcm90b3R5cGUpLCBcInNldENvbnRleHRcIiwgdGhpcykuY2FsbCh0aGlzLCBjdHgsIGZyb21NZWFzdXJlKTtcblxuICAgICAgdmFyIHRleHRCYXNlbGluZSA9IHRoaXMuZ2V0U3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJykuZ2V0VGV4dEJhc2VsaW5lKCkgfHwgdGhpcy5nZXRTdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJykuZ2V0VGV4dEJhc2VsaW5lKCk7XG5cbiAgICAgIGlmICh0ZXh0QmFzZWxpbmUpIHtcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9IHRleHRCYXNlbGluZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZUNvb3JkaW5hdGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemVDb29yZGluYXRlcyhjdHgpIHtcbiAgICAgIHRoaXMueCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd4JykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB0aGlzLnkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIGR4QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkeCcpO1xuICAgICAgdmFyIGR5QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkeScpO1xuXG4gICAgICBpZiAoZHhBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdGhpcy54ICs9IGR4QXR0ci5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGR5QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMueSArPSBkeUF0dHIuZ2V0UGl4ZWxzKCd5Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMueCArPSB0aGlzLmdldEFuY2hvckRlbHRhKGN0eCwgdGhpcywgMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kaW5nQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94KGN0eCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRURWxlbWVudEJvdW5kaW5nQm94KGN0eCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvb3JkaW5hdGVzKGN0eCk7XG4gICAgICB2YXIgYm91bmRpbmdCb3ggPSBudWxsO1xuICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChfLCBpKSB7XG4gICAgICAgIHZhciBjaGlsZEJvdW5kaW5nQm94ID0gX3RoaXMyLmdldENoaWxkQm91bmRpbmdCb3goY3R4LCBfdGhpczIsIF90aGlzMiwgaSk7XG5cbiAgICAgICAgaWYgKCFib3VuZGluZ0JveCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94ID0gY2hpbGRCb3VuZGluZ0JveDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5hZGRCb3VuZGluZ0JveChjaGlsZEJvdW5kaW5nQm94KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYm91bmRpbmdCb3g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZvbnRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZvbnRTaXplKCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgIHZhciBpbmhlcml0Rm9udFNpemUgPSBGb250LnBhcnNlKGRvY3VtZW50LmN0eC5mb250KS5mb250U2l6ZTtcbiAgICAgIHZhciBmb250U2l6ZSA9IHBhcmVudC5nZXRTdHlsZSgnZm9udC1zaXplJykuZ2V0TnVtYmVyKGluaGVyaXRGb250U2l6ZSk7XG4gICAgICByZXR1cm4gZm9udFNpemU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRFbGVtZW50Qm91bmRpbmdCb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VEVsZW1lbnRCb3VuZGluZ0JveChjdHgpIHtcbiAgICAgIHZhciBmb250U2l6ZSA9IHRoaXMuZ2V0Rm9udFNpemUoKTtcbiAgICAgIHJldHVybiBuZXcgQm91bmRpbmdCb3godGhpcy54LCB0aGlzLnkgLSBmb250U2l6ZSwgdGhpcy54ICsgdGhpcy5tZWFzdXJlVGV4dChjdHgpLCB0aGlzLnkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRHbHlwaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRHbHlwaChmb250LCB0ZXh0LCBpKSB7XG4gICAgICB2YXIgY2hhciA9IHRleHRbaV07XG4gICAgICB2YXIgZ2x5cGggPSBudWxsO1xuXG4gICAgICBpZiAoZm9udC5pc0FyYWJpYykge1xuICAgICAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHZhciBwcmV2Q2hhciA9IHRleHRbaSAtIDFdO1xuICAgICAgICB2YXIgbmV4dENoYXIgPSB0ZXh0W2kgKyAxXTtcbiAgICAgICAgdmFyIGFyYWJpY0Zvcm0gPSAnaXNvbGF0ZWQnO1xuXG4gICAgICAgIGlmICgoaSA9PT0gMCB8fCBwcmV2Q2hhciA9PT0gJyAnKSAmJiBpIDwgbGVuIC0gMiAmJiBuZXh0Q2hhciAhPT0gJyAnKSB7XG4gICAgICAgICAgYXJhYmljRm9ybSA9ICd0ZXJtaW5hbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+IDAgJiYgcHJldkNoYXIgIT09ICcgJyAmJiBpIDwgbGVuIC0gMiAmJiBuZXh0Q2hhciAhPT0gJyAnKSB7XG4gICAgICAgICAgYXJhYmljRm9ybSA9ICdtZWRpYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPiAwICYmIHByZXZDaGFyICE9PSAnICcgJiYgKGkgPT09IGxlbiAtIDEgfHwgbmV4dENoYXIgPT09ICcgJykpIHtcbiAgICAgICAgICBhcmFiaWNGb3JtID0gJ2luaXRpYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmb250LmdseXBoc1tjaGFyXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBnbHlwaCA9IGZvbnQuZ2x5cGhzW2NoYXJdW2FyYWJpY0Zvcm1dO1xuXG4gICAgICAgICAgaWYgKCFnbHlwaCAmJiBmb250LmdseXBoc1tjaGFyXS50eXBlID09PSAnZ2x5cGgnKSB7XG4gICAgICAgICAgICBnbHlwaCA9IGZvbnQuZ2x5cGhzW2NoYXJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2x5cGggPSBmb250LmdseXBoc1tjaGFyXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnbHlwaCkge1xuICAgICAgICBnbHlwaCA9IGZvbnQubWlzc2luZ0dseXBoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGV4dEZyb21Ob2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRleHRGcm9tTm9kZShub2RlKSB7XG4gICAgICB2YXIgdGV4dE5vZGUgPSBub2RlIHx8IHRoaXMubm9kZTtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gQXJyYXkuZnJvbSh0ZXh0Tm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMpO1xuICAgICAgdmFyIGluZGV4ID0gY2hpbGROb2Rlcy5pbmRleE9mKHRleHROb2RlKTtcbiAgICAgIHZhciBsYXN0SW5kZXggPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgdGV4dCA9IGNvbXByZXNzU3BhY2VzKHRleHROb2RlLnZhbHVlIHx8IHRleHROb2RlLnRleHQgfHwgdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgJycpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgdGV4dCA9IHRyaW1MZWZ0KHRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICB0ZXh0ID0gdHJpbVJpZ2h0KHRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2hpbGRyZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyVEVsZW1lbnRDaGlsZHJlbihjdHgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvb3JkaW5hdGVzKGN0eCk7XG4gICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKF8sIGkpIHtcbiAgICAgICAgX3RoaXMzLnJlbmRlckNoaWxkKGN0eCwgX3RoaXMzLCBfdGhpczMsIGkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgbW91c2UgPSB0aGlzLmRvY3VtZW50LnNjcmVlbi5tb3VzZTsgLy8gRG8gbm90IGNhbGMgYm91bmRpbmcgYm94IGlmIG1vdXNlIGlzIG5vdCB3b3JraW5nLlxuXG4gICAgICBpZiAobW91c2UuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgbW91c2UuY2hlY2tCb3VuZGluZ0JveCh0aGlzLCB0aGlzLmdldEJvdW5kaW5nQm94KGN0eCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJURWxlbWVudENoaWxkcmVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRFbGVtZW50Q2hpbGRyZW4oY3R4KSB7XG4gICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgdmFyIHJlbmRlclRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgICAgIHZhciBjdXN0b21Gb250ID0gcGFyZW50LmdldFN0eWxlKCdmb250LWZhbWlseScpLmdldERlZmluaXRpb24oKTtcblxuICAgICAgaWYgKGN1c3RvbUZvbnQpIHtcbiAgICAgICAgdmFyIHVuaXRzUGVyRW0gPSBjdXN0b21Gb250LmZvbnRGYWNlLnVuaXRzUGVyRW07XG4gICAgICAgIHZhciBjdHhGb250ID0gRm9udC5wYXJzZShkb2N1bWVudC5jdHguZm9udCk7XG4gICAgICAgIHZhciBmb250U2l6ZSA9IHBhcmVudC5nZXRTdHlsZSgnZm9udC1zaXplJykuZ2V0TnVtYmVyKGN0eEZvbnQuZm9udFNpemUpO1xuICAgICAgICB2YXIgZm9udFN0eWxlID0gcGFyZW50LmdldFN0eWxlKCdmb250LXN0eWxlJykuZ2V0U3RyaW5nKGN0eEZvbnQuZm9udFN0eWxlKTtcbiAgICAgICAgdmFyIHNjYWxlID0gZm9udFNpemUgLyB1bml0c1BlckVtO1xuICAgICAgICB2YXIgdGV4dCA9IGN1c3RvbUZvbnQuaXNSVEwgPyByZW5kZXJUZXh0LnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJykgOiByZW5kZXJUZXh0O1xuICAgICAgICB2YXIgZHggPSB0b051bWJlcnMocGFyZW50LmdldEF0dHJpYnV0ZSgnZHgnKS5nZXRTdHJpbmcoKSk7XG4gICAgICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nZXRHbHlwaChjdXN0b21Gb250LCB0ZXh0LCBpKTtcbiAgICAgICAgICBjdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgICBjdHguc2NhbGUoc2NhbGUsIC1zY2FsZSk7XG4gICAgICAgICAgdmFyIGx3ID0gY3R4LmxpbmVXaWR0aDtcbiAgICAgICAgICBjdHgubGluZVdpZHRoID0gY3R4LmxpbmVXaWR0aCAqIHVuaXRzUGVyRW0gLyBmb250U2l6ZTtcblxuICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdpdGFsaWMnKSB7XG4gICAgICAgICAgICBjdHgudHJhbnNmb3JtKDEsIDAsIC40LCAxLCAwLCAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnbHlwaC5yZW5kZXIoY3R4KTtcblxuICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdpdGFsaWMnKSB7XG4gICAgICAgICAgICBjdHgudHJhbnNmb3JtKDEsIDAsIC0uNCwgMSwgMCwgMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGx3O1xuICAgICAgICAgIGN0eC5zY2FsZSgxIC8gc2NhbGUsIC0xIC8gc2NhbGUpO1xuICAgICAgICAgIGN0eC50cmFuc2xhdGUoLXRoaXMueCwgLXRoaXMueSk7XG4gICAgICAgICAgdGhpcy54ICs9IGZvbnRTaXplICogKGdseXBoLmhvcml6QWR2WCB8fCBjdXN0b21Gb250Lmhvcml6QWR2WCkgLyB1bml0c1BlckVtO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeFtpXSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzTmFOKGR4W2ldKSkge1xuICAgICAgICAgICAgdGhpcy54ICs9IGR4W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHggPSB0aGlzLngsXG4gICAgICAgICAgeSA9IHRoaXMueTtcblxuICAgICAgaWYgKGN0eC5wYWludE9yZGVyID09PSAnc3Ryb2tlJykge1xuICAgICAgICBpZiAoY3R4LnN0cm9rZVN0eWxlKSB7XG4gICAgICAgICAgY3R4LnN0cm9rZVRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3R4LmZpbGxTdHlsZSkge1xuICAgICAgICAgIGN0eC5maWxsVGV4dChyZW5kZXJUZXh0LCB4LCB5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN0eC5maWxsU3R5bGUpIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3R4LnN0cm9rZVN0eWxlKSB7XG4gICAgICAgICAgY3R4LnN0cm9rZVRleHQocmVuZGVyVGV4dCwgeCwgeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QW5jaG9yRGVsdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QW5jaG9yRGVsdGEoY3R4LCBwYXJlbnQsIHN0YXJ0SSkge1xuICAgICAgdmFyIHRleHRBbmNob3IgPSB0aGlzLmdldFN0eWxlKCd0ZXh0LWFuY2hvcicpLmdldFN0cmluZygnc3RhcnQnKTtcblxuICAgICAgaWYgKHRleHRBbmNob3IgIT09ICdzdGFydCcpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuO1xuICAgICAgICB2YXIgbGVuID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICB2YXIgY2hpbGQgPSBudWxsO1xuICAgICAgICB2YXIgd2lkdGggPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydEk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICAgICAgICBpZiAoaSA+IHN0YXJ0SSAmJiBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3gnKS5oYXNWYWx1ZSgpIHx8IGNoaWxkLmdldEF0dHJpYnV0ZSgndGV4dC1hbmNob3InKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICBicmVhazsgLy8gbmV3IGdyb3VwXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgd2lkdGggKz0gY2hpbGQubWVhc3VyZVRleHRSZWN1cnNpdmUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtMSAqICh0ZXh0QW5jaG9yID09PSAnZW5kJyA/IHdpZHRoIDogd2lkdGggLyAyLjApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRqdXN0Q2hpbGRDb29yZGluYXRlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGp1c3RDaGlsZENvb3JkaW5hdGVzKGN0eCwgdGV4dFBhcmVudCwgcGFyZW50LCBpKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5baV07XG5cbiAgICAgIGlmICh0eXBlb2YgY2hpbGQubWVhc3VyZVRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY2hpbGQuc2V0Q29udGV4dChjdHgsIHRydWUpO1xuICAgICAgdmFyIHhBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlKCd4Jyk7XG4gICAgICB2YXIgeUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3knKTtcbiAgICAgIHZhciBkeEF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ2R4Jyk7XG4gICAgICB2YXIgZHlBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlKCdkeScpO1xuICAgICAgdmFyIHRleHRBbmNob3IgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ3RleHQtYW5jaG9yJykuZ2V0U3RyaW5nKCdzdGFydCcpO1xuXG4gICAgICBpZiAoaSA9PT0gMCAmJiBjaGlsZC50eXBlICE9PSAndGV4dE5vZGUnKSB7XG4gICAgICAgIGlmICgheEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHhBdHRyLnNldFZhbHVlKHRleHRQYXJlbnQuZ2V0QXR0cmlidXRlKCd4JykuZ2V0VmFsdWUoJzAnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXlBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICB5QXR0ci5zZXRWYWx1ZSh0ZXh0UGFyZW50LmdldEF0dHJpYnV0ZSgneScpLmdldFZhbHVlKCcwJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkeEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIGR4QXR0ci5zZXRWYWx1ZSh0ZXh0UGFyZW50LmdldEF0dHJpYnV0ZSgnZHgnKS5nZXRWYWx1ZSgnMCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZHlBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBkeUF0dHIuc2V0VmFsdWUodGV4dFBhcmVudC5nZXRBdHRyaWJ1dGUoJ2R5JykuZ2V0VmFsdWUoJzAnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHhBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgY2hpbGQueCA9IHhBdHRyLmdldFBpeGVscygneCcpICsgdGV4dFBhcmVudC5nZXRBbmNob3JEZWx0YShjdHgsIHBhcmVudCwgaSk7XG5cbiAgICAgICAgaWYgKHRleHRBbmNob3IgIT09ICdzdGFydCcpIHtcbiAgICAgICAgICB2YXIgd2lkdGggPSBjaGlsZC5tZWFzdXJlVGV4dFJlY3Vyc2l2ZShjdHgpO1xuICAgICAgICAgIGNoaWxkLnggKz0gLTEgKiAodGV4dEFuY2hvciA9PT0gJ2VuZCcgPyB3aWR0aCA6IHdpZHRoIC8gMi4wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIGNoaWxkLnggKz0gZHhBdHRyLmdldFBpeGVscygneCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGV4dEFuY2hvciAhPT0gJ3N0YXJ0Jykge1xuICAgICAgICAgIHZhciBfd2lkdGggPSBjaGlsZC5tZWFzdXJlVGV4dFJlY3Vyc2l2ZShjdHgpO1xuXG4gICAgICAgICAgdGV4dFBhcmVudC54ICs9IC0xICogKHRleHRBbmNob3IgPT09ICdlbmQnID8gX3dpZHRoIDogX3dpZHRoIC8gMi4wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeEF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHRleHRQYXJlbnQueCArPSBkeEF0dHIuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZC54ID0gdGV4dFBhcmVudC54O1xuICAgICAgfVxuXG4gICAgICB0ZXh0UGFyZW50LnggPSBjaGlsZC54ICsgY2hpbGQubWVhc3VyZVRleHQoY3R4KTtcblxuICAgICAgaWYgKHlBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgY2hpbGQueSA9IHlBdHRyLmdldFBpeGVscygneScpO1xuXG4gICAgICAgIGlmIChkeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIGNoaWxkLnkgKz0gZHlBdHRyLmdldFBpeGVscygneScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZHlBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICB0ZXh0UGFyZW50LnkgKz0gZHlBdHRyLmdldFBpeGVscygneScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQueSA9IHRleHRQYXJlbnQueTtcbiAgICAgIH1cblxuICAgICAgdGV4dFBhcmVudC55ID0gY2hpbGQueTtcbiAgICAgIGNoaWxkLmNsZWFyQ29udGV4dChjdHgpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2hpbGRCb3VuZGluZ0JveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGlsZEJvdW5kaW5nQm94KGN0eCwgdGV4dFBhcmVudCwgcGFyZW50LCBpKSB7XG4gICAgICB2YXIgY2hpbGQgPSB0aGlzLmFkanVzdENoaWxkQ29vcmRpbmF0ZXMoY3R4LCB0ZXh0UGFyZW50LCBwYXJlbnQsIGkpO1xuICAgICAgdmFyIGJvdW5kaW5nQm94ID0gY2hpbGQuZ2V0Qm91bmRpbmdCb3goY3R4KTtcblxuICAgICAgaWYgKCFib3VuZGluZ0JveCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoXywgaSkge1xuICAgICAgICB2YXIgY2hpbGRCb3VuZGluZ0JveCA9IHRleHRQYXJlbnQuZ2V0Q2hpbGRCb3VuZGluZ0JveChjdHgsIHRleHRQYXJlbnQsIGNoaWxkLCBpKTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkQm91bmRpbmdCb3goY2hpbGRCb3VuZGluZ0JveCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBib3VuZGluZ0JveDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2hpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2hpbGQoY3R4LCB0ZXh0UGFyZW50LCBwYXJlbnQsIGkpIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuYWRqdXN0Q2hpbGRDb29yZGluYXRlcyhjdHgsIHRleHRQYXJlbnQsIHBhcmVudCwgaSk7XG4gICAgICBjaGlsZC5yZW5kZXIoY3R4KTtcbiAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKF8sIGkpIHtcbiAgICAgICAgdGV4dFBhcmVudC5yZW5kZXJDaGlsZChjdHgsIHRleHRQYXJlbnQsIGNoaWxkLCBpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtZWFzdXJlVGV4dFJlY3Vyc2l2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtZWFzdXJlVGV4dFJlY3Vyc2l2ZShjdHgpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uICh3aWR0aCwgY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHdpZHRoICsgY2hpbGQubWVhc3VyZVRleHRSZWN1cnNpdmUoY3R4KTtcbiAgICAgIH0sIHRoaXMubWVhc3VyZVRleHQoY3R4KSk7XG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1lYXN1cmVUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1lYXN1cmVUZXh0KGN0eCkge1xuICAgICAgdmFyIG1lYXN1cmVDYWNoZSA9IHRoaXMubWVhc3VyZUNhY2hlO1xuXG4gICAgICBpZiAofm1lYXN1cmVDYWNoZSkge1xuICAgICAgICByZXR1cm4gbWVhc3VyZUNhY2hlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVuZGVyVGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgICAgdmFyIG1lYXN1cmUgPSB0aGlzLm1lYXN1cmVUYXJnZXRUZXh0KGN0eCwgcmVuZGVyVGV4dCk7XG4gICAgICB0aGlzLm1lYXN1cmVDYWNoZSA9IG1lYXN1cmU7XG4gICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWVhc3VyZVRhcmdldFRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWVhc3VyZVRhcmdldFRleHQoY3R4LCB0YXJnZXRUZXh0KSB7XG4gICAgICBpZiAoIXRhcmdldFRleHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICB2YXIgY3VzdG9tRm9udCA9IHBhcmVudC5nZXRTdHlsZSgnZm9udC1mYW1pbHknKS5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgIGlmIChjdXN0b21Gb250KSB7XG4gICAgICAgIHZhciBmb250U2l6ZSA9IHRoaXMuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgdmFyIHRleHQgPSBjdXN0b21Gb250LmlzUlRMID8gdGFyZ2V0VGV4dC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogdGFyZ2V0VGV4dDtcbiAgICAgICAgdmFyIGR4ID0gdG9OdW1iZXJzKHBhcmVudC5nZXRBdHRyaWJ1dGUoJ2R4JykuZ2V0U3RyaW5nKCkpO1xuICAgICAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHZhciBfbWVhc3VyZSA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2V0R2x5cGgoY3VzdG9tRm9udCwgdGV4dCwgaSk7XG4gICAgICAgICAgX21lYXN1cmUgKz0gKGdseXBoLmhvcml6QWR2WCB8fCBjdXN0b21Gb250Lmhvcml6QWR2WCkgKiBmb250U2l6ZSAvIGN1c3RvbUZvbnQuZm9udEZhY2UudW5pdHNQZXJFbTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZHhbaV0gIT09ICd1bmRlZmluZWQnICYmICFpc05hTihkeFtpXSkpIHtcbiAgICAgICAgICAgIF9tZWFzdXJlICs9IGR4W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbWVhc3VyZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjdHgubWVhc3VyZVRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFRleHQubGVuZ3RoICogMTA7XG4gICAgICB9XG5cbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICB0aGlzLnNldENvbnRleHQoY3R4LCB0cnVlKTtcblxuICAgICAgdmFyIF9jdHgkbWVhc3VyZVRleHQgPSBjdHgubWVhc3VyZVRleHQodGFyZ2V0VGV4dCksXG4gICAgICAgICAgbWVhc3VyZSA9IF9jdHgkbWVhc3VyZVRleHQud2lkdGg7XG5cbiAgICAgIHRoaXMuY2xlYXJDb250ZXh0KGN0eCk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgcmV0dXJuIG1lYXN1cmU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHRFbGVtZW50O1xufShSZW5kZXJlZEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkNihEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQ2KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDYoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFRTcGFuRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RleHRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhUU3BhbkVsZW1lbnQsIF9UZXh0RWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQ2KFRTcGFuRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gVFNwYW5FbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRTcGFuRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCAodGhpcyBpbnN0YW5jZW9mIFRTcGFuRWxlbWVudCA/IHRoaXMuY29uc3RydWN0b3IgOiB2b2lkIDApID09PSBUU3BhbkVsZW1lbnQgPyB0cnVlIDogY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgX3RoaXMudHlwZSA9ICd0c3Bhbic7IC8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIHRoZW4gdGhleSBvd24gdGhlIHRleHRcblxuICAgIF90aGlzLnRleHQgPSBfdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwID8gJycgOiBfdGhpcy5nZXRUZXh0RnJvbU5vZGUoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVFNwYW5FbGVtZW50LCBbe1xuICAgIGtleTogXCJnZXRUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRleHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUU3BhbkVsZW1lbnQ7XG59KFRleHRFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDcoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkNygpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQ3KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBUZXh0Tm9kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RTcGFuRWxlbWVudCkge1xuICBfaW5oZXJpdHMoVGV4dE5vZGUsIF9UU3BhbkVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkNyhUZXh0Tm9kZSk7XG5cbiAgZnVuY3Rpb24gVGV4dE5vZGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHROb2RlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICd0ZXh0Tm9kZSc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFRleHROb2RlO1xufShUU3BhbkVsZW1lbnQpO1xuXG5mdW5jdGlvbiBwcmVwYXJlUGF0aChwYXRoKSB7XG4gIHZhciBkID0gcGF0aC5yZXBsYWNlKC8sL2dtLCAnICcpIC8vIGdldCByaWQgb2YgYWxsIGNvbW1hc1xuICAvLyBBcyB0aGUgZW5kIG9mIGEgbWF0Y2ggY2FuIGFsc28gYmUgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG1hdGNoLCB3ZSBuZWVkIHRvIHJ1biB0aGlzIHJlcGxhY2UgdHdpY2UuXG4gIC5yZXBsYWNlKC8oW01tWnpMbEhoVnZDY1NzUXFUdEFhXSkoW15cXHNdKS9nbSwgJyQxICQyJykgLy8gc3VmZml4IGNvbW1hbmRzIHdpdGggc3BhY2VzXG4gIC5yZXBsYWNlKC8oW01tWnpMbEhoVnZDY1NzUXFUdEFhXSkoW15cXHNdKS9nbSwgJyQxICQyJykgLy8gc3VmZml4IGNvbW1hbmRzIHdpdGggc3BhY2VzXG4gIC5yZXBsYWNlKC8oW15cXHNdKShbTW1aekxsSGhWdkNjU3NRcVR0QWFdKS9nbSwgJyQxICQyJykgLy8gcHJlZml4IGNvbW1hbmRzIHdpdGggc3BhY2VzXG4gIC5yZXBsYWNlKC8oWzAtOV0pKFsrXFwtXSkvZ20sICckMSAkMicpIC8vIHNlcGFyYXRlIGRpZ2l0cyBvbiArLSBzaWduc1xuICAvLyBBZ2Fpbiwgd2UgbmVlZCB0byBydW4gdGhpcyB0d2ljZSB0byBmaW5kIGFsbCBvY2N1cmFuY2VzXG4gIC5yZXBsYWNlKC8oXFwuWzAtOV0qKShcXC4pL2dtLCAnJDEgJDInKSAvLyBzZXBhcmF0ZSBkaWdpdHMgd2hlbiB0aGV5IHN0YXJ0IHdpdGggYSBjb21tYVxuICAucmVwbGFjZSgvKFxcLlswLTldKikoXFwuKS9nbSwgJyQxICQyJykgLy8gc2VwYXJhdGUgZGlnaXRzIHdoZW4gdGhleSBzdGFydCB3aXRoIGEgY29tbWFcbiAgLnJlcGxhY2UoLyhbQWFdKD86XFxzKyg/OlswLTldKlxcLik/WzAtOV0rKXszfSlcXHMrKFswMV0pXFxzKihbMDFdKS9nbSwgJyQxICQyICQzICcpOyAvLyBzaG9ydGhhbmQgZWxsaXB0aWNhbCBhcmMgcGF0aCBzeW50YXhcblxuICByZXR1cm4gY29tcHJlc3NTcGFjZXMoZCkudHJpbSgpO1xufVxuXG52YXIgUGF0aFBhcnNlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBhdGhQYXJzZXIocGF0aCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXRoUGFyc2VyKTtcblxuICAgIHRoaXMuY29udHJvbCA9IG51bGw7XG4gICAgdGhpcy5zdGFydCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmNvbW1hbmQgPSAnJztcbiAgICB0aGlzLnRva2VucyA9IFtdO1xuICAgIHRoaXMuaSA9IC0xO1xuICAgIHRoaXMucHJldmlvdXNDb21tYW5kID0gJyc7XG4gICAgdGhpcy5wb2ludHMgPSBbXTtcbiAgICB0aGlzLmFuZ2xlcyA9IFtdO1xuICAgIHRoaXMudG9rZW5zID0gcHJlcGFyZVBhdGgocGF0aCkuc3BsaXQoJyAnKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXRoUGFyc2VyLCBbe1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuaSA9IC0xO1xuICAgICAgdGhpcy5jb21tYW5kID0gJyc7XG4gICAgICB0aGlzLnByZXZpb3VzQ29tbWFuZCA9ICcnO1xuICAgICAgdGhpcy5zdGFydCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHRoaXMuY29udHJvbCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHRoaXMucG9pbnRzID0gW107XG4gICAgICB0aGlzLmFuZ2xlcyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0VuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VuZCgpIHtcbiAgICAgIHZhciBpID0gdGhpcy5pLFxuICAgICAgICAgIHRva2VucyA9IHRoaXMudG9rZW5zO1xuICAgICAgcmV0dXJuIGkgPj0gdG9rZW5zLmxlbmd0aCAtIDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzQ29tbWFuZE9yRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzQ29tbWFuZE9yRW5kKCkge1xuICAgICAgaWYgKHRoaXMuaXNFbmQoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSB0aGlzLmksXG4gICAgICAgICAgdG9rZW5zID0gdGhpcy50b2tlbnM7XG4gICAgICByZXR1cm4gL15bQS1aYS16XSQvLnRlc3QodG9rZW5zW2kgKyAxXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzUmVsYXRpdmVDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUmVsYXRpdmVDb21tYW5kKCkge1xuICAgICAgc3dpdGNoICh0aGlzLmNvbW1hbmQpIHtcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgY2FzZSAndic6XG4gICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgY2FzZSAncSc6XG4gICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgY2FzZSAneic6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRva2VuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRva2VuKCkge1xuICAgICAgdGhpcy5pKys7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5pXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2NhbGFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNjYWxhcigpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuZ2V0VG9rZW4oKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHRDb21tYW5kKCkge1xuICAgICAgdGhpcy5wcmV2aW91c0NvbW1hbmQgPSB0aGlzLmNvbW1hbmQ7XG4gICAgICB0aGlzLmNvbW1hbmQgPSB0aGlzLmdldFRva2VuKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHRoaXMuZ2V0U2NhbGFyKCksIHRoaXMuZ2V0U2NhbGFyKCkpO1xuICAgICAgcmV0dXJuIHRoaXMubWFrZUFic29sdXRlKHBvaW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXNDb250cm9sUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QXNDb250cm9sUG9pbnQoKSB7XG4gICAgICB2YXIgcG9pbnQgPSB0aGlzLmdldFBvaW50KCk7XG4gICAgICB0aGlzLmNvbnRyb2wgPSBwb2ludDtcbiAgICAgIHJldHVybiBwb2ludDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXNDdXJyZW50UG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QXNDdXJyZW50UG9pbnQoKSB7XG4gICAgICB2YXIgcG9pbnQgPSB0aGlzLmdldFBvaW50KCk7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBwb2ludDtcbiAgICAgIHJldHVybiBwb2ludDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVmbGVjdGVkQ29udHJvbFBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlZmxlY3RlZENvbnRyb2xQb2ludCgpIHtcbiAgICAgIHZhciBwcmV2aW91c0NvbW1hbmQgPSB0aGlzLnByZXZpb3VzQ29tbWFuZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAocHJldmlvdXNDb21tYW5kICE9PSAnYycgJiYgcHJldmlvdXNDb21tYW5kICE9PSAncycgJiYgcHJldmlvdXNDb21tYW5kICE9PSAncScgJiYgcHJldmlvdXNDb21tYW5kICE9PSAndCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgICAgIH0gLy8gcmVmbGVjdCBwb2ludFxuXG5cbiAgICAgIHZhciBfdGhpcyRjdXJyZW50ID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgIGN4ID0gX3RoaXMkY3VycmVudC54LFxuICAgICAgICAgIGN5ID0gX3RoaXMkY3VycmVudC55LFxuICAgICAgICAgIF90aGlzJGNvbnRyb2wgPSB0aGlzLmNvbnRyb2wsXG4gICAgICAgICAgb3ggPSBfdGhpcyRjb250cm9sLngsXG4gICAgICAgICAgb3kgPSBfdGhpcyRjb250cm9sLnk7XG4gICAgICB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoMiAqIGN4IC0gb3gsIDIgKiBjeSAtIG95KTtcbiAgICAgIHJldHVybiBwb2ludDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFrZUFic29sdXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VBYnNvbHV0ZShwb2ludCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWxhdGl2ZUNvbW1hbmQoKSkge1xuICAgICAgICB2YXIgX3RoaXMkY3VycmVudDIgPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICB4ID0gX3RoaXMkY3VycmVudDIueCxcbiAgICAgICAgICAgIHkgPSBfdGhpcyRjdXJyZW50Mi55O1xuICAgICAgICBwb2ludC54ICs9IHg7XG4gICAgICAgIHBvaW50LnkgKz0geTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBvaW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRNYXJrZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTWFya2VyKHBvaW50LCBmcm9tLCBwcmlvclRvKSB7XG4gICAgICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHMsXG4gICAgICAgICAgYW5nbGVzID0gdGhpcy5hbmdsZXM7IC8vIGlmIHRoZSBsYXN0IGFuZ2xlIGlzbid0IGZpbGxlZCBpbiBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIHRoaXMgcG9pbnQgeWV0IC4uLlxuXG4gICAgICBpZiAocHJpb3JUbyAmJiBhbmdsZXMubGVuZ3RoID4gMCAmJiAhYW5nbGVzW2FuZ2xlcy5sZW5ndGggLSAxXSkge1xuICAgICAgICBhbmdsZXNbYW5nbGVzLmxlbmd0aCAtIDFdID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXS5hbmdsZVRvKHByaW9yVG8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZE1hcmtlckFuZ2xlKHBvaW50LCBmcm9tID8gZnJvbS5hbmdsZVRvKHBvaW50KSA6IG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRNYXJrZXJBbmdsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNYXJrZXJBbmdsZShwb2ludCwgYW5nbGUpIHtcbiAgICAgIHRoaXMucG9pbnRzLnB1c2gocG9pbnQpO1xuICAgICAgdGhpcy5hbmdsZXMucHVzaChhbmdsZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcmtlclBvaW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrZXJQb2ludHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2ludHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcmtlckFuZ2xlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrZXJBbmdsZXMoKSB7XG4gICAgICB2YXIgYW5nbGVzID0gdGhpcy5hbmdsZXM7XG4gICAgICB2YXIgbGVuID0gYW5nbGVzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoIWFuZ2xlc1tpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYW5nbGVzW2pdKSB7XG4gICAgICAgICAgICAgIGFuZ2xlc1tpXSA9IGFuZ2xlc1tqXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbmdsZXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhdGhQYXJzZXI7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQ4KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDgoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkOCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUGF0aEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJlZEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFBhdGhFbGVtZW50LCBfUmVuZGVyZWRFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJDgoUGF0aEVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhdGhFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhdGhFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAncGF0aCc7XG4gICAgX3RoaXMucGF0aFBhcnNlciA9IG51bGw7XG4gICAgX3RoaXMucGF0aFBhcnNlciA9IG5ldyBQYXRoUGFyc2VyKF90aGlzLmdldEF0dHJpYnV0ZSgnZCcpLmdldFN0cmluZygpKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGF0aEVsZW1lbnQsIFt7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aChjdHgpIHtcbiAgICAgIHZhciBwYXRoUGFyc2VyID0gdGhpcy5wYXRoUGFyc2VyO1xuICAgICAgdmFyIGJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICBwYXRoUGFyc2VyLnJlc2V0KCk7XG5cbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNFbmQoKSkge1xuICAgICAgICBwYXRoUGFyc2VyLm5leHRDb21tYW5kKCk7XG5cbiAgICAgICAgc3dpdGNoIChwYXRoUGFyc2VyLmNvbW1hbmQpIHtcbiAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHRoaXMucGF0aE0oY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgdGhpcy5wYXRoTChjdHgsIGJvdW5kaW5nQm94KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICB0aGlzLnBhdGhIKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgIHRoaXMucGF0aFYoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgdGhpcy5wYXRoQyhjdHgsIGJvdW5kaW5nQm94KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICB0aGlzLnBhdGhTKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICBjYXNlICdxJzpcbiAgICAgICAgICAgIHRoaXMucGF0aFEoY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgdGhpcy5wYXRoVChjdHgsIGJvdW5kaW5nQm94KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICB0aGlzLnBhdGhBKGN0eCwgYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICBjYXNlICd6JzpcbiAgICAgICAgICAgIHRoaXMucGF0aFooY3R4LCBib3VuZGluZ0JveCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYm91bmRpbmdCb3g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kaW5nQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94KF8pIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGgoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TWFya2Vyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrZXJzKCkge1xuICAgICAgdmFyIHBhdGhQYXJzZXIgPSB0aGlzLnBhdGhQYXJzZXI7XG4gICAgICB2YXIgcG9pbnRzID0gcGF0aFBhcnNlci5nZXRNYXJrZXJQb2ludHMoKTtcbiAgICAgIHZhciBhbmdsZXMgPSBwYXRoUGFyc2VyLmdldE1hcmtlckFuZ2xlcygpO1xuICAgICAgdmFyIG1hcmtlcnMgPSBwb2ludHMubWFwKGZ1bmN0aW9uIChwb2ludCwgaSkge1xuICAgICAgICByZXR1cm4gW3BvaW50LCBhbmdsZXNbaV1dO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWFya2VycztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2hpbGRyZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgICB0aGlzLnBhdGgoY3R4KTtcbiAgICAgIHRoaXMuZG9jdW1lbnQuc2NyZWVuLm1vdXNlLmNoZWNrUGF0aCh0aGlzLCBjdHgpO1xuICAgICAgdmFyIGZpbGxSdWxlU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnZmlsbC1ydWxlJyk7XG5cbiAgICAgIGlmIChjdHguZmlsbFN0eWxlICE9PSAnJykge1xuICAgICAgICBpZiAoZmlsbFJ1bGVTdHlsZVByb3AuZ2V0U3RyaW5nKCdpbmhlcml0JykgIT09ICdpbmhlcml0Jykge1xuICAgICAgICAgIGN0eC5maWxsKGZpbGxSdWxlU3R5bGVQcm9wLmdldFN0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdHguc3Ryb2tlU3R5bGUgIT09ICcnKSB7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hcmtlcnMgPSB0aGlzLmdldE1hcmtlcnMoKTtcblxuICAgICAgaWYgKG1hcmtlcnMpIHtcbiAgICAgICAgdmFyIG1hcmtlcnNMYXN0SW5kZXggPSBtYXJrZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBtYXJrZXJTdGFydFN0eWxlUHJvcCA9IHRoaXMuZ2V0U3R5bGUoJ21hcmtlci1zdGFydCcpO1xuICAgICAgICB2YXIgbWFya2VyTWlkU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnbWFya2VyLW1pZCcpO1xuICAgICAgICB2YXIgbWFya2VyRW5kU3R5bGVQcm9wID0gdGhpcy5nZXRTdHlsZSgnbWFya2VyLWVuZCcpO1xuXG4gICAgICAgIGlmIChtYXJrZXJTdGFydFN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJTdGFydFN0eWxlUHJvcC5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgICAgICB2YXIgX21hcmtlcnMkID0gX3NsaWNlZFRvQXJyYXkobWFya2Vyc1swXSwgMiksXG4gICAgICAgICAgICAgIHBvaW50ID0gX21hcmtlcnMkWzBdLFxuICAgICAgICAgICAgICBhbmdsZSA9IF9tYXJrZXJzJFsxXTtcblxuICAgICAgICAgIG1hcmtlci5yZW5kZXIoY3R4LCBwb2ludCwgYW5nbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtlck1pZFN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICAgIHZhciBfbWFya2VyID0gbWFya2VyTWlkU3R5bGVQcm9wLmdldERlZmluaXRpb24oKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWFya2Vyc0xhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgX21hcmtlcnMkaSA9IF9zbGljZWRUb0FycmF5KG1hcmtlcnNbaV0sIDIpLFxuICAgICAgICAgICAgICAgIF9wb2ludCA9IF9tYXJrZXJzJGlbMF0sXG4gICAgICAgICAgICAgICAgX2FuZ2xlID0gX21hcmtlcnMkaVsxXTtcblxuICAgICAgICAgICAgX21hcmtlci5yZW5kZXIoY3R4LCBfcG9pbnQsIF9hbmdsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtlckVuZFN0eWxlUHJvcC5pc1VybERlZmluaXRpb24oKSkge1xuICAgICAgICAgIHZhciBfbWFya2VyMiA9IG1hcmtlckVuZFN0eWxlUHJvcC5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgICAgICB2YXIgX21hcmtlcnMkbWFya2Vyc0xhc3RJID0gX3NsaWNlZFRvQXJyYXkobWFya2Vyc1ttYXJrZXJzTGFzdEluZGV4XSwgMiksXG4gICAgICAgICAgICAgIF9wb2ludDIgPSBfbWFya2VycyRtYXJrZXJzTGFzdElbMF0sXG4gICAgICAgICAgICAgIF9hbmdsZTIgPSBfbWFya2VycyRtYXJrZXJzTGFzdElbMV07XG5cbiAgICAgICAgICBfbWFya2VyMi5yZW5kZXIoY3R4LCBfcG9pbnQyLCBfYW5nbGUyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoTShjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHRoaXMucGF0aFBhcnNlcjtcbiAgICAgIHZhciBwb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTtcbiAgICAgIHZhciB4ID0gcG9pbnQueCxcbiAgICAgICAgICB5ID0gcG9pbnQueTtcbiAgICAgIHBhdGhQYXJzZXIuYWRkTWFya2VyKHBvaW50KTtcbiAgICAgIGJvdW5kaW5nQm94LmFkZFBvaW50KHgsIHkpO1xuXG4gICAgICBpZiAoY3R4KSB7XG4gICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICB9XG5cbiAgICAgIHBhdGhQYXJzZXIuc3RhcnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7XG5cbiAgICAgIHdoaWxlICghcGF0aFBhcnNlci5pc0NvbW1hbmRPckVuZCgpKSB7XG4gICAgICAgIHZhciBfcG9pbnQzID0gcGF0aFBhcnNlci5nZXRBc0N1cnJlbnRQb2ludCgpO1xuXG4gICAgICAgIHZhciBfeCA9IF9wb2ludDMueCxcbiAgICAgICAgICAgIF95ID0gX3BvaW50My55O1xuICAgICAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihfcG9pbnQzLCBwYXRoUGFyc2VyLnN0YXJ0KTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkUG9pbnQoX3gsIF95KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmxpbmVUbyhfeCwgX3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhMXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhMKGN0eCwgYm91bmRpbmdCb3gpIHtcbiAgICAgIHZhciBwYXRoUGFyc2VyID0gdGhpcy5wYXRoUGFyc2VyO1xuXG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICAgICAgdmFyIHBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0N1cnJlbnRQb2ludCgpO1xuICAgICAgICB2YXIgeCA9IHBvaW50LngsXG4gICAgICAgICAgICB5ID0gcG9pbnQueTtcbiAgICAgICAgcGF0aFBhcnNlci5hZGRNYXJrZXIocG9pbnQsIGN1cnJlbnQpO1xuICAgICAgICBib3VuZGluZ0JveC5hZGRQb2ludCh4LCB5KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoSFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoSChjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHRoaXMucGF0aFBhcnNlcjtcblxuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7XG4gICAgICAgIHZhciBwb2ludCA9IG5ldyBQb2ludCgocGF0aFBhcnNlci5pc1JlbGF0aXZlQ29tbWFuZCgpID8gY3VycmVudC54IDogMCkgKyBwYXRoUGFyc2VyLmdldFNjYWxhcigpLCBjdXJyZW50LnkpO1xuICAgICAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCwgY3VycmVudCk7XG4gICAgICAgIHBhdGhQYXJzZXIuY3VycmVudCA9IHBvaW50O1xuICAgICAgICBib3VuZGluZ0JveC5hZGRQb2ludChwb2ludC54LCBwb2ludC55KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoVlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoVihjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHRoaXMucGF0aFBhcnNlcjtcblxuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7XG4gICAgICAgIHZhciBwb2ludCA9IG5ldyBQb2ludChjdXJyZW50LngsIChwYXRoUGFyc2VyLmlzUmVsYXRpdmVDb21tYW5kKCkgPyBjdXJyZW50LnkgOiAwKSArIHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCkpO1xuICAgICAgICBwYXRoUGFyc2VyLmFkZE1hcmtlcihwb2ludCwgY3VycmVudCk7XG4gICAgICAgIHBhdGhQYXJzZXIuY3VycmVudCA9IHBvaW50O1xuICAgICAgICBib3VuZGluZ0JveC5hZGRQb2ludChwb2ludC54LCBwb2ludC55KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoQ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoQyhjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHRoaXMucGF0aFBhcnNlcjtcblxuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7XG4gICAgICAgIHZhciBwb2ludCA9IHBhdGhQYXJzZXIuZ2V0UG9pbnQoKTtcbiAgICAgICAgdmFyIGNvbnRyb2xQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDb250cm9sUG9pbnQoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTtcbiAgICAgICAgcGF0aFBhcnNlci5hZGRNYXJrZXIoY3VycmVudFBvaW50LCBjb250cm9sUG9pbnQsIHBvaW50KTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkQmV6aWVyQ3VydmUoY3VycmVudC54LCBjdXJyZW50LnksIHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8ocG9pbnQueCwgcG9pbnQueSwgY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBjdXJyZW50UG9pbnQueCwgY3VycmVudFBvaW50LnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhTXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhTKGN0eCwgYm91bmRpbmdCb3gpIHtcbiAgICAgIHZhciBwYXRoUGFyc2VyID0gdGhpcy5wYXRoUGFyc2VyO1xuXG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICAgICAgdmFyIHBvaW50ID0gcGF0aFBhcnNlci5nZXRSZWZsZWN0ZWRDb250cm9sUG9pbnQoKTtcbiAgICAgICAgdmFyIGNvbnRyb2xQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDb250cm9sUG9pbnQoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTtcbiAgICAgICAgcGF0aFBhcnNlci5hZGRNYXJrZXIoY3VycmVudFBvaW50LCBjb250cm9sUG9pbnQsIHBvaW50KTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkQmV6aWVyQ3VydmUoY3VycmVudC54LCBjdXJyZW50LnksIHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcblxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8ocG9pbnQueCwgcG9pbnQueSwgY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBjdXJyZW50UG9pbnQueCwgY3VycmVudFBvaW50LnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhRXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhRKGN0eCwgYm91bmRpbmdCb3gpIHtcbiAgICAgIHZhciBwYXRoUGFyc2VyID0gdGhpcy5wYXRoUGFyc2VyO1xuXG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICAgICAgdmFyIGNvbnRyb2xQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDb250cm9sUG9pbnQoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTtcbiAgICAgICAgcGF0aFBhcnNlci5hZGRNYXJrZXIoY3VycmVudFBvaW50LCBjb250cm9sUG9pbnQsIGNvbnRyb2xQb2ludCk7XG4gICAgICAgIGJvdW5kaW5nQm94LmFkZFF1YWRyYXRpY0N1cnZlKGN1cnJlbnQueCwgY3VycmVudC55LCBjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG5cbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoVFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoVChjdHgsIGJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHRoaXMucGF0aFBhcnNlcjtcblxuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7XG4gICAgICAgIHZhciBjb250cm9sUG9pbnQgPSBwYXRoUGFyc2VyLmdldFJlZmxlY3RlZENvbnRyb2xQb2ludCgpO1xuICAgICAgICBwYXRoUGFyc2VyLmNvbnRyb2wgPSBjb250cm9sUG9pbnQ7XG4gICAgICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgICAgIHBhdGhQYXJzZXIuYWRkTWFya2VyKGN1cnJlbnRQb2ludCwgY29udHJvbFBvaW50LCBjb250cm9sUG9pbnQpO1xuICAgICAgICBib3VuZGluZ0JveC5hZGRRdWFkcmF0aWNDdXJ2ZShjdXJyZW50LngsIGN1cnJlbnQueSwgY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBjdXJyZW50UG9pbnQueCwgY3VycmVudFBvaW50LnkpO1xuXG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyhjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aEFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aEEoY3R4LCBib3VuZGluZ0JveCkge1xuICAgICAgdmFyIHBhdGhQYXJzZXIgPSB0aGlzLnBhdGhQYXJzZXI7XG5cbiAgICAgIHdoaWxlICghcGF0aFBhcnNlci5pc0NvbW1hbmRPckVuZCgpKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gcGF0aFBhcnNlci5jdXJyZW50O1xuICAgICAgICB2YXIgcnggPSBwYXRoUGFyc2VyLmdldFNjYWxhcigpO1xuICAgICAgICB2YXIgcnkgPSBwYXRoUGFyc2VyLmdldFNjYWxhcigpO1xuICAgICAgICB2YXIgeEF4aXNSb3RhdGlvbiA9IHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCkgKiAoTWF0aC5QSSAvIDE4MC4wKTtcbiAgICAgICAgdmFyIGxhcmdlQXJjRmxhZyA9IHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCk7XG4gICAgICAgIHZhciBzd2VlcEZsYWcgPSBwYXRoUGFyc2VyLmdldFNjYWxhcigpO1xuICAgICAgICB2YXIgY3VycmVudFBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0N1cnJlbnRQb2ludCgpOyAvLyBDb252ZXJzaW9uIGZyb20gZW5kcG9pbnQgdG8gY2VudGVyIHBhcmFtZXRlcml6YXRpb25cbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvaW1wbG5vdGUuaHRtbCNBcmNJbXBsZW1lbnRhdGlvbk5vdGVzXG4gICAgICAgIC8vIHgxJywgeTEnXG5cbiAgICAgICAgdmFyIGN1cnJwID0gbmV3IFBvaW50KE1hdGguY29zKHhBeGlzUm90YXRpb24pICogKGN1cnJlbnQueCAtIGN1cnJlbnRQb2ludC54KSAvIDIuMCArIE1hdGguc2luKHhBeGlzUm90YXRpb24pICogKGN1cnJlbnQueSAtIGN1cnJlbnRQb2ludC55KSAvIDIuMCwgLU1hdGguc2luKHhBeGlzUm90YXRpb24pICogKGN1cnJlbnQueCAtIGN1cnJlbnRQb2ludC54KSAvIDIuMCArIE1hdGguY29zKHhBeGlzUm90YXRpb24pICogKGN1cnJlbnQueSAtIGN1cnJlbnRQb2ludC55KSAvIDIuMCk7IC8vIGFkanVzdCByYWRpaVxuXG4gICAgICAgIHZhciBsID0gTWF0aC5wb3coY3VycnAueCwgMikgLyBNYXRoLnBvdyhyeCwgMikgKyBNYXRoLnBvdyhjdXJycC55LCAyKSAvIE1hdGgucG93KHJ5LCAyKTtcblxuICAgICAgICBpZiAobCA+IDEpIHtcbiAgICAgICAgICByeCAqPSBNYXRoLnNxcnQobCk7XG4gICAgICAgICAgcnkgKj0gTWF0aC5zcXJ0KGwpO1xuICAgICAgICB9IC8vIGN4JywgY3knXG5cblxuICAgICAgICB2YXIgcyA9IChsYXJnZUFyY0ZsYWcgPT09IHN3ZWVwRmxhZyA/IC0xIDogMSkgKiBNYXRoLnNxcnQoKE1hdGgucG93KHJ4LCAyKSAqIE1hdGgucG93KHJ5LCAyKSAtIE1hdGgucG93KHJ4LCAyKSAqIE1hdGgucG93KGN1cnJwLnksIDIpIC0gTWF0aC5wb3cocnksIDIpICogTWF0aC5wb3coY3VycnAueCwgMikpIC8gKE1hdGgucG93KHJ4LCAyKSAqIE1hdGgucG93KGN1cnJwLnksIDIpICsgTWF0aC5wb3cocnksIDIpICogTWF0aC5wb3coY3VycnAueCwgMikpKTtcblxuICAgICAgICBpZiAoaXNOYU4ocykpIHtcbiAgICAgICAgICBzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjcHAgPSBuZXcgUG9pbnQocyAqIHJ4ICogY3VycnAueSAvIHJ5LCBzICogLXJ5ICogY3VycnAueCAvIHJ4KTsgLy8gY3gsIGN5XG5cbiAgICAgICAgdmFyIGNlbnRwID0gbmV3IFBvaW50KChjdXJyZW50LnggKyBjdXJyZW50UG9pbnQueCkgLyAyLjAgKyBNYXRoLmNvcyh4QXhpc1JvdGF0aW9uKSAqIGNwcC54IC0gTWF0aC5zaW4oeEF4aXNSb3RhdGlvbikgKiBjcHAueSwgKGN1cnJlbnQueSArIGN1cnJlbnRQb2ludC55KSAvIDIuMCArIE1hdGguc2luKHhBeGlzUm90YXRpb24pICogY3BwLnggKyBNYXRoLmNvcyh4QXhpc1JvdGF0aW9uKSAqIGNwcC55KTsgLy8gaW5pdGlhbCBhbmdsZVxuXG4gICAgICAgIHZhciBhMSA9IHZlY3RvcnNBbmdsZShbMSwgMF0sIFsoY3VycnAueCAtIGNwcC54KSAvIHJ4LCAoY3VycnAueSAtIGNwcC55KSAvIHJ5XSk7IC8vIGFuZ2xlIGRlbHRhXG5cbiAgICAgICAgdmFyIHUgPSBbKGN1cnJwLnggLSBjcHAueCkgLyByeCwgKGN1cnJwLnkgLSBjcHAueSkgLyByeV07XG4gICAgICAgIHZhciB2ID0gWygtY3VycnAueCAtIGNwcC54KSAvIHJ4LCAoLWN1cnJwLnkgLSBjcHAueSkgLyByeV07XG4gICAgICAgIHZhciBhZCA9IHZlY3RvcnNBbmdsZSh1LCB2KTtcblxuICAgICAgICBpZiAodmVjdG9yc1JhdGlvKHUsIHYpIDw9IC0xKSB7XG4gICAgICAgICAgYWQgPSBNYXRoLlBJO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlY3RvcnNSYXRpbyh1LCB2KSA+PSAxKSB7XG4gICAgICAgICAgYWQgPSAwO1xuICAgICAgICB9IC8vIGZvciBtYXJrZXJzXG5cblxuICAgICAgICB2YXIgZGlyID0gMSAtIHN3ZWVwRmxhZyA/IDEuMCA6IC0xLjA7XG4gICAgICAgIHZhciBhaCA9IGExICsgZGlyICogKGFkIC8gMi4wKTtcbiAgICAgICAgdmFyIGhhbGZXYXkgPSBuZXcgUG9pbnQoY2VudHAueCArIHJ4ICogTWF0aC5jb3MoYWgpLCBjZW50cC55ICsgcnkgKiBNYXRoLnNpbihhaCkpO1xuICAgICAgICBwYXRoUGFyc2VyLmFkZE1hcmtlckFuZ2xlKGhhbGZXYXksIGFoIC0gZGlyICogTWF0aC5QSSAvIDIpO1xuICAgICAgICBwYXRoUGFyc2VyLmFkZE1hcmtlckFuZ2xlKGN1cnJlbnRQb2ludCwgYWggLSBkaXIgKiBNYXRoLlBJKTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkUG9pbnQoY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTsgLy8gVE9ETzogdGhpcyBpcyB0b28gbmFpdmUsIG1ha2UgaXQgYmV0dGVyXG5cbiAgICAgICAgaWYgKGN0eCAmJiAhaXNOYU4oYTEpICYmICFpc05hTihhZCkpIHtcbiAgICAgICAgICB2YXIgciA9IHJ4ID4gcnkgPyByeCA6IHJ5O1xuICAgICAgICAgIHZhciBzeCA9IHJ4ID4gcnkgPyAxIDogcnggLyByeTtcbiAgICAgICAgICB2YXIgc3kgPSByeCA+IHJ5ID8gcnkgLyByeCA6IDE7XG4gICAgICAgICAgY3R4LnRyYW5zbGF0ZShjZW50cC54LCBjZW50cC55KTtcbiAgICAgICAgICBjdHgucm90YXRlKHhBeGlzUm90YXRpb24pO1xuICAgICAgICAgIGN0eC5zY2FsZShzeCwgc3kpO1xuICAgICAgICAgIGN0eC5hcmMoMCwgMCwgciwgYTEsIGExICsgYWQsIEJvb2xlYW4oMSAtIHN3ZWVwRmxhZykpO1xuICAgICAgICAgIGN0eC5zY2FsZSgxIC8gc3gsIDEgLyBzeSk7XG4gICAgICAgICAgY3R4LnJvdGF0ZSgteEF4aXNSb3RhdGlvbik7XG4gICAgICAgICAgY3R4LnRyYW5zbGF0ZSgtY2VudHAueCwgLWNlbnRwLnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhaXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhaKGN0eCwgYm91bmRpbmdCb3gpIHtcbiAgICAgIHZhciBwYXRoUGFyc2VyID0gdGhpcy5wYXRoUGFyc2VyO1xuXG4gICAgICBpZiAoY3R4KSB7XG4gICAgICAgIC8vIG9ubHkgY2xvc2UgcGF0aCBpZiBpdCBpcyBub3QgYSBzdHJhaWdodCBsaW5lXG4gICAgICAgIGlmIChib3VuZGluZ0JveC54MSAhPT0gYm91bmRpbmdCb3gueDIgJiYgYm91bmRpbmdCb3gueTEgIT09IGJvdW5kaW5nQm94LnkyKSB7XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhdGhQYXJzZXIuY3VycmVudCA9IHBhdGhQYXJzZXIuc3RhcnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhdGhFbGVtZW50O1xufShSZW5kZXJlZEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkOShEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCQ5KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDkoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFNWR0VsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJlZEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFNWR0VsZW1lbnQsIF9SZW5kZXJlZEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkOShTVkdFbGVtZW50KTtcblxuICBmdW5jdGlvbiBTVkdFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTVkdFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdzdmcnO1xuICAgIF90aGlzLnJvb3QgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU1ZHRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiY2xlYXJDb250ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyQ29udGV4dChjdHgpIHtcbiAgICAgIF9nZXQoX2dldFByb3RvdHlwZU9mKFNWR0VsZW1lbnQucHJvdG90eXBlKSwgXCJjbGVhckNvbnRleHRcIiwgdGhpcykuY2FsbCh0aGlzLCBjdHgpO1xuXG4gICAgICB0aGlzLmRvY3VtZW50LnNjcmVlbi52aWV3UG9ydC5yZW1vdmVDdXJyZW50KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldENvbnRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29udGV4dChjdHgpIHtcbiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7XG4gICAgICB2YXIgc2NyZWVuID0gZG9jdW1lbnQuc2NyZWVuLFxuICAgICAgICAgIHdpbmRvdyA9IGRvY3VtZW50LndpbmRvdztcbiAgICAgIHZhciBjYW52YXMgPSBjdHguY2FudmFzO1xuICAgICAgc2NyZWVuLnNldERlZmF1bHRzKGN0eCk7XG5cbiAgICAgIGlmIChjYW52YXMuc3R5bGUgJiYgdHlwZW9mIGN0eC5mb250ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgJiYgdHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjdHguZm9udCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNhbnZhcykuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udCcpO1xuICAgICAgICB2YXIgZm9udFNpemVQcm9wID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnZm9udFNpemUnLCBGb250LnBhcnNlKGN0eC5mb250KS5mb250U2l6ZSk7XG5cbiAgICAgICAgaWYgKGZvbnRTaXplUHJvcC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgZG9jdW1lbnQucm9vdEVtU2l6ZSA9IGZvbnRTaXplUHJvcC5nZXRQaXhlbHMoJ3knKTtcbiAgICAgICAgICBkb2N1bWVudC5lbVNpemUgPSBkb2N1bWVudC5yb290RW1TaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9nZXQoX2dldFByb3RvdHlwZU9mKFNWR0VsZW1lbnQucHJvdG90eXBlKSwgXCJzZXRDb250ZXh0XCIsIHRoaXMpLmNhbGwodGhpcywgY3R4KTsgLy8gY3JlYXRlIG5ldyB2aWV3IHBvcnRcblxuXG4gICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKCd4JykuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneCcsIHRydWUpLnNldFZhbHVlKDApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKCd5JykuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneScsIHRydWUpLnNldFZhbHVlKDApO1xuICAgICAgfVxuXG4gICAgICBjdHgudHJhbnNsYXRlKHRoaXMuZ2V0QXR0cmlidXRlKCd4JykuZ2V0UGl4ZWxzKCd4JyksIHRoaXMuZ2V0QXR0cmlidXRlKCd5JykuZ2V0UGl4ZWxzKCd5JykpO1xuICAgICAgdmFyIF9zY3JlZW4kdmlld1BvcnQgPSBzY3JlZW4udmlld1BvcnQsXG4gICAgICAgICAgd2lkdGggPSBfc2NyZWVuJHZpZXdQb3J0LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9zY3JlZW4kdmlld1BvcnQuaGVpZ2h0O1xuXG4gICAgICBpZiAoIXRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmdldFN0eWxlKCd3aWR0aCcsIHRydWUpLnNldFZhbHVlKCcxMDAlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmdldFN0eWxlKCdoZWlnaHQnLCB0cnVlKS5zZXRWYWx1ZSgnMTAwJScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZ2V0U3R5bGUoJ2NvbG9yJykuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLmdldFN0eWxlKCdjb2xvcicsIHRydWUpLnNldFZhbHVlKCdibGFjaycpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmWEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncmVmWCcpO1xuICAgICAgdmFyIHJlZllBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3JlZlknKTtcbiAgICAgIHZhciB2aWV3Qm94QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyk7XG4gICAgICB2YXIgdmlld0JveCA9IHZpZXdCb3hBdHRyLmhhc1ZhbHVlKCkgPyB0b051bWJlcnModmlld0JveEF0dHIuZ2V0U3RyaW5nKCkpIDogbnVsbDtcbiAgICAgIHZhciBjbGlwID0gIXRoaXMucm9vdCAmJiB0aGlzLmdldEF0dHJpYnV0ZSgnb3ZlcmZsb3cnKS5nZXRWYWx1ZSgnaGlkZGVuJykgIT09ICd2aXNpYmxlJztcbiAgICAgIHZhciBtaW5YID0gMDtcbiAgICAgIHZhciBtaW5ZID0gMDtcbiAgICAgIHZhciBjbGlwWCA9IDA7XG4gICAgICB2YXIgY2xpcFkgPSAwO1xuXG4gICAgICBpZiAodmlld0JveCkge1xuICAgICAgICBtaW5YID0gdmlld0JveFswXTtcbiAgICAgICAgbWluWSA9IHZpZXdCb3hbMV07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgIHdpZHRoID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuZ2V0UGl4ZWxzKCd5Jyk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21hcmtlcicpIHtcbiAgICAgICAgICBjbGlwWCA9IG1pblg7XG4gICAgICAgICAgY2xpcFkgPSBtaW5ZO1xuICAgICAgICAgIG1pblggPSAwO1xuICAgICAgICAgIG1pblkgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcmVlbi52aWV3UG9ydC5zZXRDdXJyZW50KHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICBpZiAodmlld0JveCkge1xuICAgICAgICB3aWR0aCA9IHZpZXdCb3hbMl07XG4gICAgICAgIGhlaWdodCA9IHZpZXdCb3hbM107XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LnNldFZpZXdCb3goe1xuICAgICAgICBjdHg6IGN0eCxcbiAgICAgICAgYXNwZWN0UmF0aW86IHRoaXMuZ2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJykuZ2V0U3RyaW5nKCksXG4gICAgICAgIHdpZHRoOiBzY3JlZW4udmlld1BvcnQud2lkdGgsXG4gICAgICAgIGRlc2lyZWRXaWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogc2NyZWVuLnZpZXdQb3J0LmhlaWdodCxcbiAgICAgICAgZGVzaXJlZEhlaWdodDogaGVpZ2h0LFxuICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICByZWZYOiByZWZYQXR0ci5nZXRWYWx1ZSgpLFxuICAgICAgICByZWZZOiByZWZZQXR0ci5nZXRWYWx1ZSgpLFxuICAgICAgICBjbGlwOiBjbGlwLFxuICAgICAgICBjbGlwWDogY2xpcFgsXG4gICAgICAgIGNsaXBZOiBjbGlwWVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh2aWV3Qm94KSB7XG4gICAgICAgIHNjcmVlbi52aWV3UG9ydC5yZW1vdmVDdXJyZW50KCk7XG4gICAgICAgIHNjcmVlbi52aWV3UG9ydC5zZXRDdXJyZW50KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemUgU1ZHIHRvIGZpdCBpbiBnaXZlbiBzaXplLlxuICAgICAqIEBwYXJhbSB3aWR0aFxuICAgICAqIEBwYXJhbSBoZWlnaHRcbiAgICAgKiBAcGFyYW0gcHJlc2VydmVBc3BlY3RSYXRpb1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSh3aWR0aCkge1xuICAgICAgdmFyIGhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogd2lkdGg7XG4gICAgICB2YXIgcHJlc2VydmVBc3BlY3RSYXRpbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgICB2YXIgd2lkdGhBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdHJ1ZSk7XG4gICAgICB2YXIgaGVpZ2h0QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0cnVlKTtcbiAgICAgIHZhciB2aWV3Qm94QXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyk7XG4gICAgICB2YXIgc3R5bGVBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB2YXIgb3JpZ2luV2lkdGggPSB3aWR0aEF0dHIuZ2V0TnVtYmVyKDApO1xuICAgICAgdmFyIG9yaWdpbkhlaWdodCA9IGhlaWdodEF0dHIuZ2V0TnVtYmVyKDApO1xuXG4gICAgICBpZiAocHJlc2VydmVBc3BlY3RSYXRpbykge1xuICAgICAgICBpZiAodHlwZW9mIHByZXNlcnZlQXNwZWN0UmF0aW8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCB0cnVlKS5zZXRWYWx1ZShwcmVzZXJ2ZUFzcGVjdFJhdGlvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlc2VydmVBc3BlY3RSYXRpb0F0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycpO1xuXG4gICAgICAgICAgaWYgKHByZXNlcnZlQXNwZWN0UmF0aW9BdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW9BdHRyLnNldFZhbHVlKHByZXNlcnZlQXNwZWN0UmF0aW9BdHRyLmdldFN0cmluZygpLnJlcGxhY2UoL15cXHMqKFxcUy4qXFxTKVxccyokLywgJyQxJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aWR0aEF0dHIuc2V0VmFsdWUod2lkdGgpO1xuICAgICAgaGVpZ2h0QXR0ci5zZXRWYWx1ZShoZWlnaHQpO1xuXG4gICAgICBpZiAoIXZpZXdCb3hBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdmlld0JveEF0dHIuc2V0VmFsdWUoXCIwIDAgXCIuY29uY2F0KG9yaWdpbldpZHRoIHx8IHdpZHRoLCBcIiBcIikuY29uY2F0KG9yaWdpbkhlaWdodCB8fCBoZWlnaHQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlQXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHZhciB3aWR0aFN0eWxlID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKTtcbiAgICAgICAgdmFyIGhlaWdodFN0eWxlID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0Jyk7XG5cbiAgICAgICAgaWYgKHdpZHRoU3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIHdpZHRoU3R5bGUuc2V0VmFsdWUoXCJcIi5jb25jYXQod2lkdGgsIFwicHhcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlaWdodFN0eWxlLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBoZWlnaHRTdHlsZS5zZXRWYWx1ZShcIlwiLmNvbmNhdChoZWlnaHQsIFwicHhcIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNWR0VsZW1lbnQ7XG59KFJlbmRlcmVkRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRhKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGEoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkYSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUmVjdEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QYXRoRWxlbWVudCkge1xuICBfaW5oZXJpdHMoUmVjdEVsZW1lbnQsIF9QYXRoRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRhKFJlY3RFbGVtZW50KTtcblxuICBmdW5jdGlvbiBSZWN0RWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVjdEVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ3JlY3QnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZWN0RWxlbWVudCwgW3tcbiAgICBrZXk6IFwicGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoKGN0eCkge1xuICAgICAgdmFyIHggPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpLmdldFBpeGVscygneCcpO1xuICAgICAgdmFyIHkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIHZhciByeEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncngnKTtcbiAgICAgIHZhciByeUF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncnknKTtcbiAgICAgIHZhciByeCA9IHJ4QXR0ci5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciByeSA9IHJ5QXR0ci5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgaWYgKHJ4QXR0ci5oYXNWYWx1ZSgpICYmICFyeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICByeSA9IHJ4O1xuICAgICAgfVxuXG4gICAgICBpZiAocnlBdHRyLmhhc1ZhbHVlKCkgJiYgIXJ4QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHJ4ID0gcnk7XG4gICAgICB9XG5cbiAgICAgIHJ4ID0gTWF0aC5taW4ocngsIHdpZHRoIC8gMi4wKTtcbiAgICAgIHJ5ID0gTWF0aC5taW4ocnksIGhlaWdodCAvIDIuMCk7XG5cbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgdmFyIEtBUFBBID0gNCAqICgoTWF0aC5zcXJ0KDIpIC0gMSkgLyAzKTtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOyAvLyBhbHdheXMgc3RhcnQgdGhlIHBhdGggc28gd2UgZG9uJ3QgZmlsbCBwcmlvciBwYXRoc1xuXG4gICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHdpZHRoID4gMCkge1xuICAgICAgICAgIGN0eC5tb3ZlVG8oeCArIHJ4LCB5KTtcbiAgICAgICAgICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHJ4LCB5KTtcbiAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4ICsgd2lkdGggLSByeCArIEtBUFBBICogcngsIHksIHggKyB3aWR0aCwgeSArIHJ5IC0gS0FQUEEgKiByeSwgeCArIHdpZHRoLCB5ICsgcnkpO1xuICAgICAgICAgIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcnkpO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJ5ICsgS0FQUEEgKiByeSwgeCArIHdpZHRoIC0gcnggKyBLQVBQQSAqIHJ4LCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByeCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcngsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHggKyByeCAtIEtBUFBBICogcngsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByeSArIEtBUFBBICogcnksIHgsIHkgKyBoZWlnaHQgLSByeSk7XG4gICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcnkpO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHgsIHkgKyByeSAtIEtBUFBBICogcnksIHggKyByeCAtIEtBUFBBICogcngsIHksIHggKyByeCwgeSk7XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQm91bmRpbmdCb3goeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TWFya2Vyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrZXJzKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlY3RFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRiKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGIoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkYigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgQ2lyY2xlRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1BhdGhFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhDaXJjbGVFbGVtZW50LCBfUGF0aEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkYihDaXJjbGVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBDaXJjbGVFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaXJjbGVFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdjaXJjbGUnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDaXJjbGVFbGVtZW50LCBbe1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoY3R4KSB7XG4gICAgICB2YXIgY3ggPSB0aGlzLmdldEF0dHJpYnV0ZSgnY3gnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciBjeSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjeScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncicpLmdldFBpeGVscygpO1xuXG4gICAgICBpZiAoY3R4ICYmIHIgPiAwKSB7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmFyYyhjeCwgY3ksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBCb3VuZGluZ0JveChjeCAtIHIsIGN5IC0gciwgY3ggKyByLCBjeSArIHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXJrZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcmtlcnMoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2lyY2xlRWxlbWVudDtcbn0oUGF0aEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkYyhEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRjKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGMoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIEVsbGlwc2VFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUGF0aEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEVsbGlwc2VFbGVtZW50LCBfUGF0aEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkYyhFbGxpcHNlRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gRWxsaXBzZUVsZW1lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVsbGlwc2VFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdlbGxpcHNlJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRWxsaXBzZUVsZW1lbnQsIFt7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aChjdHgpIHtcbiAgICAgIHZhciBLQVBQQSA9IDQgKiAoKE1hdGguc3FydCgyKSAtIDEpIC8gMyk7XG4gICAgICB2YXIgcnggPSB0aGlzLmdldEF0dHJpYnV0ZSgncngnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciByeSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdyeScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIGN4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2N4JykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB2YXIgY3kgPSB0aGlzLmdldEF0dHJpYnV0ZSgnY3knKS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgaWYgKGN0eCAmJiByeCA+IDAgJiYgcnkgPiAwKSB7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyhjeCArIHJ4LCBjeSk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4ICsgcngsIGN5ICsgS0FQUEEgKiByeSwgY3ggKyBLQVBQQSAqIHJ4LCBjeSArIHJ5LCBjeCwgY3kgKyByeSk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4IC0gS0FQUEEgKiByeCwgY3kgKyByeSwgY3ggLSByeCwgY3kgKyBLQVBQQSAqIHJ5LCBjeCAtIHJ4LCBjeSk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4IC0gcngsIGN5IC0gS0FQUEEgKiByeSwgY3ggLSBLQVBQQSAqIHJ4LCBjeSAtIHJ5LCBjeCwgY3kgLSByeSk7XG4gICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGN4ICsgS0FQUEEgKiByeCwgY3kgLSByeSwgY3ggKyByeCwgY3kgLSBLQVBQQSAqIHJ5LCBjeCArIHJ4LCBjeSk7XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBCb3VuZGluZ0JveChjeCAtIHJ4LCBjeSAtIHJ5LCBjeCArIHJ4LCBjeSArIHJ5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TWFya2Vyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXJrZXJzKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVsbGlwc2VFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRkKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGQoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkZCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgTGluZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QYXRoRWxlbWVudCkge1xuICBfaW5oZXJpdHMoTGluZUVsZW1lbnQsIF9QYXRoRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRkKExpbmVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBMaW5lRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluZUVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ2xpbmUnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaW5lRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0UG9pbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvaW50cygpIHtcbiAgICAgIHJldHVybiBbbmV3IFBvaW50KHRoaXMuZ2V0QXR0cmlidXRlKCd4MScpLmdldFBpeGVscygneCcpLCB0aGlzLmdldEF0dHJpYnV0ZSgneTEnKS5nZXRQaXhlbHMoJ3knKSksIG5ldyBQb2ludCh0aGlzLmdldEF0dHJpYnV0ZSgneDInKS5nZXRQaXhlbHMoJ3gnKSwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3kyJykuZ2V0UGl4ZWxzKCd5JykpXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoKGN0eCkge1xuICAgICAgdmFyIF90aGlzJGdldFBvaW50cyA9IHRoaXMuZ2V0UG9pbnRzKCksXG4gICAgICAgICAgX3RoaXMkZ2V0UG9pbnRzMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJGdldFBvaW50cywgMiksXG4gICAgICAgICAgX3RoaXMkZ2V0UG9pbnRzMiQgPSBfdGhpcyRnZXRQb2ludHMyWzBdLFxuICAgICAgICAgIHgwID0gX3RoaXMkZ2V0UG9pbnRzMiQueCxcbiAgICAgICAgICB5MCA9IF90aGlzJGdldFBvaW50czIkLnksXG4gICAgICAgICAgX3RoaXMkZ2V0UG9pbnRzMiQyID0gX3RoaXMkZ2V0UG9pbnRzMlsxXSxcbiAgICAgICAgICB4MSA9IF90aGlzJGdldFBvaW50czIkMi54LFxuICAgICAgICAgIHkxID0gX3RoaXMkZ2V0UG9pbnRzMiQyLnk7XG5cbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHgwLCB5MCk7XG4gICAgICAgIGN0eC5saW5lVG8oeDEsIHkxKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcmtlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWFya2VycygpIHtcbiAgICAgIHZhciBfdGhpcyRnZXRQb2ludHMzID0gdGhpcy5nZXRQb2ludHMoKSxcbiAgICAgICAgICBfdGhpcyRnZXRQb2ludHM0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkZ2V0UG9pbnRzMywgMiksXG4gICAgICAgICAgcDAgPSBfdGhpcyRnZXRQb2ludHM0WzBdLFxuICAgICAgICAgIHAxID0gX3RoaXMkZ2V0UG9pbnRzNFsxXTtcblxuICAgICAgdmFyIGEgPSBwMC5hbmdsZVRvKHAxKTtcbiAgICAgIHJldHVybiBbW3AwLCBhXSwgW3AxLCBhXV07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmVFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRlKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGUoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkZSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUG9seWxpbmVFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUGF0aEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFBvbHlsaW5lRWxlbWVudCwgX1BhdGhFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJGUoUG9seWxpbmVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBQb2x5bGluZUVsZW1lbnQoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seWxpbmVFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAncG9seWxpbmUnO1xuICAgIF90aGlzLnBvaW50cyA9IFtdO1xuICAgIF90aGlzLnBvaW50cyA9IFBvaW50LnBhcnNlUGF0aChfdGhpcy5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpLmdldFN0cmluZygpKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUG9seWxpbmVFbGVtZW50LCBbe1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoY3R4KSB7XG4gICAgICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cbiAgICAgIHZhciBfcG9pbnRzID0gX3NsaWNlZFRvQXJyYXkocG9pbnRzLCAxKSxcbiAgICAgICAgICBfcG9pbnRzJCA9IF9wb2ludHNbMF0sXG4gICAgICAgICAgeDAgPSBfcG9pbnRzJC54LFxuICAgICAgICAgIHkwID0gX3BvaW50cyQueTtcblxuICAgICAgdmFyIGJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KHgwLCB5MCk7XG5cbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHgubW92ZVRvKHgwLCB5MCk7XG4gICAgICB9XG5cbiAgICAgIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciB4ID0gX3JlZi54LFxuICAgICAgICAgICAgeSA9IF9yZWYueTtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkUG9pbnQoeCwgeSk7XG5cbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJvdW5kaW5nQm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRNYXJrZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcmtlcnMoKSB7XG4gICAgICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gICAgICB2YXIgbGFzdEluZGV4ID0gcG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgbWFya2VycyA9IFtdO1xuICAgICAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50LCBpKSB7XG4gICAgICAgIGlmIChpID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrZXJzLnB1c2goW3BvaW50LCBwb2ludC5hbmdsZVRvKHBvaW50c1tpICsgMV0pXSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXJrZXJzLnB1c2goW3BvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIG1hcmtlcnNbbWFya2Vycy5sZW5ndGggLSAxXVsxXV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFya2VycztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9seWxpbmVFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRmKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGYoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkZigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUG9seWdvbkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Qb2x5bGluZUVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFBvbHlnb25FbGVtZW50LCBfUG9seWxpbmVFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJGYoUG9seWdvbkVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIFBvbHlnb25FbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb2x5Z29uRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAncG9seWdvbic7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvbHlnb25FbGVtZW50LCBbe1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoY3R4KSB7XG4gICAgICB2YXIgYm91bmRpbmdCb3ggPSBfZ2V0KF9nZXRQcm90b3R5cGVPZihQb2x5Z29uRWxlbWVudC5wcm90b3R5cGUpLCBcInBhdGhcIiwgdGhpcykuY2FsbCh0aGlzLCBjdHgpO1xuXG4gICAgICB2YXIgX3RoaXMkcG9pbnRzID0gX3NsaWNlZFRvQXJyYXkodGhpcy5wb2ludHMsIDEpLFxuICAgICAgICAgIF90aGlzJHBvaW50cyQgPSBfdGhpcyRwb2ludHNbMF0sXG4gICAgICAgICAgeCA9IF90aGlzJHBvaW50cyQueCxcbiAgICAgICAgICB5ID0gX3RoaXMkcG9pbnRzJC55O1xuXG4gICAgICBpZiAoY3R4KSB7XG4gICAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJvdW5kaW5nQm94O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb2x5Z29uRWxlbWVudDtcbn0oUG9seWxpbmVFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJGcoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkZygpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRnKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBQYXR0ZXJuRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFBhdHRlcm5FbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRnKFBhdHRlcm5FbGVtZW50KTtcblxuICBmdW5jdGlvbiBQYXR0ZXJuRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGF0dGVybkVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ3BhdHRlcm4nO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXR0ZXJuRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiY3JlYXRlUGF0dGVyblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQYXR0ZXJuKGN0eCwgXywgcGFyZW50T3BhY2l0eVByb3ApIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuZ2V0UGl4ZWxzKCd4JywgdHJ1ZSk7XG4gICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuZ2V0UGl4ZWxzKCd5JywgdHJ1ZSk7IC8vIHJlbmRlciBtZSB1c2luZyBhIHRlbXBvcmFyeSBzdmcgZWxlbWVudFxuXG4gICAgICB2YXIgcGF0dGVyblN2ZyA9IG5ldyBTVkdFbGVtZW50KHRoaXMuZG9jdW1lbnQsIG51bGwpO1xuICAgICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLnZpZXdCb3ggPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3ZpZXdCb3gnLCB0aGlzLmdldEF0dHJpYnV0ZSgndmlld0JveCcpLmdldFZhbHVlKCkpO1xuICAgICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLndpZHRoID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICd3aWR0aCcsIFwiXCIuY29uY2F0KHdpZHRoLCBcInB4XCIpKTtcbiAgICAgIHBhdHRlcm5TdmcuYXR0cmlidXRlcy5oZWlnaHQgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ2hlaWdodCcsIFwiXCIuY29uY2F0KGhlaWdodCwgXCJweFwiKSk7XG4gICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMudHJhbnNmb3JtID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICd0cmFuc2Zvcm0nLCB0aGlzLmdldEF0dHJpYnV0ZSgncGF0dGVyblRyYW5zZm9ybScpLmdldFZhbHVlKCkpO1xuICAgICAgcGF0dGVyblN2Zy5jaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICB2YXIgcGF0dGVybkNhbnZhcyA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIHBhdHRlcm5DdHggPSBwYXR0ZXJuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICB2YXIgeEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpO1xuICAgICAgdmFyIHlBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3knKTtcblxuICAgICAgaWYgKHhBdHRyLmhhc1ZhbHVlKCkgJiYgeUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICBwYXR0ZXJuQ3R4LnRyYW5zbGF0ZSh4QXR0ci5nZXRQaXhlbHMoJ3gnLCB0cnVlKSwgeUF0dHIuZ2V0UGl4ZWxzKCd5JywgdHJ1ZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50T3BhY2l0eVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICB0aGlzLnN0eWxlc1snZmlsbC1vcGFjaXR5J10gPSBwYXJlbnRPcGFjaXR5UHJvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5zdHlsZXMsICdmaWxsLW9wYWNpdHknKTtcbiAgICAgIH0gLy8gcmVuZGVyIDN4MyBncmlkIHNvIHdoZW4gd2UgdHJhbnNmb3JtIHRoZXJlJ3Mgbm8gd2hpdGUgc3BhY2Ugb24gZWRnZXNcblxuXG4gICAgICBmb3IgKHZhciB4ID0gLTE7IHggPD0gMTsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSAtMTsgeSA8PSAxOyB5KyspIHtcbiAgICAgICAgICBwYXR0ZXJuQ3R4LnNhdmUoKTtcbiAgICAgICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMueCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAneCcsIHggKiBwYXR0ZXJuQ2FudmFzLndpZHRoKTtcbiAgICAgICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMueSA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAneScsIHkgKiBwYXR0ZXJuQ2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgcGF0dGVyblN2Zy5yZW5kZXIocGF0dGVybkN0eCk7XG4gICAgICAgICAgcGF0dGVybkN0eC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybihwYXR0ZXJuQ2FudmFzLCAncmVwZWF0Jyk7XG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGF0dGVybkVsZW1lbnQ7XG59KEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkaChEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRoKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGgoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIE1hcmtlckVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FbGVtZW50KSB7XG4gIF9pbmhlcml0cyhNYXJrZXJFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRoKE1hcmtlckVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIE1hcmtlckVsZW1lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcmtlckVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ21hcmtlcic7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcmtlckVsZW1lbnQsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoY3R4LCBwb2ludCwgYW5nbGUpIHtcbiAgICAgIGlmICghcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgeCA9IHBvaW50LngsXG4gICAgICAgICAgeSA9IHBvaW50Lnk7XG4gICAgICB2YXIgb3JpZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ29yaWVudCcpLmdldFZhbHVlKCdhdXRvJyk7XG4gICAgICB2YXIgbWFya2VyVW5pdHMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFya2VyVW5pdHMnKS5nZXRWYWx1ZSgnc3Ryb2tlV2lkdGgnKTtcbiAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG5cbiAgICAgIGlmIChvcmllbnQgPT09ICdhdXRvJykge1xuICAgICAgICBjdHgucm90YXRlKGFuZ2xlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hcmtlclVuaXRzID09PSAnc3Ryb2tlV2lkdGgnKSB7XG4gICAgICAgIGN0eC5zY2FsZShjdHgubGluZVdpZHRoLCBjdHgubGluZVdpZHRoKTtcbiAgICAgIH1cblxuICAgICAgY3R4LnNhdmUoKTsgLy8gcmVuZGVyIG1lIHVzaW5nIGEgdGVtcG9yYXJ5IHN2ZyBlbGVtZW50XG5cbiAgICAgIHZhciBtYXJrZXJTdmcgPSBuZXcgU1ZHRWxlbWVudCh0aGlzLmRvY3VtZW50LCBudWxsKTtcbiAgICAgIG1hcmtlclN2Zy50eXBlID0gdGhpcy50eXBlO1xuICAgICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMudmlld0JveCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAndmlld0JveCcsIHRoaXMuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykuZ2V0VmFsdWUoKSk7XG4gICAgICBtYXJrZXJTdmcuYXR0cmlidXRlcy5yZWZYID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdyZWZYJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ3JlZlgnKS5nZXRWYWx1ZSgpKTtcbiAgICAgIG1hcmtlclN2Zy5hdHRyaWJ1dGVzLnJlZlkgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3JlZlknLCB0aGlzLmdldEF0dHJpYnV0ZSgncmVmWScpLmdldFZhbHVlKCkpO1xuICAgICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMud2lkdGggPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ3dpZHRoJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ21hcmtlcldpZHRoJykuZ2V0VmFsdWUoKSk7XG4gICAgICBtYXJrZXJTdmcuYXR0cmlidXRlcy5oZWlnaHQgPSBuZXcgUHJvcGVydHkodGhpcy5kb2N1bWVudCwgJ2hlaWdodCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdtYXJrZXJIZWlnaHQnKS5nZXRWYWx1ZSgpKTtcbiAgICAgIG1hcmtlclN2Zy5hdHRyaWJ1dGVzLm92ZXJmbG93ID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdvdmVyZmxvdycsIHRoaXMuZ2V0QXR0cmlidXRlKCdvdmVyZmxvdycpLmdldFZhbHVlKCkpO1xuICAgICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMuZmlsbCA9IG5ldyBQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LCAnZmlsbCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdmaWxsJykuZ2V0Q29sb3IoJ2JsYWNrJykpO1xuICAgICAgbWFya2VyU3ZnLmF0dHJpYnV0ZXMuc3Ryb2tlID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdzdHJva2UnLCB0aGlzLmdldEF0dHJpYnV0ZSgnc3Ryb2tlJykuZ2V0VmFsdWUoJ25vbmUnKSk7XG4gICAgICBtYXJrZXJTdmcuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgbWFya2VyU3ZnLnJlbmRlcihjdHgpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcblxuICAgICAgaWYgKG1hcmtlclVuaXRzID09PSAnc3Ryb2tlV2lkdGgnKSB7XG4gICAgICAgIGN0eC5zY2FsZSgxIC8gY3R4LmxpbmVXaWR0aCwgMSAvIGN0eC5saW5lV2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JpZW50ID09PSAnYXV0bycpIHtcbiAgICAgICAgY3R4LnJvdGF0ZSgtYW5nbGUpO1xuICAgICAgfVxuXG4gICAgICBjdHgudHJhbnNsYXRlKC14LCAteSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hcmtlckVsZW1lbnQ7XG59KEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkaShEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRpKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGkoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIERlZnNFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoRGVmc0VsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJGkoRGVmc0VsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIERlZnNFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEZWZzRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAnZGVmcyc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERlZnNFbGVtZW50LCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgey8vIE5PT1BcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGVmc0VsZW1lbnQ7XG59KEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkaihEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRqKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGooKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIEdFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVuZGVyZWRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhHRWxlbWVudCwgX1JlbmRlcmVkRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRqKEdFbGVtZW50KTtcblxuICBmdW5jdGlvbiBHRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR0VsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ2cnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhHRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0Qm91bmRpbmdCb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRpbmdCb3goY3R4KSB7XG4gICAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgYm91bmRpbmdCb3guYWRkQm91bmRpbmdCb3goY2hpbGQuZ2V0Qm91bmRpbmdCb3goY3R4KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBib3VuZGluZ0JveDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR0VsZW1lbnQ7XG59KFJlbmRlcmVkRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRrKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGsoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkaygpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgR3JhZGllbnRFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoR3JhZGllbnRFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRrKEdyYWRpZW50RWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gR3JhZGllbnRFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEdyYWRpZW50RWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy5hdHRyaWJ1dGVzVG9Jbmhlcml0ID0gWydncmFkaWVudFVuaXRzJ107XG4gICAgX3RoaXMuc3RvcHMgPSBbXTtcblxuICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSxcbiAgICAgICAgc3RvcHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUuc3RvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX2Fzc2VydFRoaXNJbml0aWFsaXplLmNoaWxkcmVuO1xuXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnc3RvcCcpIHtcbiAgICAgICAgc3RvcHMucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEdyYWRpZW50RWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0R3JhZGllbnRVbml0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRHcmFkaWVudFVuaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdncmFkaWVudFVuaXRzJykuZ2V0U3RyaW5nKCdvYmplY3RCb3VuZGluZ0JveCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVHcmFkaWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVHcmFkaWVudChjdHgsIGVsZW1lbnQsIHBhcmVudE9wYWNpdHlQcm9wKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby10aGlzLWFzc2lnbm1lbnRcbiAgICAgIHZhciBzdG9wc0NvbnRhaW5lciA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmdldEhyZWZBdHRyaWJ1dGUoKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHN0b3BzQ29udGFpbmVyID0gdGhpcy5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0RGVmaW5pdGlvbigpO1xuICAgICAgICB0aGlzLmluaGVyaXRTdG9wQ29udGFpbmVyKHN0b3BzQ29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9zdG9wc0NvbnRhaW5lciA9IHN0b3BzQ29udGFpbmVyLFxuICAgICAgICAgIHN0b3BzID0gX3N0b3BzQ29udGFpbmVyLnN0b3BzO1xuICAgICAgdmFyIGdyYWRpZW50ID0gdGhpcy5nZXRHcmFkaWVudChjdHgsIGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWdyYWRpZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFBhcmVudE9wYWNpdHkocGFyZW50T3BhY2l0eVByb3AsIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdLmNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgc3RvcHMuZm9yRWFjaChmdW5jdGlvbiAoc3RvcCkge1xuICAgICAgICBncmFkaWVudC5hZGRDb2xvclN0b3Aoc3RvcC5vZmZzZXQsIF90aGlzMi5hZGRQYXJlbnRPcGFjaXR5KHBhcmVudE9wYWNpdHlQcm9wLCBzdG9wLmNvbG9yKSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdncmFkaWVudFRyYW5zZm9ybScpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgLy8gcmVuZGVyIGFzIHRyYW5zZm9ybWVkIHBhdHRlcm4gb24gdGVtcG9yYXJ5IGNhbnZhc1xuICAgICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50O1xuICAgICAgICB2YXIgX2RvY3VtZW50JHNjcmVlbiA9IGRvY3VtZW50LnNjcmVlbixcbiAgICAgICAgICAgIE1BWF9WSVJUVUFMX1BJWEVMUyA9IF9kb2N1bWVudCRzY3JlZW4uTUFYX1ZJUlRVQUxfUElYRUxTLFxuICAgICAgICAgICAgdmlld1BvcnQgPSBfZG9jdW1lbnQkc2NyZWVuLnZpZXdQb3J0O1xuXG4gICAgICAgIHZhciBfdmlld1BvcnQkdmlld1BvcnRzID0gX3NsaWNlZFRvQXJyYXkodmlld1BvcnQudmlld1BvcnRzLCAxKSxcbiAgICAgICAgICAgIHJvb3RWaWV3ID0gX3ZpZXdQb3J0JHZpZXdQb3J0c1swXTtcblxuICAgICAgICB2YXIgcmVjdCA9IG5ldyBSZWN0RWxlbWVudChkb2N1bWVudCwgbnVsbCk7XG4gICAgICAgIHJlY3QuYXR0cmlidXRlcy54ID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAneCcsIC1NQVhfVklSVFVBTF9QSVhFTFMgLyAzLjApO1xuICAgICAgICByZWN0LmF0dHJpYnV0ZXMueSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3knLCAtTUFYX1ZJUlRVQUxfUElYRUxTIC8gMy4wKTtcbiAgICAgICAgcmVjdC5hdHRyaWJ1dGVzLndpZHRoID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnd2lkdGgnLCBNQVhfVklSVFVBTF9QSVhFTFMpO1xuICAgICAgICByZWN0LmF0dHJpYnV0ZXMuaGVpZ2h0ID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnaGVpZ2h0JywgTUFYX1ZJUlRVQUxfUElYRUxTKTtcbiAgICAgICAgdmFyIGdyb3VwID0gbmV3IEdFbGVtZW50KGRvY3VtZW50LCBudWxsKTtcbiAgICAgICAgZ3JvdXAuYXR0cmlidXRlcy50cmFuc2Zvcm0gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICd0cmFuc2Zvcm0nLCB0aGlzLmdldEF0dHJpYnV0ZSgnZ3JhZGllbnRUcmFuc2Zvcm0nKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgZ3JvdXAuY2hpbGRyZW4gPSBbcmVjdF07XG4gICAgICAgIHZhciBwYXR0ZXJuU3ZnID0gbmV3IFNWR0VsZW1lbnQoZG9jdW1lbnQsIG51bGwpO1xuICAgICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMueCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3gnLCAwKTtcbiAgICAgICAgcGF0dGVyblN2Zy5hdHRyaWJ1dGVzLnkgPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICd5JywgMCk7XG4gICAgICAgIHBhdHRlcm5TdmcuYXR0cmlidXRlcy53aWR0aCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ3dpZHRoJywgcm9vdFZpZXcud2lkdGgpO1xuICAgICAgICBwYXR0ZXJuU3ZnLmF0dHJpYnV0ZXMuaGVpZ2h0ID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnaGVpZ2h0Jywgcm9vdFZpZXcuaGVpZ2h0KTtcbiAgICAgICAgcGF0dGVyblN2Zy5jaGlsZHJlbiA9IFtncm91cF07XG4gICAgICAgIHZhciBwYXR0ZXJuQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlQ2FudmFzKHJvb3RWaWV3LndpZHRoLCByb290Vmlldy5oZWlnaHQpO1xuICAgICAgICB2YXIgcGF0dGVybkN0eCA9IHBhdHRlcm5DYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgcGF0dGVybkN0eC5maWxsU3R5bGUgPSBncmFkaWVudDtcbiAgICAgICAgcGF0dGVyblN2Zy5yZW5kZXIocGF0dGVybkN0eCk7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuQ3R4LmNyZWF0ZVBhdHRlcm4ocGF0dGVybkNhbnZhcywgJ25vLXJlcGVhdCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZ3JhZGllbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluaGVyaXRTdG9wQ29udGFpbmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaGVyaXRTdG9wQ29udGFpbmVyKHN0b3BzQ29udGFpbmVyKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy5hdHRyaWJ1dGVzVG9Jbmhlcml0LmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZVRvSW5oZXJpdCkge1xuICAgICAgICBpZiAoIV90aGlzMy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlVG9Jbmhlcml0KS5oYXNWYWx1ZSgpICYmIHN0b3BzQ29udGFpbmVyLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVUb0luaGVyaXQpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICBfdGhpczMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvSW5oZXJpdCwgdHJ1ZSkuc2V0VmFsdWUoc3RvcHNDb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvSW5oZXJpdCkuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRQYXJlbnRPcGFjaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFBhcmVudE9wYWNpdHkocGFyZW50T3BhY2l0eVByb3AsIGNvbG9yKSB7XG4gICAgICBpZiAocGFyZW50T3BhY2l0eVByb3AuaGFzVmFsdWUoKSkge1xuICAgICAgICB2YXIgY29sb3JQcm9wID0gbmV3IFByb3BlcnR5KHRoaXMuZG9jdW1lbnQsICdjb2xvcicsIGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUHJvcC5hZGRPcGFjaXR5KHBhcmVudE9wYWNpdHlQcm9wKS5nZXRDb2xvcigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sb3I7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdyYWRpZW50RWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRsKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JGwoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkbCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgTGluZWFyR3JhZGllbnRFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfR3JhZGllbnRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhMaW5lYXJHcmFkaWVudEVsZW1lbnQsIF9HcmFkaWVudEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkbChMaW5lYXJHcmFkaWVudEVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIExpbmVhckdyYWRpZW50RWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5lYXJHcmFkaWVudEVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgX3RoaXMudHlwZSA9ICdsaW5lYXJHcmFkaWVudCc7XG5cbiAgICBfdGhpcy5hdHRyaWJ1dGVzVG9Jbmhlcml0LnB1c2goJ3gxJywgJ3kxJywgJ3gyJywgJ3kyJyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGluZWFyR3JhZGllbnRFbGVtZW50LCBbe1xuICAgIGtleTogXCJnZXRHcmFkaWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRHcmFkaWVudChjdHgsIGVsZW1lbnQpIHtcbiAgICAgIHZhciBpc0JvdW5kaW5nQm94VW5pdHMgPSB0aGlzLmdldEdyYWRpZW50VW5pdHMoKSA9PT0gJ29iamVjdEJvdW5kaW5nQm94JztcbiAgICAgIHZhciBib3VuZGluZ0JveCA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdCb3goY3R4KSA6IG51bGw7XG5cbiAgICAgIGlmIChpc0JvdW5kaW5nQm94VW5pdHMgJiYgIWJvdW5kaW5nQm94KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKCd4MScpLmhhc1ZhbHVlKCkgJiYgIXRoaXMuZ2V0QXR0cmlidXRlKCd5MScpLmhhc1ZhbHVlKCkgJiYgIXRoaXMuZ2V0QXR0cmlidXRlKCd4MicpLmhhc1ZhbHVlKCkgJiYgIXRoaXMuZ2V0QXR0cmlidXRlKCd5MicpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3gxJywgdHJ1ZSkuc2V0VmFsdWUoMCk7XG4gICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCd5MScsIHRydWUpLnNldFZhbHVlKDApO1xuICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgneDInLCB0cnVlKS5zZXRWYWx1ZSgxKTtcbiAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3kyJywgdHJ1ZSkuc2V0VmFsdWUoMCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB4MSA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnggKyBib3VuZGluZ0JveC53aWR0aCAqIHRoaXMuZ2V0QXR0cmlidXRlKCd4MScpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3gxJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB2YXIgeTEgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC55ICsgYm91bmRpbmdCb3guaGVpZ2h0ICogdGhpcy5nZXRBdHRyaWJ1dGUoJ3kxJykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgneTEnKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIHZhciB4MiA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnggKyBib3VuZGluZ0JveC53aWR0aCAqIHRoaXMuZ2V0QXR0cmlidXRlKCd4MicpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3gyJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB2YXIgeTIgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC55ICsgYm91bmRpbmdCb3guaGVpZ2h0ICogdGhpcy5nZXRBdHRyaWJ1dGUoJ3kyJykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgneTInKS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgaWYgKHgxID09PSB4MiAmJiB5MSA9PT0geTIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaW5lYXJHcmFkaWVudEVsZW1lbnQ7XG59KEdyYWRpZW50RWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRtKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JG0oKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkbSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgUmFkaWFsR3JhZGllbnRFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfR3JhZGllbnRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhSYWRpYWxHcmFkaWVudEVsZW1lbnQsIF9HcmFkaWVudEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkbShSYWRpYWxHcmFkaWVudEVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIFJhZGlhbEdyYWRpZW50RWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYWRpYWxHcmFkaWVudEVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcyk7XG4gICAgX3RoaXMudHlwZSA9ICdyYWRpYWxHcmFkaWVudCc7XG5cbiAgICBfdGhpcy5hdHRyaWJ1dGVzVG9Jbmhlcml0LnB1c2goJ2N4JywgJ2N5JywgJ3InLCAnZngnLCAnZnknLCAnZnInKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYWRpYWxHcmFkaWVudEVsZW1lbnQsIFt7XG4gICAga2V5OiBcImdldEdyYWRpZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEdyYWRpZW50KGN0eCwgZWxlbWVudCkge1xuICAgICAgdmFyIGlzQm91bmRpbmdCb3hVbml0cyA9IHRoaXMuZ2V0R3JhZGllbnRVbml0cygpID09PSAnb2JqZWN0Qm91bmRpbmdCb3gnO1xuICAgICAgdmFyIGJvdW5kaW5nQm94ID0gZWxlbWVudC5nZXRCb3VuZGluZ0JveChjdHgpO1xuXG4gICAgICBpZiAoaXNCb3VuZGluZ0JveFVuaXRzICYmICFib3VuZGluZ0JveCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgnY3gnKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdjeCcsIHRydWUpLnNldFZhbHVlKCc1MCUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgnY3knKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdjeScsIHRydWUpLnNldFZhbHVlKCc1MCUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgncicpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ3InLCB0cnVlKS5zZXRWYWx1ZSgnNTAlJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjeCA9IGlzQm91bmRpbmdCb3hVbml0cyA/IGJvdW5kaW5nQm94LnggKyBib3VuZGluZ0JveC53aWR0aCAqIHRoaXMuZ2V0QXR0cmlidXRlKCdjeCcpLmdldE51bWJlcigpIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ2N4JykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB2YXIgY3kgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC55ICsgYm91bmRpbmdCb3guaGVpZ2h0ICogdGhpcy5nZXRBdHRyaWJ1dGUoJ2N5JykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgnY3knKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIHZhciBmeCA9IGN4O1xuICAgICAgdmFyIGZ5ID0gY3k7XG5cbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgnZngnKS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGZ4ID0gaXNCb3VuZGluZ0JveFVuaXRzID8gYm91bmRpbmdCb3gueCArIGJvdW5kaW5nQm94LndpZHRoICogdGhpcy5nZXRBdHRyaWJ1dGUoJ2Z4JykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgnZngnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdmeScpLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgZnkgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyBib3VuZGluZ0JveC55ICsgYm91bmRpbmdCb3guaGVpZ2h0ICogdGhpcy5nZXRBdHRyaWJ1dGUoJ2Z5JykuZ2V0TnVtYmVyKCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgnZnknKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBpc0JvdW5kaW5nQm94VW5pdHMgPyAoYm91bmRpbmdCb3gud2lkdGggKyBib3VuZGluZ0JveC5oZWlnaHQpIC8gMi4wICogdGhpcy5nZXRBdHRyaWJ1dGUoJ3InKS5nZXROdW1iZXIoKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCdyJykuZ2V0UGl4ZWxzKCk7XG4gICAgICB2YXIgZnIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZnInKS5nZXRQaXhlbHMoKTtcbiAgICAgIHJldHVybiBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQoZngsIGZ5LCBmciwgY3gsIGN5LCByKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFkaWFsR3JhZGllbnRFbGVtZW50O1xufShHcmFkaWVudEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkbihEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRuKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JG4oKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFN0b3BFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoU3RvcEVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJG4oU3RvcEVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIFN0b3BFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0b3BFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAnc3RvcCc7XG4gICAgdmFyIG9mZnNldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF90aGlzLmdldEF0dHJpYnV0ZSgnb2Zmc2V0JykuZ2V0TnVtYmVyKCkpKTtcblxuICAgIHZhciBzdG9wT3BhY2l0eSA9IF90aGlzLmdldFN0eWxlKCdzdG9wLW9wYWNpdHknKTtcblxuICAgIHZhciBzdG9wQ29sb3IgPSBfdGhpcy5nZXRTdHlsZSgnc3RvcC1jb2xvcicsIHRydWUpO1xuXG4gICAgaWYgKHN0b3BDb2xvci5nZXRTdHJpbmcoKSA9PT0gJycpIHtcbiAgICAgIHN0b3BDb2xvci5zZXRWYWx1ZSgnIzAwMCcpO1xuICAgIH1cblxuICAgIGlmIChzdG9wT3BhY2l0eS5oYXNWYWx1ZSgpKSB7XG4gICAgICBzdG9wQ29sb3IgPSBzdG9wQ29sb3IuYWRkT3BhY2l0eShzdG9wT3BhY2l0eSk7XG4gICAgfVxuXG4gICAgX3RoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIF90aGlzLmNvbG9yID0gc3RvcENvbG9yLmdldENvbG9yKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFN0b3BFbGVtZW50O1xufShFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJG8oRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkbygpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRvKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBBbmltYXRlRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEFuaW1hdGVFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRvKEFuaW1hdGVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBBbmltYXRlRWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2FuaW1hdGUnO1xuICAgIF90aGlzLmR1cmF0aW9uID0gMDtcbiAgICBfdGhpcy5pbml0aWFsVmFsdWUgPSBudWxsO1xuICAgIF90aGlzLmluaXRpYWxVbml0cyA9ICcnO1xuICAgIF90aGlzLnJlbW92ZWQgPSBmYWxzZTtcbiAgICBfdGhpcy5mcm96ZW4gPSBmYWxzZTtcbiAgICBkb2N1bWVudC5zY3JlZW4uYW5pbWF0aW9ucy5wdXNoKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICBfdGhpcy5iZWdpbiA9IF90aGlzLmdldEF0dHJpYnV0ZSgnYmVnaW4nKS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICBfdGhpcy5tYXhEdXJhdGlvbiA9IF90aGlzLmJlZ2luICsgX3RoaXMuZ2V0QXR0cmlidXRlKCdkdXInKS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICBfdGhpcy5mcm9tID0gX3RoaXMuZ2V0QXR0cmlidXRlKCdmcm9tJyk7XG4gICAgX3RoaXMudG8gPSBfdGhpcy5nZXRBdHRyaWJ1dGUoJ3RvJyk7XG4gICAgX3RoaXMudmFsdWVzID0gX3RoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZXMnKTtcblxuICAgIGlmIChfdGhpcy52YWx1ZXMuaGFzVmFsdWUoKSkge1xuICAgICAgX3RoaXMudmFsdWVzLnNldFZhbHVlKF90aGlzLnZhbHVlcy5nZXRTdHJpbmcoKS5zcGxpdCgnOycpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0ZUVsZW1lbnQsIFt7XG4gICAga2V5OiBcImdldFByb3BlcnR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFByb3BlcnR5KCkge1xuICAgICAgdmFyIGF0dHJpYnV0ZVR5cGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXR0cmlidXRlVHlwZScpLmdldFN0cmluZygpO1xuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXR0cmlidXRlTmFtZScpLmdldFN0cmluZygpO1xuXG4gICAgICBpZiAoYXR0cmlidXRlVHlwZSA9PT0gJ0NTUycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldFN0eWxlKGF0dHJpYnV0ZU5hbWUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYWxjVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY1ZhbHVlKCkge1xuICAgICAgdmFyIGluaXRpYWxVbml0cyA9IHRoaXMuaW5pdGlhbFVuaXRzO1xuXG4gICAgICB2YXIgX3RoaXMkZ2V0UHJvZ3Jlc3MgPSB0aGlzLmdldFByb2dyZXNzKCksXG4gICAgICAgICAgcHJvZ3Jlc3MgPSBfdGhpcyRnZXRQcm9ncmVzcy5wcm9ncmVzcyxcbiAgICAgICAgICBmcm9tID0gX3RoaXMkZ2V0UHJvZ3Jlc3MuZnJvbSxcbiAgICAgICAgICB0byA9IF90aGlzJGdldFByb2dyZXNzLnRvOyAvLyB0d2VlbiB2YWx1ZSBsaW5lYXJseVxuXG5cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGZyb20uZ2V0TnVtYmVyKCkgKyAodG8uZ2V0TnVtYmVyKCkgLSBmcm9tLmdldE51bWJlcigpKSAqIHByb2dyZXNzO1xuXG4gICAgICBpZiAoaW5pdGlhbFVuaXRzID09PSAnJScpIHtcbiAgICAgICAgbmV3VmFsdWUgKj0gMTAwLjA7IC8vIG51bVZhbHVlKCkgcmV0dXJucyAwLTEgd2hlcmVhcyBwcm9wZXJ0aWVzIGFyZSAwLTEwMFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQobmV3VmFsdWUpLmNvbmNhdChpbml0aWFsVW5pdHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGRlbHRhKSB7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMuZ2V0UHJvcGVydHkoKTsgLy8gc2V0IGluaXRpYWwgdmFsdWVcblxuICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHByb3AuZ2V0U3RyaW5nKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbFVuaXRzID0gcHJvcC5nZXRVbml0cygpO1xuICAgICAgfSAvLyBpZiB3ZSdyZSBwYXN0IHRoZSBlbmQgdGltZVxuXG5cbiAgICAgIGlmICh0aGlzLmR1cmF0aW9uID4gdGhpcy5tYXhEdXJhdGlvbikge1xuICAgICAgICB2YXIgZmlsbCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWxsJykuZ2V0U3RyaW5nKCdyZW1vdmUnKTsgLy8gbG9vcCBmb3IgaW5kZWZpbml0ZWx5IHJlcGVhdGluZyBhbmltYXRpb25zXG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdyZXBlYXRDb3VudCcpLmdldFN0cmluZygpID09PSAnaW5kZWZpbml0ZScgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3JlcGVhdER1cicpLmdldFN0cmluZygpID09PSAnaW5kZWZpbml0ZScpIHtcbiAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChmaWxsID09PSAnZnJlZXplJyAmJiAhdGhpcy5mcm96ZW4pIHtcbiAgICAgICAgICB0aGlzLmZyb3plbiA9IHRydWU7XG4gICAgICAgICAgcGFyZW50LmFuaW1hdGlvbkZyb3plbiA9IHRydWU7XG4gICAgICAgICAgcGFyZW50LmFuaW1hdGlvbkZyb3plblZhbHVlID0gcHJvcC5nZXRTdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWxsID09PSAncmVtb3ZlJyAmJiAhdGhpcy5yZW1vdmVkKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBwcm9wLnNldFZhbHVlKHBhcmVudC5hbmltYXRpb25Gcm96ZW4gPyBwYXJlbnQuYW5pbWF0aW9uRnJvemVuVmFsdWUgOiB0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHVyYXRpb24gKz0gZGVsdGE7IC8vIGlmIHdlJ3JlIHBhc3QgdGhlIGJlZ2luIHRpbWVcblxuICAgICAgdmFyIHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuYmVnaW4gPCB0aGlzLmR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY2FsY1ZhbHVlKCk7IC8vIHR3ZWVuXG5cbiAgICAgICAgdmFyIHR5cGVBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgICBpZiAodHlwZUF0dHIuaGFzVmFsdWUoKSkge1xuICAgICAgICAgIC8vIGZvciB0cmFuc2Zvcm0sIGV0Yy5cbiAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVBdHRyLmdldFN0cmluZygpO1xuICAgICAgICAgIG5ld1ZhbHVlID0gXCJcIi5jb25jYXQodHlwZSwgXCIoXCIpLmNvbmNhdChuZXdWYWx1ZSwgXCIpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvcC5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UHJvZ3Jlc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHJvZ3Jlc3MoKSB7XG4gICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50LFxuICAgICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgcHJvZ3Jlc3M6ICh0aGlzLmR1cmF0aW9uIC0gdGhpcy5iZWdpbikgLyAodGhpcy5tYXhEdXJhdGlvbiAtIHRoaXMuYmVnaW4pXG4gICAgICB9O1xuXG4gICAgICBpZiAodmFsdWVzLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgdmFyIHAgPSByZXN1bHQucHJvZ3Jlc3MgKiAodmFsdWVzLmdldFZhbHVlKCkubGVuZ3RoIC0gMSk7XG4gICAgICAgIHZhciBsYiA9IE1hdGguZmxvb3IocCk7XG4gICAgICAgIHZhciB1YiA9IE1hdGguY2VpbChwKTtcbiAgICAgICAgcmVzdWx0LmZyb20gPSBuZXcgUHJvcGVydHkoZG9jdW1lbnQsICdmcm9tJywgcGFyc2VGbG9hdCh2YWx1ZXMuZ2V0VmFsdWUoKVtsYl0pKTtcbiAgICAgICAgcmVzdWx0LnRvID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAndG8nLCBwYXJzZUZsb2F0KHZhbHVlcy5nZXRWYWx1ZSgpW3ViXSkpO1xuICAgICAgICByZXN1bHQucHJvZ3Jlc3MgPSAocCAtIGxiKSAvICh1YiAtIGxiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5mcm9tID0gdGhpcy5mcm9tO1xuICAgICAgICByZXN1bHQudG8gPSB0aGlzLnRvO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRlRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRwKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHAoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkcCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgQW5pbWF0ZUNvbG9yRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0FuaW1hdGVFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhBbmltYXRlQ29sb3JFbGVtZW50LCBfQW5pbWF0ZUVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkcChBbmltYXRlQ29sb3JFbGVtZW50KTtcblxuICBmdW5jdGlvbiBBbmltYXRlQ29sb3JFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlQ29sb3JFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdhbmltYXRlQ29sb3InO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBbmltYXRlQ29sb3JFbGVtZW50LCBbe1xuICAgIGtleTogXCJjYWxjVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY1ZhbHVlKCkge1xuICAgICAgdmFyIF90aGlzJGdldFByb2dyZXNzID0gdGhpcy5nZXRQcm9ncmVzcygpLFxuICAgICAgICAgIHByb2dyZXNzID0gX3RoaXMkZ2V0UHJvZ3Jlc3MucHJvZ3Jlc3MsXG4gICAgICAgICAgZnJvbSA9IF90aGlzJGdldFByb2dyZXNzLmZyb20sXG4gICAgICAgICAgdG8gPSBfdGhpcyRnZXRQcm9ncmVzcy50bztcblxuICAgICAgdmFyIGNvbG9yRnJvbSA9IG5ldyBSR0JDb2xvcihmcm9tLmdldENvbG9yKCkpO1xuICAgICAgdmFyIGNvbG9yVG8gPSBuZXcgUkdCQ29sb3IodG8uZ2V0Q29sb3IoKSk7XG5cbiAgICAgIGlmIChjb2xvckZyb20ub2sgJiYgY29sb3JUby5vaykge1xuICAgICAgICAvLyB0d2VlbiBjb2xvciBsaW5lYXJseVxuICAgICAgICB2YXIgciA9IGNvbG9yRnJvbS5yICsgKGNvbG9yVG8uciAtIGNvbG9yRnJvbS5yKSAqIHByb2dyZXNzO1xuICAgICAgICB2YXIgZyA9IGNvbG9yRnJvbS5nICsgKGNvbG9yVG8uZyAtIGNvbG9yRnJvbS5nKSAqIHByb2dyZXNzO1xuICAgICAgICB2YXIgYiA9IGNvbG9yRnJvbS5iICsgKGNvbG9yVG8uYiAtIGNvbG9yRnJvbS5iKSAqIHByb2dyZXNzOyAvLyA/IGFscGhhXG5cbiAgICAgICAgcmV0dXJuIFwicmdiKFwiLmNvbmNhdChwYXJzZUludChyLCAxMCksIFwiLCBcIikuY29uY2F0KHBhcnNlSW50KGcsIDEwKSwgXCIsIFwiKS5jb25jYXQocGFyc2VJbnQoYiwgMTApLCBcIilcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnZnJvbScpLmdldENvbG9yKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGVDb2xvckVsZW1lbnQ7XG59KEFuaW1hdGVFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJHEoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkcSgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRxKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBBbmltYXRlVHJhbnNmb3JtRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0FuaW1hdGVFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhBbmltYXRlVHJhbnNmb3JtRWxlbWVudCwgX0FuaW1hdGVFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJHEoQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIEFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlVHJhbnNmb3JtRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAnYW5pbWF0ZVRyYW5zZm9ybSc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50LCBbe1xuICAgIGtleTogXCJjYWxjVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY1ZhbHVlKCkge1xuICAgICAgdmFyIF90aGlzJGdldFByb2dyZXNzID0gdGhpcy5nZXRQcm9ncmVzcygpLFxuICAgICAgICAgIHByb2dyZXNzID0gX3RoaXMkZ2V0UHJvZ3Jlc3MucHJvZ3Jlc3MsXG4gICAgICAgICAgZnJvbSA9IF90aGlzJGdldFByb2dyZXNzLmZyb20sXG4gICAgICAgICAgdG8gPSBfdGhpcyRnZXRQcm9ncmVzcy50bzsgLy8gdHdlZW4gdmFsdWUgbGluZWFybHlcblxuXG4gICAgICB2YXIgdHJhbnNmb3JtRnJvbSA9IHRvTnVtYmVycyhmcm9tLmdldFN0cmluZygpKTtcbiAgICAgIHZhciB0cmFuc2Zvcm1UbyA9IHRvTnVtYmVycyh0by5nZXRTdHJpbmcoKSk7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0cmFuc2Zvcm1Gcm9tLm1hcChmdW5jdGlvbiAoZnJvbSwgaSkge1xuICAgICAgICB2YXIgdG8gPSB0cmFuc2Zvcm1Ub1tpXTtcbiAgICAgICAgcmV0dXJuIGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzO1xuICAgICAgfSkuam9pbignICcpO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRlVHJhbnNmb3JtRWxlbWVudDtcbn0oQW5pbWF0ZUVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSkgeyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBpdCwgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obik7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJHIoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkcigpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRyKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBGb250RWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEZvbnRFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRyKEZvbnRFbGVtZW50KTtcblxuICBmdW5jdGlvbiBGb250RWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb250RWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2ZvbnQnO1xuICAgIF90aGlzLmdseXBocyA9IHt9O1xuICAgIF90aGlzLmhvcml6QWR2WCA9IF90aGlzLmdldEF0dHJpYnV0ZSgnaG9yaXotYWR2LXgnKS5nZXROdW1iZXIoKTtcbiAgICB2YXIgZGVmaW5pdGlvbnMgPSBkb2N1bWVudC5kZWZpbml0aW9ucztcblxuICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSxcbiAgICAgICAgY2hpbGRyZW4gPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUuY2hpbGRyZW47XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY2hpbGRyZW4pLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdmb250LWZhY2UnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfdGhpcy5mb250RmFjZSA9IGNoaWxkO1xuICAgICAgICAgICAgICB2YXIgZm9udEZhbWlseVN0eWxlID0gY2hpbGQuZ2V0U3R5bGUoJ2ZvbnQtZmFtaWx5Jyk7XG5cbiAgICAgICAgICAgICAgaWYgKGZvbnRGYW1pbHlTdHlsZS5oYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbnNbZm9udEZhbWlseVN0eWxlLmdldFN0cmluZygpXSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgICAgICAgIF90aGlzLm1pc3NpbmdHbHlwaCA9IGNoaWxkO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdnbHlwaCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBnbHlwaCA9IGNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChnbHlwaC5hcmFiaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNSVEwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmlzQXJhYmljID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgX3RoaXMuZ2x5cGhzW2dseXBoLnVuaWNvZGVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuZ2x5cGhzW2dseXBoLnVuaWNvZGVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX3RoaXMuZ2x5cGhzW2dseXBoLnVuaWNvZGVdW2dseXBoLmFyYWJpY0Zvcm1dID0gZ2x5cGg7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZ2x5cGhzW2dseXBoLnVuaWNvZGVdID0gZ2x5cGg7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvbnRFbGVtZW50LCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkgey8vIE5PIFJFTkRFUlxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb250RWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRzKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHMoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkcygpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgRm9udEZhY2VFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoRm9udEZhY2VFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRzKEZvbnRGYWNlRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gRm9udEZhY2VFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvbnRGYWNlRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2ZvbnQtZmFjZSc7XG4gICAgX3RoaXMuYXNjZW50ID0gX3RoaXMuZ2V0QXR0cmlidXRlKCdhc2NlbnQnKS5nZXROdW1iZXIoKTtcbiAgICBfdGhpcy5kZXNjZW50ID0gX3RoaXMuZ2V0QXR0cmlidXRlKCdkZXNjZW50JykuZ2V0TnVtYmVyKCk7XG4gICAgX3RoaXMudW5pdHNQZXJFbSA9IF90aGlzLmdldEF0dHJpYnV0ZSgndW5pdHMtcGVyLWVtJykuZ2V0TnVtYmVyKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEZvbnRGYWNlRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciR0KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHQoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgTWlzc2luZ0dseXBoRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1BhdGhFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhNaXNzaW5nR2x5cGhFbGVtZW50LCBfUGF0aEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkdChNaXNzaW5nR2x5cGhFbGVtZW50KTtcblxuICBmdW5jdGlvbiBNaXNzaW5nR2x5cGhFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNaXNzaW5nR2x5cGhFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdtaXNzaW5nLWdseXBoJztcbiAgICBfdGhpcy5ob3JpekFkdlggPSAwO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBNaXNzaW5nR2x5cGhFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciR1KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHUoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkdSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgR2x5cGhFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUGF0aEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEdseXBoRWxlbWVudCwgX1BhdGhFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJHUoR2x5cGhFbGVtZW50KTtcblxuICBmdW5jdGlvbiBHbHlwaEVsZW1lbnQoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR2x5cGhFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAnZ2x5cGgnO1xuICAgIF90aGlzLmhvcml6QWR2WCA9IF90aGlzLmdldEF0dHJpYnV0ZSgnaG9yaXotYWR2LXgnKS5nZXROdW1iZXIoKTtcbiAgICBfdGhpcy51bmljb2RlID0gX3RoaXMuZ2V0QXR0cmlidXRlKCd1bmljb2RlJykuZ2V0U3RyaW5nKCk7XG4gICAgX3RoaXMuYXJhYmljRm9ybSA9IF90aGlzLmdldEF0dHJpYnV0ZSgnYXJhYmljLWZvcm0nKS5nZXRTdHJpbmcoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gR2x5cGhFbGVtZW50O1xufShQYXRoRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciR2KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHYoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkdigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgVFJlZkVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UZXh0RWxlbWVudCkge1xuICBfaW5oZXJpdHMoVFJlZkVsZW1lbnQsIF9UZXh0RWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciR2KFRSZWZFbGVtZW50KTtcblxuICBmdW5jdGlvbiBUUmVmRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVFJlZkVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ3RyZWYnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUUmVmRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0VGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUZXh0KCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmdldEhyZWZBdHRyaWJ1dGUoKS5nZXREZWZpbml0aW9uKCk7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgICAgIHJldHVybiBmaXJzdENoaWxkLmdldFRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRSZWZFbGVtZW50O1xufShUZXh0RWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciR3KERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHcoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkdygpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgQUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UZXh0RWxlbWVudCkge1xuICBfaW5oZXJpdHMoQUVsZW1lbnQsIF9UZXh0RWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciR3KEFFbGVtZW50KTtcblxuICBmdW5jdGlvbiBBRWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2EnO1xuICAgIHZhciBjaGlsZE5vZGVzID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgIHZhciBmaXJzdENoaWxkID0gY2hpbGROb2Rlc1swXTtcbiAgICB2YXIgaGFzVGV4dCA9IGNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJiBBcnJheS5mcm9tKGNoaWxkTm9kZXMpLmV2ZXJ5KGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMztcbiAgICB9KTtcbiAgICBfdGhpcy5oYXNUZXh0ID0gaGFzVGV4dDtcbiAgICBfdGhpcy50ZXh0ID0gaGFzVGV4dCA/IF90aGlzLmdldFRleHRGcm9tTm9kZShmaXJzdENoaWxkKSA6ICcnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiZ2V0VGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2hpbGRyZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oY3R4KSB7XG4gICAgICBpZiAodGhpcy5oYXNUZXh0KSB7XG4gICAgICAgIC8vIHJlbmRlciBhcyB0ZXh0IGVsZW1lbnRcbiAgICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoQUVsZW1lbnQucHJvdG90eXBlKSwgXCJyZW5kZXJDaGlsZHJlblwiLCB0aGlzKS5jYWxsKHRoaXMsIGN0eCk7XG5cbiAgICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudCxcbiAgICAgICAgICAgIHggPSB0aGlzLngsXG4gICAgICAgICAgICB5ID0gdGhpcy55O1xuICAgICAgICB2YXIgbW91c2UgPSBkb2N1bWVudC5zY3JlZW4ubW91c2U7XG4gICAgICAgIHZhciBmb250U2l6ZSA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRTaXplJywgRm9udC5wYXJzZShkb2N1bWVudC5jdHguZm9udCkuZm9udFNpemUpOyAvLyBEbyBub3QgY2FsYyBib3VuZGluZyBib3ggaWYgbW91c2UgaXMgbm90IHdvcmtpbmcuXG5cbiAgICAgICAgaWYgKG1vdXNlLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgbW91c2UuY2hlY2tCb3VuZGluZ0JveCh0aGlzLCBuZXcgQm91bmRpbmdCb3goeCwgeSAtIGZvbnRTaXplLmdldFBpeGVscygneScpLCB4ICsgdGhpcy5tZWFzdXJlVGV4dChjdHgpLCB5KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHJlbmRlciBhcyB0ZW1wb3JhcnkgZ3JvdXBcbiAgICAgICAgdmFyIGcgPSBuZXcgR0VsZW1lbnQodGhpcy5kb2N1bWVudCwgbnVsbCk7XG4gICAgICAgIGcuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgICBnLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIGcucmVuZGVyKGN0eCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQ2xpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgIHZhciB3aW5kb3cgPSB0aGlzLmRvY3VtZW50LndpbmRvdztcblxuICAgICAgaWYgKHdpbmRvdykge1xuICAgICAgICB3aW5kb3cub3Blbih0aGlzLmdldEhyZWZBdHRyaWJ1dGUoKS5nZXRTdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uTW91c2VNb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKCkge1xuICAgICAgdmFyIGN0eCA9IHRoaXMuZG9jdW1lbnQuY3R4O1xuICAgICAgY3R4LmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFFbGVtZW50O1xufShUZXh0RWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyJDEobykgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8pKSkgeyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBpdCwgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG4pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQxKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkeChEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCR4KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHgoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFRleHRQYXRoRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RleHRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhUZXh0UGF0aEVsZW1lbnQsIF9UZXh0RWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciR4KFRleHRQYXRoRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gVGV4dFBhdGhFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRQYXRoRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ3RleHRQYXRoJztcbiAgICBfdGhpcy50ZXh0V2lkdGggPSAwO1xuICAgIF90aGlzLnRleHRIZWlnaHQgPSAwO1xuICAgIF90aGlzLnBhdGhMZW5ndGggPSAtMTtcbiAgICBfdGhpcy5nbHlwaEluZm8gPSBudWxsO1xuICAgIF90aGlzLmxldHRlclNwYWNpbmdDYWNoZSA9IFtdO1xuICAgIF90aGlzLm1lYXN1cmVzQ2FjaGUgPSBuZXcgTWFwKFtbJycsIDBdXSk7XG5cbiAgICB2YXIgcGF0aEVsZW1lbnQgPSBfdGhpcy5nZXRIcmVmQXR0cmlidXRlKCkuZ2V0RGVmaW5pdGlvbigpO1xuXG4gICAgX3RoaXMudGV4dCA9IF90aGlzLmdldFRleHRGcm9tTm9kZSgpO1xuICAgIF90aGlzLmRhdGFBcnJheSA9IF90aGlzLnBhcnNlUGF0aERhdGEocGF0aEVsZW1lbnQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0UGF0aEVsZW1lbnQsIFt7XG4gICAga2V5OiBcImdldFRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aChjdHgpIHtcbiAgICAgIHZhciBkYXRhQXJyYXkgPSB0aGlzLmRhdGFBcnJheTtcblxuICAgICAgaWYgKGN0eCkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICB9XG5cbiAgICAgIGRhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBjb21tYW5kID0gX3JlZi5jb21tYW5kLFxuICAgICAgICAgICAgcG9pbnRzID0gX3JlZi5wb2ludHM7XG5cbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICAgIGN0eC5saW5lVG8ocG9pbnRzWzBdLCBwb2ludHNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgICBjdHgubW92ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8ocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBjeCA9IHBvaW50c1swXTtcbiAgICAgICAgICAgICAgdmFyIGN5ID0gcG9pbnRzWzFdO1xuICAgICAgICAgICAgICB2YXIgcnggPSBwb2ludHNbMl07XG4gICAgICAgICAgICAgIHZhciByeSA9IHBvaW50c1szXTtcbiAgICAgICAgICAgICAgdmFyIHRoZXRhID0gcG9pbnRzWzRdO1xuICAgICAgICAgICAgICB2YXIgZFRoZXRhID0gcG9pbnRzWzVdO1xuICAgICAgICAgICAgICB2YXIgcHNpID0gcG9pbnRzWzZdO1xuICAgICAgICAgICAgICB2YXIgZnMgPSBwb2ludHNbN107XG4gICAgICAgICAgICAgIHZhciByID0gcnggPiByeSA/IHJ4IDogcnk7XG4gICAgICAgICAgICAgIHZhciBzY2FsZVggPSByeCA+IHJ5ID8gMSA6IHJ4IC8gcnk7XG4gICAgICAgICAgICAgIHZhciBzY2FsZVkgPSByeCA+IHJ5ID8gcnkgLyByeCA6IDE7XG5cbiAgICAgICAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgICAgICAgICBjdHgucm90YXRlKHBzaSk7XG4gICAgICAgICAgICAgICAgY3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgICAgICAgICAgICBjdHguYXJjKDAsIDAsIHIsIHRoZXRhLCB0aGV0YSArIGRUaGV0YSwgQm9vbGVhbigxIC0gZnMpKTtcbiAgICAgICAgICAgICAgICBjdHguc2NhbGUoMSAvIHNjYWxlWCwgMSAvIHNjYWxlWSk7XG4gICAgICAgICAgICAgICAgY3R4LnJvdGF0ZSgtcHNpKTtcbiAgICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKC1jeCwgLWN5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAneic6XG4gICAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbihjdHgpIHtcbiAgICAgIHRoaXMuc2V0VGV4dERhdGEoY3R4KTtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICB2YXIgdGV4dERlY29yYXRpb24gPSB0aGlzLnBhcmVudC5nZXRTdHlsZSgndGV4dC1kZWNvcmF0aW9uJykuZ2V0U3RyaW5nKCk7XG4gICAgICB2YXIgZm9udFNpemUgPSB0aGlzLmdldEZvbnRTaXplKCk7XG4gICAgICB2YXIgZ2x5cGhJbmZvID0gdGhpcy5nbHlwaEluZm87XG4gICAgICB2YXIgZmlsbCA9IGN0eC5maWxsU3R5bGU7XG5cbiAgICAgIGlmICh0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZScpIHtcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgfVxuXG4gICAgICBnbHlwaEluZm8uZm9yRWFjaChmdW5jdGlvbiAoZ2x5cGgsIGkpIHtcbiAgICAgICAgdmFyIHAwID0gZ2x5cGgucDAsXG4gICAgICAgICAgICBwMSA9IGdseXBoLnAxLFxuICAgICAgICAgICAgcGFydGlhbFRleHQgPSBnbHlwaC50ZXh0O1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHgudHJhbnNsYXRlKHAwLngsIHAwLnkpO1xuICAgICAgICBjdHgucm90YXRlKGdseXBoSW5mb1tpXS5yb3RhdGlvbik7XG5cbiAgICAgICAgaWYgKGN0eC5maWxsU3R5bGUpIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQocGFydGlhbFRleHQsIDAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN0eC5zdHJva2VTdHlsZSkge1xuICAgICAgICAgIGN0eC5zdHJva2VUZXh0KHBhcnRpYWxUZXh0LCAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG5cbiAgICAgICAgaWYgKHRleHREZWNvcmF0aW9uID09PSAndW5kZXJsaW5lJykge1xuICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHAwLngsIHAwLnkgKyBmb250U2l6ZSAvIDgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN0eC5saW5lVG8ocDEueCwgcDEueSArIGZvbnRTaXplIC8gNSk7XG4gICAgICAgIH0gLy8vLyBUbyBhc3Npc3Qgd2l0aCBkZWJ1Z2dpbmcgdmlzdWFsbHksIHVuY29tbWVudCBmb2xsb3dpbmdcbiAgICAgICAgLy9cbiAgICAgICAgLy8gY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAvLyBpZiAoaSAlIDIpXG4gICAgICAgIC8vIFx0Y3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgIC8vIGVsc2VcbiAgICAgICAgLy8gXHRjdHguc3Ryb2tlU3R5bGUgPSAnZ3JlZW4nO1xuICAgICAgICAvLyBjdHgubW92ZVRvKHAwLngsIHAwLnkpO1xuICAgICAgICAvLyBjdHgubGluZVRvKHAxLngsIHAxLnkpO1xuICAgICAgICAvLyBjdHguc3Ryb2tlKCk7XG4gICAgICAgIC8vIGN0eC5jbG9zZVBhdGgoKTtcblxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZScpIHtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGZvbnRTaXplIC8gMjA7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGZpbGw7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgfVxuXG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMZXR0ZXJTcGFjaW5nQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGV0dGVyU3BhY2luZ0F0KCkge1xuICAgICAgdmFyIGlkeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgICAgIHJldHVybiB0aGlzLmxldHRlclNwYWNpbmdDYWNoZVtpZHhdIHx8IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRTZWdtZW50VG9GaXRDaGFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRTZWdtZW50VG9GaXRDaGFyKGN0eCwgYW5jaG9yLCB0ZXh0RnVsbFdpZHRoLCBmdWxsUGF0aFdpZHRoLCBzcGFjZXNOdW1iZXIsIGlucHV0T2Zmc2V0LCBjLCBjaGFySSkge1xuICAgICAgdmFyIG9mZnNldCA9IGlucHV0T2Zmc2V0O1xuICAgICAgdmFyIGdseXBoV2lkdGggPSB0aGlzLm1lYXN1cmVUZXh0KGN0eCwgYyk7XG5cbiAgICAgIGlmIChjID09PSAnICcgJiYgYW5jaG9yID09PSAnanVzdGlmeScgJiYgdGV4dEZ1bGxXaWR0aCA8IGZ1bGxQYXRoV2lkdGgpIHtcbiAgICAgICAgZ2x5cGhXaWR0aCArPSAoZnVsbFBhdGhXaWR0aCAtIHRleHRGdWxsV2lkdGgpIC8gc3BhY2VzTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhckkgPiAtMSkge1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5nZXRMZXR0ZXJTcGFjaW5nQXQoY2hhckkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3BsaW5lU3RlcCA9IHRoaXMudGV4dEhlaWdodCAvIDIwO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiB0aGlzLmdldEVxdWlkaXN0YW50UG9pbnRPblBhdGgob2Zmc2V0LCBzcGxpbmVTdGVwKSxcbiAgICAgICAgcDE6IHRoaXMuZ2V0RXF1aWRpc3RhbnRQb2ludE9uUGF0aChvZmZzZXQgKyBnbHlwaFdpZHRoLCBzcGxpbmVTdGVwKVxuICAgICAgfTtcbiAgICAgIG9mZnNldCArPSBnbHlwaFdpZHRoO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIHNlZ21lbnQ6IHNlZ21lbnRcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1lYXN1cmVUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1lYXN1cmVUZXh0KGN0eCwgdGV4dCkge1xuICAgICAgdmFyIG1lYXN1cmVzQ2FjaGUgPSB0aGlzLm1lYXN1cmVzQ2FjaGU7XG4gICAgICB2YXIgdGFyZ2V0VGV4dCA9IHRleHQgfHwgdGhpcy5nZXRUZXh0KCk7XG5cbiAgICAgIGlmIChtZWFzdXJlc0NhY2hlLmhhcyh0YXJnZXRUZXh0KSkge1xuICAgICAgICByZXR1cm4gbWVhc3VyZXNDYWNoZS5nZXQodGFyZ2V0VGV4dCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBtZWFzdXJlID0gdGhpcy5tZWFzdXJlVGFyZ2V0VGV4dChjdHgsIHRhcmdldFRleHQpO1xuICAgICAgbWVhc3VyZXNDYWNoZS5zZXQodGFyZ2V0VGV4dCwgbWVhc3VyZSk7XG4gICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICB9IC8vIFRoaXMgbWV0aG9kIHN1cHBvc2VzIHdoYXQgYWxsIGN1c3RvbSBmb250cyBhbHJlYWR5IGxvYWRlZC5cbiAgICAvLyBJZiBzb21lIGZvbnQgd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbCwgPHRleHRQYXRoPiB3aWxsIG5vdCBiZSByZW5kZXJlZCBjb3JyZWN0bHkuXG4gICAgLy8gWW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBtYW51YWxseSB0byB1cGRhdGUgZ2x5cGhzIGNhY2hlLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4dERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dERhdGEoY3R4KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuZ2x5cGhJbmZvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbmRlclRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgICAgIHZhciBjaGFycyA9IHJlbmRlclRleHQuc3BsaXQoJycpO1xuICAgICAgdmFyIHNwYWNlc051bWJlciA9IHJlbmRlclRleHQuc3BsaXQoJyAnKS5sZW5ndGggLSAxO1xuICAgICAgdmFyIGR4ID0gdG9OdW1iZXJzKHRoaXMucGFyZW50LmdldEF0dHJpYnV0ZSgnZHgnKS5nZXRTdHJpbmcoJzAnKSk7XG4gICAgICB2YXIgYW5jaG9yID0gdGhpcy5wYXJlbnQuZ2V0U3R5bGUoJ3RleHQtYW5jaG9yJykuZ2V0U3RyaW5nKCdzdGFydCcpO1xuICAgICAgdmFyIHRoaXNTcGFjaW5nID0gdGhpcy5nZXRTdHlsZSgnbGV0dGVyLXNwYWNpbmcnKTtcbiAgICAgIHZhciBwYXJlbnRTcGFjaW5nID0gdGhpcy5wYXJlbnQuZ2V0U3R5bGUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICB2YXIgbGV0dGVyU3BhY2luZyA9IDA7XG5cbiAgICAgIGlmICghdGhpc1NwYWNpbmcuaGFzVmFsdWUoKSB8fCB0aGlzU3BhY2luZy5nZXRWYWx1ZSgpID09PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgbGV0dGVyU3BhY2luZyA9IHBhcmVudFNwYWNpbmcuZ2V0UGl4ZWxzKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXNTcGFjaW5nLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgaWYgKHRoaXNTcGFjaW5nLmdldFZhbHVlKCkgIT09ICdpbml0aWFsJyAmJiB0aGlzU3BhY2luZy5nZXRWYWx1ZSgpICE9PSAndW5zZXQnKSB7XG4gICAgICAgICAgbGV0dGVyU3BhY2luZyA9IHRoaXNTcGFjaW5nLmdldFBpeGVscygpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGZpbGwgbGV0dGVyLXNwYWNpbmcgY2FjaGVcblxuXG4gICAgICB2YXIgbGV0dGVyU3BhY2luZ0NhY2hlID0gW107XG4gICAgICB2YXIgdGV4dExlbiA9IHJlbmRlclRleHQubGVuZ3RoO1xuICAgICAgdGhpcy5sZXR0ZXJTcGFjaW5nQ2FjaGUgPSBsZXR0ZXJTcGFjaW5nQ2FjaGU7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dExlbjsgaSsrKSB7XG4gICAgICAgIGxldHRlclNwYWNpbmdDYWNoZS5wdXNoKHR5cGVvZiBkeFtpXSAhPT0gJ3VuZGVmaW5lZCcgPyBkeFtpXSA6IGxldHRlclNwYWNpbmcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHhTdW0gPSBsZXR0ZXJTcGFjaW5nQ2FjaGUucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cikge1xuICAgICAgICByZXR1cm4gYWNjICsgY3VyIHx8IDA7XG4gICAgICB9LCAwKTtcbiAgICAgIHRoaXMudGV4dFdpZHRoID0gdGhpcy5tZWFzdXJlVGV4dChjdHgpO1xuICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGhpcy5nZXRGb250U2l6ZSgpO1xuICAgICAgdmFyIHRleHRGdWxsV2lkdGggPSBNYXRoLm1heCh0aGlzLnRleHRXaWR0aCArIGR4U3VtLCAwKTtcbiAgICAgIHRoaXMuZ2x5cGhJbmZvID0gW107XG4gICAgICB2YXIgZnVsbFBhdGhXaWR0aCA9IHRoaXMuZ2V0UGF0aExlbmd0aCgpO1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gdGhpcy5nZXRTdHlsZSgnc3RhcnRPZmZzZXQnKS5nZXROdW1iZXIoMCkgKiBmdWxsUGF0aFdpZHRoO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICAgIGlmIChhbmNob3IgPT09ICdtaWRkbGUnIHx8IGFuY2hvciA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgb2Zmc2V0ID0gLXRleHRGdWxsV2lkdGggLyAyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYW5jaG9yID09PSAnZW5kJyB8fCBhbmNob3IgPT09ICdyaWdodCcpIHtcbiAgICAgICAgb2Zmc2V0ID0gLXRleHRGdWxsV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIG9mZnNldCArPSBzdGFydE9mZnNldDtcbiAgICAgIGNoYXJzLmZvckVhY2goZnVuY3Rpb24gKGNoYXIsIGkpIHtcbiAgICAgICAgLy8gRmluZCBzdWNoIHNlZ21lbnQgd2hhdCBkaXN0YW5jZSBiZXR3ZWVuIHAwIGFuZCBwMSBpcyBhcHByb3guIHdpZHRoIG9mIGdseXBoXG4gICAgICAgIHZhciBfdGhpczIkZmluZFNlZ21lbnRUb0YgPSBfdGhpczIuZmluZFNlZ21lbnRUb0ZpdENoYXIoY3R4LCBhbmNob3IsIHRleHRGdWxsV2lkdGgsIGZ1bGxQYXRoV2lkdGgsIHNwYWNlc051bWJlciwgb2Zmc2V0LCBjaGFyLCBpKSxcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBfdGhpczIkZmluZFNlZ21lbnRUb0Yub2Zmc2V0LFxuICAgICAgICAgICAgc2VnbWVudCA9IF90aGlzMiRmaW5kU2VnbWVudFRvRi5zZWdtZW50O1xuXG4gICAgICAgIG9mZnNldCA9IG5leHRPZmZzZXQ7XG5cbiAgICAgICAgaWYgKCFzZWdtZW50LnAwIHx8ICFzZWdtZW50LnAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpZHRoID0gX3RoaXMyLmdldExpbmVMZW5ndGgoc2VnbWVudC5wMC54LCBzZWdtZW50LnAwLnksIHNlZ21lbnQucDEueCwgc2VnbWVudC5wMS55KTsgLy8gTm90ZTogU2luY2UgZ2x5cGhzIGFyZSByZW5kZXJlZCBvbmUgYXQgYSB0aW1lLCBhbnkga2VybmluZyBwYWlyIGRhdGEgYnVpbHQgaW50byB0aGUgZm9udCB3aWxsIG5vdCBiZSB1c2VkLlxuICAgICAgICAvLyBDYW4gZm9yZXNlZSBoYXZpbmcgYSByb3VnaCBwYWlyIHRhYmxlIGJ1aWx0IGluIHRoYXQgdGhlIGRldmVsb3BlciBjYW4gb3ZlcnJpZGUgYXMgbmVlZGVkLlxuICAgICAgICAvLyBPciB1c2UgXCJkeFwiIGF0dHJpYnV0ZSBvZiB0aGUgPHRleHQ+IG5vZGUgYXMgYSBuYWl2ZSByZXBsYWNlbWVudFxuXG5cbiAgICAgICAgdmFyIGtlcm4gPSAwOyAvLyBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgdmFyIG1pZHBvaW50ID0gX3RoaXMyLmdldFBvaW50T25MaW5lKGtlcm4gKyB3aWR0aCAvIDIuMCwgc2VnbWVudC5wMC54LCBzZWdtZW50LnAwLnksIHNlZ21lbnQucDEueCwgc2VnbWVudC5wMS55KTtcblxuICAgICAgICB2YXIgcm90YXRpb24gPSBNYXRoLmF0YW4yKHNlZ21lbnQucDEueSAtIHNlZ21lbnQucDAueSwgc2VnbWVudC5wMS54IC0gc2VnbWVudC5wMC54KTtcblxuICAgICAgICBfdGhpczIuZ2x5cGhJbmZvLnB1c2goe1xuICAgICAgICAgIHRyYW5zcG9zZVg6IG1pZHBvaW50LngsXG4gICAgICAgICAgdHJhbnNwb3NlWTogbWlkcG9pbnQueSxcbiAgICAgICAgICB0ZXh0OiBjaGFyc1tpXSxcbiAgICAgICAgICBwMDogc2VnbWVudC5wMCxcbiAgICAgICAgICBwMTogc2VnbWVudC5wMSxcbiAgICAgICAgICByb3RhdGlvbjogcm90YXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VQYXRoRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVBhdGhEYXRhKHBhdGgpIHtcbiAgICAgIHRoaXMucGF0aExlbmd0aCA9IC0xOyAvLyByZXNldCBwYXRoIGxlbmd0aFxuXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGF0aENvbW1hbmRzID0gW107XG4gICAgICB2YXIgcGF0aFBhcnNlciA9IHBhdGgucGF0aFBhcnNlcjtcbiAgICAgIHBhdGhQYXJzZXIucmVzZXQoKTsgLy8gY29udmVydCBsLCBILCBoLCBWLCBhbmQgdiB0byBMXG5cbiAgICAgIHdoaWxlICghcGF0aFBhcnNlci5pc0VuZCgpKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gcGF0aFBhcnNlci5jdXJyZW50O1xuICAgICAgICB2YXIgc3RhcnRYID0gY3VycmVudCA/IGN1cnJlbnQueCA6IDA7XG4gICAgICAgIHZhciBzdGFydFkgPSBjdXJyZW50ID8gY3VycmVudC55IDogMDtcbiAgICAgICAgdmFyIGNtZCA9ICcnO1xuICAgICAgICB2YXIgcG9pbnRzID0gW107XG4gICAgICAgIHBhdGhQYXJzZXIubmV4dENvbW1hbmQoKTtcbiAgICAgICAgdmFyIHVwcGVyQ29tbWFuZCA9IHBhdGhQYXJzZXIuY29tbWFuZC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIHN3aXRjaCAocGF0aFBhcnNlci5jb21tYW5kKSB7XG4gICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICBjbWQgPSB0aGlzLnBhdGhNKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgY21kID0gdGhpcy5wYXRoTChwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIGNtZCA9IHRoaXMucGF0aEgocGF0aFBhcnNlciwgcG9pbnRzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnVic6XG4gICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICBjbWQgPSB0aGlzLnBhdGhWKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgdGhpcy5wYXRoQyhwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIGNtZCA9IHRoaXMucGF0aFMocGF0aFBhcnNlciwgcG9pbnRzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgY2FzZSAncSc6XG4gICAgICAgICAgICB0aGlzLnBhdGhRKHBhdGhQYXJzZXIsIHBvaW50cyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgY21kID0gdGhpcy5wYXRoVChwYXRoUGFyc2VyLCBwb2ludHMpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgIHBvaW50cyA9IHRoaXMucGF0aEEocGF0aFBhcnNlcik7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgICAgcGF0aFBhcnNlci5jdXJyZW50ID0gcGF0aFBhcnNlci5zdGFydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwcGVyQ29tbWFuZCAhPT0gJ1onKSB7XG4gICAgICAgICAgcGF0aENvbW1hbmRzLnB1c2goe1xuICAgICAgICAgICAgY29tbWFuZDogY21kIHx8IHVwcGVyQ29tbWFuZCxcbiAgICAgICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgeDogc3RhcnRYLFxuICAgICAgICAgICAgICB5OiBzdGFydFlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoTGVuZ3RoOiB0aGlzLmNhbGNMZW5ndGgoc3RhcnRYLCBzdGFydFksIGNtZCB8fCB1cHBlckNvbW1hbmQsIHBvaW50cylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoQ29tbWFuZHMucHVzaCh7XG4gICAgICAgICAgICBjb21tYW5kOiAneicsXG4gICAgICAgICAgICBwb2ludHM6IFtdLFxuICAgICAgICAgICAgcGF0aExlbmd0aDogMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXRoQ29tbWFuZHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhNXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhNKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgICAgdmFyIHAgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7IC8vIHBhdGhQYXJzZXIuYWRkTWFya2VyKHApO1xuXG4gICAgICBwb2ludHMucHVzaChwLngsIHAueSk7XG4gICAgICBwYXRoUGFyc2VyLnN0YXJ0ID0gcGF0aFBhcnNlci5jdXJyZW50O1xuXG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgX3AgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG5cbiAgICAgICAgcG9pbnRzLnB1c2goX3AueCwgX3AueSk7XG4gICAgICAgIHJldHVybiAnTCc7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhMXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhMKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIHAgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgICAgIHBvaW50cy5wdXNoKHAueCwgcC55KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdMJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aEhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aEgocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KChwYXRoUGFyc2VyLmlzUmVsYXRpdmVDb21tYW5kKCkgPyBjdXJyZW50LnggOiAwKSArIHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCksIGN1cnJlbnQueSk7XG4gICAgICAgIHBvaW50cy5wdXNoKHBvaW50LngsIHBvaW50LnkpO1xuICAgICAgICBwYXRoUGFyc2VyLmN1cnJlbnQgPSBwb2ludDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdMJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aFZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aFYocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHBhdGhQYXJzZXIuY3VycmVudDtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KGN1cnJlbnQueCwgKHBhdGhQYXJzZXIuaXNSZWxhdGl2ZUNvbW1hbmQoKSA/IGN1cnJlbnQueSA6IDApICsgcGF0aFBhcnNlci5nZXRTY2FsYXIoKSk7XG4gICAgICAgIHBvaW50cy5wdXNoKHBvaW50LngsIHBvaW50LnkpO1xuICAgICAgICBwYXRoUGFyc2VyLmN1cnJlbnQgPSBwb2ludDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdMJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aENcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aEMocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgcG9pbnQgPSBwYXRoUGFyc2VyLmdldFBvaW50KCk7XG4gICAgICAgIHZhciBjb250cm9sUG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ29udHJvbFBvaW50KCk7XG4gICAgICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgICAgIHBvaW50cy5wdXNoKHBvaW50LngsIHBvaW50LnksIGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aFNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aFMocGF0aFBhcnNlciwgcG9pbnRzKSB7XG4gICAgICB3aGlsZSAoIXBhdGhQYXJzZXIuaXNDb21tYW5kT3JFbmQoKSkge1xuICAgICAgICB2YXIgcG9pbnQgPSBwYXRoUGFyc2VyLmdldFJlZmxlY3RlZENvbnRyb2xQb2ludCgpO1xuICAgICAgICB2YXIgY29udHJvbFBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0NvbnRyb2xQb2ludCgpO1xuICAgICAgICB2YXIgY3VycmVudFBvaW50ID0gcGF0aFBhcnNlci5nZXRBc0N1cnJlbnRQb2ludCgpO1xuICAgICAgICBwb2ludHMucHVzaChwb2ludC54LCBwb2ludC55LCBjb250cm9sUG9pbnQueCwgY29udHJvbFBvaW50LnksIGN1cnJlbnRQb2ludC54LCBjdXJyZW50UG9pbnQueSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnQyc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhRXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGhRKHBhdGhQYXJzZXIsIHBvaW50cykge1xuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDb250cm9sUG9pbnQoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTtcbiAgICAgICAgcG9pbnRzLnB1c2goY29udHJvbFBvaW50LngsIGNvbnRyb2xQb2ludC55LCBjdXJyZW50UG9pbnQueCwgY3VycmVudFBvaW50LnkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoVFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoVChwYXRoUGFyc2VyLCBwb2ludHMpIHtcbiAgICAgIHdoaWxlICghcGF0aFBhcnNlci5pc0NvbW1hbmRPckVuZCgpKSB7XG4gICAgICAgIHZhciBjb250cm9sUG9pbnQgPSBwYXRoUGFyc2VyLmdldFJlZmxlY3RlZENvbnRyb2xQb2ludCgpO1xuICAgICAgICBwYXRoUGFyc2VyLmNvbnRyb2wgPSBjb250cm9sUG9pbnQ7XG4gICAgICAgIHZhciBjdXJyZW50UG9pbnQgPSBwYXRoUGFyc2VyLmdldEFzQ3VycmVudFBvaW50KCk7XG4gICAgICAgIHBvaW50cy5wdXNoKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgY3VycmVudFBvaW50LngsIGN1cnJlbnRQb2ludC55KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdRJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aEFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aEEocGF0aFBhcnNlcikge1xuICAgICAgd2hpbGUgKCFwYXRoUGFyc2VyLmlzQ29tbWFuZE9yRW5kKCkpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXRoUGFyc2VyLmN1cnJlbnQ7IC8vIHgxLCB5MVxuXG4gICAgICAgIHZhciByeCA9IHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCk7XG4gICAgICAgIHZhciByeSA9IHBhdGhQYXJzZXIuZ2V0U2NhbGFyKCk7XG4gICAgICAgIHZhciB4QXhpc1JvdGF0aW9uID0gcGF0aFBhcnNlci5nZXRTY2FsYXIoKSAqIChNYXRoLlBJIC8gMTgwLjApOyAvLyDPhlxuXG4gICAgICAgIHZhciBsYXJnZUFyY0ZsYWcgPSBwYXRoUGFyc2VyLmdldFNjYWxhcigpOyAvLyAgZkFcblxuICAgICAgICB2YXIgc3dlZXBGbGFnID0gcGF0aFBhcnNlci5nZXRTY2FsYXIoKTsgLy8gIGZTXG5cbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHBhdGhQYXJzZXIuZ2V0QXNDdXJyZW50UG9pbnQoKTsgLy8geDIsIHkyXG4gICAgICAgIC8vIENvbnZlcnNpb24gZnJvbSBlbmRwb2ludCB0byBjZW50ZXIgcGFyYW1ldGVyaXphdGlvblxuICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9pbXBsbm90ZS5odG1sI0FyY0ltcGxlbWVudGF0aW9uTm90ZXNcbiAgICAgICAgLy8geDEnLCB5MSdcblxuICAgICAgICB2YXIgY3VycnAgPSBuZXcgUG9pbnQoTWF0aC5jb3MoeEF4aXNSb3RhdGlvbikgKiAoY3VycmVudC54IC0gY3VycmVudFBvaW50LngpIC8gMi4wICsgTWF0aC5zaW4oeEF4aXNSb3RhdGlvbikgKiAoY3VycmVudC55IC0gY3VycmVudFBvaW50LnkpIC8gMi4wLCAtTWF0aC5zaW4oeEF4aXNSb3RhdGlvbikgKiAoY3VycmVudC54IC0gY3VycmVudFBvaW50LngpIC8gMi4wICsgTWF0aC5jb3MoeEF4aXNSb3RhdGlvbikgKiAoY3VycmVudC55IC0gY3VycmVudFBvaW50LnkpIC8gMi4wKTsgLy8gYWRqdXN0IHJhZGlpXG5cbiAgICAgICAgdmFyIGwgPSBNYXRoLnBvdyhjdXJycC54LCAyKSAvIE1hdGgucG93KHJ4LCAyKSArIE1hdGgucG93KGN1cnJwLnksIDIpIC8gTWF0aC5wb3cocnksIDIpO1xuXG4gICAgICAgIGlmIChsID4gMSkge1xuICAgICAgICAgIHJ4ICo9IE1hdGguc3FydChsKTtcbiAgICAgICAgICByeSAqPSBNYXRoLnNxcnQobCk7XG4gICAgICAgIH0gLy8gY3gnLCBjeSdcblxuXG4gICAgICAgIHZhciBzID0gKGxhcmdlQXJjRmxhZyA9PT0gc3dlZXBGbGFnID8gLTEgOiAxKSAqIE1hdGguc3FydCgoTWF0aC5wb3cocngsIDIpICogTWF0aC5wb3cocnksIDIpIC0gTWF0aC5wb3cocngsIDIpICogTWF0aC5wb3coY3VycnAueSwgMikgLSBNYXRoLnBvdyhyeSwgMikgKiBNYXRoLnBvdyhjdXJycC54LCAyKSkgLyAoTWF0aC5wb3cocngsIDIpICogTWF0aC5wb3coY3VycnAueSwgMikgKyBNYXRoLnBvdyhyeSwgMikgKiBNYXRoLnBvdyhjdXJycC54LCAyKSkpO1xuXG4gICAgICAgIGlmIChpc05hTihzKSkge1xuICAgICAgICAgIHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNwcCA9IG5ldyBQb2ludChzICogcnggKiBjdXJycC55IC8gcnksIHMgKiAtcnkgKiBjdXJycC54IC8gcngpOyAvLyBjeCwgY3lcblxuICAgICAgICB2YXIgY2VudHAgPSBuZXcgUG9pbnQoKGN1cnJlbnQueCArIGN1cnJlbnRQb2ludC54KSAvIDIuMCArIE1hdGguY29zKHhBeGlzUm90YXRpb24pICogY3BwLnggLSBNYXRoLnNpbih4QXhpc1JvdGF0aW9uKSAqIGNwcC55LCAoY3VycmVudC55ICsgY3VycmVudFBvaW50LnkpIC8gMi4wICsgTWF0aC5zaW4oeEF4aXNSb3RhdGlvbikgKiBjcHAueCArIE1hdGguY29zKHhBeGlzUm90YXRpb24pICogY3BwLnkpOyAvLyBpbml0aWFsIGFuZ2xlXG5cbiAgICAgICAgdmFyIGExID0gdmVjdG9yc0FuZ2xlKFsxLCAwXSwgWyhjdXJycC54IC0gY3BwLngpIC8gcngsIChjdXJycC55IC0gY3BwLnkpIC8gcnldKTsgLy8gzrgxXG4gICAgICAgIC8vIGFuZ2xlIGRlbHRhXG5cbiAgICAgICAgdmFyIHUgPSBbKGN1cnJwLnggLSBjcHAueCkgLyByeCwgKGN1cnJwLnkgLSBjcHAueSkgLyByeV07XG4gICAgICAgIHZhciB2ID0gWygtY3VycnAueCAtIGNwcC54KSAvIHJ4LCAoLWN1cnJwLnkgLSBjcHAueSkgLyByeV07XG4gICAgICAgIHZhciBhZCA9IHZlY3RvcnNBbmdsZSh1LCB2KTsgLy8gzpTOuFxuXG4gICAgICAgIGlmICh2ZWN0b3JzUmF0aW8odSwgdikgPD0gLTEpIHtcbiAgICAgICAgICBhZCA9IE1hdGguUEk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmVjdG9yc1JhdGlvKHUsIHYpID49IDEpIHtcbiAgICAgICAgICBhZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3dlZXBGbGFnID09PSAwICYmIGFkID4gMCkge1xuICAgICAgICAgIGFkID0gYWQgLSAyICogTWF0aC5QSTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzd2VlcEZsYWcgPT09IDEgJiYgYWQgPCAwKSB7XG4gICAgICAgICAgYWQgPSBhZCArIDIgKiBNYXRoLlBJO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjZW50cC54LCBjZW50cC55LCByeCwgcnksIGExLCBhZCwgeEF4aXNSb3RhdGlvbiwgc3dlZXBGbGFnXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FsY0xlbmd0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjTGVuZ3RoKHgsIHksIGNtZCwgcG9pbnRzKSB7XG4gICAgICB2YXIgbGVuID0gMDtcbiAgICAgIHZhciBwMSA9IG51bGw7XG4gICAgICB2YXIgcDIgPSBudWxsO1xuICAgICAgdmFyIHQgPSAwO1xuXG4gICAgICBzd2l0Y2ggKGNtZCkge1xuICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTGVuZ3RoKHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdKTtcblxuICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAvLyBBcHByb3hpbWF0ZXMgYnkgYnJlYWtpbmcgY3VydmUgaW50byAxMDAgbGluZSBzZWdtZW50c1xuICAgICAgICAgIGxlbiA9IDAuMDtcbiAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPbkN1YmljQmV6aWVyKDAsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCBwb2ludHNbNV0pO1xuXG4gICAgICAgICAgZm9yICh0ID0gMC4wMTsgdCA8PSAxOyB0ICs9IDAuMDEpIHtcbiAgICAgICAgICAgIHAyID0gdGhpcy5nZXRQb2ludE9uQ3ViaWNCZXppZXIodCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG4gICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbGVuO1xuXG4gICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgIC8vIEFwcHJveGltYXRlcyBieSBicmVha2luZyBjdXJ2ZSBpbnRvIDEwMCBsaW5lIHNlZ21lbnRzXG4gICAgICAgICAgbGVuID0gMC4wO1xuICAgICAgICAgIHAxID0gdGhpcy5nZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKDAsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG5cbiAgICAgICAgICBmb3IgKHQgPSAwLjAxOyB0IDw9IDE7IHQgKz0gMC4wMSkge1xuICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIodCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTtcbiAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBsZW47XG5cbiAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgLy8gQXBwcm94aW1hdGVzIGJ5IGJyZWFraW5nIGN1cnZlIGludG8gbGluZSBzZWdtZW50c1xuICAgICAgICAgIGxlbiA9IDAuMDtcbiAgICAgICAgICB2YXIgc3RhcnQgPSBwb2ludHNbNF07IC8vIDQgPSB0aGV0YVxuXG4gICAgICAgICAgdmFyIGRUaGV0YSA9IHBvaW50c1s1XTsgLy8gNSA9IGRUaGV0YVxuXG4gICAgICAgICAgdmFyIGVuZCA9IHBvaW50c1s0XSArIGRUaGV0YTtcbiAgICAgICAgICB2YXIgaW5jID0gTWF0aC5QSSAvIDE4MC4wOyAvLyAxIGRlZ3JlZSByZXNvbHV0aW9uXG5cbiAgICAgICAgICBpZiAoTWF0aC5hYnMoc3RhcnQgLSBlbmQpIDwgaW5jKSB7XG4gICAgICAgICAgICBpbmMgPSBNYXRoLmFicyhzdGFydCAtIGVuZCk7XG4gICAgICAgICAgfSAvLyBOb3RlOiBmb3IgcHVycG9zZSBvZiBjYWxjdWxhdGluZyBhcmMgbGVuZ3RoLCBub3QgZ29pbmcgdG8gd29ycnkgYWJvdXQgcm90YXRpbmcgWC1heGlzIGJ5IGFuZ2xlIHBzaVxuXG5cbiAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBzdGFydCwgMCk7XG5cbiAgICAgICAgICBpZiAoZFRoZXRhIDwgMCkge1xuICAgICAgICAgICAgLy8gY2xvY2t3aXNlXG4gICAgICAgICAgICBmb3IgKHQgPSBzdGFydCAtIGluYzsgdCA+IGVuZDsgdCAtPSBpbmMpIHtcbiAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvdW50ZXItY2xvY2t3aXNlXG4gICAgICAgICAgICBmb3IgKHQgPSBzdGFydCArIGluYzsgdCA8IGVuZDsgdCArPSBpbmMpIHtcbiAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgZW5kLCAwKTtcbiAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgIHJldHVybiBsZW47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQb2ludE9uTGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb2ludE9uTGluZShkaXN0LCBQMXgsIFAxeSwgUDJ4LCBQMnkpIHtcbiAgICAgIHZhciBmcm9tWCA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogUDF4O1xuICAgICAgdmFyIGZyb21ZID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgJiYgYXJndW1lbnRzWzZdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNl0gOiBQMXk7XG4gICAgICB2YXIgbSA9IChQMnkgLSBQMXkpIC8gKFAyeCAtIFAxeCArIFBTRVVET19aRVJPKTtcbiAgICAgIHZhciBydW4gPSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgLyAoMSArIG0gKiBtKSk7XG5cbiAgICAgIGlmIChQMnggPCBQMXgpIHtcbiAgICAgICAgcnVuICo9IC0xO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmlzZSA9IG0gKiBydW47XG4gICAgICB2YXIgcHQgPSBudWxsO1xuXG4gICAgICBpZiAoUDJ4ID09PSBQMXgpIHtcbiAgICAgICAgLy8gdmVydGljYWwgbGluZVxuICAgICAgICBwdCA9IHtcbiAgICAgICAgICB4OiBmcm9tWCxcbiAgICAgICAgICB5OiBmcm9tWSArIHJpc2VcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoKGZyb21ZIC0gUDF5KSAvIChmcm9tWCAtIFAxeCArIFBTRVVET19aRVJPKSA9PT0gbSkge1xuICAgICAgICBwdCA9IHtcbiAgICAgICAgICB4OiBmcm9tWCArIHJ1bixcbiAgICAgICAgICB5OiBmcm9tWSArIHJpc2VcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpeCA9IDA7XG4gICAgICAgIHZhciBpeSA9IDA7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExpbmVMZW5ndGgoUDF4LCBQMXksIFAyeCwgUDJ5KTtcblxuICAgICAgICBpZiAobGVuIDwgUFNFVURPX1pFUk8pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1ID0gKGZyb21YIC0gUDF4KSAqIChQMnggLSBQMXgpICsgKGZyb21ZIC0gUDF5KSAqIChQMnkgLSBQMXkpO1xuICAgICAgICB1ID0gdSAvIChsZW4gKiBsZW4pO1xuICAgICAgICBpeCA9IFAxeCArIHUgKiAoUDJ4IC0gUDF4KTtcbiAgICAgICAgaXkgPSBQMXkgKyB1ICogKFAyeSAtIFAxeSk7XG4gICAgICAgIHZhciBwUmlzZSA9IHRoaXMuZ2V0TGluZUxlbmd0aChmcm9tWCwgZnJvbVksIGl4LCBpeSk7XG4gICAgICAgIHZhciBwUnVuID0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0IC0gcFJpc2UgKiBwUmlzZSk7XG4gICAgICAgIHJ1biA9IE1hdGguc3FydChwUnVuICogcFJ1biAvICgxICsgbSAqIG0pKTtcblxuICAgICAgICBpZiAoUDJ4IDwgUDF4KSB7XG4gICAgICAgICAgcnVuICo9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgcmlzZSA9IG0gKiBydW47XG4gICAgICAgIHB0ID0ge1xuICAgICAgICAgIHg6IGl4ICsgcnVuLFxuICAgICAgICAgIHk6IGl5ICsgcmlzZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvaW50T25QYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvaW50T25QYXRoKGRpc3RhbmNlKSB7XG4gICAgICB2YXIgZnVsbExlbiA9IHRoaXMuZ2V0UGF0aExlbmd0aCgpO1xuICAgICAgdmFyIGN1bXVsYXRpdmVQYXRoTGVuZ3RoID0gMDtcbiAgICAgIHZhciBwID0gbnVsbDtcblxuICAgICAgaWYgKGRpc3RhbmNlIDwgLTAuMDAwMDUgfHwgZGlzdGFuY2UgLSAwLjAwMDA1ID4gZnVsbExlbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGFBcnJheSA9IHRoaXMuZGF0YUFycmF5O1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIkMShkYXRhQXJyYXkpLFxuICAgICAgICAgIF9zdGVwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBwYXRoQ21kID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAocGF0aENtZCAmJiAocGF0aENtZC5wYXRoTGVuZ3RoIDwgMC4wMDAwNSB8fCBjdW11bGF0aXZlUGF0aExlbmd0aCArIHBhdGhDbWQucGF0aExlbmd0aCArIDAuMDAwMDUgPCBkaXN0YW5jZSkpIHtcbiAgICAgICAgICAgIGN1bXVsYXRpdmVQYXRoTGVuZ3RoICs9IHBhdGhDbWQucGF0aExlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkZWx0YSA9IGRpc3RhbmNlIC0gY3VtdWxhdGl2ZVBhdGhMZW5ndGg7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUID0gMDtcblxuICAgICAgICAgIHN3aXRjaCAocGF0aENtZC5jb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgcCA9IHRoaXMuZ2V0UG9pbnRPbkxpbmUoZGVsdGEsIHBhdGhDbWQuc3RhcnQueCwgcGF0aENtZC5zdGFydC55LCBwYXRoQ21kLnBvaW50c1swXSwgcGF0aENtZC5wb2ludHNbMV0sIHBhdGhDbWQuc3RhcnQueCwgcGF0aENtZC5zdGFydC55KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBwYXRoQ21kLnBvaW50c1s0XTsgLy8gNCA9IHRoZXRhXG5cbiAgICAgICAgICAgICAgdmFyIGRUaGV0YSA9IHBhdGhDbWQucG9pbnRzWzVdOyAvLyA1ID0gZFRoZXRhXG5cbiAgICAgICAgICAgICAgdmFyIGVuZCA9IHBhdGhDbWQucG9pbnRzWzRdICsgZFRoZXRhO1xuICAgICAgICAgICAgICBjdXJyZW50VCA9IHN0YXJ0ICsgZGVsdGEgLyBwYXRoQ21kLnBhdGhMZW5ndGggKiBkVGhldGE7XG5cbiAgICAgICAgICAgICAgaWYgKGRUaGV0YSA8IDAgJiYgY3VycmVudFQgPCBlbmQgfHwgZFRoZXRhID49IDAgJiYgY3VycmVudFQgPiBlbmQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHAgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBhdGhDbWQucG9pbnRzWzBdLCBwYXRoQ21kLnBvaW50c1sxXSwgcGF0aENtZC5wb2ludHNbMl0sIHBhdGhDbWQucG9pbnRzWzNdLCBjdXJyZW50VCwgcGF0aENtZC5wb2ludHNbNl0pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgIGN1cnJlbnRUID0gZGVsdGEgLyBwYXRoQ21kLnBhdGhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUID4gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUID0gMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHAgPSB0aGlzLmdldFBvaW50T25DdWJpY0JlemllcihjdXJyZW50VCwgcGF0aENtZC5zdGFydC54LCBwYXRoQ21kLnN0YXJ0LnksIHBhdGhDbWQucG9pbnRzWzBdLCBwYXRoQ21kLnBvaW50c1sxXSwgcGF0aENtZC5wb2ludHNbMl0sIHBhdGhDbWQucG9pbnRzWzNdLCBwYXRoQ21kLnBvaW50c1s0XSwgcGF0aENtZC5wb2ludHNbNV0pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgIGN1cnJlbnRUID0gZGVsdGEgLyBwYXRoQ21kLnBhdGhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUID4gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUID0gMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHAgPSB0aGlzLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIoY3VycmVudFQsIHBhdGhDbWQuc3RhcnQueCwgcGF0aENtZC5zdGFydC55LCBwYXRoQ21kLnBvaW50c1swXSwgcGF0aENtZC5wb2ludHNbMV0sIHBhdGhDbWQucG9pbnRzWzJdLCBwYXRoQ21kLnBvaW50c1szXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TGluZUxlbmd0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMaW5lTGVuZ3RoKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KCh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBhdGhMZW5ndGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGF0aExlbmd0aCgpIHtcbiAgICAgIGlmICh0aGlzLnBhdGhMZW5ndGggPT09IC0xKSB7XG4gICAgICAgIHRoaXMucGF0aExlbmd0aCA9IHRoaXMuZGF0YUFycmF5LnJlZHVjZShmdW5jdGlvbiAobGVuZ3RoLCBjb21tYW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmQucGF0aExlbmd0aCA+IDAgPyBsZW5ndGggKyBjb21tYW5kLnBhdGhMZW5ndGggOiBsZW5ndGg7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wYXRoTGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQb2ludE9uQ3ViaWNCZXppZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9pbnRPbkN1YmljQmV6aWVyKHBjdCwgUDF4LCBQMXksIFAyeCwgUDJ5LCBQM3gsIFAzeSwgUDR4LCBQNHkpIHtcbiAgICAgIHZhciB4ID0gUDR4ICogQ0IxKHBjdCkgKyBQM3ggKiBDQjIocGN0KSArIFAyeCAqIENCMyhwY3QpICsgUDF4ICogQ0I0KHBjdCk7XG4gICAgICB2YXIgeSA9IFA0eSAqIENCMShwY3QpICsgUDN5ICogQ0IyKHBjdCkgKyBQMnkgKiBDQjMocGN0KSArIFAxeSAqIENCNChwY3QpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UG9pbnRPblF1YWRyYXRpY0JlemllclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb2ludE9uUXVhZHJhdGljQmV6aWVyKHBjdCwgUDF4LCBQMXksIFAyeCwgUDJ5LCBQM3gsIFAzeSkge1xuICAgICAgdmFyIHggPSBQM3ggKiBRQjEocGN0KSArIFAyeCAqIFFCMihwY3QpICsgUDF4ICogUUIzKHBjdCk7XG4gICAgICB2YXIgeSA9IFAzeSAqIFFCMShwY3QpICsgUDJ5ICogUUIyKHBjdCkgKyBQMXkgKiBRQjMocGN0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvaW50T25FbGxpcHRpY2FsQXJjXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvaW50T25FbGxpcHRpY2FsQXJjKGN4LCBjeSwgcngsIHJ5LCB0aGV0YSwgcHNpKSB7XG4gICAgICB2YXIgY29zUHNpID0gTWF0aC5jb3MocHNpKTtcbiAgICAgIHZhciBzaW5Qc2kgPSBNYXRoLnNpbihwc2kpO1xuICAgICAgdmFyIHB0ID0ge1xuICAgICAgICB4OiByeCAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgeTogcnkgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBjeCArIChwdC54ICogY29zUHNpIC0gcHQueSAqIHNpblBzaSksXG4gICAgICAgIHk6IGN5ICsgKHB0LnggKiBzaW5Qc2kgKyBwdC55ICogY29zUHNpKVxuICAgICAgfTtcbiAgICB9IC8vIFRPRE8gbmVlZCBzb21lIG9wdGltaXNhdGlvbnMuIHBvc3NpYmx5IGJ1aWxkIGNhY2hlIG9ubHkgZm9yIGN1cnZlZCBzZWdtZW50cz9cblxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkRXF1aWRpc3RhbnRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEVxdWlkaXN0YW50Q2FjaGUoaW5wdXRTdGVwLCBpbnB1dFByZWNpc2lvbikge1xuICAgICAgdmFyIGZ1bGxMZW4gPSB0aGlzLmdldFBhdGhMZW5ndGgoKTtcbiAgICAgIHZhciBwcmVjaXNpb24gPSBpbnB1dFByZWNpc2lvbiB8fCAwLjI1OyAvLyBhY2N1cmFjeSB2cyBwZXJmb3JtYW5jZVxuXG4gICAgICB2YXIgc3RlcCA9IGlucHV0U3RlcCB8fCBmdWxsTGVuIC8gMTAwO1xuXG4gICAgICBpZiAoIXRoaXMuZXF1aWRpc3RhbnRDYWNoZSB8fCB0aGlzLmVxdWlkaXN0YW50Q2FjaGUuc3RlcCAhPT0gc3RlcCB8fCB0aGlzLmVxdWlkaXN0YW50Q2FjaGUucHJlY2lzaW9uICE9PSBwcmVjaXNpb24pIHtcbiAgICAgICAgLy8gUHJlcGFyZSBjYWNoZVxuICAgICAgICB0aGlzLmVxdWlkaXN0YW50Q2FjaGUgPSB7XG4gICAgICAgICAgc3RlcDogc3RlcCxcbiAgICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgICBwb2ludHM6IFtdXG4gICAgICAgIH07IC8vIENhbGN1bGF0ZSBwb2ludHNcblxuICAgICAgICB2YXIgcyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPD0gZnVsbExlbjsgbCArPSBwcmVjaXNpb24pIHtcbiAgICAgICAgICB2YXIgcDAgPSB0aGlzLmdldFBvaW50T25QYXRoKGwpO1xuICAgICAgICAgIHZhciBwMSA9IHRoaXMuZ2V0UG9pbnRPblBhdGgobCArIHByZWNpc2lvbik7XG5cbiAgICAgICAgICBpZiAoIXAwIHx8ICFwMSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcyArPSB0aGlzLmdldExpbmVMZW5ndGgocDAueCwgcDAueSwgcDEueCwgcDEueSk7XG5cbiAgICAgICAgICBpZiAocyA+PSBzdGVwKSB7XG4gICAgICAgICAgICB0aGlzLmVxdWlkaXN0YW50Q2FjaGUucG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICB4OiBwMC54LFxuICAgICAgICAgICAgICB5OiBwMC55LFxuICAgICAgICAgICAgICBkaXN0YW5jZTogbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzIC09IHN0ZXA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEVxdWlkaXN0YW50UG9pbnRPblBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RXF1aWRpc3RhbnRQb2ludE9uUGF0aCh0YXJnZXREaXN0YW5jZSwgc3RlcCwgcHJlY2lzaW9uKSB7XG4gICAgICB0aGlzLmJ1aWxkRXF1aWRpc3RhbnRDYWNoZShzdGVwLCBwcmVjaXNpb24pO1xuXG4gICAgICBpZiAodGFyZ2V0RGlzdGFuY2UgPCAwIHx8IHRhcmdldERpc3RhbmNlIC0gdGhpcy5nZXRQYXRoTGVuZ3RoKCkgPiAwLjAwMDA1KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWR4ID0gTWF0aC5yb3VuZCh0YXJnZXREaXN0YW5jZSAvIHRoaXMuZ2V0UGF0aExlbmd0aCgpICogKHRoaXMuZXF1aWRpc3RhbnRDYWNoZS5wb2ludHMubGVuZ3RoIC0gMSkpO1xuICAgICAgcmV0dXJuIHRoaXMuZXF1aWRpc3RhbnRDYWNoZS5wb2ludHNbaWR4XSB8fCBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0UGF0aEVsZW1lbnQ7XG59KFRleHRFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJHkoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkeSgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCR5KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBJbWFnZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJlZEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEltYWdlRWxlbWVudCwgX1JlbmRlcmVkRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciR5KEltYWdlRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gSW1hZ2VFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEltYWdlRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2ltYWdlJztcbiAgICBfdGhpcy5sb2FkZWQgPSBmYWxzZTtcblxuICAgIHZhciBocmVmID0gX3RoaXMuZ2V0SHJlZkF0dHJpYnV0ZSgpLmdldFN0cmluZygpO1xuXG4gICAgaWYgKCFocmVmKSB7XG4gICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMpO1xuICAgIH1cblxuICAgIHZhciBpc1N2ZyA9IC9cXC5zdmckLy50ZXN0KGhyZWYpO1xuICAgIGRvY3VtZW50LmltYWdlcy5wdXNoKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcblxuICAgIGlmICghaXNTdmcpIHtcbiAgICAgIF90aGlzLmxvYWRJbWFnZShocmVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMubG9hZFN2ZyhocmVmKTtcbiAgICB9XG5cbiAgICBfdGhpcy5pc1N2ZyA9IGlzU3ZnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJbWFnZUVsZW1lbnQsIFt7XG4gICAga2V5OiBcImxvYWRJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2xvYWRJbWFnZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaHJlZikge1xuICAgICAgICB2YXIgaW1hZ2U7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDA7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlSW1hZ2UoaHJlZik7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGltYWdlID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gNztcbiAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMCk7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdoaWxlIGxvYWRpbmcgaW1hZ2UgXFxcIlwiLmNvbmNhdChocmVmLCBcIlxcXCI6XCIpLCBfY29udGV4dC50MCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzAsIDddXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZShfeCkge1xuICAgICAgICByZXR1cm4gX2xvYWRJbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZEltYWdlO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRTdmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9sb2FkU3ZnID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoaHJlZikge1xuICAgICAgICB2YXIgcmVzcG9uc2UsIHN2ZztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAwO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5mZXRjaChocmVmKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgc3ZnID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IHN2ZztcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxMDtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSgwKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgbG9hZGluZyBpbWFnZSBcXFwiXCIuY29uY2F0KGhyZWYsIFwiXFxcIjpcIiksIF9jb250ZXh0Mi50MCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMsIFtbMCwgMTBdXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRTdmcoX3gyKSB7XG4gICAgICAgIHJldHVybiBfbG9hZFN2Zy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZFN2ZztcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbihjdHgpIHtcbiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgaW1hZ2UgPSB0aGlzLmltYWdlLFxuICAgICAgICAgIGxvYWRlZCA9IHRoaXMubG9hZGVkO1xuICAgICAgdmFyIHggPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpLmdldFBpeGVscygneCcpO1xuICAgICAgdmFyIHkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKS5nZXRQaXhlbHMoJ3knKTtcblxuICAgICAgaWYgKCFsb2FkZWQgfHwgIWltYWdlIHx8ICF3aWR0aCB8fCAhaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgaWYgKHRoaXMuaXNTdmcpIHtcbiAgICAgICAgZG9jdW1lbnQuY2FudmcuZm9ya1N0cmluZyhjdHgsIHRoaXMuaW1hZ2UsIHtcbiAgICAgICAgICBpZ25vcmVNb3VzZTogdHJ1ZSxcbiAgICAgICAgICBpZ25vcmVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgaWdub3JlRGltZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgICBpZ25vcmVDbGVhcjogdHJ1ZSxcbiAgICAgICAgICBvZmZzZXRYOiB4LFxuICAgICAgICAgIG9mZnNldFk6IHksXG4gICAgICAgICAgc2NhbGVXaWR0aDogd2lkdGgsXG4gICAgICAgICAgc2NhbGVIZWlnaHQ6IGhlaWdodFxuICAgICAgICB9KS5yZW5kZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfaW1hZ2UgPSB0aGlzLmltYWdlO1xuICAgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgICBkb2N1bWVudC5zZXRWaWV3Qm94KHtcbiAgICAgICAgICBjdHg6IGN0eCxcbiAgICAgICAgICBhc3BlY3RSYXRpbzogdGhpcy5nZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nKS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgZGVzaXJlZFdpZHRoOiBfaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgZGVzaXJlZEhlaWdodDogX2ltYWdlLmhlaWdodFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIF9pbWFnZS5jb21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgX2ltYWdlLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKF9pbWFnZSwgMCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kaW5nQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94KCkge1xuICAgICAgdmFyIHggPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpLmdldFBpeGVscygneCcpO1xuICAgICAgdmFyIHkgPSB0aGlzLmdldEF0dHJpYnV0ZSgneScpLmdldFBpeGVscygneScpO1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZXRTdHlsZSgnd2lkdGgnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIHJldHVybiBuZXcgQm91bmRpbmdCb3goeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW1hZ2VFbGVtZW50O1xufShSZW5kZXJlZEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkeihEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCR6KCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JHooKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIFN5bWJvbEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJlZEVsZW1lbnQpIHtcbiAgX2luaGVyaXRzKFN5bWJvbEVsZW1lbnQsIF9SZW5kZXJlZEVsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkeihTeW1ib2xFbGVtZW50KTtcblxuICBmdW5jdGlvbiBTeW1ib2xFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTeW1ib2xFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdzeW1ib2wnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTeW1ib2xFbGVtZW50LCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKF8pIHsvLyBOTyBSRU5ERVJcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3ltYm9sRWxlbWVudDtcbn0oUmVuZGVyZWRFbGVtZW50KTtcblxudmFyIFNWR0ZvbnRMb2FkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTVkdGb250TG9hZGVyKGRvY3VtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNWR0ZvbnRMb2FkZXIpO1xuXG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZm9udHMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTVkdGb250TG9hZGVyLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbG9hZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoZm9udEZhbWlseSwgdXJsKSB7XG4gICAgICAgIHZhciBkb2N1bWVudCwgc3ZnRG9jdW1lbnQsIGZvbnRzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAwO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudDtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY2FudmcucGFyc2VyLmxvYWQodXJsKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3ZnRG9jdW1lbnQgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgIGZvbnRzID0gc3ZnRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ZvbnQnKTtcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKGZvbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmb250Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGZvbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGZvbnROb2RlKTtcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRlZmluaXRpb25zW2ZvbnRGYW1pbHldID0gZm9udDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgwKTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgbG9hZGluZyBmb250IFxcXCJcIi5jb25jYXQodXJsLCBcIlxcXCI6XCIpLCBfY29udGV4dC50MCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzLCBbWzAsIDldXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWQoX3gsIF94Mikge1xuICAgICAgICByZXR1cm4gX2xvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWQ7XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gU1ZHRm9udExvYWRlcjtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJEEoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkQSgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRBKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBTdHlsZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FbGVtZW50KSB7XG4gIF9pbmhlcml0cyhTdHlsZUVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEEoU3R5bGVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBTdHlsZUVsZW1lbnQoZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3R5bGVFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAnc3R5bGUnO1xuICAgIHZhciBjc3MgPSBjb21wcmVzc1NwYWNlcyhBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykubWFwKGZ1bmN0aW9uIChfKSB7XG4gICAgICByZXR1cm4gXy5kYXRhO1xuICAgIH0pLmpvaW4oJycpLnJlcGxhY2UoLyhcXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXipcXC9dfFtcXHJcXG5dKSkpKlxcKitcXC8pfCheW1xcc10qXFwvXFwvLiopL2dtLCAnJykgLy8gcmVtb3ZlIGNvbW1lbnRzXG4gICAgLnJlcGxhY2UoL0BpbXBvcnQuKjsvZywgJycpIC8vIHJlbW92ZSBpbXBvcnRzXG4gICAgKTtcbiAgICB2YXIgY3NzRGVmcyA9IGNzcy5zcGxpdCgnfScpO1xuICAgIGNzc0RlZnMuZm9yRWFjaChmdW5jdGlvbiAoXykge1xuICAgICAgdmFyIGRlZiA9IF8udHJpbSgpO1xuXG4gICAgICBpZiAoIWRlZikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjc3NQYXJ0cyA9IGRlZi5zcGxpdCgneycpO1xuICAgICAgdmFyIGNzc0NsYXNzZXMgPSBjc3NQYXJ0c1swXS5zcGxpdCgnLCcpO1xuICAgICAgdmFyIGNzc1Byb3BzID0gY3NzUGFydHNbMV0uc3BsaXQoJzsnKTtcbiAgICAgIGNzc0NsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoXykge1xuICAgICAgICB2YXIgY3NzQ2xhc3MgPSBfLnRyaW0oKTtcblxuICAgICAgICBpZiAoIWNzc0NsYXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3BzID0gZG9jdW1lbnQuc3R5bGVzW2Nzc0NsYXNzXSB8fCB7fTtcbiAgICAgICAgY3NzUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoY3NzUHJvcCkge1xuICAgICAgICAgIHZhciBwcm9wID0gY3NzUHJvcC5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgdmFyIG5hbWUgPSBjc3NQcm9wLnN1YnN0cigwLCBwcm9wKS50cmltKCk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY3NzUHJvcC5zdWJzdHIocHJvcCArIDEsIGNzc1Byb3AubGVuZ3RoIC0gcHJvcCkudHJpbSgpO1xuXG4gICAgICAgICAgaWYgKG5hbWUgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHByb3BzW25hbWVdID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZG9jdW1lbnQuc3R5bGVzW2Nzc0NsYXNzXSA9IHByb3BzO1xuICAgICAgICBkb2N1bWVudC5zdHlsZXNTcGVjaWZpY2l0eVtjc3NDbGFzc10gPSBnZXRTZWxlY3RvclNwZWNpZmljaXR5KGNzc0NsYXNzKTtcblxuICAgICAgICBpZiAoY3NzQ2xhc3MgPT09ICdAZm9udC1mYWNlJykge1xuICAgICAgICAgIC8vICAmJiAhbm9kZUVudlxuICAgICAgICAgIHZhciBmb250RmFtaWx5ID0gcHJvcHNbJ2ZvbnQtZmFtaWx5J10uZ2V0U3RyaW5nKCkucmVwbGFjZSgvXCJ8Jy9nLCAnJyk7XG4gICAgICAgICAgdmFyIHNyY3MgPSBwcm9wcy5zcmMuZ2V0U3RyaW5nKCkuc3BsaXQoJywnKTtcbiAgICAgICAgICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgICAgICAgICAgaWYgKHNyYy5pbmRleE9mKCdmb3JtYXQoXCJzdmdcIiknKSA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IHBhcnNlRXh0ZXJuYWxVcmwoc3JjKTtcblxuICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNWR0ZvbnRMb2FkZXIoZG9jdW1lbnQpLmxvYWQoZm9udEZhbWlseSwgdXJsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gU3R5bGVFbGVtZW50O1xufShFbGVtZW50KTtcblN0eWxlRWxlbWVudC5wYXJzZUV4dGVybmFsVXJsID0gcGFyc2VFeHRlcm5hbFVybDtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJEIoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkQigpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRCKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBVc2VFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVuZGVyZWRFbGVtZW50KSB7XG4gIF9pbmhlcml0cyhVc2VFbGVtZW50LCBfUmVuZGVyZWRFbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEIoVXNlRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gVXNlRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVXNlRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAndXNlJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVXNlRWxlbWVudCwgW3tcbiAgICBrZXk6IFwic2V0Q29udGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb250ZXh0KGN0eCkge1xuICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoVXNlRWxlbWVudC5wcm90b3R5cGUpLCBcInNldENvbnRleHRcIiwgdGhpcykuY2FsbCh0aGlzLCBjdHgpO1xuXG4gICAgICB2YXIgeEF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgneCcpO1xuICAgICAgdmFyIHlBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3knKTtcblxuICAgICAgaWYgKHhBdHRyLmhhc1ZhbHVlKCkpIHtcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSh4QXR0ci5nZXRQaXhlbHMoJ3gnKSwgMCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh5QXR0ci5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoMCwgeUF0dHIuZ2V0UGl4ZWxzKCd5JykpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoY3R4KSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudDtcblxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5wYXRoKGN0eCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckNoaWxkcmVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKGN0eCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudCxcbiAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgdGVtcFN2ZyA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyByZW5kZXIgbWUgdXNpbmcgYSB0ZW1wb3Jhcnkgc3ZnIGVsZW1lbnQgaW4gc3ltYm9sIGNhc2VzIChodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc3RydWN0Lmh0bWwjVXNlRWxlbWVudClcbiAgICAgICAgICB0ZW1wU3ZnID0gbmV3IFNWR0VsZW1lbnQoZG9jdW1lbnQsIG51bGwpO1xuICAgICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy52aWV3Qm94ID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAndmlld0JveCcsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykuZ2V0U3RyaW5nKCkpO1xuICAgICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy5wcmVzZXJ2ZUFzcGVjdFJhdGlvID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAncHJlc2VydmVBc3BlY3RSYXRpbycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJykuZ2V0U3RyaW5nKCkpO1xuICAgICAgICAgIHRlbXBTdmcuYXR0cmlidXRlcy5vdmVyZmxvdyA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ292ZXJmbG93JywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ292ZXJmbG93JykuZ2V0U3RyaW5nKCkpO1xuICAgICAgICAgIHRlbXBTdmcuY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlbXBTdmcudHlwZSA9PT0gJ3N2ZycpIHtcbiAgICAgICAgICB2YXIgd2lkdGhTdHlsZSA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJywgZmFsc2UsIHRydWUpO1xuICAgICAgICAgIHZhciBoZWlnaHRTdHlsZSA9IHRoaXMuZ2V0U3R5bGUoJ2hlaWdodCcsIGZhbHNlLCB0cnVlKTsgLy8gaWYgc3ltYm9sIG9yIHN2ZywgaW5oZXJpdCB3aWR0aC9oZWlnaHQgZnJvbSBtZVxuXG4gICAgICAgICAgaWYgKHdpZHRoU3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgdGVtcFN2Zy5hdHRyaWJ1dGVzLndpZHRoID0gbmV3IFByb3BlcnR5KGRvY3VtZW50LCAnd2lkdGgnLCB3aWR0aFN0eWxlLmdldFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGVpZ2h0U3R5bGUuaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgdGVtcFN2Zy5hdHRyaWJ1dGVzLmhlaWdodCA9IG5ldyBQcm9wZXJ0eShkb2N1bWVudCwgJ2hlaWdodCcsIGhlaWdodFN0eWxlLmdldFN0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb2xkUGFyZW50ID0gdGVtcFN2Zy5wYXJlbnQ7XG4gICAgICAgIHRlbXBTdmcucGFyZW50ID0gdGhpcztcbiAgICAgICAgdGVtcFN2Zy5yZW5kZXIoY3R4KTtcbiAgICAgICAgdGVtcFN2Zy5wYXJlbnQgPSBvbGRQYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kaW5nQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJvdW5kaW5nQm94KGN0eCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQm94KGN0eCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbGVtZW50VHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVsZW1lbnRUcmFuc2Zvcm0oKSB7XG4gICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50LFxuICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICByZXR1cm4gVHJhbnNmb3JtLmZyb21FbGVtZW50KGRvY3VtZW50LCBlbGVtZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZWxlbWVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLmdldEhyZWZBdHRyaWJ1dGUoKS5nZXREZWZpbml0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVc2VFbGVtZW50O1xufShSZW5kZXJlZEVsZW1lbnQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkQyhEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRDKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEMoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gaW1HZXQoaW1nLCB4LCB5LCB3aWR0aCwgXywgcmdiYSkge1xuICByZXR1cm4gaW1nW3kgKiB3aWR0aCAqIDQgKyB4ICogNCArIHJnYmFdO1xufVxuXG5mdW5jdGlvbiBpbVNldChpbWcsIHgsIHksIHdpZHRoLCBfLCByZ2JhLCB2YWwpIHtcbiAgaW1nW3kgKiB3aWR0aCAqIDQgKyB4ICogNCArIHJnYmFdID0gdmFsO1xufVxuXG5mdW5jdGlvbiBtKG1hdHJpeCwgaSwgdikge1xuICB2YXIgbWkgPSBtYXRyaXhbaV07XG4gIHJldHVybiBtaSAqIChtaSA8IDAgPyB2IC0gMjU1IDogdik7XG59XG5cbmZ1bmN0aW9uIGMoYSwgbTEsIG0yLCBtMykge1xuICByZXR1cm4gbTEgKyBNYXRoLmNvcyhhKSAqIG0yICsgTWF0aC5zaW4oYSkgKiBtMztcbn1cblxudmFyIEZlQ29sb3JNYXRyaXhFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoRmVDb2xvck1hdHJpeEVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEMoRmVDb2xvck1hdHJpeEVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIEZlQ29sb3JNYXRyaXhFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZlQ29sb3JNYXRyaXhFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAnZmVDb2xvck1hdHJpeCc7XG4gICAgdmFyIG1hdHJpeCA9IHRvTnVtYmVycyhfdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlcycpLmdldFN0cmluZygpKTtcblxuICAgIHN3aXRjaCAoX3RoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJykuZ2V0U3RyaW5nKCdtYXRyaXgnKSkge1xuICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL2ZpbHRlcnMuaHRtbCNmZUNvbG9yTWF0cml4RWxlbWVudFxuICAgICAgY2FzZSAnc2F0dXJhdGUnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHMgPSBtYXRyaXhbMF07XG4gICAgICAgICAgbWF0cml4ID0gWzAuMjEzICsgMC43ODcgKiBzLCAwLjcxNSAtIDAuNzE1ICogcywgMC4wNzIgLSAwLjA3MiAqIHMsIDAsIDAsIDAuMjEzIC0gMC4yMTMgKiBzLCAwLjcxNSArIDAuMjg1ICogcywgMC4wNzIgLSAwLjA3MiAqIHMsIDAsIDAsIDAuMjEzIC0gMC4yMTMgKiBzLCAwLjcxNSAtIDAuNzE1ICogcywgMC4wNzIgKyAwLjkyOCAqIHMsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2h1ZVJvdGF0ZSc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgYSA9IG1hdHJpeFswXSAqIE1hdGguUEkgLyAxODAuMDtcbiAgICAgICAgICBtYXRyaXggPSBbYyhhLCAwLjIxMywgMC43ODcsIC0wLjIxMyksIGMoYSwgMC43MTUsIC0wLjcxNSwgLTAuNzE1KSwgYyhhLCAwLjA3MiwgLTAuMDcyLCAwLjkyOCksIDAsIDAsIGMoYSwgMC4yMTMsIC0wLjIxMywgMC4xNDMpLCBjKGEsIDAuNzE1LCAwLjI4NSwgMC4xNDApLCBjKGEsIDAuMDcyLCAtMC4wNzIsIC0wLjI4MyksIDAsIDAsIGMoYSwgMC4yMTMsIC0wLjIxMywgLTAuNzg3KSwgYyhhLCAwLjcxNSwgLTAuNzE1LCAwLjcxNSksIGMoYSwgMC4wNzIsIDAuOTI4LCAwLjA3MiksIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2x1bWluYW5jZVRvQWxwaGEnOlxuICAgICAgICBtYXRyaXggPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSwgMCwgMCwgMCwgMCwgMCwgMCwgMV07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIF90aGlzLm1hdHJpeCA9IG1hdHJpeDtcbiAgICBfdGhpcy5pbmNsdWRlT3BhY2l0eSA9IF90aGlzLmdldEF0dHJpYnV0ZSgnaW5jbHVkZU9wYWNpdHknKS5oYXNWYWx1ZSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGZUNvbG9yTWF0cml4RWxlbWVudCwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4LCBfLCBfXywgd2lkdGgsIGhlaWdodCkge1xuICAgICAgLy8gYXNzdW1pbmcgeD09MCAmJiB5PT0wIGZvciBub3dcbiAgICAgIHZhciBpbmNsdWRlT3BhY2l0eSA9IHRoaXMuaW5jbHVkZU9wYWNpdHksXG4gICAgICAgICAgbWF0cml4ID0gdGhpcy5tYXRyaXg7XG4gICAgICB2YXIgc3JjRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgdmFyIHIgPSBpbUdldChzcmNEYXRhLmRhdGEsIHgsIHksIHdpZHRoLCBoZWlnaHQsIDApO1xuICAgICAgICAgIHZhciBnID0gaW1HZXQoc3JjRGF0YS5kYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAxKTtcbiAgICAgICAgICB2YXIgYiA9IGltR2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMik7XG4gICAgICAgICAgdmFyIGEgPSBpbUdldChzcmNEYXRhLmRhdGEsIHgsIHksIHdpZHRoLCBoZWlnaHQsIDMpO1xuICAgICAgICAgIHZhciBuciA9IG0obWF0cml4LCAwLCByKSArIG0obWF0cml4LCAxLCBnKSArIG0obWF0cml4LCAyLCBiKSArIG0obWF0cml4LCAzLCBhKSArIG0obWF0cml4LCA0LCAxKTtcbiAgICAgICAgICB2YXIgbmcgPSBtKG1hdHJpeCwgNSwgcikgKyBtKG1hdHJpeCwgNiwgZykgKyBtKG1hdHJpeCwgNywgYikgKyBtKG1hdHJpeCwgOCwgYSkgKyBtKG1hdHJpeCwgOSwgMSk7XG4gICAgICAgICAgdmFyIG5iID0gbShtYXRyaXgsIDEwLCByKSArIG0obWF0cml4LCAxMSwgZykgKyBtKG1hdHJpeCwgMTIsIGIpICsgbShtYXRyaXgsIDEzLCBhKSArIG0obWF0cml4LCAxNCwgMSk7XG4gICAgICAgICAgdmFyIG5hID0gbShtYXRyaXgsIDE1LCByKSArIG0obWF0cml4LCAxNiwgZykgKyBtKG1hdHJpeCwgMTcsIGIpICsgbShtYXRyaXgsIDE4LCBhKSArIG0obWF0cml4LCAxOSwgMSk7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZU9wYWNpdHkpIHtcbiAgICAgICAgICAgIG5yID0gbmcgPSBuYiA9IDA7XG4gICAgICAgICAgICBuYSAqPSBhIC8gMjU1O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGltU2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMCwgbnIpO1xuICAgICAgICAgIGltU2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMSwgbmcpO1xuICAgICAgICAgIGltU2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMiwgbmIpO1xuICAgICAgICAgIGltU2V0KHNyY0RhdGEuZGF0YSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgMywgbmEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKHNyY0RhdGEsIDAsIDApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGZUNvbG9yTWF0cml4RWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciREKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEQoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkRCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgTWFza0VsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FbGVtZW50KSB7XG4gIF9pbmhlcml0cyhNYXNrRWxlbWVudCwgX0VsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkRChNYXNrRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gTWFza0VsZW1lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hc2tFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdtYXNrJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWFza0VsZW1lbnQsIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KGN0eCwgZWxlbWVudCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudDsgLy8gcmVuZGVyIGFzIHRlbXAgc3ZnXG5cbiAgICAgIHZhciB4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3gnKS5nZXRQaXhlbHMoJ3gnKTtcbiAgICAgIHZhciB5ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3knKS5nZXRQaXhlbHMoJ3knKTtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJykuZ2V0UGl4ZWxzKCd4Jyk7XG4gICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZXRTdHlsZSgnaGVpZ2h0JykuZ2V0UGl4ZWxzKCd5Jyk7XG5cbiAgICAgIGlmICghd2lkdGggJiYgIWhlaWdodCkge1xuICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94LmFkZEJvdW5kaW5nQm94KGNoaWxkLmdldEJvdW5kaW5nQm94KGN0eCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgeCA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3gueDEpO1xuICAgICAgICB5ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC55MSk7XG4gICAgICAgIHdpZHRoID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC53aWR0aCk7XG4gICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IoYm91bmRpbmdCb3guaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlnbm9yZWRTdHlsZXMgPSB0aGlzLnJlbW92ZVN0eWxlcyhlbGVtZW50LCBNYXNrRWxlbWVudC5pZ25vcmVTdHlsZXMpO1xuICAgICAgdmFyIG1hc2tDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVDYW52YXMoeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICAgIHZhciBtYXNrQ3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgZG9jdW1lbnQuc2NyZWVuLnNldERlZmF1bHRzKG1hc2tDdHgpO1xuICAgICAgdGhpcy5yZW5kZXJDaGlsZHJlbihtYXNrQ3R4KTsgLy8gY29udmVydCBtYXNrIHRvIGFscGhhIHdpdGggYSBmYWtlIG5vZGVcbiAgICAgIC8vIFRPRE86IHJlZmFjdG9yIG91dCBhcHBseSBmcm9tIGZlQ29sb3JNYXRyaXhcblxuICAgICAgbmV3IEZlQ29sb3JNYXRyaXhFbGVtZW50KGRvY3VtZW50LCB7XG4gICAgICAgIG5vZGVUeXBlOiAxLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBub2RlTmFtZTogJ3R5cGUnLFxuICAgICAgICAgIHZhbHVlOiAnbHVtaW5hbmNlVG9BbHBoYSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIG5vZGVOYW1lOiAnaW5jbHVkZU9wYWNpdHknLFxuICAgICAgICAgIHZhbHVlOiAndHJ1ZSdcbiAgICAgICAgfV1cbiAgICAgIH0pLmFwcGx5KG1hc2tDdHgsIDAsIDAsIHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICB2YXIgdG1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlQ2FudmFzKHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICB2YXIgdG1wQ3R4ID0gdG1wQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICBkb2N1bWVudC5zY3JlZW4uc2V0RGVmYXVsdHModG1wQ3R4KTtcbiAgICAgIGVsZW1lbnQucmVuZGVyKHRtcEN0eCk7XG4gICAgICB0bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLWluJztcbiAgICAgIHRtcEN0eC5maWxsU3R5bGUgPSBtYXNrQ3R4LmNyZWF0ZVBhdHRlcm4obWFza0NhbnZhcywgJ25vLXJlcGVhdCcpO1xuICAgICAgdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gdG1wQ3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLCAnbm8tcmVwZWF0Jyk7XG4gICAgICBjdHguZmlsbFJlY3QoMCwgMCwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTsgLy8gcmVhc3NpZ24gbWFza1xuXG4gICAgICB0aGlzLnJlc3RvcmVTdHlsZXMoZWxlbWVudCwgaWdub3JlZFN0eWxlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoXykgey8vIE5PIFJFTkRFUlxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXNrRWxlbWVudDtcbn0oRWxlbWVudCk7XG5NYXNrRWxlbWVudC5pZ25vcmVTdHlsZXMgPSBbJ21hc2snLCAndHJhbnNmb3JtJywgJ2NsaXAtcGF0aCddO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIkRShEZXJpdmVkKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRFKCkpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEUoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBDbGlwUGF0aEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FbGVtZW50KSB7XG4gIF9pbmhlcml0cyhDbGlwUGF0aEVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEUoQ2xpcFBhdGhFbGVtZW50KTtcblxuICBmdW5jdGlvbiBDbGlwUGF0aEVsZW1lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBQYXRoRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAnY2xpcFBhdGgnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDbGlwUGF0aEVsZW1lbnQsIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KGN0eCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudDtcbiAgICAgIHZhciBjb250ZXh0UHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGN0eCk7XG4gICAgICB2YXIgYmVnaW5QYXRoID0gY3R4LmJlZ2luUGF0aCxcbiAgICAgICAgICBjbG9zZVBhdGggPSBjdHguY2xvc2VQYXRoO1xuXG4gICAgICBpZiAoY29udGV4dFByb3RvKSB7XG4gICAgICAgIGNvbnRleHRQcm90by5iZWdpblBhdGggPSBub29wO1xuICAgICAgICBjb250ZXh0UHJvdG8uY2xvc2VQYXRoID0gbm9vcDtcbiAgICAgIH1cblxuICAgICAgUmVmbGVjdC5hcHBseShiZWdpblBhdGgsIGN0eCwgW10pO1xuICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnBhdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHR5cGVvZiBjaGlsZC5lbGVtZW50VHJhbnNmb3JtICE9PSAndW5kZWZpbmVkJyA/IGNoaWxkLmVsZW1lbnRUcmFuc2Zvcm0oKSA6IG51bGw7IC8vIGhhbmRsZSA8dXNlIC8+XG5cbiAgICAgICAgaWYgKCF0cmFuc2Zvcm0pIHtcbiAgICAgICAgICB0cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZnJvbUVsZW1lbnQoZG9jdW1lbnQsIGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgICB0cmFuc2Zvcm0uYXBwbHkoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLnBhdGgoY3R4KTtcblxuICAgICAgICBpZiAoY29udGV4dFByb3RvKSB7XG4gICAgICAgICAgY29udGV4dFByb3RvLmNsb3NlUGF0aCA9IGNsb3NlUGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgICB0cmFuc2Zvcm0udW5hcHBseShjdHgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFJlZmxlY3QuYXBwbHkoY2xvc2VQYXRoLCBjdHgsIFtdKTtcbiAgICAgIGN0eC5jbGlwKCk7XG5cbiAgICAgIGlmIChjb250ZXh0UHJvdG8pIHtcbiAgICAgICAgY29udGV4dFByb3RvLmJlZ2luUGF0aCA9IGJlZ2luUGF0aDtcbiAgICAgICAgY29udGV4dFByb3RvLmNsb3NlUGF0aCA9IGNsb3NlUGF0aDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihfKSB7Ly8gTk8gUkVOREVSXG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENsaXBQYXRoRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRGKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEYoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkRigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgRmlsdGVyRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEZpbHRlckVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEYoRmlsdGVyRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gRmlsdGVyRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmlsdGVyRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAnZmlsdGVyJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRmlsdGVyRWxlbWVudCwgW3tcbiAgICBrZXk6IFwiYXBwbHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkoY3R4LCBlbGVtZW50KSB7XG4gICAgICAvLyByZW5kZXIgYXMgdGVtcCBzdmdcbiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgdmFyIGJvdW5kaW5nQm94ID0gZWxlbWVudC5nZXRCb3VuZGluZ0JveChjdHgpO1xuXG4gICAgICBpZiAoIWJvdW5kaW5nQm94KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHB4ID0gMDtcbiAgICAgIHZhciBweSA9IDA7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgZWZkID0gY2hpbGQuZXh0cmFGaWx0ZXJEaXN0YW5jZSB8fCAwO1xuICAgICAgICBweCA9IE1hdGgubWF4KHB4LCBlZmQpO1xuICAgICAgICBweSA9IE1hdGgubWF4KHB5LCBlZmQpO1xuICAgICAgfSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLmZsb29yKGJvdW5kaW5nQm94LndpZHRoKTtcbiAgICAgIHZhciBoZWlnaHQgPSBNYXRoLmZsb29yKGJvdW5kaW5nQm94LmhlaWdodCk7XG4gICAgICB2YXIgdG1wQ2FudmFzV2lkdGggPSB3aWR0aCArIDIgKiBweDtcbiAgICAgIHZhciB0bXBDYW52YXNIZWlnaHQgPSBoZWlnaHQgKyAyICogcHk7XG5cbiAgICAgIGlmICh0bXBDYW52YXNXaWR0aCA8IDEgfHwgdG1wQ2FudmFzSGVpZ2h0IDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB4ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC54KTtcbiAgICAgIHZhciB5ID0gTWF0aC5mbG9vcihib3VuZGluZ0JveC55KTtcbiAgICAgIHZhciBpZ25vcmVkU3R5bGVzID0gdGhpcy5yZW1vdmVTdHlsZXMoZWxlbWVudCwgRmlsdGVyRWxlbWVudC5pZ25vcmVTdHlsZXMpO1xuICAgICAgdmFyIHRtcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUNhbnZhcyh0bXBDYW52YXNXaWR0aCwgdG1wQ2FudmFzSGVpZ2h0KTtcbiAgICAgIHZhciB0bXBDdHggPSB0bXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGRvY3VtZW50LnNjcmVlbi5zZXREZWZhdWx0cyh0bXBDdHgpO1xuICAgICAgdG1wQ3R4LnRyYW5zbGF0ZSgteCArIHB4LCAteSArIHB5KTtcbiAgICAgIGVsZW1lbnQucmVuZGVyKHRtcEN0eCk7IC8vIGFwcGx5IGZpbHRlcnNcblxuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZC5hcHBseSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNoaWxkLmFwcGx5KHRtcEN0eCwgMCwgMCwgdG1wQ2FudmFzV2lkdGgsIHRtcENhbnZhc0hlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyByZW5kZXIgb24gbWVcblxuICAgICAgY3R4LmRyYXdJbWFnZSh0bXBDYW52YXMsIDAsIDAsIHRtcENhbnZhc1dpZHRoLCB0bXBDYW52YXNIZWlnaHQsIHggLSBweCwgeSAtIHB5LCB0bXBDYW52YXNXaWR0aCwgdG1wQ2FudmFzSGVpZ2h0KTtcbiAgICAgIHRoaXMucmVzdG9yZVN0eWxlcyhlbGVtZW50LCBpZ25vcmVkU3R5bGVzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihfKSB7Ly8gTk8gUkVOREVSXG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZpbHRlckVsZW1lbnQ7XG59KEVsZW1lbnQpO1xuRmlsdGVyRWxlbWVudC5pZ25vcmVTdHlsZXMgPSBbJ2ZpbHRlcicsICd0cmFuc2Zvcm0nLCAnY2xpcC1wYXRoJ107XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRHKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEcoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkRygpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgRmVEcm9wU2hhZG93RWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKEZlRHJvcFNoYWRvd0VsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEcoRmVEcm9wU2hhZG93RWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gRmVEcm9wU2hhZG93RWxlbWVudChkb2N1bWVudCwgbm9kZSwgY2FwdHVyZVRleHROb2Rlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGZURyb3BTaGFkb3dFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jdW1lbnQsIG5vZGUsIGNhcHR1cmVUZXh0Tm9kZXMpO1xuICAgIF90aGlzLnR5cGUgPSAnZmVEcm9wU2hhZG93JztcblxuICAgIF90aGlzLmFkZFN0eWxlc0Zyb21TdHlsZURlZmluaXRpb24oKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGZURyb3BTaGFkb3dFbGVtZW50LCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShfLCBfXywgX19fLCBfX19fLCBfX19fXykgey8vIFRPRE86IGltcGxlbWVudFxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGZURyb3BTaGFkb3dFbGVtZW50O1xufShFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJEgoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkSCgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRIKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBGZU1vcnBob2xvZ3lFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoRmVNb3JwaG9sb2d5RWxlbWVudCwgX0VsZW1lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIkSChGZU1vcnBob2xvZ3lFbGVtZW50KTtcblxuICBmdW5jdGlvbiBGZU1vcnBob2xvZ3lFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGZU1vcnBob2xvZ3lFbGVtZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgX3RoaXMudHlwZSA9ICdmZU1vcnBob2xvZ3knO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGZU1vcnBob2xvZ3lFbGVtZW50LCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShfLCBfXywgX19fLCBfX19fLCBfX19fXykgey8vIFRPRE86IGltcGxlbWVudFxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGZU1vcnBob2xvZ3lFbGVtZW50O1xufShFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJEkoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkSSgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRJKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBGZUNvbXBvc2l0ZUVsZW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9FbGVtZW50KSB7XG4gIF9pbmhlcml0cyhGZUNvbXBvc2l0ZUVsZW1lbnQsIF9FbGVtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJEkoRmVDb21wb3NpdGVFbGVtZW50KTtcblxuICBmdW5jdGlvbiBGZUNvbXBvc2l0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZlQ29tcG9zaXRlRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnR5cGUgPSAnZmVDb21wb3NpdGUnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGZUNvbXBvc2l0ZUVsZW1lbnQsIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KF8sIF9fLCBfX18sIF9fX18sIF9fX19fKSB7Ly8gVE9ETzogaW1wbGVtZW50XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZlQ29tcG9zaXRlRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRKKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEooKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkSigpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgRmVHYXVzc2lhbkJsdXJFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoRmVHYXVzc2lhbkJsdXJFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRKKEZlR2F1c3NpYW5CbHVyRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gRmVHYXVzc2lhbkJsdXJFbGVtZW50KGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZlR2F1c3NpYW5CbHVyRWxlbWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvY3VtZW50LCBub2RlLCBjYXB0dXJlVGV4dE5vZGVzKTtcbiAgICBfdGhpcy50eXBlID0gJ2ZlR2F1c3NpYW5CbHVyJztcbiAgICBfdGhpcy5ibHVyUmFkaXVzID0gTWF0aC5mbG9vcihfdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0ZERldmlhdGlvbicpLmdldE51bWJlcigpKTtcbiAgICBfdGhpcy5leHRyYUZpbHRlckRpc3RhbmNlID0gX3RoaXMuYmx1clJhZGl1cztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRmVHYXVzc2lhbkJsdXJFbGVtZW50LCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgYmx1clJhZGl1cyA9IHRoaXMuYmx1clJhZGl1cztcbiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQud2luZG93ID8gZG9jdW1lbnQud2luZG93LmRvY3VtZW50LmJvZHkgOiBudWxsO1xuICAgICAgdmFyIGNhbnZhcyA9IGN0eC5jYW52YXM7IC8vIFN0YWNrQmx1ciByZXF1aXJlcyBjYW52YXMgYmUgb24gZG9jdW1lbnRcblxuICAgICAgY2FudmFzLmlkID0gZG9jdW1lbnQuZ2V0VW5pcXVlSWQoKTtcblxuICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgIH1cblxuICAgICAgY2FudmFzUkdCQShjYW52YXMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJsdXJSYWRpdXMpO1xuXG4gICAgICBpZiAoYm9keSkge1xuICAgICAgICBib2R5LnJlbW92ZUNoaWxkKGNhbnZhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZlR2F1c3NpYW5CbHVyRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciRLKERlcml2ZWQpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JEsoKSkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkSygpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG52YXIgVGl0bGVFbGVtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRWxlbWVudCkge1xuICBfaW5oZXJpdHMoVGl0bGVFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRLKFRpdGxlRWxlbWVudCk7XG5cbiAgZnVuY3Rpb24gVGl0bGVFbGVtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUaXRsZUVsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ3RpdGxlJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gVGl0bGVFbGVtZW50O1xufShFbGVtZW50KTtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJEwoRGVyaXZlZCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkTCgpKSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCRMKCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbnZhciBEZXNjRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VsZW1lbnQpIHtcbiAgX2luaGVyaXRzKERlc2NFbGVtZW50LCBfRWxlbWVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciRMKERlc2NFbGVtZW50KTtcblxuICBmdW5jdGlvbiBEZXNjRWxlbWVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVzY0VsZW1lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfdGhpcy50eXBlID0gJ2Rlc2MnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBEZXNjRWxlbWVudDtcbn0oRWxlbWVudCk7XG5cbnZhciBlbGVtZW50VHlwZXMgPSB7XG4gICdzdmcnOiBTVkdFbGVtZW50LFxuICAncmVjdCc6IFJlY3RFbGVtZW50LFxuICAnY2lyY2xlJzogQ2lyY2xlRWxlbWVudCxcbiAgJ2VsbGlwc2UnOiBFbGxpcHNlRWxlbWVudCxcbiAgJ2xpbmUnOiBMaW5lRWxlbWVudCxcbiAgJ3BvbHlsaW5lJzogUG9seWxpbmVFbGVtZW50LFxuICAncG9seWdvbic6IFBvbHlnb25FbGVtZW50LFxuICAncGF0aCc6IFBhdGhFbGVtZW50LFxuICAncGF0dGVybic6IFBhdHRlcm5FbGVtZW50LFxuICAnbWFya2VyJzogTWFya2VyRWxlbWVudCxcbiAgJ2RlZnMnOiBEZWZzRWxlbWVudCxcbiAgJ2xpbmVhckdyYWRpZW50JzogTGluZWFyR3JhZGllbnRFbGVtZW50LFxuICAncmFkaWFsR3JhZGllbnQnOiBSYWRpYWxHcmFkaWVudEVsZW1lbnQsXG4gICdzdG9wJzogU3RvcEVsZW1lbnQsXG4gICdhbmltYXRlJzogQW5pbWF0ZUVsZW1lbnQsXG4gICdhbmltYXRlQ29sb3InOiBBbmltYXRlQ29sb3JFbGVtZW50LFxuICAnYW5pbWF0ZVRyYW5zZm9ybSc6IEFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50LFxuICAnZm9udCc6IEZvbnRFbGVtZW50LFxuICAnZm9udC1mYWNlJzogRm9udEZhY2VFbGVtZW50LFxuICAnbWlzc2luZy1nbHlwaCc6IE1pc3NpbmdHbHlwaEVsZW1lbnQsXG4gICdnbHlwaCc6IEdseXBoRWxlbWVudCxcbiAgJ3RleHQnOiBUZXh0RWxlbWVudCxcbiAgJ3RzcGFuJzogVFNwYW5FbGVtZW50LFxuICAndHJlZic6IFRSZWZFbGVtZW50LFxuICAnYSc6IEFFbGVtZW50LFxuICAndGV4dFBhdGgnOiBUZXh0UGF0aEVsZW1lbnQsXG4gICdpbWFnZSc6IEltYWdlRWxlbWVudCxcbiAgJ2cnOiBHRWxlbWVudCxcbiAgJ3N5bWJvbCc6IFN5bWJvbEVsZW1lbnQsXG4gICdzdHlsZSc6IFN0eWxlRWxlbWVudCxcbiAgJ3VzZSc6IFVzZUVsZW1lbnQsXG4gICdtYXNrJzogTWFza0VsZW1lbnQsXG4gICdjbGlwUGF0aCc6IENsaXBQYXRoRWxlbWVudCxcbiAgJ2ZpbHRlcic6IEZpbHRlckVsZW1lbnQsXG4gICdmZURyb3BTaGFkb3cnOiBGZURyb3BTaGFkb3dFbGVtZW50LFxuICAnZmVNb3JwaG9sb2d5JzogRmVNb3JwaG9sb2d5RWxlbWVudCxcbiAgJ2ZlQ29tcG9zaXRlJzogRmVDb21wb3NpdGVFbGVtZW50LFxuICAnZmVDb2xvck1hdHJpeCc6IEZlQ29sb3JNYXRyaXhFbGVtZW50LFxuICAnZmVHYXVzc2lhbkJsdXInOiBGZUdhdXNzaWFuQmx1ckVsZW1lbnQsXG4gICd0aXRsZSc6IFRpdGxlRWxlbWVudCxcbiAgJ2Rlc2MnOiBEZXNjRWxlbWVudFxufTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBjYW52YXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlKF94KSB7XG4gIHJldHVybiBfY3JlYXRlSW1hZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUltYWdlKCkge1xuICBfY3JlYXRlSW1hZ2UgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNyYykge1xuICAgIHZhciBhbm9ueW1vdXNDcm9zc09yaWdpbixcbiAgICAgICAgaW1hZ2UsXG4gICAgICAgIF9hcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBhbm9ueW1vdXNDcm9zc09yaWdpbiA9IF9hcmdzLmxlbmd0aCA+IDEgJiYgX2FyZ3NbMV0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzFdIDogZmFsc2U7XG4gICAgICAgICAgICBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgICAgICAgICBpZiAoYW5vbnltb3VzQ3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGltYWdlKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9jcmVhdGVJbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgRG9jdW1lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEb2N1bWVudChjYW52Zykge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZiRyb290RW1TaXplID0gX3JlZi5yb290RW1TaXplLFxuICAgICAgICByb290RW1TaXplID0gX3JlZiRyb290RW1TaXplID09PSB2b2lkIDAgPyAxMiA6IF9yZWYkcm9vdEVtU2l6ZSxcbiAgICAgICAgX3JlZiRlbVNpemUgPSBfcmVmLmVtU2l6ZSxcbiAgICAgICAgZW1TaXplID0gX3JlZiRlbVNpemUgPT09IHZvaWQgMCA/IDEyIDogX3JlZiRlbVNpemUsXG4gICAgICAgIF9yZWYkY3JlYXRlQ2FudmFzID0gX3JlZi5jcmVhdGVDYW52YXMsXG4gICAgICAgIGNyZWF0ZUNhbnZhcyA9IF9yZWYkY3JlYXRlQ2FudmFzID09PSB2b2lkIDAgPyBEb2N1bWVudC5jcmVhdGVDYW52YXMgOiBfcmVmJGNyZWF0ZUNhbnZhcyxcbiAgICAgICAgX3JlZiRjcmVhdGVJbWFnZSA9IF9yZWYuY3JlYXRlSW1hZ2UsXG4gICAgICAgIGNyZWF0ZUltYWdlID0gX3JlZiRjcmVhdGVJbWFnZSA9PT0gdm9pZCAwID8gRG9jdW1lbnQuY3JlYXRlSW1hZ2UgOiBfcmVmJGNyZWF0ZUltYWdlLFxuICAgICAgICBhbm9ueW1vdXNDcm9zc09yaWdpbiA9IF9yZWYuYW5vbnltb3VzQ3Jvc3NPcmlnaW47XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9jdW1lbnQpO1xuXG4gICAgdGhpcy5jYW52ZyA9IGNhbnZnO1xuICAgIHRoaXMuZGVmaW5pdGlvbnMgPSB7fTtcbiAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgIHRoaXMuc3R5bGVzU3BlY2lmaWNpdHkgPSB7fTtcbiAgICB0aGlzLmltYWdlcyA9IFtdO1xuICAgIHRoaXMuZm9udHMgPSBbXTtcbiAgICB0aGlzLmVtU2l6ZVN0YWNrID0gW107XG4gICAgdGhpcy51bmlxdWVJZCA9IDA7XG4gICAgdGhpcy5zY3JlZW4gPSBjYW52Zy5zY3JlZW47XG4gICAgdGhpcy5yb290RW1TaXplID0gcm9vdEVtU2l6ZTtcbiAgICB0aGlzLmVtU2l6ZSA9IGVtU2l6ZTtcbiAgICB0aGlzLmNyZWF0ZUNhbnZhcyA9IGNyZWF0ZUNhbnZhcztcbiAgICB0aGlzLmNyZWF0ZUltYWdlID0gdGhpcy5iaW5kQ3JlYXRlSW1hZ2UoY3JlYXRlSW1hZ2UsIGFub255bW91c0Nyb3NzT3JpZ2luKTtcbiAgICB0aGlzLnNjcmVlbi53YWl0KHRoaXMuaXNJbWFnZXNMb2FkZWQuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zY3JlZW4ud2FpdCh0aGlzLmlzRm9udHNMb2FkZWQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRG9jdW1lbnQsIFt7XG4gICAga2V5OiBcImJpbmRDcmVhdGVJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBiaW5kQ3JlYXRlSW1hZ2UoY3JlYXRlSW1hZ2UsIGFub255bW91c0Nyb3NzT3JpZ2luKSB7XG4gICAgICBpZiAodHlwZW9mIGFub255bW91c0Nyb3NzT3JpZ2luID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UsIGZvcmNlQW5vbnltb3VzQ3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW1hZ2Uoc291cmNlLCB0eXBlb2YgZm9yY2VBbm9ueW1vdXNDcm9zc09yaWdpbiA9PT0gJ2Jvb2xlYW4nID8gZm9yY2VBbm9ueW1vdXNDcm9zc09yaWdpbiA6IGFub255bW91c0Nyb3NzT3JpZ2luKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BFbVNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wRW1TaXplKCkge1xuICAgICAgdmFyIGVtU2l6ZVN0YWNrID0gdGhpcy5lbVNpemVTdGFjaztcbiAgICAgIGVtU2l6ZVN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRVbmlxdWVJZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVbmlxdWVJZCgpIHtcbiAgICAgIHJldHVybiBcImNhbnZnXCIuY29uY2F0KCsrdGhpcy51bmlxdWVJZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW1hZ2VzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW1hZ2VzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmV2ZXJ5KGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHJldHVybiBfLmxvYWRlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ZvbnRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRm9udHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb250cy5ldmVyeShmdW5jdGlvbiAoXykge1xuICAgICAgICByZXR1cm4gXy5sb2FkZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlRG9jdW1lbnRFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50RWxlbWVudChkb2N1bWVudCkge1xuICAgICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgZG9jdW1lbnRFbGVtZW50LnJvb3QgPSB0cnVlO1xuICAgICAgZG9jdW1lbnRFbGVtZW50LmFkZFN0eWxlc0Zyb21TdHlsZURlZmluaXRpb24oKTtcbiAgICAgIHRoaXMuZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50O1xuICAgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KG5vZGUpIHtcbiAgICAgIHZhciBlbGVtZW50VHlwZSA9IG5vZGUubm9kZU5hbWUucmVwbGFjZSgvXlteOl0rOi8sICcnKTtcbiAgICAgIHZhciBFbGVtZW50VHlwZSA9IERvY3VtZW50LmVsZW1lbnRUeXBlc1tlbGVtZW50VHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgRWxlbWVudFR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRWxlbWVudFR5cGUodGhpcywgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVsZW1lbnQodGhpcywgbm9kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVRleHROb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKG5vZGUpIHtcbiAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodGhpcywgbm9kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZpZXdCb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vmlld0JveChjb25maWcpIHtcbiAgICAgIHRoaXMuc2NyZWVuLnNldFZpZXdCb3goX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGRvY3VtZW50OiB0aGlzXG4gICAgICB9LCBjb25maWcpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid2luZG93XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JlZW4ud2luZG93O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmZXRjaFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NyZWVuLmZldGNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjdHhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbi5jdHg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtU2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGVtU2l6ZVN0YWNrID0gdGhpcy5lbVNpemVTdGFjaztcbiAgICAgIHJldHVybiBlbVNpemVTdGFja1tlbVNpemVTdGFjay5sZW5ndGggLSAxXTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB2YXIgZW1TaXplU3RhY2sgPSB0aGlzLmVtU2l6ZVN0YWNrO1xuICAgICAgZW1TaXplU3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERvY3VtZW50O1xufSgpO1xuRG9jdW1lbnQuY3JlYXRlQ2FudmFzID0gY3JlYXRlQ2FudmFzO1xuRG9jdW1lbnQuY3JlYXRlSW1hZ2UgPSBjcmVhdGVJbWFnZTtcbkRvY3VtZW50LmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlcztcblxuZnVuY3Rpb24gb3duS2V5cyQxKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDEodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbi8qKlxuICogU1ZHIHJlbmRlcmVyIG9uIGNhbnZhcy5cbiAqL1xuXG52YXIgQ2FudmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogTWFpbiBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIGN0eCAtIFJlbmRlcmluZyBjb250ZXh0LlxuICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIERvY3VtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2FudmcoY3R4LCBzdmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FudmcpO1xuXG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICAgIHRoaXMuc2NyZWVuID0gbmV3IFNjcmVlbihjdHgsIG9wdGlvbnMpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdmFyIGRvY3VtZW50ID0gbmV3IERvY3VtZW50KHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEVsZW1lbnQoc3ZnKTtcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgdGhpcy5kb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBDYW52ZyBpc250YW5jZSBmcm9tIFNWRyBzb3VyY2Ugc3RyaW5nIG9yIFVSTC5cbiAgICogQHBhcmFtIGN0eCAtIFJlbmRlcmluZyBjb250ZXh0LlxuICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIHNvdXJjZSBzdHJpbmcgb3IgVVJMLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDYW52ZywgW3tcbiAgICBrZXk6IFwiZm9ya1wiLFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBDYW52ZyBpbnN0YW5jZSB3aXRoIGluaGVyaXRlZCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBjdHggLSBSZW5kZXJpbmcgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIHNvdXJjZSBzdHJpbmcgb3IgVVJMLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMuXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcmsoY3R4LCBzdmcpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIHJldHVybiBDYW52Zy5mcm9tKGN0eCwgc3ZnLCBfb2JqZWN0U3ByZWFkJDEoe30sIHRoaXMub3B0aW9ucywge30sIG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBDYW52ZyBpbnN0YW5jZSB3aXRoIGluaGVyaXRlZCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBjdHggLSBSZW5kZXJpbmcgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gc3ZnIC0gU1ZHIHNvdXJjZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImZvcmtTdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ya1N0cmluZyhjdHgsIHN2Zykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgcmV0dXJuIENhbnZnLmZyb21TdHJpbmcoY3R4LCBzdmcsIF9vYmplY3RTcHJlYWQkMSh7fSwgdGhpcy5vcHRpb25zLCB7fSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudCBpcyByZWFkeSBwcm9taXNlLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVhZHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JlZW4ucmVhZHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnQgaXMgcmVhZHkgdmFsdWUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1JlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUmVhZHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JlZW4uaXNSZWFkeSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5kZXIgb25seSBmaXJzdCBmcmFtZSwgaWdub3JpbmcgYW5pbWF0aW9ucyBhbmQgbW91c2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlbmRlciA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBvcHRpb25zLFxuICAgICAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IF9hcmdzLmxlbmd0aCA+IDAgJiYgX2FyZ3NbMF0gIT09IHVuZGVmaW5lZCA/IF9hcmdzWzBdIDoge307XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydChfb2JqZWN0U3ByZWFkJDEoe1xuICAgICAgICAgICAgICAgICAgZW5hYmxlUmVkcmF3OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgaWdub3JlQW5pbWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgaWdub3JlTW91c2U6IHRydWVcbiAgICAgICAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBfcmVuZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZW5kZXI7XG4gICAgfSgpXG4gICAgLyoqXG4gICAgICogU3RhcnQgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyIG9wdGlvbnMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICBzY3JlZW4gPSB0aGlzLnNjcmVlbixcbiAgICAgICAgICBiYXNlT3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHNjcmVlbi5zdGFydChkb2N1bWVudEVsZW1lbnQsIF9vYmplY3RTcHJlYWQkMSh7XG4gICAgICAgIGVuYWJsZVJlZHJhdzogdHJ1ZVxuICAgICAgfSwgYmFzZU9wdGlvbnMsIHt9LCBvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3AgcmVuZGVyaW5nLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5zY3JlZW4uc3RvcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemUgU1ZHIHRvIGZpdCBpbiBnaXZlbiBzaXplLlxuICAgICAqIEBwYXJhbSB3aWR0aFxuICAgICAqIEBwYXJhbSBoZWlnaHRcbiAgICAgKiBAcGFyYW0gcHJlc2VydmVBc3BlY3RSYXRpb1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSh3aWR0aCkge1xuICAgICAgdmFyIGhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogd2lkdGg7XG4gICAgICB2YXIgcHJlc2VydmVBc3BlY3RSYXRpbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgICB0aGlzLmRvY3VtZW50RWxlbWVudC5yZXNpemUod2lkdGgsIGhlaWdodCwgcHJlc2VydmVBc3BlY3RSYXRpbyk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2Zyb20gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMihjdHgsIHN2Zykge1xuICAgICAgICB2YXIgb3B0aW9ucyxcbiAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgIHN2Z0RvY3VtZW50LFxuICAgICAgICAgICAgX2FyZ3MyID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gX2FyZ3MyLmxlbmd0aCA+IDIgJiYgX2FyZ3MyWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnczJbMl0gOiB7fTtcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKHN2Zyk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHN2Z0RvY3VtZW50ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IENhbnZnKGN0eCwgc3ZnRG9jdW1lbnQsIG9wdGlvbnMpKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gZnJvbShfeCwgX3gyKSB7XG4gICAgICAgIHJldHVybiBfZnJvbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnJvbTtcbiAgICB9KClcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgQ2FudmcgaXNudGFuY2UgZnJvbSBTVkcgc291cmNlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gY3R4IC0gUmVuZGVyaW5nIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHN2ZyAtIFNWRyBzb3VyY2Ugc3RyaW5nLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJmcm9tU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21TdHJpbmcoY3R4LCBzdmcpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICAgICAgdmFyIHN2Z0RvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzdmcpO1xuICAgICAgcmV0dXJuIG5ldyBDYW52ZyhjdHgsIHN2Z0RvY3VtZW50LCBvcHRpb25zKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2Fudmc7XG59KCk7XG5cbi8qKlxuICogT3B0aW9ucyBwcmVzZXQgZm9yIGBPZmZzY3JlZW5DYW52YXNgLlxuICogQHBhcmFtIGNvbmZpZyAtIFByZXNldCByZXF1aXJlbWVudHMuXG4gKiBAcGFyYW0gY29uZmlnLkRPTVBhcnNlciAtIFhNTC9IVE1MIHBhcnNlciBmcm9tIHN0cmluZyBpbnRvIERPTSBEb2N1bWVudC5cbiAqL1xuZnVuY3Rpb24gb2Zmc2NyZWVuKCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBET01QYXJzZXJGYWxsYmFjayA9IF9yZWYuRE9NUGFyc2VyO1xuXG4gIHZhciBwcmVzZXQgPSB7XG4gICAgd2luZG93OiBudWxsLFxuICAgIGlnbm9yZUFuaW1hdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVNb3VzZTogdHJ1ZSxcbiAgICBET01QYXJzZXI6IERPTVBhcnNlckZhbGxiYWNrLFxuICAgIGNyZWF0ZUNhbnZhczogZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgY3JlYXRlSW1hZ2U6IGZ1bmN0aW9uIGNyZWF0ZUltYWdlKHVybCkge1xuICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciByZXNwb25zZSwgYmxvYiwgaW1nO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh1cmwpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgYmxvYiA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IpO1xuXG4gICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBpbWcgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgaW1nKTtcblxuICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgfSkpKCk7XG4gICAgfVxuICB9O1xuXG4gIGlmICh0eXBlb2YgRE9NUGFyc2VyICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgRE9NUGFyc2VyRmFsbGJhY2sgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShwcmVzZXQsICdET01QYXJzZXInKTtcbiAgfVxuXG4gIHJldHVybiBwcmVzZXQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcmVzZXQgZm9yIGBub2RlLWNhbnZhc2AuXG4gKiBAcGFyYW0gY29uZmlnIC0gUHJlc2V0IHJlcXVpcmVtZW50cy5cbiAqIEBwYXJhbSBjb25maWcuRE9NUGFyc2VyIC0gWE1ML0hUTUwgcGFyc2VyIGZyb20gc3RyaW5nIGludG8gRE9NIERvY3VtZW50LlxuICogQHBhcmFtIGNvbmZpZy5jYW52YXMgLSBgbm9kZS1jYW52YXNgIGV4cG9ydHMuXG4gKiBAcGFyYW0gY29uZmlnLmZldGNoIC0gV0hBVFdHLWNvbXBhdGlibGUgYGZldGNoYCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9kZShfcmVmKSB7XG4gIHZhciBET01QYXJzZXIgPSBfcmVmLkRPTVBhcnNlcixcbiAgICAgIGNhbnZhcyA9IF9yZWYuY2FudmFzLFxuICAgICAgZmV0Y2ggPSBfcmVmLmZldGNoO1xuICByZXR1cm4ge1xuICAgIHdpbmRvdzogbnVsbCxcbiAgICBpZ25vcmVBbmltYXRpb246IHRydWUsXG4gICAgaWdub3JlTW91c2U6IHRydWUsXG4gICAgRE9NUGFyc2VyOiBET01QYXJzZXIsXG4gICAgZmV0Y2g6IGZldGNoLFxuICAgIGNyZWF0ZUNhbnZhczogY2FudmFzLmNyZWF0ZUNhbnZhcyxcbiAgICBjcmVhdGVJbWFnZTogY2FudmFzLmxvYWRJbWFnZVxuICB9O1xufVxuXG5cblxudmFyIGluZGV4ID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdG9mZnNjcmVlbjogb2Zmc2NyZWVuLFxuXHRub2RlOiBub2RlXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2Fudmc7XG5leHBvcnQgeyBBRWxlbWVudCwgQW5pbWF0ZUNvbG9yRWxlbWVudCwgQW5pbWF0ZUVsZW1lbnQsIEFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50LCBCb3VuZGluZ0JveCwgQ0IxLCBDQjIsIENCMywgQ0I0LCBDYW52ZywgQ2lyY2xlRWxlbWVudCwgQ2xpcFBhdGhFbGVtZW50LCBEZWZzRWxlbWVudCwgRGVzY0VsZW1lbnQsIERvY3VtZW50LCBFbGVtZW50LCBFbGxpcHNlRWxlbWVudCwgRmVDb2xvck1hdHJpeEVsZW1lbnQsIEZlQ29tcG9zaXRlRWxlbWVudCwgRmVEcm9wU2hhZG93RWxlbWVudCwgRmVHYXVzc2lhbkJsdXJFbGVtZW50LCBGZU1vcnBob2xvZ3lFbGVtZW50LCBGaWx0ZXJFbGVtZW50LCBGb250LCBGb250RWxlbWVudCwgRm9udEZhY2VFbGVtZW50LCBHRWxlbWVudCwgR2x5cGhFbGVtZW50LCBHcmFkaWVudEVsZW1lbnQsIEltYWdlRWxlbWVudCwgTGluZUVsZW1lbnQsIExpbmVhckdyYWRpZW50RWxlbWVudCwgTWFya2VyRWxlbWVudCwgTWFza0VsZW1lbnQsIE1hdHJpeCwgTWlzc2luZ0dseXBoRWxlbWVudCwgTW91c2UsIFBTRVVET19aRVJPLCBQYXJzZXIsIFBhdGhFbGVtZW50LCBQYXRoUGFyc2VyLCBQYXR0ZXJuRWxlbWVudCwgUG9pbnQsIFBvbHlnb25FbGVtZW50LCBQb2x5bGluZUVsZW1lbnQsIFByb3BlcnR5LCBRQjEsIFFCMiwgUUIzLCBSYWRpYWxHcmFkaWVudEVsZW1lbnQsIFJlY3RFbGVtZW50LCBSZW5kZXJlZEVsZW1lbnQsIFJvdGF0ZSwgU1ZHRWxlbWVudCwgU1ZHRm9udExvYWRlciwgU2NhbGUsIFNjcmVlbiwgU2tldywgU2tld1gsIFNrZXdZLCBTdG9wRWxlbWVudCwgU3R5bGVFbGVtZW50LCBTeW1ib2xFbGVtZW50LCBUUmVmRWxlbWVudCwgVFNwYW5FbGVtZW50LCBUZXh0RWxlbWVudCwgVGV4dFBhdGhFbGVtZW50LCBUaXRsZUVsZW1lbnQsIFRyYW5zZm9ybSwgVHJhbnNsYXRlLCBVbmtub3duRWxlbWVudCwgVXNlRWxlbWVudCwgVmlld1BvcnQsIGNvbXByZXNzU3BhY2VzLCBnZXRTZWxlY3RvclNwZWNpZmljaXR5LCBub3JtYWxpemVBdHRyaWJ1dGVOYW1lLCBub3JtYWxpemVDb2xvciwgcGFyc2VFeHRlcm5hbFVybCwgaW5kZXggYXMgcHJlc2V0cywgdG9OdW1iZXJzLCB0cmltTGVmdCwgdHJpbVJpZ2h0LCB2ZWN0b3JNYWduaXR1ZGUsIHZlY3RvcnNBbmdsZSwgdmVjdG9yc1JhdGlvIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1WlhNdWFuTWlMQ0p6YjNWeVkyVnpJanBiSWk0dUwyNXZaR1ZmYlc5a2RXeGxjeTl5WldkbGJtVnlZWFJ2Y2kxeWRXNTBhVzFsTDNKMWJuUnBiV1V1YW5NaVhTd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xWEc0Z0tpQkRiM0I1Y21sbmFIUWdLR01wSURJd01UUXRjSEpsYzJWdWRDd2dSbUZqWldKdmIyc3NJRWx1WXk1Y2JpQXFYRzRnS2lCVWFHbHpJSE52ZFhKalpTQmpiMlJsSUdseklHeHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQk5TVlFnYkdsalpXNXpaU0JtYjNWdVpDQnBiaUIwYUdWY2JpQXFJRXhKUTBWT1UwVWdabWxzWlNCcGJpQjBhR1VnY205dmRDQmthWEpsWTNSdmNua2diMllnZEdocGN5QnpiM1Z5WTJVZ2RISmxaUzVjYmlBcUwxeHVYRzUyWVhJZ2NuVnVkR2x0WlNBOUlDaG1kVzVqZEdsdmJpQW9aWGh3YjNKMGN5a2dlMXh1SUNCY0luVnpaU0J6ZEhKcFkzUmNJanRjYmx4dUlDQjJZWElnVDNBZ1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVJQ0IyWVhJZ2FHRnpUM2R1SUQwZ1QzQXVhR0Z6VDNkdVVISnZjR1Z5ZEhrN1hHNGdJSFpoY2lCMWJtUmxabWx1WldRN0lDOHZJRTF2Y21VZ1kyOXRjSEpsYzNOcFlteGxJSFJvWVc0Z2RtOXBaQ0F3TGx4dUlDQjJZWElnSkZONWJXSnZiQ0E5SUhSNWNHVnZaaUJUZVcxaWIyd2dQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQS9JRk41YldKdmJDQTZJSHQ5TzF4dUlDQjJZWElnYVhSbGNtRjBiM0pUZVcxaWIyd2dQU0FrVTNsdFltOXNMbWwwWlhKaGRHOXlJSHg4SUZ3aVFFQnBkR1Z5WVhSdmNsd2lPMXh1SUNCMllYSWdZWE41Ym1OSmRHVnlZWFJ2Y2xONWJXSnZiQ0E5SUNSVGVXMWliMnd1WVhONWJtTkpkR1Z5WVhSdmNpQjhmQ0JjSWtCQVlYTjVibU5KZEdWeVlYUnZjbHdpTzF4dUlDQjJZWElnZEc5VGRISnBibWRVWVdkVGVXMWliMndnUFNBa1UzbHRZbTlzTG5SdlUzUnlhVzVuVkdGbklIeDhJRndpUUVCMGIxTjBjbWx1WjFSaFoxd2lPMXh1WEc0Z0lHWjFibU4wYVc5dUlIZHlZWEFvYVc1dVpYSkdiaXdnYjNWMFpYSkdiaXdnYzJWc1ppd2dkSEo1VEc5amMweHBjM1FwSUh0Y2JpQWdJQ0F2THlCSlppQnZkWFJsY2tadUlIQnliM1pwWkdWa0lHRnVaQ0J2ZFhSbGNrWnVMbkJ5YjNSdmRIbHdaU0JwY3lCaElFZGxibVZ5WVhSdmNpd2dkR2hsYmlCdmRYUmxja1p1TG5CeWIzUnZkSGx3WlNCcGJuTjBZVzVqWlc5bUlFZGxibVZ5WVhSdmNpNWNiaUFnSUNCMllYSWdjSEp2ZEc5SFpXNWxjbUYwYjNJZ1BTQnZkWFJsY2tadUlDWW1JRzkxZEdWeVJtNHVjSEp2ZEc5MGVYQmxJR2x1YzNSaGJtTmxiMllnUjJWdVpYSmhkRzl5SUQ4Z2IzVjBaWEpHYmlBNklFZGxibVZ5WVhSdmNqdGNiaUFnSUNCMllYSWdaMlZ1WlhKaGRHOXlJRDBnVDJKcVpXTjBMbU55WldGMFpTaHdjbTkwYjBkbGJtVnlZWFJ2Y2k1d2NtOTBiM1I1Y0dVcE8xeHVJQ0FnSUhaaGNpQmpiMjUwWlhoMElEMGdibVYzSUVOdmJuUmxlSFFvZEhKNVRHOWpjMHhwYzNRZ2ZId2dXMTBwTzF4dVhHNGdJQ0FnTHk4Z1ZHaGxJQzVmYVc1MmIydGxJRzFsZEdodlpDQjFibWxtYVdWeklIUm9aU0JwYlhCc1pXMWxiblJoZEdsdmJuTWdiMllnZEdobElDNXVaWGgwTEZ4dUlDQWdJQzh2SUM1MGFISnZkeXdnWVc1a0lDNXlaWFIxY200Z2JXVjBhRzlrY3k1Y2JpQWdJQ0JuWlc1bGNtRjBiM0l1WDJsdWRtOXJaU0E5SUcxaGEyVkpiblp2YTJWTlpYUm9iMlFvYVc1dVpYSkdiaXdnYzJWc1ppd2dZMjl1ZEdWNGRDazdYRzVjYmlBZ0lDQnlaWFIxY200Z1oyVnVaWEpoZEc5eU8xeHVJQ0I5WEc0Z0lHVjRjRzl5ZEhNdWQzSmhjQ0E5SUhkeVlYQTdYRzVjYmlBZ0x5OGdWSEo1TDJOaGRHTm9JR2hsYkhCbGNpQjBieUJ0YVc1cGJXbDZaU0JrWlc5d2RHbHRhWHBoZEdsdmJuTXVJRkpsZEhWeWJuTWdZU0JqYjIxd2JHVjBhVzl1WEc0Z0lDOHZJSEpsWTI5eVpDQnNhV3RsSUdOdmJuUmxlSFF1ZEhKNVJXNTBjbWxsYzF0cFhTNWpiMjF3YkdWMGFXOXVMaUJVYUdseklHbHVkR1Z5Wm1GalpTQmpiM1ZzWkZ4dUlDQXZMeUJvWVhabElHSmxaVzRnS0dGdVpDQjNZWE1nY0hKbGRtbHZkWE5zZVNrZ1pHVnphV2R1WldRZ2RHOGdkR0ZyWlNCaElHTnNiM04xY21VZ2RHOGdZbVZjYmlBZ0x5OGdhVzUyYjJ0bFpDQjNhWFJvYjNWMElHRnlaM1Z0Wlc1MGN5d2dZblYwSUdsdUlHRnNiQ0IwYUdVZ1kyRnpaWE1nZDJVZ1kyRnlaU0JoWW05MWRDQjNaVnh1SUNBdkx5QmhiSEpsWVdSNUlHaGhkbVVnWVc0Z1pYaHBjM1JwYm1jZ2JXVjBhRzlrSUhkbElIZGhiblFnZEc4Z1kyRnNiQ3dnYzI4Z2RHaGxjbVVuY3lCdWJ5QnVaV1ZrWEc0Z0lDOHZJSFJ2SUdOeVpXRjBaU0JoSUc1bGR5Qm1kVzVqZEdsdmJpQnZZbXBsWTNRdUlGZGxJR05oYmlCbGRtVnVJR2RsZENCaGQyRjVJSGRwZEdnZ1lYTnpkVzFwYm1kY2JpQWdMeThnZEdobElHMWxkR2h2WkNCMFlXdGxjeUJsZUdGamRHeDVJRzl1WlNCaGNtZDFiV1Z1ZEN3Z2MybHVZMlVnZEdoaGRDQm9ZWEJ3Wlc1eklIUnZJR0psSUhSeWRXVmNiaUFnTHk4Z2FXNGdaWFpsY25rZ1kyRnpaU3dnYzI4Z2QyVWdaRzl1SjNRZ2FHRjJaU0IwYnlCMGIzVmphQ0IwYUdVZ1lYSm5kVzFsYm5SeklHOWlhbVZqZEM0Z1ZHaGxYRzRnSUM4dklHOXViSGtnWVdSa2FYUnBiMjVoYkNCaGJHeHZZMkYwYVc5dUlISmxjWFZwY21Wa0lHbHpJSFJvWlNCamIyMXdiR1YwYVc5dUlISmxZMjl5WkN3Z2QyaHBZMmhjYmlBZ0x5OGdhR0Z6SUdFZ2MzUmhZbXhsSUhOb1lYQmxJR0Z1WkNCemJ5Qm9iM0JsWm5Wc2JIa2djMmh2ZFd4a0lHSmxJR05vWldGd0lIUnZJR0ZzYkc5allYUmxMbHh1SUNCbWRXNWpkR2x2YmlCMGNubERZWFJqYUNobWJpd2diMkpxTENCaGNtY3BJSHRjYmlBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHNnZEhsd1pUb2dYQ0p1YjNKdFlXeGNJaXdnWVhKbk9pQm1iaTVqWVd4c0tHOWlhaXdnWVhKbktTQjlPMXh1SUNBZ0lIMGdZMkYwWTJnZ0tHVnljaWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHNnZEhsd1pUb2dYQ0owYUhKdmQxd2lMQ0JoY21jNklHVnljaUI5TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhaaGNpQkhaVzVUZEdGMFpWTjFjM0JsYm1SbFpGTjBZWEowSUQwZ1hDSnpkWE53Wlc1a1pXUlRkR0Z5ZEZ3aU8xeHVJQ0IyWVhJZ1IyVnVVM1JoZEdWVGRYTndaVzVrWldSWmFXVnNaQ0E5SUZ3aWMzVnpjR1Z1WkdWa1dXbGxiR1JjSWp0Y2JpQWdkbUZ5SUVkbGJsTjBZWFJsUlhobFkzVjBhVzVuSUQwZ1hDSmxlR1ZqZFhScGJtZGNJanRjYmlBZ2RtRnlJRWRsYmxOMFlYUmxRMjl0Y0d4bGRHVmtJRDBnWENKamIyMXdiR1YwWldSY0lqdGNibHh1SUNBdkx5QlNaWFIxY201cGJtY2dkR2hwY3lCdlltcGxZM1FnWm5KdmJTQjBhR1VnYVc1dVpYSkdiaUJvWVhNZ2RHaGxJSE5oYldVZ1pXWm1aV04wSUdGelhHNGdJQzh2SUdKeVpXRnJhVzVuSUc5MWRDQnZaaUIwYUdVZ1pHbHpjR0YwWTJnZ2MzZHBkR05vSUhOMFlYUmxiV1Z1ZEM1Y2JpQWdkbUZ5SUVOdmJuUnBiblZsVTJWdWRHbHVaV3dnUFNCN2ZUdGNibHh1SUNBdkx5QkVkVzF0ZVNCamIyNXpkSEoxWTNSdmNpQm1kVzVqZEdsdmJuTWdkR2hoZENCM1pTQjFjMlVnWVhNZ2RHaGxJQzVqYjI1emRISjFZM1J2Y2lCaGJtUmNiaUFnTHk4Z0xtTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU0J3Y205d1pYSjBhV1Z6SUdadmNpQm1kVzVqZEdsdmJuTWdkR2hoZENCeVpYUjFjbTRnUjJWdVpYSmhkRzl5WEc0Z0lDOHZJRzlpYW1WamRITXVJRVp2Y2lCbWRXeHNJSE53WldNZ1kyOXRjR3hwWVc1alpTd2dlVzkxSUcxaGVTQjNhWE5vSUhSdklHTnZibVpwWjNWeVpTQjViM1Z5WEc0Z0lDOHZJRzFwYm1sbWFXVnlJRzV2ZENCMGJ5QnRZVzVuYkdVZ2RHaGxJRzVoYldWeklHOW1JSFJvWlhObElIUjNieUJtZFc1amRHbHZibk11WEc0Z0lHWjFibU4wYVc5dUlFZGxibVZ5WVhSdmNpZ3BJSHQ5WEc0Z0lHWjFibU4wYVc5dUlFZGxibVZ5WVhSdmNrWjFibU4wYVc5dUtDa2dlMzFjYmlBZ1puVnVZM1JwYjI0Z1IyVnVaWEpoZEc5eVJuVnVZM1JwYjI1UWNtOTBiM1I1Y0dVb0tTQjdmVnh1WEc0Z0lDOHZJRlJvYVhNZ2FYTWdZU0J3YjJ4NVptbHNiQ0JtYjNJZ0pVbDBaWEpoZEc5eVVISnZkRzkwZVhCbEpTQm1iM0lnWlc1MmFYSnZibTFsYm5SeklIUm9ZWFJjYmlBZ0x5OGdaRzl1SjNRZ2JtRjBhWFpsYkhrZ2MzVndjRzl5ZENCcGRDNWNiaUFnZG1GeUlFbDBaWEpoZEc5eVVISnZkRzkwZVhCbElEMGdlMzA3WEc0Z0lFbDBaWEpoZEc5eVVISnZkRzkwZVhCbFcybDBaWEpoZEc5eVUzbHRZbTlzWFNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZUdGNibHh1SUNCMllYSWdaMlYwVUhKdmRHOGdQU0JQWW1wbFkzUXVaMlYwVUhKdmRHOTBlWEJsVDJZN1hHNGdJSFpoY2lCT1lYUnBkbVZKZEdWeVlYUnZjbEJ5YjNSdmRIbHdaU0E5SUdkbGRGQnliM1J2SUNZbUlHZGxkRkJ5YjNSdktHZGxkRkJ5YjNSdktIWmhiSFZsY3loYlhTa3BLVHRjYmlBZ2FXWWdLRTVoZEdsMlpVbDBaWEpoZEc5eVVISnZkRzkwZVhCbElDWW1YRzRnSUNBZ0lDQk9ZWFJwZG1WSmRHVnlZWFJ2Y2xCeWIzUnZkSGx3WlNBaFBUMGdUM0FnSmlaY2JpQWdJQ0FnSUdoaGMwOTNiaTVqWVd4c0tFNWhkR2wyWlVsMFpYSmhkRzl5VUhKdmRHOTBlWEJsTENCcGRHVnlZWFJ2Y2xONWJXSnZiQ2twSUh0Y2JpQWdJQ0F2THlCVWFHbHpJR1Z1ZG1seWIyNXRaVzUwSUdoaGN5QmhJRzVoZEdsMlpTQWxTWFJsY21GMGIzSlFjbTkwYjNSNWNHVWxPeUIxYzJVZ2FYUWdhVzV6ZEdWaFpGeHVJQ0FnSUM4dklHOW1JSFJvWlNCd2IyeDVabWxzYkM1Y2JpQWdJQ0JKZEdWeVlYUnZjbEJ5YjNSdmRIbHdaU0E5SUU1aGRHbDJaVWwwWlhKaGRHOXlVSEp2ZEc5MGVYQmxPMXh1SUNCOVhHNWNiaUFnZG1GeUlFZHdJRDBnUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjVRY205MGIzUjVjR1V1Y0hKdmRHOTBlWEJsSUQxY2JpQWdJQ0JIWlc1bGNtRjBiM0l1Y0hKdmRHOTBlWEJsSUQwZ1QySnFaV04wTG1OeVpXRjBaU2hKZEdWeVlYUnZjbEJ5YjNSdmRIbHdaU2s3WEc0Z0lFZGxibVZ5WVhSdmNrWjFibU4wYVc5dUxuQnliM1J2ZEhsd1pTQTlJRWR3TG1OdmJuTjBjblZqZEc5eUlEMGdSMlZ1WlhKaGRHOXlSblZ1WTNScGIyNVFjbTkwYjNSNWNHVTdYRzRnSUVkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1VUhKdmRHOTBlWEJsTG1OdmJuTjBjblZqZEc5eUlEMGdSMlZ1WlhKaGRHOXlSblZ1WTNScGIyNDdYRzRnSUVkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1VUhKdmRHOTBlWEJsVzNSdlUzUnlhVzVuVkdGblUzbHRZbTlzWFNBOVhHNGdJQ0FnUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjR1WkdsemNHeGhlVTVoYldVZ1BTQmNJa2RsYm1WeVlYUnZja1oxYm1OMGFXOXVYQ0k3WEc1Y2JpQWdMeThnU0dWc2NHVnlJR1p2Y2lCa1pXWnBibWx1WnlCMGFHVWdMbTVsZUhRc0lDNTBhSEp2ZHl3Z1lXNWtJQzV5WlhSMWNtNGdiV1YwYUc5a2N5QnZaaUIwYUdWY2JpQWdMeThnU1hSbGNtRjBiM0lnYVc1MFpYSm1ZV05sSUdsdUlIUmxjbTF6SUc5bUlHRWdjMmx1WjJ4bElDNWZhVzUyYjJ0bElHMWxkR2h2WkM1Y2JpQWdablZ1WTNScGIyNGdaR1ZtYVc1bFNYUmxjbUYwYjNKTlpYUm9iMlJ6S0hCeWIzUnZkSGx3WlNrZ2UxeHVJQ0FnSUZ0Y0ltNWxlSFJjSWl3Z1hDSjBhSEp2ZDF3aUxDQmNJbkpsZEhWeWJsd2lYUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLRzFsZEdodlpDa2dlMXh1SUNBZ0lDQWdjSEp2ZEc5MGVYQmxXMjFsZEdodlpGMGdQU0JtZFc1amRHbHZiaWhoY21jcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WDJsdWRtOXJaU2h0WlhSb2IyUXNJR0Z5WnlrN1hHNGdJQ0FnSUNCOU8xeHVJQ0FnSUgwcE8xeHVJQ0I5WEc1Y2JpQWdaWGh3YjNKMGN5NXBjMGRsYm1WeVlYUnZja1oxYm1OMGFXOXVJRDBnWm5WdVkzUnBiMjRvWjJWdVJuVnVLU0I3WEc0Z0lDQWdkbUZ5SUdOMGIzSWdQU0IwZVhCbGIyWWdaMlZ1Um5WdUlEMDlQU0JjSW1aMWJtTjBhVzl1WENJZ0ppWWdaMlZ1Um5WdUxtTnZibk4wY25WamRHOXlPMXh1SUNBZ0lISmxkSFZ5YmlCamRHOXlYRzRnSUNBZ0lDQS9JR04wYjNJZ1BUMDlJRWRsYm1WeVlYUnZja1oxYm1OMGFXOXVJSHg4WEc0Z0lDQWdJQ0FnSUM4dklFWnZjaUIwYUdVZ2JtRjBhWFpsSUVkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1SUdOdmJuTjBjblZqZEc5eUxDQjBhR1VnWW1WemRDQjNaU0JqWVc1Y2JpQWdJQ0FnSUNBZ0x5OGdaRzhnYVhNZ2RHOGdZMmhsWTJzZ2FYUnpJQzV1WVcxbElIQnliM0JsY25SNUxseHVJQ0FnSUNBZ0lDQW9ZM1J2Y2k1a2FYTndiR0Y1VG1GdFpTQjhmQ0JqZEc5eUxtNWhiV1VwSUQwOVBTQmNJa2RsYm1WeVlYUnZja1oxYm1OMGFXOXVYQ0pjYmlBZ0lDQWdJRG9nWm1Gc2MyVTdYRzRnSUgwN1hHNWNiaUFnWlhod2IzSjBjeTV0WVhKcklEMGdablZ1WTNScGIyNG9aMlZ1Um5WdUtTQjdYRzRnSUNBZ2FXWWdLRTlpYW1WamRDNXpaWFJRY205MGIzUjVjR1ZQWmlrZ2UxeHVJQ0FnSUNBZ1QySnFaV04wTG5ObGRGQnliM1J2ZEhsd1pVOW1LR2RsYmtaMWJpd2dSMlZ1WlhKaGRHOXlSblZ1WTNScGIyNVFjbTkwYjNSNWNHVXBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCblpXNUdkVzR1WDE5d2NtOTBiMTlmSUQwZ1IyVnVaWEpoZEc5eVJuVnVZM1JwYjI1UWNtOTBiM1I1Y0dVN1hHNGdJQ0FnSUNCcFppQW9JU2gwYjFOMGNtbHVaMVJoWjFONWJXSnZiQ0JwYmlCblpXNUdkVzRwS1NCN1hHNGdJQ0FnSUNBZ0lHZGxia1oxYmx0MGIxTjBjbWx1WjFSaFoxTjViV0p2YkYwZ1BTQmNJa2RsYm1WeVlYUnZja1oxYm1OMGFXOXVYQ0k3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lHZGxia1oxYmk1d2NtOTBiM1I1Y0dVZ1BTQlBZbXBsWTNRdVkzSmxZWFJsS0Vkd0tUdGNiaUFnSUNCeVpYUjFjbTRnWjJWdVJuVnVPMXh1SUNCOU8xeHVYRzRnSUM4dklGZHBkR2hwYmlCMGFHVWdZbTlrZVNCdlppQmhibmtnWVhONWJtTWdablZ1WTNScGIyNHNJR0JoZDJGcGRDQjRZQ0JwY3lCMGNtRnVjMlp2Y20xbFpDQjBiMXh1SUNBdkx5QmdlV2xsYkdRZ2NtVm5aVzVsY21GMGIzSlNkVzUwYVcxbExtRjNjbUZ3S0hncFlDd2djMjhnZEdoaGRDQjBhR1VnY25WdWRHbHRaU0JqWVc0Z2RHVnpkRnh1SUNBdkx5QmdhR0Z6VDNkdUxtTmhiR3dvZG1Gc2RXVXNJRndpWDE5aGQyRnBkRndpS1dBZ2RHOGdaR1YwWlhKdGFXNWxJR2xtSUhSb1pTQjVhV1ZzWkdWa0lIWmhiSFZsSUdselhHNGdJQzh2SUcxbFlXNTBJSFJ2SUdKbElHRjNZV2wwWldRdVhHNGdJR1Y0Y0c5eWRITXVZWGR5WVhBZ1BTQm1kVzVqZEdsdmJpaGhjbWNwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdleUJmWDJGM1lXbDBPaUJoY21jZ2ZUdGNiaUFnZlR0Y2JseHVJQ0JtZFc1amRHbHZiaUJCYzNsdVkwbDBaWEpoZEc5eUtHZGxibVZ5WVhSdmNpd2dVSEp2YldselpVbHRjR3dwSUh0Y2JpQWdJQ0JtZFc1amRHbHZiaUJwYm5admEyVW9iV1YwYUc5a0xDQmhjbWNzSUhKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnZTF4dUlDQWdJQ0FnZG1GeUlISmxZMjl5WkNBOUlIUnllVU5oZEdOb0tHZGxibVZ5WVhSdmNsdHRaWFJvYjJSZExDQm5aVzVsY21GMGIzSXNJR0Z5WnlrN1hHNGdJQ0FnSUNCcFppQW9jbVZqYjNKa0xuUjVjR1VnUFQwOUlGd2lkR2h5YjNkY0lpa2dlMXh1SUNBZ0lDQWdJQ0J5WldwbFkzUW9jbVZqYjNKa0xtRnlaeWs3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2NtVmpiM0prTG1GeVp6dGNiaUFnSUNBZ0lDQWdkbUZ5SUhaaGJIVmxJRDBnY21WemRXeDBMblpoYkhWbE8xeHVJQ0FnSUNBZ0lDQnBaaUFvZG1Gc2RXVWdKaVpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ1hDSnZZbXBsWTNSY0lpQW1KbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FHRnpUM2R1TG1OaGJHd29kbUZzZFdVc0lGd2lYMTloZDJGcGRGd2lLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCUWNtOXRhWE5sU1cxd2JDNXlaWE52YkhabEtIWmhiSFZsTGw5ZllYZGhhWFFwTG5Sb1pXNG9ablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWRtOXJaU2hjSW01bGVIUmNJaXdnZG1Gc2RXVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDazdYRzRnSUNBZ0lDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b1pYSnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBiblp2YTJVb1hDSjBhSEp2ZDF3aUxDQmxjbklzSUhKbGMyOXNkbVVzSUhKbGFtVmpkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVUhKdmJXbHpaVWx0Y0d3dWNtVnpiMngyWlNoMllXeDFaU2t1ZEdobGJpaG1kVzVqZEdsdmJpaDFibmR5WVhCd1pXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlhhR1Z1SUdFZ2VXbGxiR1JsWkNCUWNtOXRhWE5sSUdseklISmxjMjlzZG1Wa0xDQnBkSE1nWm1sdVlXd2dkbUZzZFdVZ1ltVmpiMjFsYzF4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlNBdWRtRnNkV1VnYjJZZ2RHaGxJRkJ5YjIxcGMyVThlM1poYkhWbExHUnZibVY5UGlCeVpYTjFiSFFnWm05eUlIUm9aVnh1SUNBZ0lDQWdJQ0FnSUM4dklHTjFjbkpsYm5RZ2FYUmxjbUYwYVc5dUxseHVJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDNTJZV3gxWlNBOUlIVnVkM0poY0hCbFpEdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOdmJIWmxLSEpsYzNWc2RDazdYRzRnSUNBZ0lDQWdJSDBzSUdaMWJtTjBhVzl1S0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdTV1lnWVNCeVpXcGxZM1JsWkNCUWNtOXRhWE5sSUhkaGN5QjVhV1ZzWkdWa0xDQjBhSEp2ZHlCMGFHVWdjbVZxWldOMGFXOXVJR0poWTJ0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJwYm5SdklIUm9aU0JoYzNsdVl5Qm5aVzVsY21GMGIzSWdablZ1WTNScGIyNGdjMjhnYVhRZ1kyRnVJR0psSUdoaGJtUnNaV1FnZEdobGNtVXVYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2x1ZG05clpTaGNJblJvY205M1hDSXNJR1Z5Y205eUxDQnlaWE52YkhabExDQnlaV3BsWTNRcE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnY0hKbGRtbHZkWE5RY205dGFYTmxPMXh1WEc0Z0lDQWdablZ1WTNScGIyNGdaVzV4ZFdWMVpTaHRaWFJvYjJRc0lHRnlaeWtnZTF4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnWTJGc2JFbHVkbTlyWlZkcGRHaE5aWFJvYjJSQmJtUkJjbWNvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVSEp2YldselpVbHRjR3dvWm5WdVkzUnBiMjRvY21WemIyeDJaU3dnY21WcVpXTjBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXNTJiMnRsS0cxbGRHaHZaQ3dnWVhKbkxDQnlaWE52YkhabExDQnlaV3BsWTNRcE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSEJ5WlhacGIzVnpVSEp2YldselpTQTlYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHVnVjWFZsZFdVZ2FHRnpJR0psWlc0Z1kyRnNiR1ZrSUdKbFptOXlaU3dnZEdobGJpQjNaU0IzWVc1MElIUnZJSGRoYVhRZ2RXNTBhV3hjYmlBZ0lDQWdJQ0FnTHk4Z1lXeHNJSEJ5WlhacGIzVnpJRkJ5YjIxcGMyVnpJR2hoZG1VZ1ltVmxiaUJ5WlhOdmJIWmxaQ0JpWldadmNtVWdZMkZzYkdsdVp5QnBiblp2YTJVc1hHNGdJQ0FnSUNBZ0lDOHZJSE52SUhSb1lYUWdjbVZ6ZFd4MGN5QmhjbVVnWVd4M1lYbHpJR1JsYkdsMlpYSmxaQ0JwYmlCMGFHVWdZMjl5Y21WamRDQnZjbVJsY2k0Z1NXWmNiaUFnSUNBZ0lDQWdMeThnWlc1eGRXVjFaU0JvWVhNZ2JtOTBJR0psWlc0Z1kyRnNiR1ZrSUdKbFptOXlaU3dnZEdobGJpQnBkQ0JwY3lCcGJYQnZjblJoYm5RZ2RHOWNiaUFnSUNBZ0lDQWdMeThnWTJGc2JDQnBiblp2YTJVZ2FXMXRaV1JwWVhSbGJIa3NJSGRwZEdodmRYUWdkMkZwZEdsdVp5QnZiaUJoSUdOaGJHeGlZV05ySUhSdklHWnBjbVVzWEc0Z0lDQWdJQ0FnSUM4dklITnZJSFJvWVhRZ2RHaGxJR0Z6ZVc1aklHZGxibVZ5WVhSdmNpQm1kVzVqZEdsdmJpQm9ZWE1nZEdobElHOXdjRzl5ZEhWdWFYUjVJSFJ2SUdSdlhHNGdJQ0FnSUNBZ0lDOHZJR0Z1ZVNCdVpXTmxjM05oY25rZ2MyVjBkWEFnYVc0Z1lTQndjbVZrYVdOMFlXSnNaU0IzWVhrdUlGUm9hWE1nY0hKbFpHbGpkR0ZpYVd4cGRIbGNiaUFnSUNBZ0lDQWdMeThnYVhNZ2QyaDVJSFJvWlNCUWNtOXRhWE5sSUdOdmJuTjBjblZqZEc5eUlITjVibU5vY205dWIzVnpiSGtnYVc1MmIydGxjeUJwZEhOY2JpQWdJQ0FnSUNBZ0x5OGdaWGhsWTNWMGIzSWdZMkZzYkdKaFkyc3NJR0Z1WkNCM2FIa2dZWE41Ym1NZ1puVnVZM1JwYjI1eklITjVibU5vY205dWIzVnpiSGxjYmlBZ0lDQWdJQ0FnTHk4Z1pYaGxZM1YwWlNCamIyUmxJR0psWm05eVpTQjBhR1VnWm1seWMzUWdZWGRoYVhRdUlGTnBibU5sSUhkbElHbHRjR3hsYldWdWRDQnphVzF3YkdWY2JpQWdJQ0FnSUNBZ0x5OGdZWE41Ym1NZ1puVnVZM1JwYjI1eklHbHVJSFJsY20xeklHOW1JR0Z6ZVc1aklHZGxibVZ5WVhSdmNuTXNJR2wwSUdseklHVnpjR1ZqYVdGc2JIbGNiaUFnSUNBZ0lDQWdMeThnYVcxd2IzSjBZVzUwSUhSdklHZGxkQ0IwYUdseklISnBaMmgwTENCbGRtVnVJSFJvYjNWbmFDQnBkQ0J5WlhGMWFYSmxjeUJqWVhKbExseHVJQ0FnSUNBZ0lDQndjbVYyYVc5MWMxQnliMjFwYzJVZ1B5QndjbVYyYVc5MWMxQnliMjFwYzJVdWRHaGxiaWhjYmlBZ0lDQWdJQ0FnSUNCallXeHNTVzUyYjJ0bFYybDBhRTFsZEdodlpFRnVaRUZ5Wnl4Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJCZG05cFpDQndjbTl3WVdkaGRHbHVaeUJtWVdsc2RYSmxjeUIwYnlCUWNtOXRhWE5sY3lCeVpYUjFjbTVsWkNCaWVTQnNZWFJsY2x4dUlDQWdJQ0FnSUNBZ0lDOHZJR2x1ZG05allYUnBiMjV6SUc5bUlIUm9aU0JwZEdWeVlYUnZjaTVjYmlBZ0lDQWdJQ0FnSUNCallXeHNTVzUyYjJ0bFYybDBhRTFsZEdodlpFRnVaRUZ5WjF4dUlDQWdJQ0FnSUNBcElEb2dZMkZzYkVsdWRtOXJaVmRwZEdoTlpYUm9iMlJCYm1SQmNtY29LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJFWldacGJtVWdkR2hsSUhWdWFXWnBaV1FnYUdWc2NHVnlJRzFsZEdodlpDQjBhR0YwSUdseklIVnpaV1FnZEc4Z2FXMXdiR1Z0Wlc1MElDNXVaWGgwTEZ4dUlDQWdJQzh2SUM1MGFISnZkeXdnWVc1a0lDNXlaWFIxY200Z0tITmxaU0JrWldacGJtVkpkR1Z5WVhSdmNrMWxkR2h2WkhNcExseHVJQ0FnSUhSb2FYTXVYMmx1ZG05clpTQTlJR1Z1Y1hWbGRXVTdYRzRnSUgxY2JseHVJQ0JrWldacGJtVkpkR1Z5WVhSdmNrMWxkR2h2WkhNb1FYTjVibU5KZEdWeVlYUnZjaTV3Y205MGIzUjVjR1VwTzF4dUlDQkJjM2x1WTBsMFpYSmhkRzl5TG5CeWIzUnZkSGx3WlZ0aGMzbHVZMGwwWlhKaGRHOXlVM2x0WW05c1hTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmVHRjYmlBZ1pYaHdiM0owY3k1QmMzbHVZMGwwWlhKaGRHOXlJRDBnUVhONWJtTkpkR1Z5WVhSdmNqdGNibHh1SUNBdkx5Qk9iM1JsSUhSb1lYUWdjMmx0Y0d4bElHRnplVzVqSUdaMWJtTjBhVzl1Y3lCaGNtVWdhVzF3YkdWdFpXNTBaV1FnYjI0Z2RHOXdJRzltWEc0Z0lDOHZJRUZ6ZVc1alNYUmxjbUYwYjNJZ2IySnFaV04wY3pzZ2RHaGxlU0JxZFhOMElISmxkSFZ5YmlCaElGQnliMjFwYzJVZ1ptOXlJSFJvWlNCMllXeDFaU0J2Wmx4dUlDQXZMeUIwYUdVZ1ptbHVZV3dnY21WemRXeDBJSEJ5YjJSMVkyVmtJR0o1SUhSb1pTQnBkR1Z5WVhSdmNpNWNiaUFnWlhod2IzSjBjeTVoYzNsdVl5QTlJR1oxYm1OMGFXOXVLR2x1Ym1WeVJtNHNJRzkxZEdWeVJtNHNJSE5sYkdZc0lIUnllVXh2WTNOTWFYTjBMQ0JRY205dGFYTmxTVzF3YkNrZ2UxeHVJQ0FnSUdsbUlDaFFjbTl0YVhObFNXMXdiQ0E5UFQwZ2RtOXBaQ0F3S1NCUWNtOXRhWE5sU1cxd2JDQTlJRkJ5YjIxcGMyVTdYRzVjYmlBZ0lDQjJZWElnYVhSbGNpQTlJRzVsZHlCQmMzbHVZMGwwWlhKaGRHOXlLRnh1SUNBZ0lDQWdkM0poY0NocGJtNWxja1p1TENCdmRYUmxja1p1TENCelpXeG1MQ0IwY25sTWIyTnpUR2x6ZENrc1hHNGdJQ0FnSUNCUWNtOXRhWE5sU1cxd2JGeHVJQ0FnSUNrN1hHNWNiaUFnSUNCeVpYUjFjbTRnWlhod2IzSjBjeTVwYzBkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1S0c5MWRHVnlSbTRwWEc0Z0lDQWdJQ0EvSUdsMFpYSWdMeThnU1dZZ2IzVjBaWEpHYmlCcGN5QmhJR2RsYm1WeVlYUnZjaXdnY21WMGRYSnVJSFJvWlNCbWRXeHNJR2wwWlhKaGRHOXlMbHh1SUNBZ0lDQWdPaUJwZEdWeUxtNWxlSFFvS1M1MGFHVnVLR1oxYm1OMGFXOXVLSEpsYzNWc2RDa2dlMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUXVaRzl1WlNBL0lISmxjM1ZzZEM1MllXeDFaU0E2SUdsMFpYSXVibVY0ZENncE8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ2ZUdGNibHh1SUNCbWRXNWpkR2x2YmlCdFlXdGxTVzUyYjJ0bFRXVjBhRzlrS0dsdWJtVnlSbTRzSUhObGJHWXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQjJZWElnYzNSaGRHVWdQU0JIWlc1VGRHRjBaVk4xYzNCbGJtUmxaRk4wWVhKME8xeHVYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUdsdWRtOXJaU2h0WlhSb2IyUXNJR0Z5WnlrZ2UxeHVJQ0FnSUNBZ2FXWWdLSE4wWVhSbElEMDlQU0JIWlc1VGRHRjBaVVY0WldOMWRHbHVaeWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWENKSFpXNWxjbUYwYjNJZ2FYTWdZV3h5WldGa2VTQnlkVzV1YVc1blhDSXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb2MzUmhkR1VnUFQwOUlFZGxibE4wWVhSbFEyOXRjR3hsZEdWa0tTQjdYRzRnSUNBZ0lDQWdJR2xtSUNodFpYUm9iMlFnUFQwOUlGd2lkR2h5YjNkY0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUhSb2NtOTNJR0Z5Wnp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQzh2SUVKbElHWnZjbWRwZG1sdVp5d2djR1Z5SURJMUxqTXVNeTR6TGpNZ2IyWWdkR2hsSUhOd1pXTTZYRzRnSUNBZ0lDQWdJQzh2SUdoMGRIQnpPaTh2Y0dWdmNHeGxMbTF2ZW1sc2JHRXViM0puTDM1cWIzSmxibVJ2Y21abUwyVnpOaTFrY21GbWRDNW9kRzFzSTNObFl5MW5aVzVsY21GMGIzSnlaWE4xYldWY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdSdmJtVlNaWE4xYkhRb0tUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdZMjl1ZEdWNGRDNXRaWFJvYjJRZ1BTQnRaWFJvYjJRN1hHNGdJQ0FnSUNCamIyNTBaWGgwTG1GeVp5QTlJR0Z5Wnp0Y2JseHVJQ0FnSUNBZ2QyaHBiR1VnS0hSeWRXVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHUmxiR1ZuWVhSbElEMGdZMjl1ZEdWNGRDNWtaV3hsWjJGMFpUdGNiaUFnSUNBZ0lDQWdhV1lnS0dSbGJHVm5ZWFJsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUdSbGJHVm5ZWFJsVW1WemRXeDBJRDBnYldGNVltVkpiblp2YTJWRVpXeGxaMkYwWlNoa1pXeGxaMkYwWlN3Z1kyOXVkR1Y0ZENrN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0dSbGJHVm5ZWFJsVW1WemRXeDBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdWc1pXZGhkR1ZTWlhOMWJIUWdQVDA5SUVOdmJuUnBiblZsVTJWdWRHbHVaV3dwSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHUmxiR1ZuWVhSbFVtVnpkV3gwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaGpiMjUwWlhoMExtMWxkR2h2WkNBOVBUMGdYQ0p1WlhoMFhDSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlRaWFIwYVc1bklHTnZiblJsZUhRdVgzTmxiblFnWm05eUlHeGxaMkZqZVNCemRYQndiM0owSUc5bUlFSmhZbVZzSjNOY2JpQWdJQ0FnSUNBZ0lDQXZMeUJtZFc1amRHbHZiaTV6Wlc1MElHbHRjR3hsYldWdWRHRjBhVzl1TGx4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRdWMyVnVkQ0E5SUdOdmJuUmxlSFF1WDNObGJuUWdQU0JqYjI1MFpYaDBMbUZ5Wnp0Y2JseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR052Ym5SbGVIUXViV1YwYUc5a0lEMDlQU0JjSW5Sb2NtOTNYQ0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvYzNSaGRHVWdQVDA5SUVkbGJsTjBZWFJsVTNWemNHVnVaR1ZrVTNSaGNuUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITjBZWFJsSUQwZ1IyVnVVM1JoZEdWRGIyMXdiR1YwWldRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QmpiMjUwWlhoMExtRnlaenRjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBMbVJwYzNCaGRHTm9SWGhqWlhCMGFXOXVLR052Ym5SbGVIUXVZWEpuS1R0Y2JseHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR052Ym5SbGVIUXViV1YwYUc5a0lEMDlQU0JjSW5KbGRIVnlibHdpS1NCN1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNWhZbkoxY0hRb1hDSnlaWFIxY201Y0lpd2dZMjl1ZEdWNGRDNWhjbWNwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjM1JoZEdVZ1BTQkhaVzVUZEdGMFpVVjRaV04xZEdsdVp6dGNibHh1SUNBZ0lDQWdJQ0IyWVhJZ2NtVmpiM0prSUQwZ2RISjVRMkYwWTJnb2FXNXVaWEpHYml3Z2MyVnNaaXdnWTI5dWRHVjRkQ2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHlaV052Y21RdWRIbHdaU0E5UFQwZ1hDSnViM0p0WVd4Y0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUM4dklFbG1JR0Z1SUdWNFkyVndkR2x2YmlCcGN5QjBhSEp2ZDI0Z1puSnZiU0JwYm01bGNrWnVMQ0IzWlNCc1pXRjJaU0J6ZEdGMFpTQTlQVDFjYmlBZ0lDQWdJQ0FnSUNBdkx5QkhaVzVUZEdGMFpVVjRaV04xZEdsdVp5QmhibVFnYkc5dmNDQmlZV05ySUdadmNpQmhibTkwYUdWeUlHbHVkbTlqWVhScGIyNHVYRzRnSUNBZ0lDQWdJQ0FnYzNSaGRHVWdQU0JqYjI1MFpYaDBMbVJ2Ym1WY2JpQWdJQ0FnSUNBZ0lDQWdJRDhnUjJWdVUzUmhkR1ZEYjIxd2JHVjBaV1JjYmlBZ0lDQWdJQ0FnSUNBZ0lEb2dSMlZ1VTNSaGRHVlRkWE53Wlc1a1pXUlphV1ZzWkR0Y2JseHVJQ0FnSUNBZ0lDQWdJR2xtSUNoeVpXTnZjbVF1WVhKbklEMDlQU0JEYjI1MGFXNTFaVk5sYm5ScGJtVnNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVTZJSEpsWTI5eVpDNWhjbWNzWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtiMjVsT2lCamIyNTBaWGgwTG1SdmJtVmNiaUFnSUNBZ0lDQWdJQ0I5TzF4dVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jbVZqYjNKa0xuUjVjR1VnUFQwOUlGd2lkR2h5YjNkY0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUhOMFlYUmxJRDBnUjJWdVUzUmhkR1ZEYjIxd2JHVjBaV1E3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdSR2x6Y0dGMFkyZ2dkR2hsSUdWNFkyVndkR2x2YmlCaWVTQnNiMjl3YVc1bklHSmhZMnNnWVhKdmRXNWtJSFJ2SUhSb1pWeHVJQ0FnSUNBZ0lDQWdJQzh2SUdOdmJuUmxlSFF1WkdsemNHRjBZMmhGZUdObGNIUnBiMjRvWTI5dWRHVjRkQzVoY21jcElHTmhiR3dnWVdKdmRtVXVYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHVjRkQzV0WlhSb2IyUWdQU0JjSW5Sb2NtOTNYQ0k3WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEM1aGNtY2dQU0J5WldOdmNtUXVZWEpuTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JpQWdmVnh1WEc0Z0lDOHZJRU5oYkd3Z1pHVnNaV2RoZEdVdWFYUmxjbUYwYjNKYlkyOXVkR1Y0ZEM1dFpYUm9iMlJkS0dOdmJuUmxlSFF1WVhKbktTQmhibVFnYUdGdVpHeGxJSFJvWlZ4dUlDQXZMeUJ5WlhOMWJIUXNJR1ZwZEdobGNpQmllU0J5WlhSMWNtNXBibWNnWVNCN0lIWmhiSFZsTENCa2IyNWxJSDBnY21WemRXeDBJR1p5YjIwZ2RHaGxYRzRnSUM4dklHUmxiR1ZuWVhSbElHbDBaWEpoZEc5eUxDQnZjaUJpZVNCdGIyUnBabmxwYm1jZ1kyOXVkR1Y0ZEM1dFpYUm9iMlFnWVc1a0lHTnZiblJsZUhRdVlYSm5MRnh1SUNBdkx5QnpaWFIwYVc1bklHTnZiblJsZUhRdVpHVnNaV2RoZEdVZ2RHOGdiblZzYkN3Z1lXNWtJSEpsZEhWeWJtbHVaeUIwYUdVZ1EyOXVkR2x1ZFdWVFpXNTBhVzVsYkM1Y2JpQWdablZ1WTNScGIyNGdiV0Y1WW1WSmJuWnZhMlZFWld4bFoyRjBaU2hrWld4bFoyRjBaU3dnWTI5dWRHVjRkQ2tnZTF4dUlDQWdJSFpoY2lCdFpYUm9iMlFnUFNCa1pXeGxaMkYwWlM1cGRHVnlZWFJ2Y2x0amIyNTBaWGgwTG0xbGRHaHZaRjA3WEc0Z0lDQWdhV1lnS0cxbGRHaHZaQ0E5UFQwZ2RXNWtaV1pwYm1Wa0tTQjdYRzRnSUNBZ0lDQXZMeUJCSUM1MGFISnZkeUJ2Y2lBdWNtVjBkWEp1SUhkb1pXNGdkR2hsSUdSbGJHVm5ZWFJsSUdsMFpYSmhkRzl5SUdoaGN5QnVieUF1ZEdoeWIzZGNiaUFnSUNBZ0lDOHZJRzFsZEdodlpDQmhiSGRoZVhNZ2RHVnliV2x1WVhSbGN5QjBhR1VnZVdsbGJHUXFJR3h2YjNBdVhHNGdJQ0FnSUNCamIyNTBaWGgwTG1SbGJHVm5ZWFJsSUQwZ2JuVnNiRHRjYmx4dUlDQWdJQ0FnYVdZZ0tHTnZiblJsZUhRdWJXVjBhRzlrSUQwOVBTQmNJblJvY205M1hDSXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1RtOTBaVG9nVzF3aWNtVjBkWEp1WENKZElHMTFjM1FnWW1VZ2RYTmxaQ0JtYjNJZ1JWTXpJSEJoY25OcGJtY2dZMjl0Y0dGMGFXSnBiR2wwZVM1Y2JpQWdJQ0FnSUNBZ2FXWWdLR1JsYkdWbllYUmxMbWwwWlhKaGRHOXlXMXdpY21WMGRYSnVYQ0pkS1NCN1hHNGdJQ0FnSUNBZ0lDQWdMeThnU1dZZ2RHaGxJR1JsYkdWbllYUmxJR2wwWlhKaGRHOXlJR2hoY3lCaElISmxkSFZ5YmlCdFpYUm9iMlFzSUdkcGRtVWdhWFFnWVZ4dUlDQWdJQ0FnSUNBZ0lDOHZJR05vWVc1alpTQjBieUJqYkdWaGJpQjFjQzVjYmlBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwTG0xbGRHaHZaQ0E5SUZ3aWNtVjBkWEp1WENJN1hHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNWhjbWNnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lDQWdiV0Y1WW1WSmJuWnZhMlZFWld4bFoyRjBaU2hrWld4bFoyRjBaU3dnWTI5dWRHVjRkQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvWTI5dWRHVjRkQzV0WlhSb2IyUWdQVDA5SUZ3aWRHaHliM2RjSWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1NXWWdiV0Y1WW1WSmJuWnZhMlZFWld4bFoyRjBaU2hqYjI1MFpYaDBLU0JqYUdGdVoyVmtJR052Ym5SbGVIUXViV1YwYUc5a0lHWnliMjFjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRndpY21WMGRYSnVYQ0lnZEc4Z1hDSjBhSEp2ZDF3aUxDQnNaWFFnZEdoaGRDQnZkbVZ5Y21sa1pTQjBhR1VnVkhsd1pVVnljbTl5SUdKbGJHOTNMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUVOdmJuUnBiblZsVTJWdWRHbHVaV3c3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWTI5dWRHVjRkQzV0WlhSb2IyUWdQU0JjSW5Sb2NtOTNYQ0k3WEc0Z0lDQWdJQ0FnSUdOdmJuUmxlSFF1WVhKbklEMGdibVYzSUZSNWNHVkZjbkp2Y2loY2JpQWdJQ0FnSUNBZ0lDQmNJbFJvWlNCcGRHVnlZWFJ2Y2lCa2IyVnpJRzV2ZENCd2NtOTJhV1JsSUdFZ0ozUm9jbTkzSnlCdFpYUm9iMlJjSWlrN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCRGIyNTBhVzUxWlZObGJuUnBibVZzTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCeVpXTnZjbVFnUFNCMGNubERZWFJqYUNodFpYUm9iMlFzSUdSbGJHVm5ZWFJsTG1sMFpYSmhkRzl5TENCamIyNTBaWGgwTG1GeVp5azdYRzVjYmlBZ0lDQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnWTI5dWRHVjRkQzV0WlhSb2IyUWdQU0JjSW5Sb2NtOTNYQ0k3WEc0Z0lDQWdJQ0JqYjI1MFpYaDBMbUZ5WnlBOUlISmxZMjl5WkM1aGNtYzdYRzRnSUNBZ0lDQmpiMjUwWlhoMExtUmxiR1ZuWVhSbElEMGdiblZzYkR0Y2JpQWdJQ0FnSUhKbGRIVnliaUJEYjI1MGFXNTFaVk5sYm5ScGJtVnNPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJwYm1adklEMGdjbVZqYjNKa0xtRnlaenRjYmx4dUlDQWdJR2xtSUNnaElHbHVabThwSUh0Y2JpQWdJQ0FnSUdOdmJuUmxlSFF1YldWMGFHOWtJRDBnWENKMGFISnZkMXdpTzF4dUlDQWdJQ0FnWTI5dWRHVjRkQzVoY21jZ1BTQnVaWGNnVkhsd1pVVnljbTl5S0Z3aWFYUmxjbUYwYjNJZ2NtVnpkV3gwSUdseklHNXZkQ0JoYmlCdlltcGxZM1JjSWlrN1hHNGdJQ0FnSUNCamIyNTBaWGgwTG1SbGJHVm5ZWFJsSUQwZ2JuVnNiRHRjYmlBZ0lDQWdJSEpsZEhWeWJpQkRiMjUwYVc1MVpWTmxiblJwYm1Wc08xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHBibVp2TG1SdmJtVXBJSHRjYmlBZ0lDQWdJQzh2SUVGemMybG5iaUIwYUdVZ2NtVnpkV3gwSUc5bUlIUm9aU0JtYVc1cGMyaGxaQ0JrWld4bFoyRjBaU0IwYnlCMGFHVWdkR1Z0Y0c5eVlYSjVYRzRnSUNBZ0lDQXZMeUIyWVhKcFlXSnNaU0J6Y0dWamFXWnBaV1FnWW5rZ1pHVnNaV2RoZEdVdWNtVnpkV3gwVG1GdFpTQW9jMlZsSUdSbGJHVm5ZWFJsV1dsbGJHUXBMbHh1SUNBZ0lDQWdZMjl1ZEdWNGRGdGtaV3hsWjJGMFpTNXlaWE4xYkhST1lXMWxYU0E5SUdsdVptOHVkbUZzZFdVN1hHNWNiaUFnSUNBZ0lDOHZJRkpsYzNWdFpTQmxlR1ZqZFhScGIyNGdZWFFnZEdobElHUmxjMmx5WldRZ2JHOWpZWFJwYjI0Z0tITmxaU0JrWld4bFoyRjBaVmxwWld4a0tTNWNiaUFnSUNBZ0lHTnZiblJsZUhRdWJtVjRkQ0E5SUdSbGJHVm5ZWFJsTG01bGVIUk1iMk03WEc1Y2JpQWdJQ0FnSUM4dklFbG1JR052Ym5SbGVIUXViV1YwYUc5a0lIZGhjeUJjSW5Sb2NtOTNYQ0lnWW5WMElIUm9aU0JrWld4bFoyRjBaU0JvWVc1a2JHVmtJSFJvWlZ4dUlDQWdJQ0FnTHk4Z1pYaGpaWEIwYVc5dUxDQnNaWFFnZEdobElHOTFkR1Z5SUdkbGJtVnlZWFJ2Y2lCd2NtOWpaV1ZrSUc1dmNtMWhiR3g1TGlCSlpseHVJQ0FnSUNBZ0x5OGdZMjl1ZEdWNGRDNXRaWFJvYjJRZ2QyRnpJRndpYm1WNGRGd2lMQ0JtYjNKblpYUWdZMjl1ZEdWNGRDNWhjbWNnYzJsdVkyVWdhWFFnYUdGeklHSmxaVzVjYmlBZ0lDQWdJQzh2SUZ3aVkyOXVjM1Z0WldSY0lpQmllU0IwYUdVZ1pHVnNaV2RoZEdVZ2FYUmxjbUYwYjNJdUlFbG1JR052Ym5SbGVIUXViV1YwYUc5a0lIZGhjMXh1SUNBZ0lDQWdMeThnWENKeVpYUjFjbTVjSWl3Z1lXeHNiM2NnZEdobElHOXlhV2RwYm1Gc0lDNXlaWFIxY200Z1kyRnNiQ0IwYnlCamIyNTBhVzUxWlNCcGJpQjBhR1ZjYmlBZ0lDQWdJQzh2SUc5MWRHVnlJR2RsYm1WeVlYUnZjaTVjYmlBZ0lDQWdJR2xtSUNoamIyNTBaWGgwTG0xbGRHaHZaQ0FoUFQwZ1hDSnlaWFIxY201Y0lpa2dlMXh1SUNBZ0lDQWdJQ0JqYjI1MFpYaDBMbTFsZEdodlpDQTlJRndpYm1WNGRGd2lPMXh1SUNBZ0lDQWdJQ0JqYjI1MFpYaDBMbUZ5WnlBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QlNaUzE1YVdWc1pDQjBhR1VnY21WemRXeDBJSEpsZEhWeWJtVmtJR0o1SUhSb1pTQmtaV3hsWjJGMFpTQnRaWFJvYjJRdVhHNGdJQ0FnSUNCeVpYUjFjbTRnYVc1bWJ6dGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QlVhR1VnWkdWc1pXZGhkR1VnYVhSbGNtRjBiM0lnYVhNZ1ptbHVhWE5vWldRc0lITnZJR1p2Y21kbGRDQnBkQ0JoYm1RZ1kyOXVkR2x1ZFdVZ2QybDBhRnh1SUNBZ0lDOHZJSFJvWlNCdmRYUmxjaUJuWlc1bGNtRjBiM0l1WEc0Z0lDQWdZMjl1ZEdWNGRDNWtaV3hsWjJGMFpTQTlJRzUxYkd3N1hHNGdJQ0FnY21WMGRYSnVJRU52Ym5ScGJuVmxVMlZ1ZEdsdVpXdzdYRzRnSUgxY2JseHVJQ0F2THlCRVpXWnBibVVnUjJWdVpYSmhkRzl5TG5CeWIzUnZkSGx3WlM1N2JtVjRkQ3gwYUhKdmR5eHlaWFIxY201OUlHbHVJSFJsY20xeklHOW1JSFJvWlZ4dUlDQXZMeUIxYm1sbWFXVmtJQzVmYVc1MmIydGxJR2hsYkhCbGNpQnRaWFJvYjJRdVhHNGdJR1JsWm1sdVpVbDBaWEpoZEc5eVRXVjBhRzlrY3loSGNDazdYRzVjYmlBZ1IzQmJkRzlUZEhKcGJtZFVZV2RUZVcxaWIyeGRJRDBnWENKSFpXNWxjbUYwYjNKY0lqdGNibHh1SUNBdkx5QkJJRWRsYm1WeVlYUnZjaUJ6YUc5MWJHUWdZV3gzWVhseklISmxkSFZ5YmlCcGRITmxiR1lnWVhNZ2RHaGxJR2wwWlhKaGRHOXlJRzlpYW1WamRDQjNhR1Z1SUhSb1pWeHVJQ0F2THlCQVFHbDBaWEpoZEc5eUlHWjFibU4wYVc5dUlHbHpJR05oYkd4bFpDQnZiaUJwZEM0Z1UyOXRaU0JpY205M2MyVnljeWNnYVcxd2JHVnRaVzUwWVhScGIyNXpJRzltSUhSb1pWeHVJQ0F2THlCcGRHVnlZWFJ2Y2lCd2NtOTBiM1I1Y0dVZ1kyaGhhVzRnYVc1amIzSnlaV04wYkhrZ2FXMXdiR1Z0Wlc1MElIUm9hWE1zSUdOaGRYTnBibWNnZEdobElFZGxibVZ5WVhSdmNseHVJQ0F2THlCdlltcGxZM1FnZEc4Z2JtOTBJR0psSUhKbGRIVnlibVZrSUdaeWIyMGdkR2hwY3lCallXeHNMaUJVYUdseklHVnVjM1Z5WlhNZ2RHaGhkQ0JrYjJWemJpZDBJR2hoY0hCbGJpNWNiaUFnTHk4Z1UyVmxJR2gwZEhCek9pOHZaMmwwYUhWaUxtTnZiUzltWVdObFltOXZheTl5WldkbGJtVnlZWFJ2Y2k5cGMzTjFaWE12TWpjMElHWnZjaUJ0YjNKbElHUmxkR0ZwYkhNdVhHNGdJRWR3VzJsMFpYSmhkRzl5VTNsdFltOXNYU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5TzF4dVhHNGdJRWR3TG5SdlUzUnlhVzVuSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUZ3aVcyOWlhbVZqZENCSFpXNWxjbUYwYjNKZFhDSTdYRzRnSUgwN1hHNWNiaUFnWm5WdVkzUnBiMjRnY0hWemFGUnllVVZ1ZEhKNUtHeHZZM01wSUh0Y2JpQWdJQ0IyWVhJZ1pXNTBjbmtnUFNCN0lIUnllVXh2WXpvZ2JHOWpjMXN3WFNCOU8xeHVYRzRnSUNBZ2FXWWdLREVnYVc0Z2JHOWpjeWtnZTF4dUlDQWdJQ0FnWlc1MGNua3VZMkYwWTJoTWIyTWdQU0JzYjJOeld6RmRPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1JQ2d5SUdsdUlHeHZZM01wSUh0Y2JpQWdJQ0FnSUdWdWRISjVMbVpwYm1Gc2JIbE1iMk1nUFNCc2IyTnpXekpkTzF4dUlDQWdJQ0FnWlc1MGNua3VZV1owWlhKTWIyTWdQU0JzYjJOeld6TmRPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11ZEhKNVJXNTBjbWxsY3k1d2RYTm9LR1Z1ZEhKNUtUdGNiaUFnZlZ4dVhHNGdJR1oxYm1OMGFXOXVJSEpsYzJWMFZISjVSVzUwY25rb1pXNTBjbmtwSUh0Y2JpQWdJQ0IyWVhJZ2NtVmpiM0prSUQwZ1pXNTBjbmt1WTI5dGNHeGxkR2x2YmlCOGZDQjdmVHRjYmlBZ0lDQnlaV052Y21RdWRIbHdaU0E5SUZ3aWJtOXliV0ZzWENJN1hHNGdJQ0FnWkdWc1pYUmxJSEpsWTI5eVpDNWhjbWM3WEc0Z0lDQWdaVzUwY25rdVkyOXRjR3hsZEdsdmJpQTlJSEpsWTI5eVpEdGNiaUFnZlZ4dVhHNGdJR1oxYm1OMGFXOXVJRU52Ym5SbGVIUW9kSEo1VEc5amMweHBjM1FwSUh0Y2JpQWdJQ0F2THlCVWFHVWdjbTl2ZENCbGJuUnllU0J2WW1wbFkzUWdLR1ZtWm1WamRHbDJaV3g1SUdFZ2RISjVJSE4wWVhSbGJXVnVkQ0IzYVhSb2IzVjBJR0VnWTJGMFkyaGNiaUFnSUNBdkx5QnZjaUJoSUdacGJtRnNiSGtnWW14dlkyc3BJR2RwZG1WeklIVnpJR0VnY0d4aFkyVWdkRzhnYzNSdmNtVWdkbUZzZFdWeklIUm9jbTkzYmlCbWNtOXRYRzRnSUNBZ0x5OGdiRzlqWVhScGIyNXpJSGRvWlhKbElIUm9aWEpsSUdseklHNXZJR1Z1WTJ4dmMybHVaeUIwY25rZ2MzUmhkR1Z0Wlc1MExseHVJQ0FnSUhSb2FYTXVkSEo1Ulc1MGNtbGxjeUE5SUZ0N0lIUnllVXh2WXpvZ1hDSnliMjkwWENJZ2ZWMDdYRzRnSUNBZ2RISjVURzlqYzB4cGMzUXVabTl5UldGamFDaHdkWE5vVkhKNVJXNTBjbmtzSUhSb2FYTXBPMXh1SUNBZ0lIUm9hWE11Y21WelpYUW9kSEoxWlNrN1hHNGdJSDFjYmx4dUlDQmxlSEJ2Y25SekxtdGxlWE1nUFNCbWRXNWpkR2x2YmlodlltcGxZM1FwSUh0Y2JpQWdJQ0IyWVhJZ2EyVjVjeUE5SUZ0ZE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ2WW1wbFkzUXBJSHRjYmlBZ0lDQWdJR3RsZVhNdWNIVnphQ2hyWlhrcE8xeHVJQ0FnSUgxY2JpQWdJQ0JyWlhsekxuSmxkbVZ5YzJVb0tUdGNibHh1SUNBZ0lDOHZJRkpoZEdobGNpQjBhR0Z1SUhKbGRIVnlibWx1WnlCaGJpQnZZbXBsWTNRZ2QybDBhQ0JoSUc1bGVIUWdiV1YwYUc5a0xDQjNaU0JyWldWd1hHNGdJQ0FnTHk4Z2RHaHBibWR6SUhOcGJYQnNaU0JoYm1RZ2NtVjBkWEp1SUhSb1pTQnVaWGgwSUdaMWJtTjBhVzl1SUdsMGMyVnNaaTVjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0Z2JtVjRkQ2dwSUh0Y2JpQWdJQ0FnSUhkb2FXeGxJQ2hyWlhsekxteGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYTJWNUlEMGdhMlY1Y3k1d2IzQW9LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHdGxlU0JwYmlCdlltcGxZM1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGgwTG5aaGJIVmxJRDBnYTJWNU8xeHVJQ0FnSUNBZ0lDQWdJRzVsZUhRdVpHOXVaU0E5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1WlhoME8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQzh2SUZSdklHRjJiMmxrSUdOeVpXRjBhVzVuSUdGdUlHRmtaR2wwYVc5dVlXd2diMkpxWldOMExDQjNaU0JxZFhOMElHaGhibWNnZEdobElDNTJZV3gxWlZ4dUlDQWdJQ0FnTHk4Z1lXNWtJQzVrYjI1bElIQnliM0JsY25ScFpYTWdiMlptSUhSb1pTQnVaWGgwSUdaMWJtTjBhVzl1SUc5aWFtVmpkQ0JwZEhObGJHWXVJRlJvYVhOY2JpQWdJQ0FnSUM4dklHRnNjMjhnWlc1emRYSmxjeUIwYUdGMElIUm9aU0J0YVc1cFptbGxjaUIzYVd4c0lHNXZkQ0JoYm05dWVXMXBlbVVnZEdobElHWjFibU4wYVc5dUxseHVJQ0FnSUNBZ2JtVjRkQzVrYjI1bElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhoME8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdablZ1WTNScGIyNGdkbUZzZFdWektHbDBaWEpoWW14bEtTQjdYRzRnSUNBZ2FXWWdLR2wwWlhKaFlteGxLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2FYUmxjbUYwYjNKTlpYUm9iMlFnUFNCcGRHVnlZV0pzWlZ0cGRHVnlZWFJ2Y2xONWJXSnZiRjA3WEc0Z0lDQWdJQ0JwWmlBb2FYUmxjbUYwYjNKTlpYUm9iMlFwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdsMFpYSmhkRzl5VFdWMGFHOWtMbU5oYkd3b2FYUmxjbUZpYkdVcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JR2wwWlhKaFlteGxMbTVsZUhRZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2FYUmxjbUZpYkdVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHbG1JQ2doYVhOT1lVNG9hWFJsY21GaWJHVXViR1Z1WjNSb0tTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FTQTlJQzB4TENCdVpYaDBJRDBnWm5WdVkzUnBiMjRnYm1WNGRDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNCM2FHbHNaU0FvS3l0cElEd2dhWFJsY21GaWJHVXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hR0Z6VDNkdUxtTmhiR3dvYVhSbGNtRmliR1VzSUdrcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWxlSFF1ZG1Gc2RXVWdQU0JwZEdWeVlXSnNaVnRwWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYm1WNGRDNWtiMjVsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnVaWGgwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQWdJRzVsZUhRdWRtRnNkV1VnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lDQWdibVY0ZEM1a2IyNWxJRDBnZEhKMVpUdGNibHh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1WlhoME8xeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ1WlhoMExtNWxlSFFnUFNCdVpYaDBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRkpsZEhWeWJpQmhiaUJwZEdWeVlYUnZjaUIzYVhSb0lHNXZJSFpoYkhWbGN5NWNiaUFnSUNCeVpYUjFjbTRnZXlCdVpYaDBPaUJrYjI1bFVtVnpkV3gwSUgwN1hHNGdJSDFjYmlBZ1pYaHdiM0owY3k1MllXeDFaWE1nUFNCMllXeDFaWE03WEc1Y2JpQWdablZ1WTNScGIyNGdaRzl1WlZKbGMzVnNkQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdleUIyWVd4MVpUb2dkVzVrWldacGJtVmtMQ0JrYjI1bE9pQjBjblZsSUgwN1hHNGdJSDFjYmx4dUlDQkRiMjUwWlhoMExuQnliM1J2ZEhsd1pTQTlJSHRjYmlBZ0lDQmpiMjV6ZEhKMVkzUnZjam9nUTI5dWRHVjRkQ3hjYmx4dUlDQWdJSEpsYzJWME9pQm1kVzVqZEdsdmJpaHphMmx3VkdWdGNGSmxjMlYwS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbkJ5WlhZZ1BTQXdPMXh1SUNBZ0lDQWdkR2hwY3k1dVpYaDBJRDBnTUR0Y2JpQWdJQ0FnSUM4dklGSmxjMlYwZEdsdVp5QmpiMjUwWlhoMExsOXpaVzUwSUdadmNpQnNaV2RoWTNrZ2MzVndjRzl5ZENCdlppQkNZV0psYkNkelhHNGdJQ0FnSUNBdkx5Qm1kVzVqZEdsdmJpNXpaVzUwSUdsdGNHeGxiV1Z1ZEdGMGFXOXVMbHh1SUNBZ0lDQWdkR2hwY3k1elpXNTBJRDBnZEdocGN5NWZjMlZ1ZENBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lIUm9hWE11Wkc5dVpTQTlJR1poYkhObE8xeHVJQ0FnSUNBZ2RHaHBjeTVrWld4bFoyRjBaU0E5SUc1MWJHdzdYRzVjYmlBZ0lDQWdJSFJvYVhNdWJXVjBhRzlrSUQwZ1hDSnVaWGgwWENJN1hHNGdJQ0FnSUNCMGFHbHpMbUZ5WnlBOUlIVnVaR1ZtYVc1bFpEdGNibHh1SUNBZ0lDQWdkR2hwY3k1MGNubEZiblJ5YVdWekxtWnZja1ZoWTJnb2NtVnpaWFJVY25sRmJuUnllU2s3WEc1Y2JpQWdJQ0FnSUdsbUlDZ2hjMnRwY0ZSbGJYQlNaWE5sZENrZ2UxeHVJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnVZVzFsSUdsdUlIUm9hWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJPYjNRZ2MzVnlaU0JoWW05MWRDQjBhR1VnYjNCMGFXMWhiQ0J2Y21SbGNpQnZaaUIwYUdWelpTQmpiMjVrYVhScGIyNXpPbHh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHVZVzFsTG1Ob1lYSkJkQ2d3S1NBOVBUMGdYQ0owWENJZ0ppWmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FHRnpUM2R1TG1OaGJHd29kR2hwY3l3Z2JtRnRaU2tnSmlaY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSVdselRtRk9LQ3R1WVcxbExuTnNhV05sS0RFcEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjMXR1WVcxbFhTQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOUxGeHVYRzRnSUNBZ2MzUnZjRG9nWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVJ2Ym1VZ1BTQjBjblZsTzF4dVhHNGdJQ0FnSUNCMllYSWdjbTl2ZEVWdWRISjVJRDBnZEdocGN5NTBjbmxGYm5SeWFXVnpXekJkTzF4dUlDQWdJQ0FnZG1GeUlISnZiM1JTWldOdmNtUWdQU0J5YjI5MFJXNTBjbmt1WTI5dGNHeGxkR2x2Ymp0Y2JpQWdJQ0FnSUdsbUlDaHliMjkwVW1WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ5YjI5MFVtVmpiM0prTG1GeVp6dGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y25aaGJEdGNiaUFnSUNCOUxGeHVYRzRnSUNBZ1pHbHpjR0YwWTJoRmVHTmxjSFJwYjI0NklHWjFibU4wYVc5dUtHVjRZMlZ3ZEdsdmJpa2dlMXh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVaRzl1WlNrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCbGVHTmxjSFJwYjI0N1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJqYjI1MFpYaDBJRDBnZEdocGN6dGNiaUFnSUNBZ0lHWjFibU4wYVc5dUlHaGhibVJzWlNoc2IyTXNJR05oZFdkb2RDa2dlMXh1SUNBZ0lDQWdJQ0J5WldOdmNtUXVkSGx3WlNBOUlGd2lkR2h5YjNkY0lqdGNiaUFnSUNBZ0lDQWdjbVZqYjNKa0xtRnlaeUE5SUdWNFkyVndkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEM1dVpYaDBJRDBnYkc5ak8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNoallYVm5hSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJKWmlCMGFHVWdaR2x6Y0dGMFkyaGxaQ0JsZUdObGNIUnBiMjRnZDJGeklHTmhkV2RvZENCaWVTQmhJR05oZEdOb0lHSnNiMk5yTEZ4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlc0Z2JHVjBJSFJvWVhRZ1kyRjBZMmdnWW14dlkyc2dhR0Z1Wkd4bElIUm9aU0JsZUdObGNIUnBiMjRnYm05eWJXRnNiSGt1WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEM1dFpYUm9iMlFnUFNCY0ltNWxlSFJjSWp0Y2JpQWdJQ0FnSUNBZ0lDQmpiMjUwWlhoMExtRnlaeUE5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQWhJU0JqWVhWbmFIUTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJR2tnUFNCMGFHbHpMblJ5ZVVWdWRISnBaWE11YkdWdVozUm9JQzBnTVRzZ2FTQStQU0F3T3lBdExXa3BJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHVnVkSEo1SUQwZ2RHaHBjeTUwY25sRmJuUnlhV1Z6VzJsZE8xeHVJQ0FnSUNBZ0lDQjJZWElnY21WamIzSmtJRDBnWlc1MGNua3VZMjl0Y0d4bGRHbHZianRjYmx4dUlDQWdJQ0FnSUNCcFppQW9aVzUwY25rdWRISjVURzlqSUQwOVBTQmNJbkp2YjNSY0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUM4dklFVjRZMlZ3ZEdsdmJpQjBhSEp2ZDI0Z2IzVjBjMmxrWlNCdlppQmhibmtnZEhKNUlHSnNiMk5ySUhSb1lYUWdZMjkxYkdRZ2FHRnVaR3hsWEc0Z0lDQWdJQ0FnSUNBZ0x5OGdhWFFzSUhOdklITmxkQ0IwYUdVZ1kyOXRjR3hsZEdsdmJpQjJZV3gxWlNCdlppQjBhR1VnWlc1MGFYSmxJR1oxYm1OMGFXOXVJSFJ2WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdkR2h5YjNjZ2RHaGxJR1Y0WTJWd2RHbHZiaTVjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYUdGdVpHeGxLRndpWlc1a1hDSXBPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLR1Z1ZEhKNUxuUnllVXh2WXlBOFBTQjBhR2x6TG5CeVpYWXBJSHRjYmlBZ0lDQWdJQ0FnSUNCMllYSWdhR0Z6UTJGMFkyZ2dQU0JvWVhOUGQyNHVZMkZzYkNobGJuUnllU3dnWENKallYUmphRXh2WTF3aUtUdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2FHRnpSbWx1WVd4c2VTQTlJR2hoYzA5M2JpNWpZV3hzS0dWdWRISjVMQ0JjSW1acGJtRnNiSGxNYjJOY0lpazdYRzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9hR0Z6UTJGMFkyZ2dKaVlnYUdGelJtbHVZV3hzZVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11Y0hKbGRpQThJR1Z1ZEhKNUxtTmhkR05vVEc5aktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCb1lXNWtiR1VvWlc1MGNua3VZMkYwWTJoTWIyTXNJSFJ5ZFdVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoMGFHbHpMbkJ5WlhZZ1BDQmxiblJ5ZVM1bWFXNWhiR3g1VEc5aktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCb1lXNWtiR1VvWlc1MGNua3VabWx1WVd4c2VVeHZZeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHaGhjME5oZEdOb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1d2NtVjJJRHdnWlc1MGNua3VZMkYwWTJoTWIyTXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHaGhibVJzWlNobGJuUnllUzVqWVhSamFFeHZZeXdnZEhKMVpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0doaGMwWnBibUZzYkhrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5CeVpYWWdQQ0JsYm5SeWVTNW1hVzVoYkd4NVRHOWpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm9ZVzVrYkdVb1pXNTBjbmt1Wm1sdVlXeHNlVXh2WXlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpZEhKNUlITjBZWFJsYldWdWRDQjNhWFJvYjNWMElHTmhkR05vSUc5eUlHWnBibUZzYkhsY0lpazdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlN4Y2JseHVJQ0FnSUdGaWNuVndkRG9nWm5WdVkzUnBiMjRvZEhsd1pTd2dZWEpuS1NCN1hHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdkR2hwY3k1MGNubEZiblJ5YVdWekxteGxibWQwYUNBdElERTdJR2tnUGowZ01Ec2dMUzFwS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJsYm5SeWVTQTlJSFJvYVhNdWRISjVSVzUwY21sbGMxdHBYVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHVnVkSEo1TG5SeWVVeHZZeUE4UFNCMGFHbHpMbkJ5WlhZZ0ppWmNiaUFnSUNBZ0lDQWdJQ0FnSUdoaGMwOTNiaTVqWVd4c0tHVnVkSEo1TENCY0ltWnBibUZzYkhsTWIyTmNJaWtnSmlaY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNISmxkaUE4SUdWdWRISjVMbVpwYm1Gc2JIbE1iMk1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQjJZWElnWm1sdVlXeHNlVVZ1ZEhKNUlEMGdaVzUwY25rN1hHNGdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0dacGJtRnNiSGxGYm5SeWVTQW1KbHh1SUNBZ0lDQWdJQ0FnSUNoMGVYQmxJRDA5UFNCY0ltSnlaV0ZyWENJZ2ZIeGNiaUFnSUNBZ0lDQWdJQ0FnZEhsd1pTQTlQVDBnWENKamIyNTBhVzUxWlZ3aUtTQW1KbHh1SUNBZ0lDQWdJQ0FnSUdacGJtRnNiSGxGYm5SeWVTNTBjbmxNYjJNZ1BEMGdZWEpuSUNZbVhHNGdJQ0FnSUNBZ0lDQWdZWEpuSUR3OUlHWnBibUZzYkhsRmJuUnllUzVtYVc1aGJHeDVURzlqS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRWxuYm05eVpTQjBhR1VnWm1sdVlXeHNlU0JsYm5SeWVTQnBaaUJqYjI1MGNtOXNJR2x6SUc1dmRDQnFkVzF3YVc1bklIUnZJR0ZjYmlBZ0lDQWdJQ0FnTHk4Z2JHOWpZWFJwYjI0Z2IzVjBjMmxrWlNCMGFHVWdkSEo1TDJOaGRHTm9JR0pzYjJOckxseHVJQ0FnSUNBZ0lDQm1hVzVoYkd4NVJXNTBjbmtnUFNCdWRXeHNPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0IyWVhJZ2NtVmpiM0prSUQwZ1ptbHVZV3hzZVVWdWRISjVJRDhnWm1sdVlXeHNlVVZ1ZEhKNUxtTnZiWEJzWlhScGIyNGdPaUI3ZlR0Y2JpQWdJQ0FnSUhKbFkyOXlaQzUwZVhCbElEMGdkSGx3WlR0Y2JpQWdJQ0FnSUhKbFkyOXlaQzVoY21jZ1BTQmhjbWM3WEc1Y2JpQWdJQ0FnSUdsbUlDaG1hVzVoYkd4NVJXNTBjbmtwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0WlhSb2IyUWdQU0JjSW01bGVIUmNJanRjYmlBZ0lDQWdJQ0FnZEdocGN5NXVaWGgwSUQwZ1ptbHVZV3hzZVVWdWRISjVMbVpwYm1Gc2JIbE1iMk03WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJEYjI1MGFXNTFaVk5sYm5ScGJtVnNPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyMXdiR1YwWlNoeVpXTnZjbVFwTzF4dUlDQWdJSDBzWEc1Y2JpQWdJQ0JqYjIxd2JHVjBaVG9nWm5WdVkzUnBiMjRvY21WamIzSmtMQ0JoWm5SbGNreHZZeWtnZTF4dUlDQWdJQ0FnYVdZZ0tISmxZMjl5WkM1MGVYQmxJRDA5UFNCY0luUm9jbTkzWENJcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2NtVmpiM0prTG1GeVp6dGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hKbFkyOXlaQzUwZVhCbElEMDlQU0JjSW1KeVpXRnJYQ0lnZkh4Y2JpQWdJQ0FnSUNBZ0lDQnlaV052Y21RdWRIbHdaU0E5UFQwZ1hDSmpiMjUwYVc1MVpWd2lLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVibVY0ZENBOUlISmxZMjl5WkM1aGNtYzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSEpsWTI5eVpDNTBlWEJsSUQwOVBTQmNJbkpsZEhWeWJsd2lLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjblpoYkNBOUlIUm9hWE11WVhKbklEMGdjbVZqYjNKa0xtRnlaenRjYmlBZ0lDQWdJQ0FnZEdocGN5NXRaWFJvYjJRZ1BTQmNJbkpsZEhWeWJsd2lPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFFnUFNCY0ltVnVaRndpTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoeVpXTnZjbVF1ZEhsd1pTQTlQVDBnWENKdWIzSnRZV3hjSWlBbUppQmhablJsY2t4dll5a2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFFnUFNCaFpuUmxja3h2WXp0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2NtVjBkWEp1SUVOdmJuUnBiblZsVTJWdWRHbHVaV3c3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJR1pwYm1semFEb2dablZ1WTNScGIyNG9abWx1WVd4c2VVeHZZeWtnZTF4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlIUm9hWE11ZEhKNVJXNTBjbWxsY3k1c1pXNW5kR2dnTFNBeE95QnBJRDQ5SURBN0lDMHRhU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdaVzUwY25rZ1BTQjBhR2x6TG5SeWVVVnVkSEpwWlhOYmFWMDdYRzRnSUNBZ0lDQWdJR2xtSUNobGJuUnllUzVtYVc1aGJHeDVURzlqSUQwOVBTQm1hVzVoYkd4NVRHOWpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjIxd2JHVjBaU2hsYm5SeWVTNWpiMjF3YkdWMGFXOXVMQ0JsYm5SeWVTNWhablJsY2t4dll5azdYRzRnSUNBZ0lDQWdJQ0FnY21WelpYUlVjbmxGYm5SeWVTaGxiblJ5ZVNrN1hHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlFTnZiblJwYm5WbFUyVnVkR2x1Wld3N1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOUxGeHVYRzRnSUNBZ1hDSmpZWFJqYUZ3aU9pQm1kVzVqZEdsdmJpaDBjbmxNYjJNcElIdGNiaUFnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0IwYUdsekxuUnllVVZ1ZEhKcFpYTXViR1Z1WjNSb0lDMGdNVHNnYVNBK1BTQXdPeUF0TFdrcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWdWRISjVJRDBnZEdocGN5NTBjbmxGYm5SeWFXVnpXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9aVzUwY25rdWRISjVURzlqSUQwOVBTQjBjbmxNYjJNcElIdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2NtVmpiM0prSUQwZ1pXNTBjbmt1WTI5dGNHeGxkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvY21WamIzSmtMblI1Y0dVZ1BUMDlJRndpZEdoeWIzZGNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhSb2NtOTNiaUE5SUhKbFkyOXlaQzVoY21jN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhObGRGUnllVVZ1ZEhKNUtHVnVkSEo1S1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvY205M2JqdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0F2THlCVWFHVWdZMjl1ZEdWNGRDNWpZWFJqYUNCdFpYUm9iMlFnYlhWemRDQnZibXg1SUdKbElHTmhiR3hsWkNCM2FYUm9JR0VnYkc5allYUnBiMjVjYmlBZ0lDQWdJQzh2SUdGeVozVnRaVzUwSUhSb1lYUWdZMjl5Y21WemNHOXVaSE1nZEc4Z1lTQnJibTkzYmlCallYUmphQ0JpYkc5amF5NWNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loY0ltbHNiR1ZuWVd3Z1kyRjBZMmdnWVhSMFpXMXdkRndpS1R0Y2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWkdWc1pXZGhkR1ZaYVdWc1pEb2dablZ1WTNScGIyNG9hWFJsY21GaWJHVXNJSEpsYzNWc2RFNWhiV1VzSUc1bGVIUk1iMk1wSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaR1ZzWldkaGRHVWdQU0I3WEc0Z0lDQWdJQ0FnSUdsMFpYSmhkRzl5T2lCMllXeDFaWE1vYVhSbGNtRmliR1VwTEZ4dUlDQWdJQ0FnSUNCeVpYTjFiSFJPWVcxbE9pQnlaWE4xYkhST1lXMWxMRnh1SUNBZ0lDQWdJQ0J1WlhoMFRHOWpPaUJ1WlhoMFRHOWpYRzRnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTV0WlhSb2IyUWdQVDA5SUZ3aWJtVjRkRndpS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRVJsYkdsaVpYSmhkR1ZzZVNCbWIzSm5aWFFnZEdobElHeGhjM1FnYzJWdWRDQjJZV3gxWlNCemJ5QjBhR0YwSUhkbElHUnZiaWQwWEc0Z0lDQWdJQ0FnSUM4dklHRmpZMmxrWlc1MFlXeHNlU0J3WVhOeklHbDBJRzl1SUhSdklIUm9aU0JrWld4bFoyRjBaUzVjYmlBZ0lDQWdJQ0FnZEdocGN5NWhjbWNnUFNCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCRGIyNTBhVzUxWlZObGJuUnBibVZzTzF4dUlDQWdJSDFjYmlBZ2ZUdGNibHh1SUNBdkx5QlNaV2RoY21Sc1pYTnpJRzltSUhkb1pYUm9aWElnZEdocGN5QnpZM0pwY0hRZ2FYTWdaWGhsWTNWMGFXNW5JR0Z6SUdFZ1EyOXRiVzl1U2xNZ2JXOWtkV3hsWEc0Z0lDOHZJRzl5SUc1dmRDd2djbVYwZFhKdUlIUm9aU0J5ZFc1MGFXMWxJRzlpYW1WamRDQnpieUIwYUdGMElIZGxJR05oYmlCa1pXTnNZWEpsSUhSb1pTQjJZWEpwWVdKc1pWeHVJQ0F2THlCeVpXZGxibVZ5WVhSdmNsSjFiblJwYldVZ2FXNGdkR2hsSUc5MWRHVnlJSE5qYjNCbExDQjNhR2xqYUNCaGJHeHZkM01nZEdocGN5QnRiMlIxYkdVZ2RHOGdZbVZjYmlBZ0x5OGdhVzVxWldOMFpXUWdaV0Z6YVd4NUlHSjVJR0JpYVc0dmNtVm5aVzVsY21GMGIzSWdMUzFwYm1Oc2RXUmxMWEoxYm5ScGJXVWdjMk55YVhCMExtcHpZQzVjYmlBZ2NtVjBkWEp1SUdWNGNHOXlkSE03WEc1Y2JuMG9YRzRnSUM4dklFbG1JSFJvYVhNZ2MyTnlhWEIwSUdseklHVjRaV04xZEdsdVp5QmhjeUJoSUVOdmJXMXZia3BUSUcxdlpIVnNaU3dnZFhObElHMXZaSFZzWlM1bGVIQnZjblJ6WEc0Z0lDOHZJR0Z6SUhSb1pTQnlaV2RsYm1WeVlYUnZjbEoxYm5ScGJXVWdibUZ0WlhOd1lXTmxMaUJQZEdobGNuZHBjMlVnWTNKbFlYUmxJR0VnYm1WM0lHVnRjSFI1WEc0Z0lDOHZJRzlpYW1WamRDNGdSV2wwYUdWeUlIZGhlU3dnZEdobElISmxjM1ZzZEdsdVp5QnZZbXBsWTNRZ2QybHNiQ0JpWlNCMWMyVmtJSFJ2SUdsdWFYUnBZV3hwZW1WY2JpQWdMeThnZEdobElISmxaMlZ1WlhKaGRHOXlVblZ1ZEdsdFpTQjJZWEpwWVdKc1pTQmhkQ0IwYUdVZ2RHOXdJRzltSUhSb2FYTWdabWxzWlM1Y2JpQWdkSGx3Wlc5bUlHMXZaSFZzWlNBOVBUMGdYQ0p2WW1wbFkzUmNJaUEvSUcxdlpIVnNaUzVsZUhCdmNuUnpJRG9nZTMxY2Jpa3BPMXh1WEc1MGNua2dlMXh1SUNCeVpXZGxibVZ5WVhSdmNsSjFiblJwYldVZ1BTQnlkVzUwYVcxbE8xeHVmU0JqWVhSamFDQW9ZV05qYVdSbGJuUmhiRk4wY21samRFMXZaR1VwSUh0Y2JpQWdMeThnVkdocGN5QnRiMlIxYkdVZ2MyaHZkV3hrSUc1dmRDQmlaU0J5ZFc1dWFXNW5JR2x1SUhOMGNtbGpkQ0J0YjJSbExDQnpieUIwYUdVZ1lXSnZkbVZjYmlBZ0x5OGdZWE56YVdkdWJXVnVkQ0J6YUc5MWJHUWdZV3gzWVhseklIZHZjbXNnZFc1c1pYTnpJSE52YldWMGFHbHVaeUJwY3lCdGFYTmpiMjVtYVdkMWNtVmtMaUJLZFhOMFhHNGdJQzh2SUdsdUlHTmhjMlVnY25WdWRHbHRaUzVxY3lCaFkyTnBaR1Z1ZEdGc2JIa2djblZ1Y3lCcGJpQnpkSEpwWTNRZ2JXOWtaU3dnZDJVZ1kyRnVJR1Z6WTJGd1pWeHVJQ0F2THlCemRISnBZM1FnYlc5a1pTQjFjMmx1WnlCaElHZHNiMkpoYkNCR2RXNWpkR2x2YmlCallXeHNMaUJVYUdseklHTnZkV3hrSUdOdmJtTmxhWFpoWW14NUlHWmhhV3hjYmlBZ0x5OGdhV1lnWVNCRGIyNTBaVzUwSUZObFkzVnlhWFI1SUZCdmJHbGplU0JtYjNKaWFXUnpJSFZ6YVc1bklFWjFibU4wYVc5dUxDQmlkWFFnYVc0Z2RHaGhkQ0JqWVhObFhHNGdJQzh2SUhSb1pTQndjbTl3WlhJZ2MyOXNkWFJwYjI0Z2FYTWdkRzhnWm1sNElIUm9aU0JoWTJOcFpHVnVkR0ZzSUhOMGNtbGpkQ0J0YjJSbElIQnliMkpzWlcwdUlFbG1YRzRnSUM4dklIbHZkU2QyWlNCdGFYTmpiMjVtYVdkMWNtVmtJSGx2ZFhJZ1luVnVaR3hsY2lCMGJ5Qm1iM0pqWlNCemRISnBZM1FnYlc5a1pTQmhibVFnWVhCd2JHbGxaQ0JoWEc0Z0lDOHZJRU5UVUNCMGJ5Qm1iM0ppYVdRZ1JuVnVZM1JwYjI0c0lHRnVaQ0I1YjNVbmNtVWdibTkwSUhkcGJHeHBibWNnZEc4Z1ptbDRJR1ZwZEdobGNpQnZaaUIwYUc5elpWeHVJQ0F2THlCd2NtOWliR1Z0Y3l3Z2NHeGxZWE5sSUdSbGRHRnBiQ0I1YjNWeUlIVnVhWEYxWlNCd2NtVmthV05oYldWdWRDQnBiaUJoSUVkcGRFaDFZaUJwYzNOMVpTNWNiaUFnUm5WdVkzUnBiMjRvWENKeVhDSXNJRndpY21WblpXNWxjbUYwYjNKU2RXNTBhVzFsSUQwZ2Nsd2lLU2h5ZFc1MGFXMWxLVHRjYm4xY2JpSmRMQ0p1WVcxbGN5STZXeUp5ZFc1MGFXMWxJaXdpWlhod2IzSjBjeUlzSWs5d0lpd2lUMkpxWldOMElpd2ljSEp2ZEc5MGVYQmxJaXdpYUdGelQzZHVJaXdpYUdGelQzZHVVSEp2Y0dWeWRIa2lMQ0oxYm1SbFptbHVaV1FpTENJa1UzbHRZbTlzSWl3aVUzbHRZbTlzSWl3aWFYUmxjbUYwYjNKVGVXMWliMndpTENKcGRHVnlZWFJ2Y2lJc0ltRnplVzVqU1hSbGNtRjBiM0pUZVcxaWIyd2lMQ0poYzNsdVkwbDBaWEpoZEc5eUlpd2lkRzlUZEhKcGJtZFVZV2RUZVcxaWIyd2lMQ0owYjFOMGNtbHVaMVJoWnlJc0luZHlZWEFpTENKcGJtNWxja1p1SWl3aWIzVjBaWEpHYmlJc0luTmxiR1lpTENKMGNubE1iMk56VEdsemRDSXNJbkJ5YjNSdlIyVnVaWEpoZEc5eUlpd2lSMlZ1WlhKaGRHOXlJaXdpWjJWdVpYSmhkRzl5SWl3aVkzSmxZWFJsSWl3aVkyOXVkR1Y0ZENJc0lrTnZiblJsZUhRaUxDSmZhVzUyYjJ0bElpd2liV0ZyWlVsdWRtOXJaVTFsZEdodlpDSXNJblJ5ZVVOaGRHTm9JaXdpWm00aUxDSnZZbW9pTENKaGNtY2lMQ0owZVhCbElpd2lZMkZzYkNJc0ltVnljaUlzSWtkbGJsTjBZWFJsVTNWemNHVnVaR1ZrVTNSaGNuUWlMQ0pIWlc1VGRHRjBaVk4xYzNCbGJtUmxaRmxwWld4a0lpd2lSMlZ1VTNSaGRHVkZlR1ZqZFhScGJtY2lMQ0pIWlc1VGRHRjBaVU52YlhCc1pYUmxaQ0lzSWtOdmJuUnBiblZsVTJWdWRHbHVaV3dpTENKSFpXNWxjbUYwYjNKR2RXNWpkR2x2YmlJc0lrZGxibVZ5WVhSdmNrWjFibU4wYVc5dVVISnZkRzkwZVhCbElpd2lTWFJsY21GMGIzSlFjbTkwYjNSNWNHVWlMQ0puWlhSUWNtOTBieUlzSW1kbGRGQnliM1J2ZEhsd1pVOW1JaXdpVG1GMGFYWmxTWFJsY21GMGIzSlFjbTkwYjNSNWNHVWlMQ0oyWVd4MVpYTWlMQ0pIY0NJc0ltTnZibk4wY25WamRHOXlJaXdpWkdsemNHeGhlVTVoYldVaUxDSmtaV1pwYm1WSmRHVnlZWFJ2Y2sxbGRHaHZaSE1pTENKbWIzSkZZV05vSWl3aWJXVjBhRzlrSWl3aWFYTkhaVzVsY21GMGIzSkdkVzVqZEdsdmJpSXNJbWRsYmtaMWJpSXNJbU4wYjNJaUxDSnVZVzFsSWl3aWJXRnlheUlzSW5ObGRGQnliM1J2ZEhsd1pVOW1JaXdpWDE5d2NtOTBiMTlmSWl3aVlYZHlZWEFpTENKZlgyRjNZV2wwSWl3aVFYTjVibU5KZEdWeVlYUnZjaUlzSWxCeWIyMXBjMlZKYlhCc0lpd2lhVzUyYjJ0bElpd2ljbVZ6YjJ4MlpTSXNJbkpsYW1WamRDSXNJbkpsWTI5eVpDSXNJbkpsYzNWc2RDSXNJblpoYkhWbElpd2lkR2hsYmlJc0luVnVkM0poY0hCbFpDSXNJbVZ5Y205eUlpd2ljSEpsZG1sdmRYTlFjbTl0YVhObElpd2laVzV4ZFdWMVpTSXNJbU5oYkd4SmJuWnZhMlZYYVhSb1RXVjBhRzlrUVc1a1FYSm5JaXdpWVhONWJtTWlMQ0pRY205dGFYTmxJaXdpYVhSbGNpSXNJbTVsZUhRaUxDSmtiMjVsSWl3aWMzUmhkR1VpTENKRmNuSnZjaUlzSW1SdmJtVlNaWE4xYkhRaUxDSmtaV3hsWjJGMFpTSXNJbVJsYkdWbllYUmxVbVZ6ZFd4MElpd2liV0Y1WW1WSmJuWnZhMlZFWld4bFoyRjBaU0lzSW5ObGJuUWlMQ0pmYzJWdWRDSXNJbVJwYzNCaGRHTm9SWGhqWlhCMGFXOXVJaXdpWVdKeWRYQjBJaXdpVkhsd1pVVnljbTl5SWl3aWFXNW1ieUlzSW5KbGMzVnNkRTVoYldVaUxDSnVaWGgwVEc5aklpd2lkRzlUZEhKcGJtY2lMQ0p3ZFhOb1ZISjVSVzUwY25raUxDSnNiMk56SWl3aVpXNTBjbmtpTENKMGNubE1iMk1pTENKallYUmphRXh2WXlJc0ltWnBibUZzYkhsTWIyTWlMQ0poWm5SbGNreHZZeUlzSW5SeWVVVnVkSEpwWlhNaUxDSndkWE5vSWl3aWNtVnpaWFJVY25sRmJuUnllU0lzSW1OdmJYQnNaWFJwYjI0aUxDSnlaWE5sZENJc0ltdGxlWE1pTENKdlltcGxZM1FpTENKclpYa2lMQ0p5WlhabGNuTmxJaXdpYkdWdVozUm9JaXdpY0c5d0lpd2lhWFJsY21GaWJHVWlMQ0pwZEdWeVlYUnZjazFsZEdodlpDSXNJbWx6VG1GT0lpd2lhU0lzSW5OcmFYQlVaVzF3VW1WelpYUWlMQ0p3Y21WMklpd2lZMmhoY2tGMElpd2ljMnhwWTJVaUxDSnpkRzl3SWl3aWNtOXZkRVZ1ZEhKNUlpd2ljbTl2ZEZKbFkyOXlaQ0lzSW5KMllXd2lMQ0psZUdObGNIUnBiMjRpTENKb1lXNWtiR1VpTENKc2IyTWlMQ0pqWVhWbmFIUWlMQ0pvWVhORFlYUmphQ0lzSW1oaGMwWnBibUZzYkhraUxDSm1hVzVoYkd4NVJXNTBjbmtpTENKamIyMXdiR1YwWlNJc0ltWnBibWx6YUNJc0luUm9jbTkzYmlJc0ltUmxiR1ZuWVhSbFdXbGxiR1FpTENKdGIyUjFiR1VpTENKeVpXZGxibVZ5WVhSdmNsSjFiblJwYldVaUxDSmhZMk5wWkdWdWRHRnNVM1J5YVdOMFRXOWtaU0lzSWtaMWJtTjBhVzl1SWwwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPMEZCUVVFN096czdPenRCUVU5QkxFMUJRVWxCTEU5QlFVOHNSMEZCU1N4VlFVRlZReXhQUVVGV0xFVkJRVzFDTzBGQlEyaERPMEZCUlVFc1VVRkJTVU1zUlVGQlJTeEhRVUZIUXl4TlFVRk5MRU5CUVVORExGTkJRV2hDTzBGQlEwRXNVVUZCU1VNc1RVRkJUU3hIUVVGSFNDeEZRVUZGTEVOQlFVTkpMR05CUVdoQ08wRkJRMEVzVVVGQlNVTXNWMEZCU2l4RFFVeG5RenM3UVVGTmFFTXNVVUZCU1VNc1QwRkJUeXhIUVVGSExFOUJRVTlETEUxQlFWQXNTMEZCYTBJc1ZVRkJiRUlzUjBGQkswSkJMRTFCUVM5Q0xFZEJRWGRETEVWQlFYUkVPMEZCUTBFc1VVRkJTVU1zWTBGQll5eEhRVUZIUml4UFFVRlBMRU5CUVVOSExGRkJRVklzU1VGQmIwSXNXVUZCZWtNN1FVRkRRU3hSUVVGSlF5eHRRa0ZCYlVJc1IwRkJSMG9zVDBGQlR5eERRVUZEU3l4aFFVRlNMRWxCUVhsQ0xHbENRVUZ1UkR0QlFVTkJMRkZCUVVsRExHbENRVUZwUWl4SFFVRkhUaXhQUVVGUExFTkJRVU5QTEZkQlFWSXNTVUZCZFVJc1pVRkJMME03TzBGQlJVRXNZVUZCVTBNc1NVRkJWQ3hEUVVGalF5eFBRVUZrTEVWQlFYVkNReXhQUVVGMlFpeEZRVUZuUTBNc1NVRkJhRU1zUlVGQmMwTkRMRmRCUVhSRExFVkJRVzFFT3p0QlFVVnFSQ3hWUVVGSlF5eGpRVUZqTEVkQlFVZElMRTlCUVU4c1NVRkJTVUVzVDBGQlR5eERRVUZEWkN4VFFVRlNMRmxCUVRaQ2EwSXNVMEZCZUVNc1IwRkJiMFJLTEU5QlFYQkVMRWRCUVRoRVNTeFRRVUZ1Ump0QlFVTkJMRlZCUVVsRExGTkJRVk1zUjBGQlIzQkNMRTFCUVUwc1EwRkJRM0ZDTEUxQlFWQXNRMEZCWTBnc1kwRkJZeXhEUVVGRGFrSXNVMEZCTjBJc1EwRkJhRUk3UVVGRFFTeFZRVUZKY1VJc1QwRkJUeXhIUVVGSExFbEJRVWxETEU5QlFVb3NRMEZCV1U0c1YwRkJWeXhKUVVGSkxFVkJRVE5DTEVOQlFXUXNRMEZLYVVRN096dEJRVkZxUkVjc1RVRkJRVUVzVTBGQlV5eERRVUZEU1N4UFFVRldMRWRCUVc5Q1F5eG5Ra0ZCWjBJc1EwRkJRMWdzVDBGQlJDeEZRVUZWUlN4SlFVRldMRVZCUVdkQ1RTeFBRVUZvUWl4RFFVRndRenRCUVVWQkxHRkJRVTlHTEZOQlFWQTdRVUZEUkRzN1FVRkRSSFJDTEVsQlFVRkJMRTlCUVU4c1EwRkJRMlVzU1VGQlVpeEhRVUZsUVN4SlFVRm1MRU5CZGtKblF6czdPenM3T3pzN096czdRVUZ0UTJoRExHRkJRVk5oTEZGQlFWUXNRMEZCYTBKRExFVkJRV3hDTEVWQlFYTkNReXhIUVVGMFFpeEZRVUV5UWtNc1IwRkJNMElzUlVGQlowTTdRVUZET1VJc1ZVRkJTVHRCUVVOR0xHVkJRVTg3UVVGQlJVTXNWVUZCUVVFc1NVRkJTU3hGUVVGRkxGRkJRVkk3UVVGQmEwSkVMRlZCUVVGQkxFZEJRVWNzUlVGQlJVWXNSVUZCUlN4RFFVRkRTU3hKUVVGSUxFTkJRVkZJTEVkQlFWSXNSVUZCWVVNc1IwRkJZanRCUVVGMlFpeFRRVUZRTzBGQlEwUXNUMEZHUkN4RFFVVkZMRTlCUVU5SExFZEJRVkFzUlVGQldUdEJRVU5hTEdWQlFVODdRVUZCUlVZc1ZVRkJRVUVzU1VGQlNTeEZRVUZGTEU5QlFWSTdRVUZCYVVKRUxGVkJRVUZCTEVkQlFVY3NSVUZCUlVjN1FVRkJkRUlzVTBGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1VVRkJTVU1zYzBKQlFYTkNMRWRCUVVjc1owSkJRVGRDTzBGQlEwRXNVVUZCU1VNc2MwSkJRWE5DTEVkQlFVY3NaMEpCUVRkQ08wRkJRMEVzVVVGQlNVTXNhVUpCUVdsQ0xFZEJRVWNzVjBGQmVFSTdRVUZEUVN4UlFVRkpReXhwUWtGQmFVSXNSMEZCUnl4WFFVRjRRaXhEUVRsRFowTTdPenRCUVd0RWFFTXNVVUZCU1VNc1owSkJRV2RDTEVkQlFVY3NSVUZCZGtJc1EwRnNSR2RET3pzN096dEJRWGRFYUVNc1lVRkJVMnhDTEZOQlFWUXNSMEZCY1VJN08wRkJRM0pDTEdGQlFWTnRRaXhwUWtGQlZDeEhRVUUyUWpzN1FVRkROMElzWVVGQlUwTXNNRUpCUVZRc1IwRkJjME1zUlVFeFJFNDdPenM3UVVFNFJHaERMRkZCUVVsRExHbENRVUZwUWl4SFFVRkhMRVZCUVhoQ096dEJRVU5CUVN4SlFVRkJRU3hwUWtGQmFVSXNRMEZCUTJwRExHTkJRVVFzUTBGQmFrSXNSMEZCYjBNc1dVRkJXVHRCUVVNNVF5eGhRVUZQTEVsQlFWQTdRVUZEUkN4TFFVWkVPenRCUVVsQkxGRkJRVWxyUXl4UlFVRlJMRWRCUVVkNlF5eE5RVUZOTEVOQlFVTXdReXhqUVVGMFFqdEJRVU5CTEZGQlFVbERMSFZDUVVGMVFpeEhRVUZIUml4UlFVRlJMRWxCUVVsQkxGRkJRVkVzUTBGQlEwRXNVVUZCVVN4RFFVRkRSeXhOUVVGTkxFTkJRVU1zUlVGQlJDeERRVUZRTEVOQlFWUXNRMEZCYkVRN08wRkJRMEVzVVVGQlNVUXNkVUpCUVhWQ0xFbEJRM1pDUVN4MVFrRkJkVUlzUzBGQlN6VkRMRVZCUkRWQ0xFbEJSVUZITEUxQlFVMHNRMEZCUXpaQ0xFbEJRVkFzUTBGQldWa3NkVUpCUVZvc1JVRkJjVU53UXl4alFVRnlReXhEUVVaS0xFVkJSVEJFT3pzN1FVRkhlRVJwUXl4TlFVRkJRU3hwUWtGQmFVSXNSMEZCUjBjc2RVSkJRWEJDTzBGQlEwUTdPMEZCUlVRc1VVRkJTVVVzUlVGQlJTeEhRVUZIVGl3d1FrRkJNRUlzUTBGQlEzUkRMRk5CUVROQ0xFZEJRMUJyUWl4VFFVRlRMRU5CUVVOc1FpeFRRVUZXTEVkQlFYTkNSQ3hOUVVGTkxFTkJRVU54UWl4TlFVRlFMRU5CUVdOdFFpeHBRa0ZCWkN4RFFVUjRRanRCUVVWQlJpeEpRVUZCUVN4cFFrRkJhVUlzUTBGQlEzSkRMRk5CUVd4Q0xFZEJRVGhDTkVNc1JVRkJSU3hEUVVGRFF5eFhRVUZJTEVkQlFXbENVQ3d3UWtGQkwwTTdRVUZEUVVFc1NVRkJRVUVzTUVKQlFUQkNMRU5CUVVOUExGZEJRVE5DTEVkQlFYbERVaXhwUWtGQmVrTTdRVUZEUVVNc1NVRkJRVUVzTUVKQlFUQkNMRU5CUVVNMVFpeHBRa0ZCUkN4RFFVRXhRaXhIUVVORk1rSXNhVUpCUVdsQ0xFTkJRVU5UTEZkQlFXeENMRWRCUVdkRExHMUNRVVJzUXl4RFFXcEdaME03T3p0QlFYTkdhRU1zWVVGQlUwTXNjVUpCUVZRc1EwRkJLMEl2UXl4VFFVRXZRaXhGUVVFd1F6dEJRVU40UXl4UFFVRkRMRTFCUVVRc1JVRkJVeXhQUVVGVUxFVkJRV3RDTEZGQlFXeENMRVZCUVRSQ1owUXNUMEZCTlVJc1EwRkJiME1zVlVGQlUwTXNUVUZCVkN4RlFVRnBRanRCUVVOdVJHcEVMRkZCUVVGQkxGTkJRVk1zUTBGQlEybEVMRTFCUVVRc1EwRkJWQ3hIUVVGdlFpeFZRVUZUY2tJc1IwRkJWQ3hGUVVGak8wRkJRMmhETEdsQ1FVRlBMRXRCUVV0TUxFOUJRVXdzUTBGQllUQkNMRTFCUVdJc1JVRkJjVUp5UWl4SFFVRnlRaXhEUVVGUU8wRkJRMFFzVTBGR1JEdEJRVWRFTEU5QlNrUTdRVUZMUkRzN1FVRkZSQzlDTEVsQlFVRkJMRTlCUVU4c1EwRkJRM0ZFTEcxQ1FVRlNMRWRCUVRoQ0xGVkJRVk5ETEUxQlFWUXNSVUZCYVVJN1FVRkROME1zVlVGQlNVTXNTVUZCU1N4SFFVRkhMRTlCUVU5RUxFMUJRVkFzUzBGQmEwSXNWVUZCYkVJc1NVRkJaME5CTEUxQlFVMHNRMEZCUTA0c1YwRkJiRVE3UVVGRFFTeGhRVUZQVHl4SlFVRkpMRWRCUTFCQkxFbEJRVWtzUzBGQlMyWXNhVUpCUVZRN08wRkJSMEVzVDBGQlEyVXNTVUZCU1N4RFFVRkRUaXhYUVVGTUxFbEJRVzlDVFN4SlFVRkpMRU5CUVVORExFbEJRVEZDTEUxQlFXOURMRzFDUVVvM1FpeEhRVXRRTEV0QlRFbzdRVUZOUkN4TFFWSkVPenRCUVZWQmVFUXNTVUZCUVVFc1QwRkJUeXhEUVVGRGVVUXNTVUZCVWl4SFFVRmxMRlZCUVZOSUxFMUJRVlFzUlVGQmFVSTdRVUZET1VJc1ZVRkJTWEJFTEUxQlFVMHNRMEZCUTNkRUxHTkJRVmdzUlVGQk1rSTdRVUZEZWtKNFJDeFJRVUZCUVN4TlFVRk5MRU5CUVVOM1JDeGpRVUZRTEVOQlFYTkNTaXhOUVVGMFFpeEZRVUU0UW1Jc01FSkJRVGxDTzBGQlEwUXNUMEZHUkN4TlFVVlBPMEZCUTB4aExGRkJRVUZCTEUxQlFVMHNRMEZCUTBzc1UwRkJVQ3hIUVVGdFFteENMREJDUVVGdVFqczdRVUZEUVN4WlFVRkpMRVZCUVVVMVFpeHBRa0ZCYVVJc1NVRkJTWGxETEUxQlFYWkNMRU5CUVVvc1JVRkJiME03UVVGRGJFTkJMRlZCUVVGQkxFMUJRVTBzUTBGQlEzcERMR2xDUVVGRUxFTkJRVTRzUjBGQk5FSXNiVUpCUVRWQ08wRkJRMFE3UVVGRFJqczdRVUZEUkhsRExFMUJRVUZCTEUxQlFVMHNRMEZCUTI1RUxGTkJRVkFzUjBGQmJVSkVMRTFCUVUwc1EwRkJRM0ZDTEUxQlFWQXNRMEZCWTNkQ0xFVkJRV1FzUTBGQmJrSTdRVUZEUVN4aFFVRlBUeXhOUVVGUU8wRkJRMFFzUzBGWVJDeERRWGhIWjBNN096czdPenRCUVhsSWFFTjBSQ3hKUVVGQlFTeFBRVUZQTEVOQlFVTTBSQ3hMUVVGU0xFZEJRV2RDTEZWQlFWTTNRaXhIUVVGVUxFVkJRV003UVVGRE5VSXNZVUZCVHp0QlFVRkZPRUlzVVVGQlFVRXNUMEZCVHl4RlFVRkZPVUk3UVVGQldDeFBRVUZRTzBGQlEwUXNTMEZHUkRzN1FVRkpRU3hoUVVGVEswSXNZVUZCVkN4RFFVRjFRbmhETEZOQlFYWkNMRVZCUVd0RGVVTXNWMEZCYkVNc1JVRkJLME03UVVGRE4wTXNaVUZCVTBNc1RVRkJWQ3hEUVVGblFsb3NUVUZCYUVJc1JVRkJkMEp5UWl4SFFVRjRRaXhGUVVFMlFtdERMRTlCUVRkQ0xFVkJRWE5EUXl4TlFVRjBReXhGUVVFNFF6dEJRVU0xUXl4WlFVRkpReXhOUVVGTkxFZEJRVWQyUXl4UlFVRlJMRU5CUVVOT0xGTkJRVk1zUTBGQlF6aENMRTFCUVVRc1EwRkJWaXhGUVVGdlFqbENMRk5CUVhCQ0xFVkJRU3RDVXl4SFFVRXZRaXhEUVVGeVFqczdRVUZEUVN4WlFVRkpiME1zVFVGQlRTeERRVUZEYmtNc1NVRkJVQ3hMUVVGblFpeFBRVUZ3UWl4RlFVRTJRanRCUVVNelFtdERMRlZCUVVGQkxFMUJRVTBzUTBGQlEwTXNUVUZCVFN4RFFVRkRjRU1zUjBGQlVpeERRVUZPTzBGQlEwUXNVMEZHUkN4TlFVVlBPMEZCUTB3c1kwRkJTWEZETEUxQlFVMHNSMEZCUjBRc1RVRkJUU3hEUVVGRGNFTXNSMEZCY0VJN1FVRkRRU3hqUVVGSmMwTXNTMEZCU3l4SFFVRkhSQ3hOUVVGTkxFTkJRVU5ETEV0QlFXNUNPenRCUVVOQkxHTkJRVWxCTEV0QlFVc3NTVUZEVEN4UFFVRlBRU3hMUVVGUUxFdEJRV2xDTEZGQlJHcENMRWxCUlVGcVJTeE5RVUZOTEVOQlFVTTJRaXhKUVVGUUxFTkJRVmx2UXl4TFFVRmFMRVZCUVcxQ0xGTkJRVzVDTEVOQlJrb3NSVUZGYlVNN1FVRkRha01zYlVKQlFVOU9MRmRCUVZjc1EwRkJRMFVzVDBGQldpeERRVUZ2UWtrc1MwRkJTeXhEUVVGRFVpeFBRVUV4UWl4RlFVRnRRMU1zU1VGQmJrTXNRMEZCZDBNc1ZVRkJVMFFzUzBGQlZDeEZRVUZuUWp0QlFVTTNSRXdzWTBGQlFVRXNUVUZCVFN4RFFVRkRMRTFCUVVRc1JVRkJVMHNzUzBGQlZDeEZRVUZuUWtvc1QwRkJhRUlzUlVGQmVVSkRMRTFCUVhwQ0xFTkJRVTQ3UVVGRFJDeGhRVVpOTEVWQlJVb3NWVUZCVTJoRExFZEJRVlFzUlVGQll6dEJRVU5tT0VJc1kwRkJRVUVzVFVGQlRTeERRVUZETEU5QlFVUXNSVUZCVlRsQ0xFZEJRVllzUlVGQlpTdENMRTlCUVdZc1JVRkJkMEpETEUxQlFYaENMRU5CUVU0N1FVRkRSQ3hoUVVwTkxFTkJRVkE3UVVGTFJEczdRVUZGUkN4cFFrRkJUMGdzVjBGQlZ5eERRVUZEUlN4UFFVRmFMRU5CUVc5Q1NTeExRVUZ3UWl4RlFVRXlRa01zU1VGQk0wSXNRMEZCWjBNc1ZVRkJVME1zVTBGQlZDeEZRVUZ2UWpzN096dEJRVWw2UkVnc1dVRkJRVUVzVFVGQlRTeERRVUZEUXl4TFFVRlFMRWRCUVdWRkxGTkJRV1k3UVVGRFFVNHNXVUZCUVVFc1QwRkJUeXhEUVVGRFJ5eE5RVUZFTEVOQlFWQTdRVUZEUkN4WFFVNU5MRVZCVFVvc1ZVRkJVMGtzUzBGQlZDeEZRVUZuUWpzN08wRkJSMnBDTEcxQ1FVRlBVaXhOUVVGTkxFTkJRVU1zVDBGQlJDeEZRVUZWVVN4TFFVRldMRVZCUVdsQ1VDeFBRVUZxUWl4RlFVRXdRa01zVFVGQk1VSXNRMEZCWWp0QlFVTkVMRmRCVmswc1EwRkJVRHRCUVZkRU8wRkJRMFk3TzBGQlJVUXNWVUZCU1U4c1pVRkJTanM3UVVGRlFTeGxRVUZUUXl4UFFVRlVMRU5CUVdsQ2RFSXNUVUZCYWtJc1JVRkJlVUp5UWl4SFFVRjZRaXhGUVVFNFFqdEJRVU0xUWl4cFFrRkJVelJETERCQ1FVRlVMRWRCUVhORE8wRkJRM0JETEdsQ1FVRlBMRWxCUVVsYUxGZEJRVW9zUTBGQlowSXNWVUZCVTBVc1QwRkJWQ3hGUVVGclFrTXNUVUZCYkVJc1JVRkJNRUk3UVVGREwwTkdMRmxCUVVGQkxFMUJRVTBzUTBGQlExb3NUVUZCUkN4RlFVRlRja0lzUjBGQlZDeEZRVUZqYTBNc1QwRkJaQ3hGUVVGMVFrTXNUVUZCZGtJc1EwRkJUanRCUVVORUxGZEJSazBzUTBGQlVEdEJRVWRFT3p0QlFVVkVMR1ZCUVU5UExHVkJRV1U3T3pzN096czdPenM3T3p0QlFXRndRa0VzVVVGQlFVRXNaVUZCWlN4SFFVRkhRU3hsUVVGbExFTkJRVU5JTEVsQlFXaENMRU5CUTJoQ1N5d3dRa0ZFWjBJN08wRkJTV2hDUVN4UlFVRkJRU3d3UWtGS1owSXNRMEZCU0N4SFFVdFlRU3d3UWtGQk1FSXNSVUZzUW1oRE8wRkJiVUpFTEU5Qk5VUTBRenM3T3p0QlFXZEZOME1zVjBGQlMycEVMRTlCUVV3c1IwRkJaV2RFTEU5QlFXWTdRVUZEUkRzN1FVRkZSSGhDTEVsQlFVRkJMSEZDUVVGeFFpeERRVUZEV1N4aFFVRmhMRU5CUVVNelJDeFRRVUZtTEVOQlFYSkNPenRCUVVOQk1rUXNTVUZCUVVFc1lVRkJZU3hEUVVGRE0wUXNVMEZCWkN4RFFVRjNRbEVzYlVKQlFYaENMRWxCUVN0RExGbEJRVms3UVVGRGVrUXNZVUZCVHl4SlFVRlFPMEZCUTBRc1MwRkdSRHM3UVVGSFFWZ3NTVUZCUVVFc1QwRkJUeXhEUVVGRE9FUXNZVUZCVWl4SFFVRjNRa0VzWVVGQmVFSXNRMEZ3VFdkRE96czdPMEZCZVUxb1F6bEVMRWxCUVVGQkxFOUJRVThzUTBGQlF6UkZMRXRCUVZJc1IwRkJaMElzVlVGQlV6VkVMRTlCUVZRc1JVRkJhMEpETEU5QlFXeENMRVZCUVRKQ1F5eEpRVUV6UWl4RlFVRnBRME1zVjBGQmFrTXNSVUZCT0VNMFF5eFhRVUU1UXl4RlFVRXlSRHRCUVVONlJTeFZRVUZKUVN4WFFVRlhMRXRCUVVzc1MwRkJTeXhEUVVGNlFpeEZRVUUwUWtFc1YwRkJWeXhIUVVGSFl5eFBRVUZrTzBGQlJUVkNMRlZCUVVsRExFbEJRVWtzUjBGQlJ5eEpRVUZKYUVJc1lVRkJTaXhEUVVOVUwwTXNTVUZCU1N4RFFVRkRReXhQUVVGRUxFVkJRVlZETEU5QlFWWXNSVUZCYlVKRExFbEJRVzVDTEVWQlFYbENReXhYUVVGNlFpeERRVVJMTEVWQlJWUTBReXhYUVVaVExFTkJRVmc3UVVGTFFTeGhRVUZQTDBRc1QwRkJUeXhEUVVGRGNVUXNiVUpCUVZJc1EwRkJORUp3UXl4UFFVRTFRaXhKUVVOSU5rUXNTVUZFUnp0QlFVRkJMRkZCUlVoQkxFbEJRVWtzUTBGQlEwTXNTVUZCVEN4SFFVRlpWQ3hKUVVGYUxFTkJRV2xDTEZWQlFWTkdMRTFCUVZRc1JVRkJhVUk3UVVGRGFFTXNaVUZCVDBFc1RVRkJUU3hEUVVGRFdTeEpRVUZRTEVkQlFXTmFMRTFCUVUwc1EwRkJRME1zUzBGQmNrSXNSMEZCTmtKVExFbEJRVWtzUTBGQlEwTXNTVUZCVEN4RlFVRndRenRCUVVORUxFOUJSa1FzUTBGR1NqdEJRVXRFTEV0QllrUTdPMEZCWlVFc1lVRkJVM0JFTEdkQ1FVRlVMRU5CUVRCQ1dDeFBRVUV4UWl4RlFVRnRRMFVzU1VGQmJrTXNSVUZCZVVOTkxFOUJRWHBETEVWQlFXdEVPMEZCUTJoRUxGVkJRVWw1UkN4TFFVRkxMRWRCUVVjNVF5eHpRa0ZCV2p0QlFVVkJMR0ZCUVU4c1UwRkJVelpDTEUxQlFWUXNRMEZCWjBKYUxFMUJRV2hDTEVWQlFYZENja0lzUjBGQmVFSXNSVUZCTmtJN1FVRkRiRU1zV1VGQlNXdEVMRXRCUVVzc1MwRkJTelZETEdsQ1FVRmtMRVZCUVdsRE8wRkJReTlDTEdkQ1FVRk5MRWxCUVVrMlF5eExRVUZLTEVOQlFWVXNPRUpCUVZZc1EwRkJUanRCUVVORU96dEJRVVZFTEZsQlFVbEVMRXRCUVVzc1MwRkJTek5ETEdsQ1FVRmtMRVZCUVdsRE8wRkJReTlDTEdOQlFVbGpMRTFCUVUwc1MwRkJTeXhQUVVGbUxFVkJRWGRDTzBGQlEzUkNMR3RDUVVGTmNrSXNSMEZCVGp0QlFVTkVMRmRCU0RoQ096czdPMEZCVHk5Q0xHbENRVUZQYjBRc1ZVRkJWU3hGUVVGcVFqdEJRVU5FT3p0QlFVVkVNMFFzVVVGQlFVRXNUMEZCVHl4RFFVRkRORUlzVFVGQlVpeEhRVUZwUWtFc1RVRkJha0k3UVVGRFFUVkNMRkZCUVVGQkxFOUJRVThzUTBGQlEwOHNSMEZCVWl4SFFVRmpRU3hIUVVGa096dEJRVVZCTEdWQlFVOHNTVUZCVUN4RlFVRmhPMEZCUTFnc1kwRkJTWEZFTEZGQlFWRXNSMEZCUnpWRUxFOUJRVThzUTBGQlF6UkVMRkZCUVhaQ096dEJRVU5CTEdOQlFVbEJMRkZCUVVvc1JVRkJZenRCUVVOYUxHZENRVUZKUXl4alFVRmpMRWRCUVVkRExHMUNRVUZ0UWl4RFFVRkRSaXhSUVVGRUxFVkJRVmMxUkN4UFFVRllMRU5CUVhoRE96dEJRVU5CTEdkQ1FVRkpOa1FzWTBGQlNpeEZRVUZ2UWp0QlFVTnNRaXhyUWtGQlNVRXNZMEZCWXl4TFFVRkxPVU1zWjBKQlFYWkNMRVZCUVhsRE8wRkJRM3BETEhGQ1FVRlBPRU1zWTBGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVRc1kwRkJTVGRFTEU5QlFVOHNRMEZCUXpSQ0xFMUJRVklzUzBGQmJVSXNUVUZCZGtJc1JVRkJLMEk3T3p0QlFVYzNRalZDTEZsQlFVRkJMRTlCUVU4c1EwRkJReXRFTEVsQlFWSXNSMEZCWlM5RUxFOUJRVThzUTBGQlEyZEZMRXRCUVZJc1IwRkJaMEpvUlN4UFFVRlBMRU5CUVVOUExFZEJRWFpETzBGQlJVUXNWMEZNUkN4TlFVdFBMRWxCUVVsUUxFOUJRVThzUTBGQlF6UkNMRTFCUVZJc1MwRkJiVUlzVDBGQmRrSXNSVUZCWjBNN1FVRkRja01zWjBKQlFVazJRaXhMUVVGTExFdEJRVXM1UXl4elFrRkJaQ3hGUVVGelF6dEJRVU53UXpoRExHTkJRVUZCTEV0QlFVc3NSMEZCUnpORExHbENRVUZTTzBGQlEwRXNiMEpCUVUxa0xFOUJRVThzUTBGQlEwOHNSMEZCWkR0QlFVTkVPenRCUVVWRVVDeFpRVUZCUVN4UFFVRlBMRU5CUVVOcFJTeHBRa0ZCVWl4RFFVRXdRbXBGTEU5QlFVOHNRMEZCUTA4c1IwRkJiRU03UVVGRlJDeFhRVkpOTEUxQlVVRXNTVUZCU1ZBc1QwRkJUeXhEUVVGRE5FSXNUVUZCVWl4TFFVRnRRaXhSUVVGMlFpeEZRVUZwUXp0QlFVTjBRelZDTEZsQlFVRkJMRTlCUVU4c1EwRkJRMnRGTEUxQlFWSXNRMEZCWlN4UlFVRm1MRVZCUVhsQ2JFVXNUMEZCVHl4RFFVRkRUeXhIUVVGcVF6dEJRVU5FT3p0QlFVVkVhMFFzVlVGQlFVRXNTMEZCU3l4SFFVRkhOVU1zYVVKQlFWSTdRVUZGUVN4alFVRkpPRUlzVFVGQlRTeEhRVUZIZGtNc1VVRkJVU3hEUVVGRFdpeFBRVUZFTEVWQlFWVkZMRWxCUVZZc1JVRkJaMEpOTEU5QlFXaENMRU5CUVhKQ096dEJRVU5CTEdOQlFVa3lReXhOUVVGTkxFTkJRVU51UXl4SlFVRlFMRXRCUVdkQ0xGRkJRWEJDTEVWQlFUaENPenM3UVVGSE5VSnBSQ3haUVVGQlFTeExRVUZMTEVkQlFVZDZSQ3hQUVVGUExFTkJRVU4zUkN4SlFVRlNMRWRCUTBveFF5eHBRa0ZFU1N4SFFVVktSaXh6UWtGR1NqczdRVUZKUVN4blFrRkJTU3RDTEUxQlFVMHNRMEZCUTNCRExFZEJRVkFzUzBGQlpWRXNaMEpCUVc1Q0xFVkJRWEZETzBGQlEyNURPMEZCUTBRN08wRkJSVVFzYlVKQlFVODdRVUZEVERoQ0xHTkJRVUZCTEV0QlFVc3NSVUZCUlVZc1RVRkJUU3hEUVVGRGNFTXNSMEZFVkR0QlFVVk1hVVFzWTBGQlFVRXNTVUZCU1N4RlFVRkZlRVFzVDBGQlR5eERRVUZEZDBRN1FVRkdWQ3hoUVVGUU8wRkJTMFFzVjBGb1FrUXNUVUZuUWs4c1NVRkJTV0lzVFVGQlRTeERRVUZEYmtNc1NVRkJVQ3hMUVVGblFpeFBRVUZ3UWl4RlFVRTJRanRCUVVOc1EybEVMRmxCUVVGQkxFdEJRVXNzUjBGQlJ6TkRMR2xDUVVGU0xFTkJSR3RET3pzN1FVRkpiRU5rTEZsQlFVRkJMRTlCUVU4c1EwRkJRelJDTEUxQlFWSXNSMEZCYVVJc1QwRkJha0k3UVVGRFFUVkNMRmxCUVVGQkxFOUJRVThzUTBGQlEwOHNSMEZCVWl4SFFVRmpiME1zVFVGQlRTeERRVUZEY0VNc1IwRkJja0k3UVVGRFJEdEJRVU5HTzBGQlEwWXNUMEY0UlVRN1FVRjVSVVFzUzBGd1V5dENPenM3T3pzN1FVRXdVMmhETEdGQlFWTjFSQ3h0UWtGQlZDeERRVUUyUWtZc1VVRkJOMElzUlVGQmRVTTFSQ3hQUVVGMlF5eEZRVUZuUkR0QlFVTTVReXhWUVVGSk5FSXNUVUZCVFN4SFFVRkhaME1zVVVGQlVTeERRVUZETVVVc1VVRkJWQ3hEUVVGclFtTXNUMEZCVHl4RFFVRkRORUlzVFVGQk1VSXNRMEZCWWpzN1FVRkRRU3hWUVVGSlFTeE5RVUZOTEV0QlFVczVReXhYUVVGbUxFVkJRVEJDT3pzN1FVRkhlRUpyUWl4UlFVRkJRU3hQUVVGUExFTkJRVU0wUkN4UlFVRlNMRWRCUVcxQ0xFbEJRVzVDT3p0QlFVVkJMRmxCUVVrMVJDeFBRVUZQTEVOQlFVTTBRaXhOUVVGU0xFdEJRVzFDTEU5QlFYWkNMRVZCUVdkRE96dEJRVVU1UWl4alFVRkpaME1zVVVGQlVTeERRVUZETVVVc1VVRkJWQ3hEUVVGclFpeFJRVUZzUWl4RFFVRktMRVZCUVdsRE96czdRVUZITDBKakxGbEJRVUZCTEU5QlFVOHNRMEZCUXpSQ0xFMUJRVklzUjBGQmFVSXNVVUZCYWtJN1FVRkRRVFZDTEZsQlFVRkJMRTlCUVU4c1EwRkJRMDhzUjBGQlVpeEhRVUZqZWtJc1YwRkJaRHRCUVVOQlowWXNXVUZCUVVFc2JVSkJRVzFDTEVOQlFVTkdMRkZCUVVRc1JVRkJWelZFTEU5QlFWZ3NRMEZCYmtJN08wRkJSVUVzWjBKQlFVbEJMRTlCUVU4c1EwRkJRelJDTEUxQlFWSXNTMEZCYlVJc1QwRkJka0lzUlVGQlowTTdPenRCUVVjNVFpeHhRa0ZCVDJJc1owSkJRVkE3UVVGRFJEdEJRVU5HT3p0QlFVVkVaaXhWUVVGQlFTeFBRVUZQTEVOQlFVTTBRaXhOUVVGU0xFZEJRV2xDTEU5QlFXcENPMEZCUTBFMVFpeFZRVUZCUVN4UFFVRlBMRU5CUVVOUExFZEJRVklzUjBGQll5eEpRVUZKTkVRc1UwRkJTaXhEUVVOYUxHZEVRVVJaTEVOQlFXUTdRVUZGUkRzN1FVRkZSQ3hsUVVGUGNFUXNaMEpCUVZBN1FVRkRSRHM3UVVGRlJDeFZRVUZKTkVJc1RVRkJUU3hIUVVGSGRrTXNVVUZCVVN4RFFVRkRkMElzVFVGQlJDeEZRVUZUWjBNc1VVRkJVU3hEUVVGRE1VVXNVVUZCYkVJc1JVRkJORUpqTEU5QlFVOHNRMEZCUTA4c1IwRkJjRU1zUTBGQmNrSTdPMEZCUlVFc1ZVRkJTVzlETEUxQlFVMHNRMEZCUTI1RExFbEJRVkFzUzBGQlowSXNUMEZCY0VJc1JVRkJOa0k3UVVGRE0wSlNMRkZCUVVGQkxFOUJRVThzUTBGQlF6UkNMRTFCUVZJc1IwRkJhVUlzVDBGQmFrSTdRVUZEUVRWQ0xGRkJRVUZCTEU5QlFVOHNRMEZCUTA4c1IwRkJVaXhIUVVGamIwTXNUVUZCVFN4RFFVRkRjRU1zUjBGQmNrSTdRVUZEUVZBc1VVRkJRVUVzVDBGQlR5eERRVUZETkVRc1VVRkJVaXhIUVVGdFFpeEpRVUZ1UWp0QlFVTkJMR1ZCUVU4M1F5eG5Ra0ZCVUR0QlFVTkVPenRCUVVWRUxGVkJRVWx4UkN4SlFVRkpMRWRCUVVkNlFpeE5RVUZOTEVOQlFVTndReXhIUVVGc1FqczdRVUZGUVN4VlFVRkpMRU5CUVVVMlJDeEpRVUZPTEVWQlFWazdRVUZEVm5CRkxGRkJRVUZCTEU5QlFVOHNRMEZCUXpSQ0xFMUJRVklzUjBGQmFVSXNUMEZCYWtJN1FVRkRRVFZDTEZGQlFVRkJMRTlCUVU4c1EwRkJRMDhzUjBGQlVpeEhRVUZqTEVsQlFVazBSQ3hUUVVGS0xFTkJRV01zYTBOQlFXUXNRMEZCWkR0QlFVTkJia1VzVVVGQlFVRXNUMEZCVHl4RFFVRkRORVFzVVVGQlVpeEhRVUZ0UWl4SlFVRnVRanRCUVVOQkxHVkJRVTgzUXl4blFrRkJVRHRCUVVORU96dEJRVVZFTEZWQlFVbHhSQ3hKUVVGSkxFTkJRVU5hTEVsQlFWUXNSVUZCWlRzN08wRkJSMko0UkN4UlFVRkJRU3hQUVVGUExFTkJRVU0wUkN4UlFVRlJMRU5CUVVOVExGVkJRVllzUTBGQlVDeEhRVUVyUWtRc1NVRkJTU3hEUVVGRGRrSXNTMEZCY0VNc1EwRklZVHM3UVVGTllqZERMRkZCUVVGQkxFOUJRVThzUTBGQlEzVkVMRWxCUVZJc1IwRkJaVXNzVVVGQlVTeERRVUZEVlN4UFFVRjRRaXhEUVU1aE96czdPenM3TzBGQlkySXNXVUZCU1hSRkxFOUJRVThzUTBGQlF6UkNMRTFCUVZJc1MwRkJiVUlzVVVGQmRrSXNSVUZCYVVNN1FVRkRMMEkxUWl4VlFVRkJRU3hQUVVGUExFTkJRVU0wUWl4TlFVRlNMRWRCUVdsQ0xFMUJRV3BDTzBGQlEwRTFRaXhWUVVGQlFTeFBRVUZQTEVOQlFVTlBMRWRCUVZJc1IwRkJZM3BDTEZkQlFXUTdRVUZEUkR0QlFVVkdMRTlCYmtKRUxFMUJiVUpQT3p0QlFVVk1MR1ZCUVU5elJpeEpRVUZRTzBGQlEwUXNUMEYyUlRaRE96czdPMEZCTWtVNVEzQkZMRTFCUVVGQkxFOUJRVThzUTBGQlF6UkVMRkZCUVZJc1IwRkJiVUlzU1VGQmJrSTdRVUZEUVN4aFFVRlBOME1zWjBKQlFWQTdRVUZEUkN4TFFYWllLMEk3T3pzN1FVRXlXR2hEVnl4SlFVRkJRU3h4UWtGQmNVSXNRMEZCUTBnc1JVRkJSQ3hEUVVGeVFqdEJRVVZCUVN4SlFVRkJRU3hGUVVGRkxFTkJRVU5zUXl4cFFrRkJSQ3hEUVVGR0xFZEJRWGRDTEZkQlFYaENMRU5CTjFoblF6czdPenM3TzBGQmIxbG9RMnRETEVsQlFVRkJMRVZCUVVVc1EwRkJRM1JETEdOQlFVUXNRMEZCUml4SFFVRnhRaXhaUVVGWE8wRkJRemxDTEdGQlFVOHNTVUZCVUR0QlFVTkVMRXRCUmtRN08wRkJTVUZ6UXl4SlFVRkJRU3hGUVVGRkxFTkJRVU5uUkN4UlFVRklMRWRCUVdNc1dVRkJWenRCUVVOMlFpeGhRVUZQTEc5Q1FVRlFPMEZCUTBRc1MwRkdSRHM3UVVGSlFTeGhRVUZUUXl4WlFVRlVMRU5CUVhOQ1F5eEpRVUYwUWl4RlFVRTBRanRCUVVNeFFpeFZRVUZKUXl4TFFVRkxMRWRCUVVjN1FVRkJSVU1zVVVGQlFVRXNUVUZCVFN4RlFVRkZSaXhKUVVGSkxFTkJRVU1zUTBGQlJEdEJRVUZrTEU5QlFWbzdPMEZCUlVFc1ZVRkJTU3hMUVVGTFFTeEpRVUZVTEVWQlFXVTdRVUZEWWtNc1VVRkJRVUVzUzBGQlN5eERRVUZEUlN4UlFVRk9MRWRCUVdsQ1NDeEpRVUZKTEVOQlFVTXNRMEZCUkN4RFFVRnlRanRCUVVORU96dEJRVVZFTEZWQlFVa3NTMEZCUzBFc1NVRkJWQ3hGUVVGbE8wRkJRMkpETEZGQlFVRkJMRXRCUVVzc1EwRkJRMGNzVlVGQlRpeEhRVUZ0UWtvc1NVRkJTU3hEUVVGRExFTkJRVVFzUTBGQmRrSTdRVUZEUVVNc1VVRkJRVUVzUzBGQlN5eERRVUZEU1N4UlFVRk9MRWRCUVdsQ1RDeEpRVUZKTEVOQlFVTXNRMEZCUkN4RFFVRnlRanRCUVVORU96dEJRVVZFTEZkQlFVdE5MRlZCUVV3c1EwRkJaMEpETEVsQlFXaENMRU5CUVhGQ1RpeExRVUZ5UWp0QlFVTkVPenRCUVVWRUxHRkJRVk5QTEdGQlFWUXNRMEZCZFVKUUxFdEJRWFpDTEVWQlFUaENPMEZCUXpWQ0xGVkJRVWt2UWl4TlFVRk5MRWRCUVVjclFpeExRVUZMTEVOQlFVTlJMRlZCUVU0c1NVRkJiMElzUlVGQmFrTTdRVUZEUVhaRExFMUJRVUZCTEUxQlFVMHNRMEZCUTI1RExFbEJRVkFzUjBGQll5eFJRVUZrTzBGQlEwRXNZVUZCVDIxRExFMUJRVTBzUTBGQlEzQkRMRWRCUVdRN1FVRkRRVzFGTEUxQlFVRkJMRXRCUVVzc1EwRkJRMUVzVlVGQlRpeEhRVUZ0UW5aRExFMUJRVzVDTzBGQlEwUTdPMEZCUlVRc1lVRkJVekZETEU5QlFWUXNRMEZCYVVKT0xGZEJRV3BDTEVWQlFUaENPenM3TzBGQlNUVkNMRmRCUVV0dlJpeFZRVUZNTEVkQlFXdENMRU5CUVVNN1FVRkJSVW9zVVVGQlFVRXNUVUZCVFN4RlFVRkZPMEZCUVZZc1QwRkJSQ3hEUVVGc1FqdEJRVU5CYUVZc1RVRkJRVUVzVjBGQlZ5eERRVUZEWjBNc1QwRkJXaXhEUVVGdlFqWkRMRmxCUVhCQ0xFVkJRV3RETEVsQlFXeERPMEZCUTBFc1YwRkJTMWNzUzBGQlRDeERRVUZYTEVsQlFWZzdRVUZEUkRzN1FVRkZSRE5ITEVsQlFVRkJMRTlCUVU4c1EwRkJRelJITEVsQlFWSXNSMEZCWlN4VlFVRlRReXhOUVVGVUxFVkJRV2xDTzBGQlF6bENMRlZCUVVsRUxFbEJRVWtzUjBGQlJ5eEZRVUZZT3p0QlFVTkJMRmRCUVVzc1NVRkJTVVVzUjBGQlZDeEpRVUZuUWtRc1RVRkJhRUlzUlVGQmQwSTdRVUZEZEVKRUxGRkJRVUZCTEVsQlFVa3NRMEZCUTBvc1NVRkJUQ3hEUVVGVlRTeEhRVUZXTzBGQlEwUTdPMEZCUTBSR0xFMUJRVUZCTEVsQlFVa3NRMEZCUTBjc1QwRkJUQ3hIUVV3NFFqczdPMEZCVXpsQ0xHRkJRVThzVTBGQlUyaERMRWxCUVZRc1IwRkJaMEk3UVVGRGNrSXNaVUZCVHpaQ0xFbEJRVWtzUTBGQlEwa3NUVUZCV2l4RlFVRnZRanRCUVVOc1FpeGpRVUZKUml4SFFVRkhMRWRCUVVkR0xFbEJRVWtzUTBGQlEwc3NSMEZCVEN4RlFVRldPenRCUVVOQkxHTkJRVWxJTEVkQlFVY3NTVUZCU1VRc1RVRkJXQ3hGUVVGdFFqdEJRVU5xUWpsQ0xGbEJRVUZCTEVsQlFVa3NRMEZCUTFZc1MwRkJUQ3hIUVVGaGVVTXNSMEZCWWp0QlFVTkJMMElzV1VGQlFVRXNTVUZCU1N4RFFVRkRReXhKUVVGTUxFZEJRVmtzUzBGQldqdEJRVU5CTEcxQ1FVRlBSQ3hKUVVGUU8wRkJRMFE3UVVGRFJpeFRRVkp2UWpzN096czdRVUZoY2tKQkxGRkJRVUZCTEVsQlFVa3NRMEZCUTBNc1NVRkJUQ3hIUVVGWkxFbEJRVm83UVVGRFFTeGxRVUZQUkN4SlFVRlFPMEZCUTBRc1QwRm1SRHRCUVdkQ1JDeExRWHBDUkRzN1FVRXlRa0VzWVVGQlUycERMRTFCUVZRc1EwRkJaMEp2UlN4UlFVRm9RaXhGUVVFd1FqdEJRVU40UWl4VlFVRkpRU3hSUVVGS0xFVkJRV003UVVGRFdpeFpRVUZKUXl4alFVRmpMRWRCUVVkRUxGRkJRVkVzUTBGQlEzcEhMR05CUVVRc1EwRkJOMEk3TzBGQlEwRXNXVUZCU1RCSExHTkJRVW9zUlVGQmIwSTdRVUZEYkVJc2FVSkJRVTlCTEdOQlFXTXNRMEZCUTJ4R0xFbEJRV1lzUTBGQmIwSnBSaXhSUVVGd1FpeERRVUZRTzBGQlEwUTdPMEZCUlVRc1dVRkJTU3hQUVVGUFFTeFJRVUZSTEVOQlFVTnVReXhKUVVGb1FpeExRVUY1UWl4VlFVRTNRaXhGUVVGNVF6dEJRVU4yUXl4cFFrRkJUMjFETEZGQlFWQTdRVUZEUkRzN1FVRkZSQ3haUVVGSkxFTkJRVU5GTEV0QlFVc3NRMEZCUTBZc1VVRkJVU3hEUVVGRFJpeE5RVUZXTEVOQlFWWXNSVUZCTmtJN1FVRkRNMElzWTBGQlNVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJWRHRCUVVGQkxHTkJRVmwwUXl4SlFVRkpMRWRCUVVjc1UwRkJVMEVzU1VGQlZDeEhRVUZuUWp0QlFVTnFReXh0UWtGQlR5eEZRVUZGYzBNc1EwRkJSaXhIUVVGTlNDeFJRVUZSTEVOQlFVTkdMRTFCUVhSQ0xFVkJRVGhDTzBGQlF6VkNMR3RDUVVGSk5VY3NUVUZCVFN4RFFVRkROa0lzU1VGQlVDeERRVUZaYVVZc1VVRkJXaXhGUVVGelFrY3NRMEZCZEVJc1EwRkJTaXhGUVVFNFFqdEJRVU0xUW5SRExHZENRVUZCUVN4SlFVRkpMRU5CUVVOV0xFdEJRVXdzUjBGQllUWkRMRkZCUVZFc1EwRkJRMGNzUTBGQlJDeERRVUZ5UWp0QlFVTkJkRU1zWjBKQlFVRkJMRWxCUVVrc1EwRkJRME1zU1VGQlRDeEhRVUZaTEV0QlFWbzdRVUZEUVN4MVFrRkJUMFFzU1VGQlVEdEJRVU5FTzBGQlEwWTdPMEZCUlVSQkxGbEJRVUZCTEVsQlFVa3NRMEZCUTFZc1MwRkJUQ3hIUVVGaEwwUXNWMEZCWWp0QlFVTkJlVVVzV1VGQlFVRXNTVUZCU1N4RFFVRkRReXhKUVVGTUxFZEJRVmtzU1VGQldqdEJRVVZCTEcxQ1FVRlBSQ3hKUVVGUU8wRkJRMFFzVjBGaVJEczdRVUZsUVN4cFFrRkJUMEVzU1VGQlNTeERRVUZEUVN4SlFVRk1MRWRCUVZsQkxFbEJRVzVDTzBGQlEwUTdRVUZEUml4UFFUZENkVUk3T3p0QlFXZERlRUlzWVVGQlR6dEJRVUZGUVN4UlFVRkJRU3hKUVVGSkxFVkJRVVZKTzBGQlFWSXNUMEZCVUR0QlFVTkVPenRCUVVORWJrWXNTVUZCUVVFc1QwRkJUeXhEUVVGRE9FTXNUVUZCVWl4SFFVRnBRa0VzVFVGQmFrSTdPMEZCUlVFc1lVRkJVM0ZETEZWQlFWUXNSMEZCYzBJN1FVRkRjRUlzWVVGQlR6dEJRVUZGWkN4UlFVRkJRU3hMUVVGTExFVkJRVVV2UkN4WFFVRlVPMEZCUVc5Q01FVXNVVUZCUVVFc1NVRkJTU3hGUVVGRk8wRkJRVEZDTEU5QlFWQTdRVUZEUkRzN1FVRkZSSFpFTEVsQlFVRkJMRTlCUVU4c1EwRkJRM1JDTEZOQlFWSXNSMEZCYjBJN1FVRkRiRUkyUXl4TlFVRkJRU3hYUVVGWExFVkJRVVYyUWl4UFFVUkxPMEZCUjJ4Q2EwWXNUVUZCUVVFc1MwRkJTeXhGUVVGRkxGVkJRVk5YTEdGQlFWUXNSVUZCZDBJN1FVRkROMElzWVVGQlMwTXNTVUZCVEN4SFFVRlpMRU5CUVZvN1FVRkRRU3hoUVVGTGVFTXNTVUZCVEN4SFFVRlpMRU5CUVZvc1EwRkdOa0k3T3p0QlFVczNRaXhoUVVGTFVTeEpRVUZNTEVkQlFWa3NTMEZCUzBNc1MwRkJUQ3hIUVVGaGJFWXNWMEZCZWtJN1FVRkRRU3hoUVVGTE1FVXNTVUZCVEN4SFFVRlpMRXRCUVZvN1FVRkRRU3hoUVVGTFNTeFJRVUZNTEVkQlFXZENMRWxCUVdoQ08wRkJSVUVzWVVGQlMyaERMRTFCUVV3c1IwRkJZeXhOUVVGa08wRkJRMEVzWVVGQlMzSkNMRWRCUVV3c1IwRkJWM3BDTEZkQlFWZzdRVUZGUVN4aFFVRkxhVWNzVlVGQlRDeERRVUZuUW5CRUxFOUJRV2hDTEVOQlFYZENjMFFzWVVGQmVFSTdPMEZCUlVFc1dVRkJTU3hEUVVGRFlTeGhRVUZNTEVWQlFXOUNPMEZCUTJ4Q0xHVkJRVXNzU1VGQlNUbEVMRWxCUVZRc1NVRkJhVUlzU1VGQmFrSXNSVUZCZFVJN08wRkJSWEpDTEdkQ1FVRkpRU3hKUVVGSkxFTkJRVU5uUlN4TlFVRk1MRU5CUVZrc1EwRkJXaXhOUVVGdFFpeEhRVUZ1UWl4SlFVTkJjRWdzVFVGQlRTeERRVUZETmtJc1NVRkJVQ3hEUVVGWkxFbEJRVm9zUlVGQmEwSjFRaXhKUVVGc1FpeERRVVJCTEVsQlJVRXNRMEZCUXpSRUxFdEJRVXNzUTBGQlF5eERRVUZETlVRc1NVRkJTU3hEUVVGRGFVVXNTMEZCVEN4RFFVRlhMRU5CUVZnc1EwRkJSaXhEUVVaV0xFVkJSVFJDTzBGQlF6RkNMRzFDUVVGTGFrVXNTVUZCVEN4SlFVRmhiRVFzVjBGQllqdEJRVU5FTzBGQlEwWTdRVUZEUmp0QlFVTkdMRTlCTTBKcFFqdEJRVFpDYkVKdlNDeE5RVUZCUVN4SlFVRkpMRVZCUVVVc1dVRkJWenRCUVVObUxHRkJRVXN4UXl4SlFVRk1MRWRCUVZrc1NVRkJXanRCUVVWQkxGbEJRVWt5UXl4VFFVRlRMRWRCUVVjc1MwRkJTM0JDTEZWQlFVd3NRMEZCWjBJc1EwRkJhRUlzUTBGQmFFSTdRVUZEUVN4WlFVRkpjVUlzVlVGQlZTeEhRVUZIUkN4VFFVRlRMRU5CUVVOcVFpeFZRVUV6UWpzN1FVRkRRU3haUVVGSmEwSXNWVUZCVlN4RFFVRkROVVlzU1VGQldDeExRVUZ2UWl4UFFVRjRRaXhGUVVGcFF6dEJRVU12UWl4blFrRkJUVFJHTEZWQlFWVXNRMEZCUXpkR0xFZEJRV3BDTzBGQlEwUTdPMEZCUlVRc1pVRkJUeXhMUVVGTE9FWXNTVUZCV2p0QlFVTkVMRTlCZGtOcFFqdEJRWGxEYkVKd1F5eE5RVUZCUVN4cFFrRkJhVUlzUlVGQlJTeFZRVUZUY1VNc1UwRkJWQ3hGUVVGdlFqdEJRVU55UXl4WlFVRkpMRXRCUVVzNVF5eEpRVUZVTEVWQlFXVTdRVUZEWWl4blFrRkJUVGhETEZOQlFVNDdRVUZEUkRzN1FVRkZSQ3haUVVGSmRFY3NUMEZCVHl4SFFVRkhMRWxCUVdRN08wRkJRMEVzYVVKQlFWTjFSeXhOUVVGVUxFTkJRV2RDUXl4SFFVRm9RaXhGUVVGeFFrTXNUVUZCY2tJc1JVRkJOa0k3UVVGRE0wSTVSQ3hWUVVGQlFTeE5RVUZOTEVOQlFVTnVReXhKUVVGUUxFZEJRV01zVDBGQlpEdEJRVU5CYlVNc1ZVRkJRVUVzVFVGQlRTeERRVUZEY0VNc1IwRkJVQ3hIUVVGaEswWXNVMEZCWWp0QlFVTkJkRWNzVlVGQlFVRXNUMEZCVHl4RFFVRkRkVVFzU1VGQlVpeEhRVUZsYVVRc1IwRkJaanM3UVVGRlFTeGpRVUZKUXl4TlFVRktMRVZCUVZrN096dEJRVWRXZWtjc1dVRkJRVUVzVDBGQlR5eERRVUZETkVJc1RVRkJVaXhIUVVGcFFpeE5RVUZxUWp0QlFVTkJOVUlzV1VGQlFVRXNUMEZCVHl4RFFVRkRUeXhIUVVGU0xFZEJRV042UWl4WFFVRmtPMEZCUTBRN08wRkJSVVFzYVVKQlFVOHNRMEZCUXl4RFFVRkZNa2dzVFVGQlZqdEJRVU5FT3p0QlFVVkVMR0ZCUVVzc1NVRkJTVm9zUTBGQlF5eEhRVUZITEV0QlFVdGtMRlZCUVV3c1EwRkJaMEpUTEUxQlFXaENMRWRCUVhsQ0xFTkJRWFJETEVWQlFYbERTeXhEUVVGRExFbEJRVWtzUTBGQk9VTXNSVUZCYVVRc1JVRkJSVUVzUTBGQmJrUXNSVUZCYzBRN1FVRkRjRVFzWTBGQlNXNUNMRXRCUVVzc1IwRkJSeXhMUVVGTFN5eFZRVUZNTEVOQlFXZENZeXhEUVVGb1FpeERRVUZhTzBGQlEwRXNZMEZCU1d4RUxFMUJRVTBzUjBGQlJ5dENMRXRCUVVzc1EwRkJRMUVzVlVGQmJrSTdPMEZCUlVFc1kwRkJTVklzUzBGQlN5eERRVUZEUXl4TlFVRk9MRXRCUVdsQ0xFMUJRWEpDTEVWQlFUWkNPenM3TzBGQlNUTkNMRzFDUVVGUE5FSXNUVUZCVFN4RFFVRkRMRXRCUVVRc1EwRkJZanRCUVVORU96dEJRVVZFTEdOQlFVazNRaXhMUVVGTExFTkJRVU5ETEUxQlFVNHNTVUZCWjBJc1MwRkJTMjlDTEVsQlFYcENMRVZCUVN0Q08wRkJRemRDTEdkQ1FVRkpWeXhSUVVGUkxFZEJRVWM1U0N4TlFVRk5MRU5CUVVNMlFpeEpRVUZRTEVOQlFWbHBSU3hMUVVGYUxFVkJRVzFDTEZWQlFXNUNMRU5CUVdZN1FVRkRRU3huUWtGQlNXbERMRlZCUVZVc1IwRkJSeTlJTEUxQlFVMHNRMEZCUXpaQ0xFbEJRVkFzUTBGQldXbEZMRXRCUVZvc1JVRkJiVUlzV1VGQmJrSXNRMEZCYWtJN08wRkJSVUVzWjBKQlFVbG5ReXhSUVVGUkxFbEJRVWxETEZWQlFXaENMRVZCUVRSQ08wRkJRekZDTEd0Q1FVRkpMRXRCUVV0YUxFbEJRVXdzUjBGQldYSkNMRXRCUVVzc1EwRkJRMFVzVVVGQmRFSXNSVUZCWjBNN1FVRkRPVUlzZFVKQlFVOHlRaXhOUVVGTkxFTkJRVU0zUWl4TFFVRkxMRU5CUVVORkxGRkJRVkFzUlVGQmFVSXNTVUZCYWtJc1EwRkJZanRCUVVORUxHVkJSa1FzVFVGRlR5eEpRVUZKTEV0QlFVdHRRaXhKUVVGTUxFZEJRVmx5UWl4TFFVRkxMRU5CUVVOSExGVkJRWFJDTEVWQlFXdERPMEZCUTNaRExIVkNRVUZQTUVJc1RVRkJUU3hEUVVGRE4wSXNTMEZCU3l4RFFVRkRSeXhWUVVGUUxFTkJRV0k3UVVGRFJEdEJRVVZHTEdGQlVFUXNUVUZQVHl4SlFVRkpOa0lzVVVGQlNpeEZRVUZqTzBGQlEyNUNMR3RDUVVGSkxFdEJRVXRZTEVsQlFVd3NSMEZCV1hKQ0xFdEJRVXNzUTBGQlEwVXNVVUZCZEVJc1JVRkJaME03UVVGRE9VSXNkVUpCUVU4eVFpeE5RVUZOTEVOQlFVTTNRaXhMUVVGTExFTkJRVU5GTEZGQlFWQXNSVUZCYVVJc1NVRkJha0lzUTBGQllqdEJRVU5FTzBGQlJVWXNZVUZNVFN4TlFVdEJMRWxCUVVrclFpeFZRVUZLTEVWQlFXZENPMEZCUTNKQ0xHdENRVUZKTEV0QlFVdGFMRWxCUVV3c1IwRkJXWEpDTEV0QlFVc3NRMEZCUTBjc1ZVRkJkRUlzUlVGQmEwTTdRVUZEYUVNc2RVSkJRVTh3UWl4TlFVRk5MRU5CUVVNM1FpeExRVUZMTEVOQlFVTkhMRlZCUVZBc1EwRkJZanRCUVVORU8wRkJSVVlzWVVGTVRTeE5RVXRCTzBGQlEwd3NiMEpCUVUwc1NVRkJTVzVDTEV0QlFVb3NRMEZCVlN4M1EwRkJWaXhEUVVGT08wRkJRMFE3UVVGRFJqdEJRVU5HTzBGQlEwWXNUMEZ1UjJsQ08wRkJjVWRzUWxFc1RVRkJRVUVzVFVGQlRTeEZRVUZGTEZWQlFWTXhSQ3hKUVVGVUxFVkJRV1ZFTEVkQlFXWXNSVUZCYjBJN1FVRkRNVUlzWVVGQlN5eEpRVUZKYzBZc1EwRkJReXhIUVVGSExFdEJRVXRrTEZWQlFVd3NRMEZCWjBKVExFMUJRV2hDTEVkQlFYbENMRU5CUVhSRExFVkJRWGxEU3l4RFFVRkRMRWxCUVVrc1EwRkJPVU1zUlVGQmFVUXNSVUZCUlVFc1EwRkJia1FzUlVGQmMwUTdRVUZEY0VRc1kwRkJTVzVDTEV0QlFVc3NSMEZCUnl4TFFVRkxTeXhWUVVGTUxFTkJRV2RDWXl4RFFVRm9RaXhEUVVGYU96dEJRVU5CTEdOQlFVbHVRaXhMUVVGTExFTkJRVU5ETEUxQlFVNHNTVUZCWjBJc1MwRkJTMjlDTEVsQlFYSkNMRWxCUTBGdVNDeE5RVUZOTEVOQlFVTTJRaXhKUVVGUUxFTkJRVmxwUlN4TFFVRmFMRVZCUVcxQ0xGbEJRVzVDTEVOQlJFRXNTVUZGUVN4TFFVRkxjVUlzU1VGQlRDeEhRVUZaY2tJc1MwRkJTeXhEUVVGRFJ5eFZRVVowUWl4RlFVVnJRenRCUVVOb1F5eG5Ra0ZCU1N0Q0xGbEJRVmtzUjBGQlIyeERMRXRCUVc1Q08wRkJRMEU3UVVGRFJEdEJRVU5HT3p0QlFVVkVMRmxCUVVsclF5eFpRVUZaTEV0QlExaHdSeXhKUVVGSkxFdEJRVXNzVDBGQlZDeEpRVU5CUVN4SlFVRkpMRXRCUVVzc1ZVRkdSU3hEUVVGYUxFbEJSMEZ2Unl4WlFVRlpMRU5CUVVOcVF5eE5RVUZpTEVsQlFYVkNjRVVzUjBGSWRrSXNTVUZKUVVFc1IwRkJSeXhKUVVGSmNVY3NXVUZCV1N4RFFVRkRMMElzVlVGS2VFSXNSVUZKYjBNN096dEJRVWRzUXl0Q0xGVkJRVUZCTEZsQlFWa3NSMEZCUnl4SlFVRm1PMEZCUTBRN08wRkJSVVFzV1VGQlNXcEZMRTFCUVUwc1IwRkJSMmxGTEZsQlFWa3NSMEZCUjBFc1dVRkJXU3hEUVVGRE1VSXNWVUZCYUVJc1IwRkJOa0lzUlVGQmRFUTdRVUZEUVhaRExGRkJRVUZCTEUxQlFVMHNRMEZCUTI1RExFbEJRVkFzUjBGQlkwRXNTVUZCWkR0QlFVTkJiVU1zVVVGQlFVRXNUVUZCVFN4RFFVRkRjRU1zUjBGQlVDeEhRVUZoUVN4SFFVRmlPenRCUVVWQkxGbEJRVWx4Unl4WlFVRktMRVZCUVd0Q08wRkJRMmhDTEdWQlFVdG9SaXhOUVVGTUxFZEJRV01zVFVGQlpEdEJRVU5CTEdWQlFVc3lRaXhKUVVGTUxFZEJRVmx4UkN4WlFVRlpMRU5CUVVNdlFpeFZRVUY2UWp0QlFVTkJMR2xDUVVGUE9VUXNaMEpCUVZBN1FVRkRSRHM3UVVGRlJDeGxRVUZQTEV0QlFVczRSaXhSUVVGTUxFTkJRV05zUlN4TlFVRmtMRU5CUVZBN1FVRkRSQ3hQUVhKSmFVSTdRVUYxU1d4Q2EwVXNUVUZCUVVFc1VVRkJVU3hGUVVGRkxGVkJRVk5zUlN4TlFVRlVMRVZCUVdsQ2JVTXNVVUZCYWtJc1JVRkJNa0k3UVVGRGJrTXNXVUZCU1c1RExFMUJRVTBzUTBGQlEyNURMRWxCUVZBc1MwRkJaMElzVDBGQmNFSXNSVUZCTmtJN1FVRkRNMElzWjBKQlFVMXRReXhOUVVGTkxFTkJRVU53UXl4SFFVRmlPMEZCUTBRN08wRkJSVVFzV1VGQlNXOURMRTFCUVUwc1EwRkJRMjVETEVsQlFWQXNTMEZCWjBJc1QwRkJhRUlzU1VGRFFXMURMRTFCUVUwc1EwRkJRMjVETEVsQlFWQXNTMEZCWjBJc1ZVRkVjRUlzUlVGRFowTTdRVUZET1VJc1pVRkJTeXRETEVsQlFVd3NSMEZCV1Zvc1RVRkJUU3hEUVVGRGNFTXNSMEZCYmtJN1FVRkRSQ3hUUVVoRUxFMUJSMDhzU1VGQlNXOURMRTFCUVUwc1EwRkJRMjVETEVsQlFWQXNTMEZCWjBJc1VVRkJjRUlzUlVGQk9FSTdRVUZEYmtNc1pVRkJTelpHTEVsQlFVd3NSMEZCV1N4TFFVRkxPVVlzUjBGQlRDeEhRVUZYYjBNc1RVRkJUU3hEUVVGRGNFTXNSMEZCT1VJN1FVRkRRU3hsUVVGTGNVSXNUVUZCVEN4SFFVRmpMRkZCUVdRN1FVRkRRU3hsUVVGTE1rSXNTVUZCVEN4SFFVRlpMRXRCUVZvN1FVRkRSQ3hUUVVwTkxFMUJTVUVzU1VGQlNWb3NUVUZCVFN4RFFVRkRia01zU1VGQlVDeExRVUZuUWl4UlFVRm9RaXhKUVVFMFFuTkZMRkZCUVdoRExFVkJRVEJETzBGQlF5OURMR1ZCUVV0MlFpeEpRVUZNTEVkQlFWbDFRaXhSUVVGYU8wRkJRMFE3TzBGQlJVUXNaVUZCVHk5RUxHZENRVUZRTzBGQlEwUXNUMEY0U21sQ08wRkJNRXBzUWl0R0xFMUJRVUZCTEUxQlFVMHNSVUZCUlN4VlFVRlRha01zVlVGQlZDeEZRVUZ4UWp0QlFVTXpRaXhoUVVGTExFbEJRVWxuUWl4RFFVRkRMRWRCUVVjc1MwRkJTMlFzVlVGQlRDeERRVUZuUWxNc1RVRkJhRUlzUjBGQmVVSXNRMEZCZEVNc1JVRkJlVU5MTEVOQlFVTXNTVUZCU1N4RFFVRTVReXhGUVVGcFJDeEZRVUZGUVN4RFFVRnVSQ3hGUVVGelJEdEJRVU53UkN4alFVRkpia0lzUzBGQlN5eEhRVUZITEV0QlFVdExMRlZCUVV3c1EwRkJaMEpqTEVOQlFXaENMRU5CUVZvN08wRkJRMEVzWTBGQlNXNUNMRXRCUVVzc1EwRkJRMGNzVlVGQlRpeExRVUZ4UWtFc1ZVRkJla0lzUlVGQmNVTTdRVUZEYmtNc2FVSkJRVXRuUXl4UlFVRk1MRU5CUVdOdVF5eExRVUZMTEVOQlFVTlJMRlZCUVhCQ0xFVkJRV2REVWl4TFFVRkxMRU5CUVVOSkxGRkJRWFJETzBGQlEwRkhMRmxCUVVGQkxHRkJRV0VzUTBGQlExQXNTMEZCUkN4RFFVRmlPMEZCUTBFc2JVSkJRVTh6UkN4blFrRkJVRHRCUVVORU8wRkJRMFk3UVVGRFJpeFBRVzVMYVVJN1FVRnhTMnhDTEdWQlFWTXNWVUZCVXpSRUxFMUJRVlFzUlVGQmFVSTdRVUZEZUVJc1lVRkJTeXhKUVVGSmEwSXNRMEZCUXl4SFFVRkhMRXRCUVV0a0xGVkJRVXdzUTBGQlowSlRMRTFCUVdoQ0xFZEJRWGxDTEVOQlFYUkRMRVZCUVhsRFN5eERRVUZETEVsQlFVa3NRMEZCT1VNc1JVRkJhVVFzUlVGQlJVRXNRMEZCYmtRc1JVRkJjMFE3UVVGRGNFUXNZMEZCU1c1Q0xFdEJRVXNzUjBGQlJ5eExRVUZMU3l4VlFVRk1MRU5CUVdkQ1l5eERRVUZvUWl4RFFVRmFPenRCUVVOQkxHTkJRVWx1UWl4TFFVRkxMRU5CUVVORExFMUJRVTRzUzBGQmFVSkJMRTFCUVhKQ0xFVkJRVFpDTzBGQlF6TkNMR2RDUVVGSmFFTXNUVUZCVFN4SFFVRkhLMElzUzBGQlN5eERRVUZEVVN4VlFVRnVRanM3UVVGRFFTeG5Ra0ZCU1haRExFMUJRVTBzUTBGQlEyNURMRWxCUVZBc1MwRkJaMElzVDBGQmNFSXNSVUZCTmtJN1FVRkRNMElzYTBKQlFVbDFSeXhOUVVGTkxFZEJRVWR3UlN4TlFVRk5MRU5CUVVOd1F5eEhRVUZ3UWp0QlFVTkJNRVVzWTBGQlFVRXNZVUZCWVN4RFFVRkRVQ3hMUVVGRUxFTkJRV0k3UVVGRFJEczdRVUZEUkN4dFFrRkJUM0ZETEUxQlFWQTdRVUZEUkR0QlFVTkdMRk5CV0hWQ096czdPMEZCWlhoQ0xHTkJRVTBzU1VGQlNYSkVMRXRCUVVvc1EwRkJWU3gxUWtGQlZpeERRVUZPTzBGQlEwUXNUMEZ5VEdsQ08wRkJkVXhzUW5ORUxFMUJRVUZCTEdGQlFXRXNSVUZCUlN4VlFVRlRkRUlzVVVGQlZDeEZRVUZ0UW5KQ0xGVkJRVzVDTEVWQlFTdENReXhQUVVFdlFpeEZRVUYzUXp0QlFVTnlSQ3hoUVVGTFZpeFJRVUZNTEVkQlFXZENPMEZCUTJReFJTeFZRVUZCUVN4UlFVRlJMRVZCUVVWdlF5eE5RVUZOTEVOQlFVTnZSU3hSUVVGRUxFTkJSRVk3UVVGRlpISkNMRlZCUVVGQkxGVkJRVlVzUlVGQlJVRXNWVUZHUlR0QlFVZGtReXhWUVVGQlFTeFBRVUZQTEVWQlFVVkJPMEZCU0Vzc1UwRkJhRUk3TzBGQlRVRXNXVUZCU1N4TFFVRkxNVU1zVFVGQlRDeExRVUZuUWl4TlFVRndRaXhGUVVFMFFqczdPMEZCUnpGQ0xHVkJRVXR5UWl4SFFVRk1MRWRCUVZkNlFpeFhRVUZZTzBGQlEwUTdPMEZCUlVRc1pVRkJUMmxETEdkQ1FVRlFPMEZCUTBRN1FVRnlUV2xDTEV0QlFYQkNMRU5CT1dWblF6czdPenM3UVVFd2NrSm9ReXhYUVVGUGRrTXNUMEZCVUR0QlFVVkVMRWRCTlhKQ1l6czdPenRCUVdselFtSXNSMEZCTmtKNVNTeE5RVUZOTEVOQlFVTjZTU3hQUVVGd1F5eERRV3B6UW1Fc1EwRkJaanM3UVVGdmMwSkJMRTFCUVVrN1FVRkRSakJKTEVsQlFVRkJMR3RDUVVGclFpeEhRVUZITTBrc1QwRkJja0k3UVVGRFJDeEhRVVpFTEVOQlJVVXNUMEZCVHpSSkxHOUNRVUZRTEVWQlFUWkNPenM3T3pzN096czdPMEZCVlRkQ1F5eEpRVUZCUVN4UlFVRlJMRU5CUVVNc1IwRkJSQ3hGUVVGTkxIZENRVUZPTEVOQlFWSXNRMEZCZDBNM1NTeFBRVUY0UXpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPeUo5XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufSIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSIsImltcG9ydCBzdXBlclByb3BCYXNlIGZyb20gXCIuL3N1cGVyUHJvcEJhc2UuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgX2dldCA9IFJlZmxlY3QuZ2V0O1xuICB9IGVsc2Uge1xuICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IHN1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybjtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChyZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn0iLCJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRoSG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXlMaW1pdCBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn0iLCJpbXBvcnQgZ2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vZ2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn0iLCJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufSIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbGxgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsbFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG5tb2R1bGUuZXhwb3J0cyA9ICFTVFJJQ1RfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbn0gOiBbXS5mb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICByZXN1bHQgPSBuZXcgQygpO1xuICAgIGZvciAoOyEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWU7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJPdXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgSVNfRklMVEVSX09VVCA9IFRZUEUgPT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9PVVQgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlck91dFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyT3V0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlck91dDogY3JlYXRlTWV0aG9kKDcpXG59O1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgcmVkdWNlLCByZWR1Y2VSaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX1JJR0hUKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7XG4gICAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICAgIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gSVNfUklHSFQgPyBsZW5ndGggLSAxIDogMDtcbiAgICB2YXIgaSA9IElTX1JJR0hUID8gLTEgOiAxO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPCAyKSB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgICBpbmRleCArPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBpZiAoSVNfUklHSFQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0XG4gIHJpZ2h0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYXN0S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZmFzdEtleTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpbmRleDogY3JlYXRlKG51bGwpLFxuICAgICAgICBmaXJzdDogdW5kZWZpbmVkLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWQsXG4gICAgICAgIHNpemU6IDBcbiAgICAgIH0pO1xuICAgICAgaWYgKCFERVNDUklQVE9SUykgdGhhdC5zaXplID0gMDtcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmNsZWFyKClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5jbGVhclxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmNsZWFyXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uZXh0ID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gZW50cnkpIHN0YXRlLmxhc3QgPSBwcmV2O1xuICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tO1xuICAgICAgICAgIGVsc2UgdGhhdC5zaXplLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXR9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuZ2V0KGtleSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmdldFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gYFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuYWRkXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLnsga2V5cywgdmFsdWVzLCBlbnRyaWVzLCBAQGl0ZXJhdG9yIH0oKWAgbWV0aG9kc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgZGVmaW5lSXRlcmF0b3IoQywgQ09OU1RSVUNUT1JfTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSxcbiAgICAgICAgdGFyZ2V0OiBpdGVyYXRlZCxcbiAgICAgICAgc3RhdGU6IGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlKGl0ZXJhdGVkKSxcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gICAgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0O1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXN0YXRlLnRhcmdldCB8fCAhKHN0YXRlLmxhc3QgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLnN0YXRlLmZpcnN0KSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICByZXR1cm4geyB2YWx1ZTogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBkb25lOiBmYWxzZSB9O1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlW0BAc3BlY2llc11gIGFjY2Vzc29yc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LW1hcC1AQHNwZWNpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1zZXQtQEBzcGVjaWVzXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBDb25zdHJ1Y3RvciA9IE5hdGl2ZUNvbnN0cnVjdG9yO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciBuYXRpdmVNZXRob2QgPSBOYXRpdmVQcm90b3R5cGVbS0VZXTtcbiAgICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSxcbiAgICAgIEtFWSA9PSAnYWRkJyA/IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTtcbiAgICB9KSlcbiAgKTtcblxuICBpZiAoUkVQTEFDRSkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5SRVFVSVJFRCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCksIGR1bW15LCBDb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICB9KTtcbiAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE5hdGl2ZVByb3RvdHlwZTtcbiAgICAgIE5hdGl2ZVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgIH1cblxuICAgIGlmIChUSFJPV1NfT05fUFJJTUlUSVZFUyB8fCBCVUdHWV9aRVJPKSB7XG4gICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpO1xuICAgICAgZml4TWV0aG9kKCdoYXMnKTtcbiAgICAgIElTX01BUCAmJiBmaXhNZXRob2QoJ2dldCcpO1xuICAgIH1cblxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuXG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZiAoSVNfV0VBSyAmJiBOYXRpdmVQcm90b3R5cGUuY2xlYXIpIGRlbGV0ZSBOYXRpdmVQcm90b3R5cGUuY2xlYXI7XG4gIH1cblxuICBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yO1xuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTtcblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgdmFyIHJlZ2V4cCA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHZhciBTeW1ib2wgPSBwYXRoLlN5bWJvbCB8fCAocGF0aC5TeW1ib2wgPSB7fSk7XG4gIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwge1xuICAgIHZhbHVlOiB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoTkFNRSlcbiAgfSk7XG59O1xuIiwiLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gLyg/OmlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzb2YoZ2xvYmFsLnByb2Nlc3MpID09ICdwcm9jZXNzJztcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LXByZXZlbnRleHRlbnNpb25zIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG4iLCJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0KTtcbiAgICB9O1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChDLCBhcmdzTGVuZ3RoLCBhcmdzKSB7XG4gIGlmICghKGFyZ3NMZW5ndGggaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIGxpc3QgPSBbXSwgaSA9IDA7IGkgPCBhcmdzTGVuZ3RoOyBpKyspIGxpc3RbaV0gPSAnYVsnICsgaSArICddJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gd2UgaGF2ZSBubyBwcm9wZXIgYWx0ZXJuYXRpdmVzLCBJRTgtIG9ubHlcbiAgICBmYWN0b3JpZXNbYXJnc0xlbmd0aF0gPSBGdW5jdGlvbignQyxhJywgJ3JldHVybiBuZXcgQygnICsgbGlzdC5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbYXJnc0xlbmd0aF0oQywgYXJncyk7XG59O1xuXG4vLyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZEZ1bmN0aW9uID0gZnVuY3Rpb24gYm91bmQoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZEZ1bmN0aW9uID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmRGdW5jdGlvbjtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgdHlwZW9mIChOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIE5ld1RhcmdldCAhPT0gV3JhcHBlciAmJlxuICAgIGlzT2JqZWN0KE5ld1RhcmdldFByb3RvdHlwZSA9IE5ld1RhcmdldC5wcm90b3R5cGUpICYmXG4gICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZVxuICApIHNldFByb3RvdHlwZU9mKCR0aGlzLCBOZXdUYXJnZXRQcm90b3R5cGUpO1xuICByZXR1cm4gJHRoaXM7XG59O1xuIiwidmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIG1ldGEuUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgUkVRVUlSRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7XG4gIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7XG4gIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQsIDEgKyBBU19FTlRSSUVTICsgSU5URVJSVVBURUQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG4gICAgfVxuICAgIGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpO1xuICB9XG5cbiAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGNhbGxGbihzdGVwLnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvcikge1xuICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKS52YWx1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9IEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3JcbmlmICgoIUlTX1BVUkUgfHwgTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfV0VCT1NfV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgLy8gd29ya2Fyb3VuZCBvZiBXZWJLaXQgfiBpT1MgU2FmYXJpIDEwLjEgYnVnXG4gICAgcHJvbWlzZS5jb25zdHJ1Y3RvciA9IFByb21pc2U7XG4gICAgdGhlbiA9IHByb21pc2UudGhlbjtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJ2YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1JlZ0V4cChpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcIik7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUgKi9cbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0aWVzIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlICovXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJ1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiAkZ2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gLS0gc2FmZSAqL1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qtc2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkge1xuICAgIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpIHx8IG5vbltNRVRIT0RfTkFNRV0oKSAhPSBub24gfHwgd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdLm5hbWUgIT09IE1FVEhPRF9OQU1FO1xuICB9KTtcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJ0cmltLCAnJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBzcGVjIHJlcXVpcmVtZW50XG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChJU19OT0RFKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgIGxvY2F0aW9uICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKHBvc3QpXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5leHBvcnRzLmYgPSB3ZWxsS25vd25TeW1ib2w7XG4iLCIvLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDInICtcbiAgJ1xcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7XG52YXIgTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCc7XG5cbi8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyYXkgPSBbXTtcbiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7XG4gIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7XG59KTtcblxudmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5jb25jYXRcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBpc0NvbmNhdFNwcmVhZGFibGUgYW5kIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYXJnKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTtcbiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrLCBuKyspIGlmIChrIGluIEUpIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZXZlcnk7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnZXZlcnknKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmaWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZpbGwnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsbFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmaWxsOiBmaWxsXG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygnZmlsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mb3ItZWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFtdLmZvckVhY2ggIT0gZm9yRWFjaCB9LCB7XG4gIGZvckVhY2g6IGZvckVhY2hcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmNsdWRlcztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykubWFwO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdtYXAnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZScpLmxlZnQ7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgQ0hST01FX1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgncmVkdWNlJyk7XG4vLyBDaHJvbWUgODAtODIgaGFzIGEgY3JpdGljYWwgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDQ5OTgyXG52YXIgQ0hST01FX0JVRyA9ICFJU19OT0RFICYmIENIUk9NRV9WRVJTSU9OID4gNzkgJiYgQ0hST01FX1ZFUlNJT04gPCA4MztcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhU1RSSUNUX01FVEhPRCB8fCBDSFJPTUVfQlVHIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciBuYXRpdmVSZXZlcnNlID0gW10ucmV2ZXJzZTtcbnZhciB0ZXN0ID0gWzEsIDJdO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmV2ZXJzZVxuLy8gZml4IGZvciBTYWZhcmkgMTIuMCBidWdcbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODg3OTRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFN0cmluZyh0ZXN0KSA9PT0gU3RyaW5nKHRlc3QucmV2ZXJzZSgpKSB9LCB7XG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduIC0tIGRpcnR5IGhhY2tcbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gbmF0aXZlUmV2ZXJzZS5jYWxsKHRoaXMpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc2xpY2UnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBuYXRpdmVTbGljZSA9IFtdLnNsaWNlO1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNsaWNlXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgayA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuZ3RoKTtcbiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpO1xuICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZVxuICAgIHZhciBDb25zdHJ1Y3RvciwgcmVzdWx0LCBuO1xuICAgIGlmIChpc0FycmF5KE8pKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7XG4gICAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgICAgaWYgKHR5cGVvZiBDb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIChDb25zdHJ1Y3RvciA9PT0gQXJyYXkgfHwgaXNBcnJheShDb25zdHJ1Y3Rvci5wcm90b3R5cGUpKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JbU1BFQ0lFU107XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlLmNhbGwoTywgaywgZmluKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTtcbiAgICBmb3IgKG4gPSAwOyBrIDwgZmluOyBrKyssIG4rKykgaWYgKGsgaW4gTykgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBuLCBPW2tdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRzb21lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLnNvbWU7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnc29tZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QgfSwge1xuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvblN0cm9uZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyBgTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcblxudmFyIE5VTUJFUiA9ICdOdW1iZXInO1xudmFyIE5hdGl2ZU51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIE51bWJlclByb3RvdHlwZSA9IE5hdGl2ZU51bWJlci5wcm90b3R5cGU7XG5cbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DTEFTU09GID0gY2xhc3NvZihjcmVhdGUoTnVtYmVyUHJvdG90eXBlKSkgPT0gTlVNQkVSO1xuXG4vLyBgVG9OdW1iZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b251bWJlclxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIHZhciBmaXJzdCwgdGhpcmQsIHJhZGl4LCBtYXhDb2RlLCBkaWdpdHMsIGxlbmd0aCwgaW5kZXgsIGNvZGU7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gdHJpbShpdCk7XG4gICAgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KSB7XG4gICAgICB0aGlyZCA9IGl0LmNoYXJDb2RlQXQoMik7XG4gICAgICBpZiAodGhpcmQgPT09IDg4IHx8IHRoaXJkID09PSAxMjApIHJldHVybiBOYU47IC8vIE51bWJlcignKzB4MScpIHNob3VsZCBiZSBOYU4sIG9sZCBWOCBmaXhcbiAgICB9IGVsc2UgaWYgKGZpcnN0ID09PSA0OCkge1xuICAgICAgc3dpdGNoIChpdC5jaGFyQ29kZUF0KDEpKSB7XG4gICAgICAgIGNhc2UgNjY6IGNhc2UgOTg6IHJhZGl4ID0gMjsgbWF4Q29kZSA9IDQ5OyBicmVhazsgLy8gZmFzdCBlcXVhbCBvZiAvXjBiWzAxXSskL2lcbiAgICAgICAgY2FzZSA3OTogY2FzZSAxMTE6IHJhZGl4ID0gODsgbWF4Q29kZSA9IDU1OyBicmVhazsgLy8gZmFzdCBlcXVhbCBvZiAvXjBvWzAtN10rJC9pXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiAraXQ7XG4gICAgICB9XG4gICAgICBkaWdpdHMgPSBpdC5zbGljZSgyKTtcbiAgICAgIGxlbmd0aCA9IGRpZ2l0cy5sZW5ndGg7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgLy8gcGFyc2VJbnQgcGFyc2VzIGEgc3RyaW5nIHRvIGEgZmlyc3QgdW5hdmFpbGFibGUgc3ltYm9sXG4gICAgICAgIC8vIGJ1dCBUb051bWJlciBzaG91bGQgcmV0dXJuIE5hTiBpZiBhIHN0cmluZyBjb250YWlucyB1bmF2YWlsYWJsZSBzeW1ib2xzXG4gICAgICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpIHJldHVybiBOYU47XG4gICAgICB9IHJldHVybiBwYXJzZUludChkaWdpdHMsIHJhZGl4KTtcbiAgICB9XG4gIH0gcmV0dXJuICtpdDtcbn07XG5cbi8vIGBOdW1iZXJgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci1jb25zdHJ1Y3RvclxuaWYgKGlzRm9yY2VkKE5VTUJFUiwgIU5hdGl2ZU51bWJlcignIDBvMScpIHx8ICFOYXRpdmVOdW1iZXIoJzBiMScpIHx8IE5hdGl2ZU51bWJlcignKzB4MScpKSkge1xuICB2YXIgTnVtYmVyV3JhcHBlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSkge1xuICAgIHZhciBpdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IHZhbHVlO1xuICAgIHZhciBkdW1teSA9IHRoaXM7XG4gICAgcmV0dXJuIGR1bW15IGluc3RhbmNlb2YgTnVtYmVyV3JhcHBlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NMQVNTT0YgPyBmYWlscyhmdW5jdGlvbiAoKSB7IE51bWJlclByb3RvdHlwZS52YWx1ZU9mLmNhbGwoZHVtbXkpOyB9KSA6IGNsYXNzb2YoZHVtbXkpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlTnVtYmVyKHRvTnVtYmVyKGl0KSksIGR1bW15LCBOdW1iZXJXcmFwcGVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IERFU0NSSVBUT1JTID8gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVOdW1iZXIpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVMyMDE1IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVMyMDE1IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlciwnICtcbiAgICAvLyBFU05leHRcbiAgICAnZnJvbVN0cmluZyxyYW5nZSdcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoTmF0aXZlTnVtYmVyLCBrZXkgPSBrZXlzW2pdKSAmJiAhaGFzKE51bWJlcldyYXBwZXIsIGtleSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KE51bWJlcldyYXBwZXIsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5hdGl2ZU51bWJlciwga2V5KSk7XG4gICAgfVxuICB9XG4gIE51bWJlcldyYXBwZXIucHJvdG90eXBlID0gTnVtYmVyUHJvdG90eXBlO1xuICBOdW1iZXJQcm90b3R5cGUuY29uc3RydWN0b3IgPSBOdW1iZXJXcmFwcGVyO1xuICByZWRlZmluZShnbG9iYWwsIE5VTUJFUiwgTnVtYmVyV3JhcHBlcik7XG59XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKDEpOyB9KTtcbnZhciBGT1JDRUQgPSAhREVTQ1JJUFRPUlMgfHwgRkFJTFNfT05fUFJJTUlUSVZFUztcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSW5kZXhlZE9iamVjdChpdCksIGtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICAgIHZhciBrZXlzID0gb3duS2V5cyhPKTtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIga2V5LCBkZXNjcmlwdG9yO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGluZGV4KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSA9IGtleXNbaW5kZXgrK10pO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlS2V5cygxKTsgfSk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHtcbiAga2V5czogZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfQlJPV1NFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3NlcicpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2UgJiYgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGU7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3JQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBOQVRJVkVfUkVKRUNUSU9OX0VWRU5UID0gdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3RvcikgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjZmluYWxseSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZVsnZmluYWxseSddKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgaWYgKCFTVUJDTEFTU0lORykgcmV0dXJuIHRydWU7XG4gIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIElTX0JST1dTRVIgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQ7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gc3RhdGUucmVhY3Rpb25zO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBjaGFpbltpbmRleCsrXTtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgICAgICBzdGF0ZS5yZWplY3Rpb24gPSBIQU5ETEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdO1xuICAgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHN0YXRlKTtcbiAgfSk7XG59O1xuXG52YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHtcbiAgdmFyIGV2ZW50LCBoYW5kbGVyO1xuICBpZiAoRElTUEFUQ0hfRVZFTlQpIHtcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgfSk7XG59O1xuXG52YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgc3RhdGUsIHVud3JhcCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm4oc3RhdGUsIHZhbHVlLCB1bndyYXApO1xuICB9O1xufTtcblxudmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgc3RhdGUuc3RhdGUgPSBSRUpFQ1RFRDtcbiAgbm90aWZ5KHN0YXRlLCB0cnVlKTtcbn07XG5cbnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICB0cnkge1xuICAgIGlmIChzdGF0ZS5mYWNhZGUgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3Qoc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJyAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBuYXRpdmVUaGVuLmNhbGwodGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcblxuICAgICAgLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuICAgICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgUHJvbWlzZUNvbnN0cnVjdG9yUHJvdG90eXBlWydjYXRjaCddLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlQ29uc3RydWN0b3JQcm90b3R5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBnZXRCdWlsdEluKFBST01JU0UpO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgY2FwYWJpbGl0eS5yZWplY3QuY2FsbCh1bmRlZmluZWQsIHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VEIH0sIHtcbiAgLy8gYFByb21pc2UucmVzb2x2ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2VcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBuYXRpdmVBcHBseSA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnYXBwbHknKTtcbnZhciBmdW5jdGlvbkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG5cbi8vIE1TIEVkZ2UgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxudmFyIE9QVElPTkFMX0FSR1VNRU5UU19MSVNUID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmF0aXZlQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUmVmbGVjdC5hcHBseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZmxlY3QuYXBwbHlcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPUFRJT05BTF9BUkdVTUVOVFNfTElTVCB9LCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkge1xuICAgIGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiBuYXRpdmVBcHBseVxuICAgICAgPyBuYXRpdmVBcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbiAgICAgIDogZnVuY3Rpb25BcHBseS5jYWxsKHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgbmF0aXZlQ29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcblxuLy8gYFJlZmxlY3QuY29uc3RydWN0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVmbGVjdC5jb25zdHJ1Y3Rcbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxudmFyIE5FV19UQVJHRVRfQlVHID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKG5hdGl2ZUNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xudmFyIEZPUkNFRCA9IE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHO1xuXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiBGT1JDRUQgfSwge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gbmF0aXZlQ29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTtcbiAgICBpZiAoVGFyZ2V0ID09IG5ld1RhcmdldCkge1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IFRhcmdldCgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSkoKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvID0gbmV3VGFyZ2V0LnByb3RvdHlwZTtcbiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcblxuLy8gYFJlZmxlY3QuZGVsZXRlUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmRlbGV0ZXByb3BlcnR5XG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24gZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG4vLyBgUmVmbGVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0cHJvdG90eXBlb2ZcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIUNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiB9LCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICByZXR1cm4gb2JqZWN0R2V0UHJvdG90eXBlT2YoYW5PYmplY3QodGFyZ2V0KSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYygnaW5jbHVkZXMnKSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+U3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpXG4gICAgICAuaW5kZXhPZihub3RBUmVnRXhwKHNlYXJjaFN0cmluZyksIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdtYXRjaCcsIDEsIGZ1bmN0aW9uIChNQVRDSCwgbmF0aXZlTWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgICByZXR1cm4gbWF0Y2hlciAhPT0gdW5kZWZpbmVkID8gbWF0Y2hlci5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG5cbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG5cbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS1zdGFydHN3aXRoIC0tIHNhZmVcbnZhciAkc3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdzdGFydHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltJykgfSwge1xuICB0cmltOiBmdW5jdGlvbiB0cmltKCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzKTtcbiAgfVxufSk7XG4iLCIvLyBgU3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbmAgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cbid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcblxuaWYgKERFU0NSSVBUT1JTICYmIHR5cGVvZiBOYXRpdmVTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAoISgnZGVzY3JpcHRpb24nIGluIE5hdGl2ZVN5bWJvbC5wcm90b3R5cGUpIHx8XG4gIC8vIFNhZmFyaSAxMiBidWdcbiAgTmF0aXZlU3ltYm9sKCkuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZFxuKSkge1xuICB2YXIgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlID0ge307XG4gIC8vIHdyYXAgU3ltYm9sIGNvbnN0cnVjdG9yIGZvciBjb3JyZWN0IHdvcmsgd2l0aCB1bmRlZmluZWQgZGVzY3JpcHRpb25cbiAgdmFyIFN5bWJvbFdyYXBwZXIgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcyBpbnN0YW5jZW9mIFN5bWJvbFdyYXBwZXJcbiAgICAgID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbilcbiAgICAgIC8vIGluIEVkZ2UgMTMsIFN0cmluZyhTeW1ib2wodW5kZWZpbmVkKSkgPT09ICdTeW1ib2wodW5kZWZpbmVkKSdcbiAgICAgIDogZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/IE5hdGl2ZVN5bWJvbCgpIDogTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKTtcbiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmVbcmVzdWx0XSA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpO1xuICB2YXIgc3ltYm9sUHJvdG90eXBlID0gU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wucHJvdG90eXBlO1xuICBzeW1ib2xQcm90b3R5cGUuY29uc3RydWN0b3IgPSBTeW1ib2xXcmFwcGVyO1xuXG4gIHZhciBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7XG4gIHZhciByZWdleHAgPSAvXlN5bWJvbFxcKCguKilcXClbXildKyQvO1xuICBkZWZpbmVQcm9wZXJ0eShzeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSBpc09iamVjdCh0aGlzKSA/IHRoaXMudmFsdWVPZigpIDogdGhpcztcbiAgICAgIHZhciBzdHJpbmcgPSBzeW1ib2xUb1N0cmluZy5jYWxsKHN5bWJvbCk7XG4gICAgICBpZiAoaGFzKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTtcbiAgICAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7XG4gICAgfVxuICB9KTtcblxuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5pdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBuYXRpdmVPYmplY3RDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZvckVhY2g7XG5cbnZhciBISURERU4gPSBzaGFyZWRLZXkoJ2hpZGRlbicpO1xudmFyIFNZTUJPTCA9ICdTeW1ib2wnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNZTUJPTCk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJHN0cmluZ2lmeSA9IGdldEJ1aWx0SW4oJ0pTT04nLCAnc3RyaW5naWZ5Jyk7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZjtcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvdHlwZVN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXRvLXN0cmluZy1yZWdpc3RyeScpO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgVVNFX1NFVFRFUiA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBQKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IpIGRlbGV0ZSBPYmplY3RQcm90b3R5cGVbUF07XG4gIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciAmJiBPICE9PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGUsIFAsIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IpO1xuICB9XG59IDogbmF0aXZlRGVmaW5lUHJvcGVydHk7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZywgZGVzY3JpcHRpb24pIHtcbiAgdmFyIHN5bWJvbCA9IEFsbFN5bWJvbHNbdGFnXSA9IG5hdGl2ZU9iamVjdENyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzZXRJbnRlcm5hbFN0YXRlKHN5bWJvbCwge1xuICAgIHR5cGU6IFNZTUJPTCxcbiAgICB0YWc6IHRhZyxcbiAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cbiAgfSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHN5bWJvbC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICByZXR1cm4gc3ltYm9sO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChpdCkgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgaWYgKE8gPT09IE9iamVjdFByb3RvdHlwZSkgJGRlZmluZVByb3BlcnR5KE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFAsIEF0dHJpYnV0ZXMpO1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFBdHRyaWJ1dGVzLmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKE8sIEhJRERFTikpIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIEhJRERFTiwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHt9KSk7XG4gICAgICBPW0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMoTywgSElEREVOKSAmJiBPW0hJRERFTl1ba2V5XSkgT1tISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSBuYXRpdmVPYmplY3RDcmVhdGUoQXR0cmlidXRlcywgeyBlbnVtZXJhYmxlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2NyaXB0b3IoTywga2V5LCBBdHRyaWJ1dGVzKTtcbiAgfSByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywga2V5LCBBdHRyaWJ1dGVzKTtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIHByb3BlcnRpZXMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhwcm9wZXJ0aWVzKS5jb25jYXQoJGdldE93blByb3BlcnR5U3ltYm9scyhwcm9wZXJ0aWVzKSk7XG4gICRmb3JFYWNoKGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpICRkZWZpbmVQcm9wZXJ0eShPLCBrZXksIHByb3BlcnRpZXNba2V5XSk7XG4gIH0pO1xuICByZXR1cm4gTztcbn07XG5cbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IG5hdGl2ZU9iamVjdENyZWF0ZShPKSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShPKSwgUHJvcGVydGllcyk7XG59O1xuXG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgUCA9IHRvUHJpbWl0aXZlKFYsIHRydWUpO1xuICB2YXIgZW51bWVyYWJsZSA9IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGhpcywgUCk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVudW1lcmFibGUgfHwgIWhhcyh0aGlzLCBQKSB8fCAhaGFzKEFsbFN5bWJvbHMsIFApIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtQXSA/IGVudW1lcmFibGUgOiB0cnVlO1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICB2YXIgaXQgPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBkZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xuICBpZiAoZGVzY3JpcHRvciAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSB7XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZGVzY3JpcHRvcjtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoaGlkZGVuS2V5cywga2V5KSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhPKSB7XG4gIHZhciBJU19PQkpFQ1RfUFJPVE9UWVBFID0gTyA9PT0gT2JqZWN0UHJvdG90eXBlO1xuICB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKElTX09CSkVDVF9QUk9UT1RZUEUgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KE8pKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICAkZm9yRWFjaChuYW1lcywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSAmJiAoIUlTX09CSkVDVF9QUk9UT1RZUEUgfHwgaGFzKE9iamVjdFByb3RvdHlwZSwga2V5KSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGBTeW1ib2xgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvclxuaWYgKCFOQVRJVkVfU1lNQk9MKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgIHZhciBkZXNjcmlwdGlvbiA9ICFhcmd1bWVudHMubGVuZ3RoIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvdHlwZSkgc2V0dGVyLmNhbGwoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjcmlwdG9yKHRoaXMsIHRhZywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgVVNFX1NFVFRFUikgc2V0U3ltYm9sRGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogc2V0dGVyIH0pO1xuICAgIHJldHVybiB3cmFwKHRhZywgZGVzY3JpcHRpb24pO1xuICB9O1xuXG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykudGFnO1xuICB9KTtcblxuICByZWRlZmluZSgkU3ltYm9sLCAnd2l0aG91dFNldHRlcicsIGZ1bmN0aW9uIChkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiB3cmFwKHVpZChkZXNjcmlwdGlvbiksIGRlc2NyaXB0aW9uKTtcbiAgfSk7XG5cbiAgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3ZWxsS25vd25TeW1ib2wobmFtZSksIG5hbWUpO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLVN5bWJvbC1kZXNjcmlwdGlvblxuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KCRTeW1ib2xbUFJPVE9UWVBFXSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFJU19QVVJFKSB7XG4gICAgICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgU3ltYm9sOiAkU3ltYm9sXG59KTtcblxuJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkge1xuICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7XG59KTtcblxuJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYFN5bWJvbC5mb3JgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5mb3JcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhcyhTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKHN0cmluZyk7XG4gICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sO1xuICAgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZztcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9LFxuICAvLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmtleWZvclxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCcpO1xuICAgIGlmIChoYXMoU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSwgc3ltKSkgcmV0dXJuIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltXTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgVVNFX1NFVFRFUiA9IGZhbHNlOyB9XG59KTtcblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIC8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlzeW1ib2xzXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIENocm9tZSAzOCBhbmQgMzkgYE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNgIGZhaWxzIG9uIHByaW1pdGl2ZXNcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM0NDNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IGZhaWxzKGZ1bmN0aW9uICgpIHsgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYoMSk7IH0pIH0sIHtcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYodG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG5cbi8vIGBKU09OLnN0cmluZ2lmeWAgbWV0aG9kIGJlaGF2aW9yIHdpdGggc3ltYm9sc1xuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgdmFyIEZPUkNFRF9KU09OX1NUUklOR0lGWSA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpO1xuICAgIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gICAgcmV0dXJuICRzdHJpbmdpZnkoW3N5bWJvbF0pICE9ICdbbnVsbF0nXG4gICAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgICAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgICAgIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7XG4gIH0pO1xuXG4gICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfSlNPTl9TVFJJTkdJRlkgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIHZhciAkcmVwbGFjZXI7XG4gICAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KSBhcmdzLnB1c2goYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICAgIHJldHVybiAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlXG5pZiAoISRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xufVxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11gIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTtcblxuaGlkZGVuS2V5c1tISURERU5dID0gdHJ1ZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlICYmIENvbGxlY3Rpb25Qcm90b3R5cGUuZm9yRWFjaCAhPT0gZm9yRWFjaCkgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgJ2ZvckVhY2gnLCBmb3JFYWNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBDb2xsZWN0aW9uUHJvdG90eXBlLmZvckVhY2ggPSBmb3JFYWNoO1xuICB9XG59XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIERPTUl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb20taXRlcmFibGVzJyk7XG52YXIgQXJyYXlJdGVyYXRvck1ldGhvZHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JNZXRob2RzLnZhbHVlcztcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdO1xuICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzO1xuICAgIH1cbiAgICBpZiAoIUNvbGxlY3Rpb25Qcm90b3R5cGVbVE9fU1RSSU5HX1RBR10pIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIH1cbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi4yXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBnZXROYW5vU2Vjb25kcywgaHJ0aW1lLCBsb2FkVGltZSwgbW9kdWxlTG9hZFRpbWUsIG5vZGVMb2FkVGltZSwgdXBUaW1lO1xuXG4gIGlmICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIHBlcmZvcm1hbmNlICE9PSBudWxsKSAmJiBwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoZ2V0TmFub1NlY29uZHMoKSAtIG5vZGVMb2FkVGltZSkgLyAxZTY7XG4gICAgfTtcbiAgICBocnRpbWUgPSBwcm9jZXNzLmhydGltZTtcbiAgICBnZXROYW5vU2Vjb25kcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhyO1xuICAgICAgaHIgPSBocnRpbWUoKTtcbiAgICAgIHJldHVybiBoclswXSAqIDFlOSArIGhyWzFdO1xuICAgIH07XG4gICAgbW9kdWxlTG9hZFRpbWUgPSBnZXROYW5vU2Vjb25kcygpO1xuICAgIHVwVGltZSA9IHByb2Nlc3MudXB0aW1lKCkgKiAxZTk7XG4gICAgbm9kZUxvYWRUaW1lID0gbW9kdWxlTG9hZFRpbWUgLSB1cFRpbWU7XG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbn0pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZvcm1hbmNlLW5vdy5qcy5tYXBcbiIsInZhciBub3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZS1ub3cnKVxuICAsIHJvb3QgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xuICAsIHZlbmRvcnMgPSBbJ21veicsICd3ZWJraXQnXVxuICAsIHN1ZmZpeCA9ICdBbmltYXRpb25GcmFtZSdcbiAgLCByYWYgPSByb290WydyZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBjYWYgPSByb290WydjYW5jZWwnICsgc3VmZml4XSB8fCByb290WydjYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cblxuZm9yKHZhciBpID0gMDsgIXJhZiAmJiBpIDwgdmVuZG9ycy5sZW5ndGg7IGkrKykge1xuICByYWYgPSByb290W3ZlbmRvcnNbaV0gKyAnUmVxdWVzdCcgKyBzdWZmaXhdXG4gIGNhZiA9IHJvb3RbdmVuZG9yc1tpXSArICdDYW5jZWwnICsgc3VmZml4XVxuICAgICAgfHwgcm9vdFt2ZW5kb3JzW2ldICsgJ0NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxufVxuXG4vLyBTb21lIHZlcnNpb25zIG9mIEZGIGhhdmUgckFGIGJ1dCBub3QgY0FGXG5pZighcmFmIHx8ICFjYWYpIHtcbiAgdmFyIGxhc3QgPSAwXG4gICAgLCBpZCA9IDBcbiAgICAsIHF1ZXVlID0gW11cbiAgICAsIGZyYW1lRHVyYXRpb24gPSAxMDAwIC8gNjBcblxuICByYWYgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFyIF9ub3cgPSBub3coKVxuICAgICAgICAsIG5leHQgPSBNYXRoLm1heCgwLCBmcmFtZUR1cmF0aW9uIC0gKF9ub3cgLSBsYXN0KSlcbiAgICAgIGxhc3QgPSBuZXh0ICsgX25vd1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNwID0gcXVldWUuc2xpY2UoMClcbiAgICAgICAgLy8gQ2xlYXIgcXVldWUgaGVyZSB0byBwcmV2ZW50XG4gICAgICAgIC8vIGNhbGxiYWNrcyBmcm9tIGFwcGVuZGluZyBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgZnJhbWUncyBxdWV1ZVxuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwXG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmKCFjcFtpXS5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgY3BbaV0uY2FsbGJhY2sobGFzdClcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBNYXRoLnJvdW5kKG5leHQpKVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKHtcbiAgICAgIGhhbmRsZTogKytpZCxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIGNhbmNlbGxlZDogZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpZFxuICB9XG5cbiAgY2FmID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihxdWV1ZVtpXS5oYW5kbGUgPT09IGhhbmRsZSkge1xuICAgICAgICBxdWV1ZVtpXS5jYW5jZWxsZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4pIHtcbiAgLy8gV3JhcCBpbiBhIG5ldyBmdW5jdGlvbiB0byBwcmV2ZW50XG4gIC8vIGBjYW5jZWxgIHBvdGVudGlhbGx5IGJlaW5nIGFzc2lnbmVkXG4gIC8vIHRvIHRoZSBuYXRpdmUgckFGIGZ1bmN0aW9uXG4gIHJldHVybiByYWYuY2FsbChyb290LCBmbilcbn1cbm1vZHVsZS5leHBvcnRzLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICBjYWYuYXBwbHkocm9vdCwgYXJndW1lbnRzKVxufVxubW9kdWxlLmV4cG9ydHMucG9seWZpbGwgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICBvYmplY3QgPSByb290O1xuICB9XG4gIG9iamVjdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByYWZcbiAgb2JqZWN0LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2FmXG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiIsIi8qXG5cdEJhc2VkIG9uIHJnYmNvbG9yLmpzIGJ5IFN0b3lhbiBTdGVmYW5vdiA8c3N0b29AZ21haWwuY29tPlxuXHRodHRwOi8vd3d3LnBocGllZC5jb20vcmdiLWNvbG9yLXBhcnNlci1pbi1qYXZhc2NyaXB0L1xuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb2xvcl9zdHJpbmcpIHtcbiAgICB0aGlzLm9rID0gZmFsc2U7XG4gICAgdGhpcy5hbHBoYSA9IDEuMDtcblxuICAgIC8vIHN0cmlwIGFueSBsZWFkaW5nICNcbiAgICBpZiAoY29sb3Jfc3RyaW5nLmNoYXJBdCgwKSA9PSAnIycpIHsgLy8gcmVtb3ZlICMgaWYgYW55XG4gICAgICAgIGNvbG9yX3N0cmluZyA9IGNvbG9yX3N0cmluZy5zdWJzdHIoMSw2KTtcbiAgICB9XG5cbiAgICBjb2xvcl9zdHJpbmcgPSBjb2xvcl9zdHJpbmcucmVwbGFjZSgvIC9nLCcnKTtcbiAgICBjb2xvcl9zdHJpbmcgPSBjb2xvcl9zdHJpbmcudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIGJlZm9yZSBnZXR0aW5nIGludG8gcmVnZXhwcywgdHJ5IHNpbXBsZSBtYXRjaGVzXG4gICAgLy8gYW5kIG92ZXJ3cml0ZSB0aGUgaW5wdXRcbiAgICB2YXIgc2ltcGxlX2NvbG9ycyA9IHtcbiAgICAgICAgYWxpY2VibHVlOiAnZjBmOGZmJyxcbiAgICAgICAgYW50aXF1ZXdoaXRlOiAnZmFlYmQ3JyxcbiAgICAgICAgYXF1YTogJzAwZmZmZicsXG4gICAgICAgIGFxdWFtYXJpbmU6ICc3ZmZmZDQnLFxuICAgICAgICBhenVyZTogJ2YwZmZmZicsXG4gICAgICAgIGJlaWdlOiAnZjVmNWRjJyxcbiAgICAgICAgYmlzcXVlOiAnZmZlNGM0JyxcbiAgICAgICAgYmxhY2s6ICcwMDAwMDAnLFxuICAgICAgICBibGFuY2hlZGFsbW9uZDogJ2ZmZWJjZCcsXG4gICAgICAgIGJsdWU6ICcwMDAwZmYnLFxuICAgICAgICBibHVldmlvbGV0OiAnOGEyYmUyJyxcbiAgICAgICAgYnJvd246ICdhNTJhMmEnLFxuICAgICAgICBidXJseXdvb2Q6ICdkZWI4ODcnLFxuICAgICAgICBjYWRldGJsdWU6ICc1ZjllYTAnLFxuICAgICAgICBjaGFydHJldXNlOiAnN2ZmZjAwJyxcbiAgICAgICAgY2hvY29sYXRlOiAnZDI2OTFlJyxcbiAgICAgICAgY29yYWw6ICdmZjdmNTAnLFxuICAgICAgICBjb3JuZmxvd2VyYmx1ZTogJzY0OTVlZCcsXG4gICAgICAgIGNvcm5zaWxrOiAnZmZmOGRjJyxcbiAgICAgICAgY3JpbXNvbjogJ2RjMTQzYycsXG4gICAgICAgIGN5YW46ICcwMGZmZmYnLFxuICAgICAgICBkYXJrYmx1ZTogJzAwMDA4YicsXG4gICAgICAgIGRhcmtjeWFuOiAnMDA4YjhiJyxcbiAgICAgICAgZGFya2dvbGRlbnJvZDogJ2I4ODYwYicsXG4gICAgICAgIGRhcmtncmF5OiAnYTlhOWE5JyxcbiAgICAgICAgZGFya2dyZWVuOiAnMDA2NDAwJyxcbiAgICAgICAgZGFya2toYWtpOiAnYmRiNzZiJyxcbiAgICAgICAgZGFya21hZ2VudGE6ICc4YjAwOGInLFxuICAgICAgICBkYXJrb2xpdmVncmVlbjogJzU1NmIyZicsXG4gICAgICAgIGRhcmtvcmFuZ2U6ICdmZjhjMDAnLFxuICAgICAgICBkYXJrb3JjaGlkOiAnOTkzMmNjJyxcbiAgICAgICAgZGFya3JlZDogJzhiMDAwMCcsXG4gICAgICAgIGRhcmtzYWxtb246ICdlOTk2N2EnLFxuICAgICAgICBkYXJrc2VhZ3JlZW46ICc4ZmJjOGYnLFxuICAgICAgICBkYXJrc2xhdGVibHVlOiAnNDgzZDhiJyxcbiAgICAgICAgZGFya3NsYXRlZ3JheTogJzJmNGY0ZicsXG4gICAgICAgIGRhcmt0dXJxdW9pc2U6ICcwMGNlZDEnLFxuICAgICAgICBkYXJrdmlvbGV0OiAnOTQwMGQzJyxcbiAgICAgICAgZGVlcHBpbms6ICdmZjE0OTMnLFxuICAgICAgICBkZWVwc2t5Ymx1ZTogJzAwYmZmZicsXG4gICAgICAgIGRpbWdyYXk6ICc2OTY5NjknLFxuICAgICAgICBkb2RnZXJibHVlOiAnMWU5MGZmJyxcbiAgICAgICAgZmVsZHNwYXI6ICdkMTkyNzUnLFxuICAgICAgICBmaXJlYnJpY2s6ICdiMjIyMjInLFxuICAgICAgICBmbG9yYWx3aGl0ZTogJ2ZmZmFmMCcsXG4gICAgICAgIGZvcmVzdGdyZWVuOiAnMjI4YjIyJyxcbiAgICAgICAgZnVjaHNpYTogJ2ZmMDBmZicsXG4gICAgICAgIGdhaW5zYm9ybzogJ2RjZGNkYycsXG4gICAgICAgIGdob3N0d2hpdGU6ICdmOGY4ZmYnLFxuICAgICAgICBnb2xkOiAnZmZkNzAwJyxcbiAgICAgICAgZ29sZGVucm9kOiAnZGFhNTIwJyxcbiAgICAgICAgZ3JheTogJzgwODA4MCcsXG4gICAgICAgIGdyZWVuOiAnMDA4MDAwJyxcbiAgICAgICAgZ3JlZW55ZWxsb3c6ICdhZGZmMmYnLFxuICAgICAgICBob25leWRldzogJ2YwZmZmMCcsXG4gICAgICAgIGhvdHBpbms6ICdmZjY5YjQnLFxuICAgICAgICBpbmRpYW5yZWQgOiAnY2Q1YzVjJyxcbiAgICAgICAgaW5kaWdvIDogJzRiMDA4MicsXG4gICAgICAgIGl2b3J5OiAnZmZmZmYwJyxcbiAgICAgICAga2hha2k6ICdmMGU2OGMnLFxuICAgICAgICBsYXZlbmRlcjogJ2U2ZTZmYScsXG4gICAgICAgIGxhdmVuZGVyYmx1c2g6ICdmZmYwZjUnLFxuICAgICAgICBsYXduZ3JlZW46ICc3Y2ZjMDAnLFxuICAgICAgICBsZW1vbmNoaWZmb246ICdmZmZhY2QnLFxuICAgICAgICBsaWdodGJsdWU6ICdhZGQ4ZTYnLFxuICAgICAgICBsaWdodGNvcmFsOiAnZjA4MDgwJyxcbiAgICAgICAgbGlnaHRjeWFuOiAnZTBmZmZmJyxcbiAgICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6ICdmYWZhZDInLFxuICAgICAgICBsaWdodGdyZXk6ICdkM2QzZDMnLFxuICAgICAgICBsaWdodGdyZWVuOiAnOTBlZTkwJyxcbiAgICAgICAgbGlnaHRwaW5rOiAnZmZiNmMxJyxcbiAgICAgICAgbGlnaHRzYWxtb246ICdmZmEwN2EnLFxuICAgICAgICBsaWdodHNlYWdyZWVuOiAnMjBiMmFhJyxcbiAgICAgICAgbGlnaHRza3libHVlOiAnODdjZWZhJyxcbiAgICAgICAgbGlnaHRzbGF0ZWJsdWU6ICc4NDcwZmYnLFxuICAgICAgICBsaWdodHNsYXRlZ3JheTogJzc3ODg5OScsXG4gICAgICAgIGxpZ2h0c3RlZWxibHVlOiAnYjBjNGRlJyxcbiAgICAgICAgbGlnaHR5ZWxsb3c6ICdmZmZmZTAnLFxuICAgICAgICBsaW1lOiAnMDBmZjAwJyxcbiAgICAgICAgbGltZWdyZWVuOiAnMzJjZDMyJyxcbiAgICAgICAgbGluZW46ICdmYWYwZTYnLFxuICAgICAgICBtYWdlbnRhOiAnZmYwMGZmJyxcbiAgICAgICAgbWFyb29uOiAnODAwMDAwJyxcbiAgICAgICAgbWVkaXVtYXF1YW1hcmluZTogJzY2Y2RhYScsXG4gICAgICAgIG1lZGl1bWJsdWU6ICcwMDAwY2QnLFxuICAgICAgICBtZWRpdW1vcmNoaWQ6ICdiYTU1ZDMnLFxuICAgICAgICBtZWRpdW1wdXJwbGU6ICc5MzcwZDgnLFxuICAgICAgICBtZWRpdW1zZWFncmVlbjogJzNjYjM3MScsXG4gICAgICAgIG1lZGl1bXNsYXRlYmx1ZTogJzdiNjhlZScsXG4gICAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAnMDBmYTlhJyxcbiAgICAgICAgbWVkaXVtdHVycXVvaXNlOiAnNDhkMWNjJyxcbiAgICAgICAgbWVkaXVtdmlvbGV0cmVkOiAnYzcxNTg1JyxcbiAgICAgICAgbWlkbmlnaHRibHVlOiAnMTkxOTcwJyxcbiAgICAgICAgbWludGNyZWFtOiAnZjVmZmZhJyxcbiAgICAgICAgbWlzdHlyb3NlOiAnZmZlNGUxJyxcbiAgICAgICAgbW9jY2FzaW46ICdmZmU0YjUnLFxuICAgICAgICBuYXZham93aGl0ZTogJ2ZmZGVhZCcsXG4gICAgICAgIG5hdnk6ICcwMDAwODAnLFxuICAgICAgICBvbGRsYWNlOiAnZmRmNWU2JyxcbiAgICAgICAgb2xpdmU6ICc4MDgwMDAnLFxuICAgICAgICBvbGl2ZWRyYWI6ICc2YjhlMjMnLFxuICAgICAgICBvcmFuZ2U6ICdmZmE1MDAnLFxuICAgICAgICBvcmFuZ2VyZWQ6ICdmZjQ1MDAnLFxuICAgICAgICBvcmNoaWQ6ICdkYTcwZDYnLFxuICAgICAgICBwYWxlZ29sZGVucm9kOiAnZWVlOGFhJyxcbiAgICAgICAgcGFsZWdyZWVuOiAnOThmYjk4JyxcbiAgICAgICAgcGFsZXR1cnF1b2lzZTogJ2FmZWVlZScsXG4gICAgICAgIHBhbGV2aW9sZXRyZWQ6ICdkODcwOTMnLFxuICAgICAgICBwYXBheWF3aGlwOiAnZmZlZmQ1JyxcbiAgICAgICAgcGVhY2hwdWZmOiAnZmZkYWI5JyxcbiAgICAgICAgcGVydTogJ2NkODUzZicsXG4gICAgICAgIHBpbms6ICdmZmMwY2InLFxuICAgICAgICBwbHVtOiAnZGRhMGRkJyxcbiAgICAgICAgcG93ZGVyYmx1ZTogJ2IwZTBlNicsXG4gICAgICAgIHB1cnBsZTogJzgwMDA4MCcsXG4gICAgICAgIHJlYmVjY2FwdXJwbGU6ICc2NjMzOTknLFxuICAgICAgICByZWQ6ICdmZjAwMDAnLFxuICAgICAgICByb3N5YnJvd246ICdiYzhmOGYnLFxuICAgICAgICByb3lhbGJsdWU6ICc0MTY5ZTEnLFxuICAgICAgICBzYWRkbGVicm93bjogJzhiNDUxMycsXG4gICAgICAgIHNhbG1vbjogJ2ZhODA3MicsXG4gICAgICAgIHNhbmR5YnJvd246ICdmNGE0NjAnLFxuICAgICAgICBzZWFncmVlbjogJzJlOGI1NycsXG4gICAgICAgIHNlYXNoZWxsOiAnZmZmNWVlJyxcbiAgICAgICAgc2llbm5hOiAnYTA1MjJkJyxcbiAgICAgICAgc2lsdmVyOiAnYzBjMGMwJyxcbiAgICAgICAgc2t5Ymx1ZTogJzg3Y2VlYicsXG4gICAgICAgIHNsYXRlYmx1ZTogJzZhNWFjZCcsXG4gICAgICAgIHNsYXRlZ3JheTogJzcwODA5MCcsXG4gICAgICAgIHNub3c6ICdmZmZhZmEnLFxuICAgICAgICBzcHJpbmdncmVlbjogJzAwZmY3ZicsXG4gICAgICAgIHN0ZWVsYmx1ZTogJzQ2ODJiNCcsXG4gICAgICAgIHRhbjogJ2QyYjQ4YycsXG4gICAgICAgIHRlYWw6ICcwMDgwODAnLFxuICAgICAgICB0aGlzdGxlOiAnZDhiZmQ4JyxcbiAgICAgICAgdG9tYXRvOiAnZmY2MzQ3JyxcbiAgICAgICAgdHVycXVvaXNlOiAnNDBlMGQwJyxcbiAgICAgICAgdmlvbGV0OiAnZWU4MmVlJyxcbiAgICAgICAgdmlvbGV0cmVkOiAnZDAyMDkwJyxcbiAgICAgICAgd2hlYXQ6ICdmNWRlYjMnLFxuICAgICAgICB3aGl0ZTogJ2ZmZmZmZicsXG4gICAgICAgIHdoaXRlc21va2U6ICdmNWY1ZjUnLFxuICAgICAgICB5ZWxsb3c6ICdmZmZmMDAnLFxuICAgICAgICB5ZWxsb3dncmVlbjogJzlhY2QzMidcbiAgICB9O1xuICAgIGNvbG9yX3N0cmluZyA9IHNpbXBsZV9jb2xvcnNbY29sb3Jfc3RyaW5nXSB8fCBjb2xvcl9zdHJpbmc7XG4gICAgLy8gZW1kIG9mIHNpbXBsZSB0eXBlLWluIGNvbG9yc1xuXG4gICAgLy8gYXJyYXkgb2YgY29sb3IgZGVmaW5pdGlvbiBvYmplY3RzXG4gICAgdmFyIGNvbG9yX2RlZnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlOiAvXnJnYmFcXCgoXFxkezEsM30pLFxccyooXFxkezEsM30pLFxccyooXFxkezEsM30pLFxccyooKD86XFxkP1xcLik/XFxkKVxcKSQvLFxuICAgICAgICAgICAgZXhhbXBsZTogWydyZ2JhKDEyMywgMjM0LCA0NSwgMC44KScsICdyZ2JhKDI1NSwyMzQsMjQ1LDEuMCknXSxcbiAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChiaXRzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzFdKSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1syXSksXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbM10pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGJpdHNbNF0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcmU6IC9ecmdiXFwoKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KVxcKSQvLFxuICAgICAgICAgICAgZXhhbXBsZTogWydyZ2IoMTIzLCAyMzQsIDQ1KScsICdyZ2IoMjU1LDIzNCwyNDUpJ10sXG4gICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoYml0cyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1sxXSksXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbMl0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzNdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlOiAvXihbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvLFxuICAgICAgICAgICAgZXhhbXBsZTogWycjMDBmZjAwJywgJzMzNjY5OSddLFxuICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGJpdHMpe1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGJpdHNbMV0sIDE2KSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoYml0c1syXSwgMTYpLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzNdLCAxNilcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICByZTogL14oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLyxcbiAgICAgICAgICAgIGV4YW1wbGU6IFsnI2ZiMCcsICdmMGYnXSxcbiAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChiaXRzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzFdICsgYml0c1sxXSwgMTYpLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzJdICsgYml0c1syXSwgMTYpLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChiaXRzWzNdICsgYml0c1szXSwgMTYpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBzZWFyY2ggdGhyb3VnaCB0aGUgZGVmaW5pdGlvbnMgdG8gZmluZCBhIG1hdGNoXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvcl9kZWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByZSA9IGNvbG9yX2RlZnNbaV0ucmU7XG4gICAgICAgIHZhciBwcm9jZXNzb3IgPSBjb2xvcl9kZWZzW2ldLnByb2Nlc3M7XG4gICAgICAgIHZhciBiaXRzID0gcmUuZXhlYyhjb2xvcl9zdHJpbmcpO1xuICAgICAgICBpZiAoYml0cykge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxzID0gcHJvY2Vzc29yKGJpdHMpO1xuICAgICAgICAgICAgdGhpcy5yID0gY2hhbm5lbHNbMF07XG4gICAgICAgICAgICB0aGlzLmcgPSBjaGFubmVsc1sxXTtcbiAgICAgICAgICAgIHRoaXMuYiA9IGNoYW5uZWxzWzJdO1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFscGhhID0gY2hhbm5lbHNbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9rID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUvY2xlYW51cCB2YWx1ZXNcbiAgICB0aGlzLnIgPSAodGhpcy5yIDwgMCB8fCBpc05hTih0aGlzLnIpKSA/IDAgOiAoKHRoaXMuciA+IDI1NSkgPyAyNTUgOiB0aGlzLnIpO1xuICAgIHRoaXMuZyA9ICh0aGlzLmcgPCAwIHx8IGlzTmFOKHRoaXMuZykpID8gMCA6ICgodGhpcy5nID4gMjU1KSA/IDI1NSA6IHRoaXMuZyk7XG4gICAgdGhpcy5iID0gKHRoaXMuYiA8IDAgfHwgaXNOYU4odGhpcy5iKSkgPyAwIDogKCh0aGlzLmIgPiAyNTUpID8gMjU1IDogdGhpcy5iKTtcbiAgICB0aGlzLmFscGhhID0gKHRoaXMuYWxwaGEgPCAwKSA/IDAgOiAoKHRoaXMuYWxwaGEgPiAxLjAgfHwgaXNOYU4odGhpcy5hbHBoYSkpID8gMS4wIDogdGhpcy5hbHBoYSk7XG5cbiAgICAvLyBzb21lIGdldHRlcnNcbiAgICB0aGlzLnRvUkdCID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ3JnYignICsgdGhpcy5yICsgJywgJyArIHRoaXMuZyArICcsICcgKyB0aGlzLmIgKyAnKSc7XG4gICAgfVxuICAgIHRoaXMudG9SR0JBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ3JnYmEoJyArIHRoaXMuciArICcsICcgKyB0aGlzLmcgKyAnLCAnICsgdGhpcy5iICsgJywgJyArIHRoaXMuYWxwaGEgKyAnKSc7XG4gICAgfVxuICAgIHRoaXMudG9IZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5yLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIGcgPSB0aGlzLmcudG9TdHJpbmcoMTYpO1xuICAgICAgICB2YXIgYiA9IHRoaXMuYi50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyLmxlbmd0aCA9PSAxKSByID0gJzAnICsgcjtcbiAgICAgICAgaWYgKGcubGVuZ3RoID09IDEpIGcgPSAnMCcgKyBnO1xuICAgICAgICBpZiAoYi5sZW5ndGggPT0gMSkgYiA9ICcwJyArIGI7XG4gICAgICAgIHJldHVybiAnIycgKyByICsgZyArIGI7XG4gICAgfVxuXG4gICAgLy8gaGVscFxuICAgIHRoaXMuZ2V0SGVscFhNTCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgZXhhbXBsZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgLy8gYWRkIHJlZ2V4cHNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvcl9kZWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZXhhbXBsZSA9IGNvbG9yX2RlZnNbaV0uZXhhbXBsZTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZXhhbXBsZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzW2V4YW1wbGVzLmxlbmd0aF0gPSBleGFtcGxlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCB0eXBlLWluIGNvbG9yc1xuICAgICAgICBmb3IgKHZhciBzYyBpbiBzaW1wbGVfY29sb3JzKSB7XG4gICAgICAgICAgICBleGFtcGxlc1tleGFtcGxlcy5sZW5ndGhdID0gc2M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgeG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICAgICAgeG1sLnNldEF0dHJpYnV0ZSgnaWQnLCAncmdiY29sb3ItZXhhbXBsZXMnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGFtcGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdF9pdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdF9jb2xvciA9IG5ldyBSR0JDb2xvcihleGFtcGxlc1tpXSk7XG4gICAgICAgICAgICAgICAgdmFyIGV4YW1wbGVfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZXhhbXBsZV9kaXYuc3R5bGUuY3NzVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAnbWFyZ2luOiAzcHg7ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJ2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyAnXG4gICAgICAgICAgICAgICAgICAgICAgICArICdiYWNrZ3JvdW5kOicgKyBsaXN0X2NvbG9yLnRvSGV4KCkgKyAnOyAnXG4gICAgICAgICAgICAgICAgICAgICAgICArICdjb2xvcjonICsgbGlzdF9jb2xvci50b0hleCgpXG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIGV4YW1wbGVfZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd0ZXN0JykpO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0X2l0ZW1fdmFsdWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcbiAgICAgICAgICAgICAgICAgICAgJyAnICsgZXhhbXBsZXNbaV0gKyAnIC0+ICcgKyBsaXN0X2NvbG9yLnRvUkdCKCkgKyAnIC0+ICcgKyBsaXN0X2NvbG9yLnRvSGV4KClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbS5hcHBlbmRDaGlsZChleGFtcGxlX2Rpdik7XG4gICAgICAgICAgICAgICAgbGlzdF9pdGVtLmFwcGVuZENoaWxkKGxpc3RfaXRlbV92YWx1ZSk7XG4gICAgICAgICAgICAgICAgeG1sLmFwcGVuZENoaWxkKGxpc3RfaXRlbSk7XG5cbiAgICAgICAgICAgIH0gY2F0Y2goZSl7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4bWw7XG5cbiAgICB9XG5cbn1cbiIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgLS0gdXNlZCBmb3IgY2FsY3VsYXRpb25zICovXG5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLXF1ZXJ5LXNlbGVjdG9yIC0tIGFpbWluZyBhdFxuICBiYWNrd2FyZC1jb21wYXRpYmlsaXR5ICovXG5cbi8qKlxuKiBTdGFja0JsdXIgLSBhIGZhc3QgYWxtb3N0IEdhdXNzaWFuIEJsdXIgRm9yIENhbnZhc1xuKlxuKiBJbiBjYXNlIHlvdSBmaW5kIHRoaXMgY2xhc3MgdXNlZnVsIC0gZXNwZWNpYWxseSBpbiBjb21tZXJjaWFsIHByb2plY3RzIC1cbiogSSBhbSBub3QgdG90YWxseSB1bmhhcHB5IGZvciBhIHNtYWxsIGRvbmF0aW9uIHRvIG15IFBheVBhbCBhY2NvdW50XG4qIG1hcmlvQHF1YXNpbW9uZG8uZGVcbipcbiogT3Igc3VwcG9ydCBtZSBvbiBmbGF0dHI6XG4qIHtAbGluayBodHRwczovL2ZsYXR0ci5jb20vdGhpbmcvNzI3OTEvU3RhY2tCbHVyLWEtZmFzdC1hbG1vc3QtR2F1c3NpYW4tQmx1ci1FZmZlY3QtZm9yLUNhbnZhc0phdmFzY3JpcHR9LlxuKlxuKiBAbW9kdWxlIFN0YWNrQmx1clxuKiBAYXV0aG9yIE1hcmlvIEtsaW5nZW1hbm5cbiogQ29udGFjdDogbWFyaW9AcXVhc2ltb25kby5jb21cbiogV2Vic2l0ZToge0BsaW5rIGh0dHA6Ly93d3cucXVhc2ltb25kby5jb20vU3RhY2tCbHVyRm9yQ2FudmFzL1N0YWNrQmx1ckRlbW8uaHRtbH1cbiogVHdpdHRlcjogQHF1YXNpbW9uZG9cbipcbiogQGNvcHlyaWdodCAoYykgMjAxMCBNYXJpbyBLbGluZ2VtYW5uXG4qXG4qIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4qIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXG4qIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dFxuKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSxcbiogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4qIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nXG4qIGNvbmRpdGlvbnM6XG4qXG4qIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4qIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuKlxuKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVNcbiogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcbiogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksXG4qIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG4qIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiovXG52YXIgbXVsVGFibGUgPSBbNTEyLCA1MTIsIDQ1NiwgNTEyLCAzMjgsIDQ1NiwgMzM1LCA1MTIsIDQwNSwgMzI4LCAyNzEsIDQ1NiwgMzg4LCAzMzUsIDI5MiwgNTEyLCA0NTQsIDQwNSwgMzY0LCAzMjgsIDI5OCwgMjcxLCA0OTYsIDQ1NiwgNDIwLCAzODgsIDM2MCwgMzM1LCAzMTIsIDI5MiwgMjczLCA1MTIsIDQ4MiwgNDU0LCA0MjgsIDQwNSwgMzgzLCAzNjQsIDM0NSwgMzI4LCAzMTIsIDI5OCwgMjg0LCAyNzEsIDI1OSwgNDk2LCA0NzUsIDQ1NiwgNDM3LCA0MjAsIDQwNCwgMzg4LCAzNzQsIDM2MCwgMzQ3LCAzMzUsIDMyMywgMzEyLCAzMDIsIDI5MiwgMjgyLCAyNzMsIDI2NSwgNTEyLCA0OTcsIDQ4MiwgNDY4LCA0NTQsIDQ0MSwgNDI4LCA0MTcsIDQwNSwgMzk0LCAzODMsIDM3MywgMzY0LCAzNTQsIDM0NSwgMzM3LCAzMjgsIDMyMCwgMzEyLCAzMDUsIDI5OCwgMjkxLCAyODQsIDI3OCwgMjcxLCAyNjUsIDI1OSwgNTA3LCA0OTYsIDQ4NSwgNDc1LCA0NjUsIDQ1NiwgNDQ2LCA0MzcsIDQyOCwgNDIwLCA0MTIsIDQwNCwgMzk2LCAzODgsIDM4MSwgMzc0LCAzNjcsIDM2MCwgMzU0LCAzNDcsIDM0MSwgMzM1LCAzMjksIDMyMywgMzE4LCAzMTIsIDMwNywgMzAyLCAyOTcsIDI5MiwgMjg3LCAyODIsIDI3OCwgMjczLCAyNjksIDI2NSwgMjYxLCA1MTIsIDUwNSwgNDk3LCA0ODksIDQ4MiwgNDc1LCA0NjgsIDQ2MSwgNDU0LCA0NDcsIDQ0MSwgNDM1LCA0MjgsIDQyMiwgNDE3LCA0MTEsIDQwNSwgMzk5LCAzOTQsIDM4OSwgMzgzLCAzNzgsIDM3MywgMzY4LCAzNjQsIDM1OSwgMzU0LCAzNTAsIDM0NSwgMzQxLCAzMzcsIDMzMiwgMzI4LCAzMjQsIDMyMCwgMzE2LCAzMTIsIDMwOSwgMzA1LCAzMDEsIDI5OCwgMjk0LCAyOTEsIDI4NywgMjg0LCAyODEsIDI3OCwgMjc0LCAyNzEsIDI2OCwgMjY1LCAyNjIsIDI1OSwgMjU3LCA1MDcsIDUwMSwgNDk2LCA0OTEsIDQ4NSwgNDgwLCA0NzUsIDQ3MCwgNDY1LCA0NjAsIDQ1NiwgNDUxLCA0NDYsIDQ0MiwgNDM3LCA0MzMsIDQyOCwgNDI0LCA0MjAsIDQxNiwgNDEyLCA0MDgsIDQwNCwgNDAwLCAzOTYsIDM5MiwgMzg4LCAzODUsIDM4MSwgMzc3LCAzNzQsIDM3MCwgMzY3LCAzNjMsIDM2MCwgMzU3LCAzNTQsIDM1MCwgMzQ3LCAzNDQsIDM0MSwgMzM4LCAzMzUsIDMzMiwgMzI5LCAzMjYsIDMyMywgMzIwLCAzMTgsIDMxNSwgMzEyLCAzMTAsIDMwNywgMzA0LCAzMDIsIDI5OSwgMjk3LCAyOTQsIDI5MiwgMjg5LCAyODcsIDI4NSwgMjgyLCAyODAsIDI3OCwgMjc1LCAyNzMsIDI3MSwgMjY5LCAyNjcsIDI2NSwgMjYzLCAyNjEsIDI1OV07XG52YXIgc2hnVGFibGUgPSBbOSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0XTtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd8SFRNTEltYWdlRWxlbWVudH0gaW1nXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG4gKiBAcGFyYW0ge0Zsb2F0fSByYWRpdXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYmx1ckFscGhhQ2hhbm5lbFxuICogQHBhcmFtIHtib29sZWFufSB1c2VPZmZzZXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2tpcFN0eWxlc1xuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuXG5mdW5jdGlvbiBwcm9jZXNzSW1hZ2UoaW1nLCBjYW52YXMsIHJhZGl1cywgYmx1ckFscGhhQ2hhbm5lbCwgdXNlT2Zmc2V0LCBza2lwU3R5bGVzKSB7XG4gIGlmICh0eXBlb2YgaW1nID09PSAnc3RyaW5nJykge1xuICAgIGltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGltZyk7XG4gIH1cblxuICBpZiAoIWltZyB8fCAhKCduYXR1cmFsV2lkdGgnIGluIGltZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZGltZW5zaW9uVHlwZSA9IHVzZU9mZnNldCA/ICdvZmZzZXQnIDogJ25hdHVyYWwnO1xuICB2YXIgdyA9IGltZ1tkaW1lbnNpb25UeXBlICsgJ1dpZHRoJ107XG4gIHZhciBoID0gaW1nW2RpbWVuc2lvblR5cGUgKyAnSGVpZ2h0J107XG5cbiAgaWYgKHR5cGVvZiBjYW52YXMgPT09ICdzdHJpbmcnKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzKTtcbiAgfVxuXG4gIGlmICghY2FudmFzIHx8ICEoJ2dldENvbnRleHQnIGluIGNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNraXBTdHlsZXMpIHtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3ICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gIH1cblxuICBjYW52YXMud2lkdGggPSB3O1xuICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLm5hdHVyYWxXaWR0aCwgaW1nLm5hdHVyYWxIZWlnaHQsIDAsIDAsIHcsIGgpO1xuXG4gIGlmIChpc05hTihyYWRpdXMpIHx8IHJhZGl1cyA8IDEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYmx1ckFscGhhQ2hhbm5lbCkge1xuICAgIHByb2Nlc3NDYW52YXNSR0JBKGNhbnZhcywgMCwgMCwgdywgaCwgcmFkaXVzKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzQ2FudmFzUkdCKGNhbnZhcywgMCwgMCwgdywgaCwgcmFkaXVzKTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWVxuICogQHBhcmFtIHtJbnRlZ2VyfSB3aWR0aFxuICogQHBhcmFtIHtJbnRlZ2VyfSBoZWlnaHRcbiAqIEB0aHJvd3Mge0Vycm9yfFR5cGVFcnJvcn1cbiAqIEByZXR1cm5zIHtJbWFnZURhdGF9IFNlZSB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjaW1hZ2VkYXRhfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyhjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKHR5cGVvZiBjYW52YXMgPT09ICdzdHJpbmcnKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzKTtcbiAgfVxuXG4gIGlmICghY2FudmFzIHx8IF90eXBlb2YoY2FudmFzKSAhPT0gJ29iamVjdCcgfHwgISgnZ2V0Q29udGV4dCcgaW4gY2FudmFzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGluZyBjYW52YXMgd2l0aCBgZ2V0Q29udGV4dGAgbWV0aG9kICcgKyAnaW4gcHJvY2Vzc0NhbnZhc1JHQihBKSBjYWxscyEnKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEodG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBhY2Nlc3MgaW1hZ2UgZGF0YTogJyArIGUpO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BYXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFlcbiAqIEBwYXJhbSB7SW50ZWdlcn0gd2lkdGhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaGVpZ2h0XG4gKiBAcGFyYW0ge0Zsb2F0fSByYWRpdXNcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cblxuXG5mdW5jdGlvbiBwcm9jZXNzQ2FudmFzUkdCQShjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICBpZiAoaXNOYU4ocmFkaXVzKSB8fCByYWRpdXMgPCAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmFkaXVzIHw9IDA7XG4gIHZhciBpbWFnZURhdGEgPSBnZXRJbWFnZURhdGFGcm9tQ2FudmFzKGNhbnZhcywgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCk7XG4gIGltYWdlRGF0YSA9IHByb2Nlc3NJbWFnZURhdGFSR0JBKGltYWdlRGF0YSwgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKTtcbiAgY2FudmFzLmdldENvbnRleHQoJzJkJykucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdG9wWCwgdG9wWSk7XG59XG4vKipcbiAqIEBwYXJhbSB7SW1hZ2VEYXRhfSBpbWFnZURhdGFcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BZXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGhlaWdodFxuICogQHBhcmFtIHtGbG9hdH0gcmFkaXVzXG4gKiBAcmV0dXJucyB7SW1hZ2VEYXRhfVxuICovXG5cblxuZnVuY3Rpb24gcHJvY2Vzc0ltYWdlRGF0YVJHQkEoaW1hZ2VEYXRhLCB0b3BYLCB0b3BZLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIHBpeGVscyA9IGltYWdlRGF0YS5kYXRhO1xuICB2YXIgZGl2ID0gMiAqIHJhZGl1cyArIDE7IC8vIGNvbnN0IHc0ID0gd2lkdGggPDwgMjtcblxuICB2YXIgd2lkdGhNaW51czEgPSB3aWR0aCAtIDE7XG4gIHZhciBoZWlnaHRNaW51czEgPSBoZWlnaHQgLSAxO1xuICB2YXIgcmFkaXVzUGx1czEgPSByYWRpdXMgKyAxO1xuICB2YXIgc3VtRmFjdG9yID0gcmFkaXVzUGx1czEgKiAocmFkaXVzUGx1czEgKyAxKSAvIDI7XG4gIHZhciBzdGFja1N0YXJ0ID0gbmV3IEJsdXJTdGFjaygpO1xuICB2YXIgc3RhY2sgPSBzdGFja1N0YXJ0O1xuICB2YXIgc3RhY2tFbmQ7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBkaXY7IGkrKykge1xuICAgIHN0YWNrID0gc3RhY2submV4dCA9IG5ldyBCbHVyU3RhY2soKTtcblxuICAgIGlmIChpID09PSByYWRpdXNQbHVzMSkge1xuICAgICAgc3RhY2tFbmQgPSBzdGFjaztcbiAgICB9XG4gIH1cblxuICBzdGFjay5uZXh0ID0gc3RhY2tTdGFydDtcbiAgdmFyIHN0YWNrSW4gPSBudWxsLFxuICAgICAgc3RhY2tPdXQgPSBudWxsLFxuICAgICAgeXcgPSAwLFxuICAgICAgeWkgPSAwO1xuICB2YXIgbXVsU3VtID0gbXVsVGFibGVbcmFkaXVzXTtcbiAgdmFyIHNoZ1N1bSA9IHNoZ1RhYmxlW3JhZGl1c107XG5cbiAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIHN0YWNrID0gc3RhY2tTdGFydDtcbiAgICB2YXIgcHIgPSBwaXhlbHNbeWldLFxuICAgICAgICBwZyA9IHBpeGVsc1t5aSArIDFdLFxuICAgICAgICBwYiA9IHBpeGVsc1t5aSArIDJdLFxuICAgICAgICBwYSA9IHBpeGVsc1t5aSArIDNdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHJhZGl1c1BsdXMxOyBfaSsrKSB7XG4gICAgICBzdGFjay5yID0gcHI7XG4gICAgICBzdGFjay5nID0gcGc7XG4gICAgICBzdGFjay5iID0gcGI7XG4gICAgICBzdGFjay5hID0gcGE7XG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG4gICAgfVxuXG4gICAgdmFyIHJJblN1bSA9IDAsXG4gICAgICAgIGdJblN1bSA9IDAsXG4gICAgICAgIGJJblN1bSA9IDAsXG4gICAgICAgIGFJblN1bSA9IDAsXG4gICAgICAgIHJPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHByLFxuICAgICAgICBnT3V0U3VtID0gcmFkaXVzUGx1czEgKiBwZyxcbiAgICAgICAgYk91dFN1bSA9IHJhZGl1c1BsdXMxICogcGIsXG4gICAgICAgIGFPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHBhLFxuICAgICAgICByU3VtID0gc3VtRmFjdG9yICogcHIsXG4gICAgICAgIGdTdW0gPSBzdW1GYWN0b3IgKiBwZyxcbiAgICAgICAgYlN1bSA9IHN1bUZhY3RvciAqIHBiLFxuICAgICAgICBhU3VtID0gc3VtRmFjdG9yICogcGE7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAxOyBfaTIgPCByYWRpdXNQbHVzMTsgX2kyKyspIHtcbiAgICAgIHZhciBwID0geWkgKyAoKHdpZHRoTWludXMxIDwgX2kyID8gd2lkdGhNaW51czEgOiBfaTIpIDw8IDIpO1xuICAgICAgdmFyIHIgPSBwaXhlbHNbcF0sXG4gICAgICAgICAgZyA9IHBpeGVsc1twICsgMV0sXG4gICAgICAgICAgYiA9IHBpeGVsc1twICsgMl0sXG4gICAgICAgICAgYSA9IHBpeGVsc1twICsgM107XG4gICAgICB2YXIgcmJzID0gcmFkaXVzUGx1czEgLSBfaTI7XG4gICAgICByU3VtICs9IChzdGFjay5yID0gcikgKiByYnM7XG4gICAgICBnU3VtICs9IChzdGFjay5nID0gZykgKiByYnM7XG4gICAgICBiU3VtICs9IChzdGFjay5iID0gYikgKiByYnM7XG4gICAgICBhU3VtICs9IChzdGFjay5hID0gYSkgKiByYnM7XG4gICAgICBySW5TdW0gKz0gcjtcbiAgICAgIGdJblN1bSArPSBnO1xuICAgICAgYkluU3VtICs9IGI7XG4gICAgICBhSW5TdW0gKz0gYTtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICB2YXIgcGFJbml0aWFsID0gYVN1bSAqIG11bFN1bSA+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbeWkgKyAzXSA9IHBhSW5pdGlhbDtcblxuICAgICAgaWYgKHBhSW5pdGlhbCAhPT0gMCkge1xuICAgICAgICB2YXIgX2EyID0gMjU1IC8gcGFJbml0aWFsO1xuXG4gICAgICAgIHBpeGVsc1t5aV0gPSAoclN1bSAqIG11bFN1bSA+PiBzaGdTdW0pICogX2EyO1xuICAgICAgICBwaXhlbHNbeWkgKyAxXSA9IChnU3VtICogbXVsU3VtID4+IHNoZ1N1bSkgKiBfYTI7XG4gICAgICAgIHBpeGVsc1t5aSArIDJdID0gKGJTdW0gKiBtdWxTdW0gPj4gc2hnU3VtKSAqIF9hMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpeGVsc1t5aV0gPSBwaXhlbHNbeWkgKyAxXSA9IHBpeGVsc1t5aSArIDJdID0gMDtcbiAgICAgIH1cblxuICAgICAgclN1bSAtPSByT3V0U3VtO1xuICAgICAgZ1N1bSAtPSBnT3V0U3VtO1xuICAgICAgYlN1bSAtPSBiT3V0U3VtO1xuICAgICAgYVN1bSAtPSBhT3V0U3VtO1xuICAgICAgck91dFN1bSAtPSBzdGFja0luLnI7XG4gICAgICBnT3V0U3VtIC09IHN0YWNrSW4uZztcbiAgICAgIGJPdXRTdW0gLT0gc3RhY2tJbi5iO1xuICAgICAgYU91dFN1bSAtPSBzdGFja0luLmE7XG5cbiAgICAgIHZhciBfcCA9IHggKyByYWRpdXMgKyAxO1xuXG4gICAgICBfcCA9IHl3ICsgKF9wIDwgd2lkdGhNaW51czEgPyBfcCA6IHdpZHRoTWludXMxKSA8PCAyO1xuICAgICAgckluU3VtICs9IHN0YWNrSW4uciA9IHBpeGVsc1tfcF07XG4gICAgICBnSW5TdW0gKz0gc3RhY2tJbi5nID0gcGl4ZWxzW19wICsgMV07XG4gICAgICBiSW5TdW0gKz0gc3RhY2tJbi5iID0gcGl4ZWxzW19wICsgMl07XG4gICAgICBhSW5TdW0gKz0gc3RhY2tJbi5hID0gcGl4ZWxzW19wICsgM107XG4gICAgICByU3VtICs9IHJJblN1bTtcbiAgICAgIGdTdW0gKz0gZ0luU3VtO1xuICAgICAgYlN1bSArPSBiSW5TdW07XG4gICAgICBhU3VtICs9IGFJblN1bTtcbiAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XG4gICAgICB2YXIgX3N0YWNrT3V0ID0gc3RhY2tPdXQsXG4gICAgICAgICAgX3IgPSBfc3RhY2tPdXQucixcbiAgICAgICAgICBfZyA9IF9zdGFja091dC5nLFxuICAgICAgICAgIF9iID0gX3N0YWNrT3V0LmIsXG4gICAgICAgICAgX2EgPSBfc3RhY2tPdXQuYTtcbiAgICAgIHJPdXRTdW0gKz0gX3I7XG4gICAgICBnT3V0U3VtICs9IF9nO1xuICAgICAgYk91dFN1bSArPSBfYjtcbiAgICAgIGFPdXRTdW0gKz0gX2E7XG4gICAgICBySW5TdW0gLT0gX3I7XG4gICAgICBnSW5TdW0gLT0gX2c7XG4gICAgICBiSW5TdW0gLT0gX2I7XG4gICAgICBhSW5TdW0gLT0gX2E7XG4gICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG4gICAgICB5aSArPSA0O1xuICAgIH1cblxuICAgIHl3ICs9IHdpZHRoO1xuICB9XG5cbiAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IHdpZHRoOyBfeCsrKSB7XG4gICAgeWkgPSBfeCA8PCAyO1xuXG4gICAgdmFyIF9wciA9IHBpeGVsc1t5aV0sXG4gICAgICAgIF9wZyA9IHBpeGVsc1t5aSArIDFdLFxuICAgICAgICBfcGIgPSBwaXhlbHNbeWkgKyAyXSxcbiAgICAgICAgX3BhID0gcGl4ZWxzW3lpICsgM10sXG4gICAgICAgIF9yT3V0U3VtID0gcmFkaXVzUGx1czEgKiBfcHIsXG4gICAgICAgIF9nT3V0U3VtID0gcmFkaXVzUGx1czEgKiBfcGcsXG4gICAgICAgIF9iT3V0U3VtID0gcmFkaXVzUGx1czEgKiBfcGIsXG4gICAgICAgIF9hT3V0U3VtID0gcmFkaXVzUGx1czEgKiBfcGEsXG4gICAgICAgIF9yU3VtID0gc3VtRmFjdG9yICogX3ByLFxuICAgICAgICBfZ1N1bSA9IHN1bUZhY3RvciAqIF9wZyxcbiAgICAgICAgX2JTdW0gPSBzdW1GYWN0b3IgKiBfcGIsXG4gICAgICAgIF9hU3VtID0gc3VtRmFjdG9yICogX3BhO1xuXG4gICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG4gICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgcmFkaXVzUGx1czE7IF9pMysrKSB7XG4gICAgICBzdGFjay5yID0gX3ByO1xuICAgICAgc3RhY2suZyA9IF9wZztcbiAgICAgIHN0YWNrLmIgPSBfcGI7XG4gICAgICBzdGFjay5hID0gX3BhO1xuICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgIH1cblxuICAgIHZhciB5cCA9IHdpZHRoO1xuICAgIHZhciBfZ0luU3VtID0gMCxcbiAgICAgICAgX2JJblN1bSA9IDAsXG4gICAgICAgIF9hSW5TdW0gPSAwLFxuICAgICAgICBfckluU3VtID0gMDtcblxuICAgIGZvciAodmFyIF9pNCA9IDE7IF9pNCA8PSByYWRpdXM7IF9pNCsrKSB7XG4gICAgICB5aSA9IHlwICsgX3ggPDwgMjtcblxuICAgICAgdmFyIF9yYnMgPSByYWRpdXNQbHVzMSAtIF9pNDtcblxuICAgICAgX3JTdW0gKz0gKHN0YWNrLnIgPSBfcHIgPSBwaXhlbHNbeWldKSAqIF9yYnM7XG4gICAgICBfZ1N1bSArPSAoc3RhY2suZyA9IF9wZyA9IHBpeGVsc1t5aSArIDFdKSAqIF9yYnM7XG4gICAgICBfYlN1bSArPSAoc3RhY2suYiA9IF9wYiA9IHBpeGVsc1t5aSArIDJdKSAqIF9yYnM7XG4gICAgICBfYVN1bSArPSAoc3RhY2suYSA9IF9wYSA9IHBpeGVsc1t5aSArIDNdKSAqIF9yYnM7XG4gICAgICBfckluU3VtICs9IF9wcjtcbiAgICAgIF9nSW5TdW0gKz0gX3BnO1xuICAgICAgX2JJblN1bSArPSBfcGI7XG4gICAgICBfYUluU3VtICs9IF9wYTtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcblxuICAgICAgaWYgKF9pNCA8IGhlaWdodE1pbnVzMSkge1xuICAgICAgICB5cCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB5aSA9IF94O1xuICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xuICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG5cbiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgaGVpZ2h0OyBfeSsrKSB7XG4gICAgICB2YXIgX3AyID0geWkgPDwgMjtcblxuICAgICAgcGl4ZWxzW19wMiArIDNdID0gX3BhID0gX2FTdW0gKiBtdWxTdW0gPj4gc2hnU3VtO1xuXG4gICAgICBpZiAoX3BhID4gMCkge1xuICAgICAgICBfcGEgPSAyNTUgLyBfcGE7XG4gICAgICAgIHBpeGVsc1tfcDJdID0gKF9yU3VtICogbXVsU3VtID4+IHNoZ1N1bSkgKiBfcGE7XG4gICAgICAgIHBpeGVsc1tfcDIgKyAxXSA9IChfZ1N1bSAqIG11bFN1bSA+PiBzaGdTdW0pICogX3BhO1xuICAgICAgICBwaXhlbHNbX3AyICsgMl0gPSAoX2JTdW0gKiBtdWxTdW0gPj4gc2hnU3VtKSAqIF9wYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpeGVsc1tfcDJdID0gcGl4ZWxzW19wMiArIDFdID0gcGl4ZWxzW19wMiArIDJdID0gMDtcbiAgICAgIH1cblxuICAgICAgX3JTdW0gLT0gX3JPdXRTdW07XG4gICAgICBfZ1N1bSAtPSBfZ091dFN1bTtcbiAgICAgIF9iU3VtIC09IF9iT3V0U3VtO1xuICAgICAgX2FTdW0gLT0gX2FPdXRTdW07XG4gICAgICBfck91dFN1bSAtPSBzdGFja0luLnI7XG4gICAgICBfZ091dFN1bSAtPSBzdGFja0luLmc7XG4gICAgICBfYk91dFN1bSAtPSBzdGFja0luLmI7XG4gICAgICBfYU91dFN1bSAtPSBzdGFja0luLmE7XG4gICAgICBfcDIgPSBfeCArICgoX3AyID0gX3kgKyByYWRpdXNQbHVzMSkgPCBoZWlnaHRNaW51czEgPyBfcDIgOiBoZWlnaHRNaW51czEpICogd2lkdGggPDwgMjtcbiAgICAgIF9yU3VtICs9IF9ySW5TdW0gKz0gc3RhY2tJbi5yID0gcGl4ZWxzW19wMl07XG4gICAgICBfZ1N1bSArPSBfZ0luU3VtICs9IHN0YWNrSW4uZyA9IHBpeGVsc1tfcDIgKyAxXTtcbiAgICAgIF9iU3VtICs9IF9iSW5TdW0gKz0gc3RhY2tJbi5iID0gcGl4ZWxzW19wMiArIDJdO1xuICAgICAgX2FTdW0gKz0gX2FJblN1bSArPSBzdGFja0luLmEgPSBwaXhlbHNbX3AyICsgM107XG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuICAgICAgX3JPdXRTdW0gKz0gX3ByID0gc3RhY2tPdXQucjtcbiAgICAgIF9nT3V0U3VtICs9IF9wZyA9IHN0YWNrT3V0Lmc7XG4gICAgICBfYk91dFN1bSArPSBfcGIgPSBzdGFja091dC5iO1xuICAgICAgX2FPdXRTdW0gKz0gX3BhID0gc3RhY2tPdXQuYTtcbiAgICAgIF9ySW5TdW0gLT0gX3ByO1xuICAgICAgX2dJblN1bSAtPSBfcGc7XG4gICAgICBfYkluU3VtIC09IF9wYjtcbiAgICAgIF9hSW5TdW0gLT0gX3BhO1xuICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xuICAgICAgeWkgKz0gd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGltYWdlRGF0YTtcbn1cbi8qKlxuICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRvcFhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWVxuICogQHBhcmFtIHtJbnRlZ2VyfSB3aWR0aFxuICogQHBhcmFtIHtJbnRlZ2VyfSBoZWlnaHRcbiAqIEBwYXJhbSB7RmxvYXR9IHJhZGl1c1xuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuXG5cbmZ1bmN0aW9uIHByb2Nlc3NDYW52YXNSR0IoY2FudmFzLCB0b3BYLCB0b3BZLCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgaWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDwgMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJhZGl1cyB8PSAwO1xuICB2YXIgaW1hZ2VEYXRhID0gZ2V0SW1hZ2VEYXRhRnJvbUNhbnZhcyhjYW52YXMsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQpO1xuICBpbWFnZURhdGEgPSBwcm9jZXNzSW1hZ2VEYXRhUkdCKGltYWdlRGF0YSwgdG9wWCwgdG9wWSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKTtcbiAgY2FudmFzLmdldENvbnRleHQoJzJkJykucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdG9wWCwgdG9wWSk7XG59XG4vKipcbiAqIEBwYXJhbSB7SW1hZ2VEYXRhfSBpbWFnZURhdGFcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdG9wWFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0b3BZXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGhlaWdodFxuICogQHBhcmFtIHtGbG9hdH0gcmFkaXVzXG4gKiBAcmV0dXJucyB7SW1hZ2VEYXRhfVxuICovXG5cblxuZnVuY3Rpb24gcHJvY2Vzc0ltYWdlRGF0YVJHQihpbWFnZURhdGEsIHRvcFgsIHRvcFksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICB2YXIgcGl4ZWxzID0gaW1hZ2VEYXRhLmRhdGE7XG4gIHZhciBkaXYgPSAyICogcmFkaXVzICsgMTsgLy8gY29uc3QgdzQgPSB3aWR0aCA8PCAyO1xuXG4gIHZhciB3aWR0aE1pbnVzMSA9IHdpZHRoIC0gMTtcbiAgdmFyIGhlaWdodE1pbnVzMSA9IGhlaWdodCAtIDE7XG4gIHZhciByYWRpdXNQbHVzMSA9IHJhZGl1cyArIDE7XG4gIHZhciBzdW1GYWN0b3IgPSByYWRpdXNQbHVzMSAqIChyYWRpdXNQbHVzMSArIDEpIC8gMjtcbiAgdmFyIHN0YWNrU3RhcnQgPSBuZXcgQmx1clN0YWNrKCk7XG4gIHZhciBzdGFjayA9IHN0YWNrU3RhcnQ7XG4gIHZhciBzdGFja0VuZDtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IGRpdjsgaSsrKSB7XG4gICAgc3RhY2sgPSBzdGFjay5uZXh0ID0gbmV3IEJsdXJTdGFjaygpO1xuXG4gICAgaWYgKGkgPT09IHJhZGl1c1BsdXMxKSB7XG4gICAgICBzdGFja0VuZCA9IHN0YWNrO1xuICAgIH1cbiAgfVxuXG4gIHN0YWNrLm5leHQgPSBzdGFja1N0YXJ0O1xuICB2YXIgc3RhY2tJbiA9IG51bGw7XG4gIHZhciBzdGFja091dCA9IG51bGw7XG4gIHZhciBtdWxTdW0gPSBtdWxUYWJsZVtyYWRpdXNdO1xuICB2YXIgc2hnU3VtID0gc2hnVGFibGVbcmFkaXVzXTtcbiAgdmFyIHAsIHJicztcbiAgdmFyIHl3ID0gMCxcbiAgICAgIHlpID0gMDtcblxuICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgdmFyIHByID0gcGl4ZWxzW3lpXSxcbiAgICAgICAgcGcgPSBwaXhlbHNbeWkgKyAxXSxcbiAgICAgICAgcGIgPSBwaXhlbHNbeWkgKyAyXSxcbiAgICAgICAgck91dFN1bSA9IHJhZGl1c1BsdXMxICogcHIsXG4gICAgICAgIGdPdXRTdW0gPSByYWRpdXNQbHVzMSAqIHBnLFxuICAgICAgICBiT3V0U3VtID0gcmFkaXVzUGx1czEgKiBwYixcbiAgICAgICAgclN1bSA9IHN1bUZhY3RvciAqIHByLFxuICAgICAgICBnU3VtID0gc3VtRmFjdG9yICogcGcsXG4gICAgICAgIGJTdW0gPSBzdW1GYWN0b3IgKiBwYjtcbiAgICBzdGFjayA9IHN0YWNrU3RhcnQ7XG5cbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCByYWRpdXNQbHVzMTsgX2k1KyspIHtcbiAgICAgIHN0YWNrLnIgPSBwcjtcbiAgICAgIHN0YWNrLmcgPSBwZztcbiAgICAgIHN0YWNrLmIgPSBwYjtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICB2YXIgckluU3VtID0gMCxcbiAgICAgICAgZ0luU3VtID0gMCxcbiAgICAgICAgYkluU3VtID0gMDtcblxuICAgIGZvciAodmFyIF9pNiA9IDE7IF9pNiA8IHJhZGl1c1BsdXMxOyBfaTYrKykge1xuICAgICAgcCA9IHlpICsgKCh3aWR0aE1pbnVzMSA8IF9pNiA/IHdpZHRoTWludXMxIDogX2k2KSA8PCAyKTtcbiAgICAgIHJTdW0gKz0gKHN0YWNrLnIgPSBwciA9IHBpeGVsc1twXSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBfaTYpO1xuICAgICAgZ1N1bSArPSAoc3RhY2suZyA9IHBnID0gcGl4ZWxzW3AgKyAxXSkgKiByYnM7XG4gICAgICBiU3VtICs9IChzdGFjay5iID0gcGIgPSBwaXhlbHNbcCArIDJdKSAqIHJicztcbiAgICAgIHJJblN1bSArPSBwcjtcbiAgICAgIGdJblN1bSArPSBwZztcbiAgICAgIGJJblN1bSArPSBwYjtcbiAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICB9XG5cbiAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICBzdGFja091dCA9IHN0YWNrRW5kO1xuXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBwaXhlbHNbeWldID0gclN1bSAqIG11bFN1bSA+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbeWkgKyAxXSA9IGdTdW0gKiBtdWxTdW0gPj4gc2hnU3VtO1xuICAgICAgcGl4ZWxzW3lpICsgMl0gPSBiU3VtICogbXVsU3VtID4+IHNoZ1N1bTtcbiAgICAgIHJTdW0gLT0gck91dFN1bTtcbiAgICAgIGdTdW0gLT0gZ091dFN1bTtcbiAgICAgIGJTdW0gLT0gYk91dFN1bTtcbiAgICAgIHJPdXRTdW0gLT0gc3RhY2tJbi5yO1xuICAgICAgZ091dFN1bSAtPSBzdGFja0luLmc7XG4gICAgICBiT3V0U3VtIC09IHN0YWNrSW4uYjtcbiAgICAgIHAgPSB5dyArICgocCA9IHggKyByYWRpdXMgKyAxKSA8IHdpZHRoTWludXMxID8gcCA6IHdpZHRoTWludXMxKSA8PCAyO1xuICAgICAgckluU3VtICs9IHN0YWNrSW4uciA9IHBpeGVsc1twXTtcbiAgICAgIGdJblN1bSArPSBzdGFja0luLmcgPSBwaXhlbHNbcCArIDFdO1xuICAgICAgYkluU3VtICs9IHN0YWNrSW4uYiA9IHBpeGVsc1twICsgMl07XG4gICAgICByU3VtICs9IHJJblN1bTtcbiAgICAgIGdTdW0gKz0gZ0luU3VtO1xuICAgICAgYlN1bSArPSBiSW5TdW07XG4gICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuICAgICAgck91dFN1bSArPSBwciA9IHN0YWNrT3V0LnI7XG4gICAgICBnT3V0U3VtICs9IHBnID0gc3RhY2tPdXQuZztcbiAgICAgIGJPdXRTdW0gKz0gcGIgPSBzdGFja091dC5iO1xuICAgICAgckluU3VtIC09IHByO1xuICAgICAgZ0luU3VtIC09IHBnO1xuICAgICAgYkluU3VtIC09IHBiO1xuICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xuICAgICAgeWkgKz0gNDtcbiAgICB9XG5cbiAgICB5dyArPSB3aWR0aDtcbiAgfVxuXG4gIGZvciAodmFyIF94MiA9IDA7IF94MiA8IHdpZHRoOyBfeDIrKykge1xuICAgIHlpID0gX3gyIDw8IDI7XG5cbiAgICB2YXIgX3ByMiA9IHBpeGVsc1t5aV0sXG4gICAgICAgIF9wZzIgPSBwaXhlbHNbeWkgKyAxXSxcbiAgICAgICAgX3BiMiA9IHBpeGVsc1t5aSArIDJdLFxuICAgICAgICBfck91dFN1bTIgPSByYWRpdXNQbHVzMSAqIF9wcjIsXG4gICAgICAgIF9nT3V0U3VtMiA9IHJhZGl1c1BsdXMxICogX3BnMixcbiAgICAgICAgX2JPdXRTdW0yID0gcmFkaXVzUGx1czEgKiBfcGIyLFxuICAgICAgICBfclN1bTIgPSBzdW1GYWN0b3IgKiBfcHIyLFxuICAgICAgICBfZ1N1bTIgPSBzdW1GYWN0b3IgKiBfcGcyLFxuICAgICAgICBfYlN1bTIgPSBzdW1GYWN0b3IgKiBfcGIyO1xuXG4gICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG4gICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgcmFkaXVzUGx1czE7IF9pNysrKSB7XG4gICAgICBzdGFjay5yID0gX3ByMjtcbiAgICAgIHN0YWNrLmcgPSBfcGcyO1xuICAgICAgc3RhY2suYiA9IF9wYjI7XG4gICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XG4gICAgfVxuXG4gICAgdmFyIF9ySW5TdW0yID0gMCxcbiAgICAgICAgX2dJblN1bTIgPSAwLFxuICAgICAgICBfYkluU3VtMiA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTggPSAxLCB5cCA9IHdpZHRoOyBfaTggPD0gcmFkaXVzOyBfaTgrKykge1xuICAgICAgeWkgPSB5cCArIF94MiA8PCAyO1xuICAgICAgX3JTdW0yICs9IChzdGFjay5yID0gX3ByMiA9IHBpeGVsc1t5aV0pICogKHJicyA9IHJhZGl1c1BsdXMxIC0gX2k4KTtcbiAgICAgIF9nU3VtMiArPSAoc3RhY2suZyA9IF9wZzIgPSBwaXhlbHNbeWkgKyAxXSkgKiByYnM7XG4gICAgICBfYlN1bTIgKz0gKHN0YWNrLmIgPSBfcGIyID0gcGl4ZWxzW3lpICsgMl0pICogcmJzO1xuICAgICAgX3JJblN1bTIgKz0gX3ByMjtcbiAgICAgIF9nSW5TdW0yICs9IF9wZzI7XG4gICAgICBfYkluU3VtMiArPSBfcGIyO1xuICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuXG4gICAgICBpZiAoX2k4IDwgaGVpZ2h0TWludXMxKSB7XG4gICAgICAgIHlwICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHlpID0gX3gyO1xuICAgIHN0YWNrSW4gPSBzdGFja1N0YXJ0O1xuICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG5cbiAgICBmb3IgKHZhciBfeTIgPSAwOyBfeTIgPCBoZWlnaHQ7IF95MisrKSB7XG4gICAgICBwID0geWkgPDwgMjtcbiAgICAgIHBpeGVsc1twXSA9IF9yU3VtMiAqIG11bFN1bSA+PiBzaGdTdW07XG4gICAgICBwaXhlbHNbcCArIDFdID0gX2dTdW0yICogbXVsU3VtID4+IHNoZ1N1bTtcbiAgICAgIHBpeGVsc1twICsgMl0gPSBfYlN1bTIgKiBtdWxTdW0gPj4gc2hnU3VtO1xuICAgICAgX3JTdW0yIC09IF9yT3V0U3VtMjtcbiAgICAgIF9nU3VtMiAtPSBfZ091dFN1bTI7XG4gICAgICBfYlN1bTIgLT0gX2JPdXRTdW0yO1xuICAgICAgX3JPdXRTdW0yIC09IHN0YWNrSW4ucjtcbiAgICAgIF9nT3V0U3VtMiAtPSBzdGFja0luLmc7XG4gICAgICBfYk91dFN1bTIgLT0gc3RhY2tJbi5iO1xuICAgICAgcCA9IF94MiArICgocCA9IF95MiArIHJhZGl1c1BsdXMxKSA8IGhlaWdodE1pbnVzMSA/IHAgOiBoZWlnaHRNaW51czEpICogd2lkdGggPDwgMjtcbiAgICAgIF9yU3VtMiArPSBfckluU3VtMiArPSBzdGFja0luLnIgPSBwaXhlbHNbcF07XG4gICAgICBfZ1N1bTIgKz0gX2dJblN1bTIgKz0gc3RhY2tJbi5nID0gcGl4ZWxzW3AgKyAxXTtcbiAgICAgIF9iU3VtMiArPSBfYkluU3VtMiArPSBzdGFja0luLmIgPSBwaXhlbHNbcCArIDJdO1xuICAgICAgc3RhY2tJbiA9IHN0YWNrSW4ubmV4dDtcbiAgICAgIF9yT3V0U3VtMiArPSBfcHIyID0gc3RhY2tPdXQucjtcbiAgICAgIF9nT3V0U3VtMiArPSBfcGcyID0gc3RhY2tPdXQuZztcbiAgICAgIF9iT3V0U3VtMiArPSBfcGIyID0gc3RhY2tPdXQuYjtcbiAgICAgIF9ySW5TdW0yIC09IF9wcjI7XG4gICAgICBfZ0luU3VtMiAtPSBfcGcyO1xuICAgICAgX2JJblN1bTIgLT0gX3BiMjtcbiAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcbiAgICAgIHlpICs9IHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbWFnZURhdGE7XG59XG4vKipcbiAqXG4gKi9cblxuXG52YXIgQmx1clN0YWNrID1cbi8qKlxuICogU2V0IHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIEJsdXJTdGFjaygpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsdXJTdGFjayk7XG5cbiAgdGhpcy5yID0gMDtcbiAgdGhpcy5nID0gMDtcbiAgdGhpcy5iID0gMDtcbiAgdGhpcy5hID0gMDtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn07XG5cbmV4cG9ydCB7IEJsdXJTdGFjaywgcHJvY2Vzc0NhbnZhc1JHQiBhcyBjYW52YXNSR0IsIHByb2Nlc3NDYW52YXNSR0JBIGFzIGNhbnZhc1JHQkEsIHByb2Nlc3NJbWFnZSBhcyBpbWFnZSwgcHJvY2Vzc0ltYWdlRGF0YVJHQiBhcyBpbWFnZURhdGFSR0IsIHByb2Nlc3NJbWFnZURhdGFSR0JBIGFzIGltYWdlRGF0YVJHQkEgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=