qms-angular 1.0.36 → 1.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1174) hide show
  1. package/bundles/qms-angular.umd.js +7101 -221
  2. package/bundles/qms-angular.umd.js.map +1 -1
  3. package/esm2015/lib/components/breadcrumb/breadcrumb.js +29 -6
  4. package/esm2015/lib/components/qms-app-bar/qms-app-bar.component.js +2 -2
  5. package/esm2015/lib/components/related/popup/related-popup.component.js +2 -2
  6. package/esm2015/lib/model/en.js +144 -1
  7. package/esm2015/lib/model/no.js +148 -5
  8. package/esm2015/lib/qms-ckeditor-components/common/bpmn/inspector.function.js +2147 -0
  9. package/esm2015/lib/qms-ckeditor-components/common/bpmn/toolbar.function.js +200 -0
  10. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.js +6 -1
  11. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.js +36 -0
  12. package/esm2015/lib/qms-ckeditor-components/common/constants/iconSvg.constants.js +8 -0
  13. package/esm2015/lib/qms-ckeditor-components/common/enums/flowchart-view-mode.enum.js +6 -0
  14. package/esm2015/lib/qms-ckeditor-components/common/enums/image-mode.enum.js +9 -0
  15. package/esm2015/lib/qms-ckeditor-components/common/enums/protocol-type.enum.js +11 -3
  16. package/esm2015/lib/qms-ckeditor-components/common/enums/related-to-item-type.js +11 -0
  17. package/esm2015/lib/qms-ckeditor-components/common/enums/target-type.enum.js +8 -1
  18. package/esm2015/lib/qms-ckeditor-components/common/functions/common.function.js +6 -2
  19. package/esm2015/lib/qms-ckeditor-components/common/helper/guidHelper.js +14 -0
  20. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn-template.model.js +9 -0
  21. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn.model.js +9 -0
  22. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.js +1 -1
  23. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.js +1 -9
  24. package/esm2015/lib/qms-ckeditor-components/common/module/confirm/qms-ckeditor-confirm.component.js +3 -3
  25. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.js +266 -0
  26. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.js +67 -0
  27. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.js +524 -0
  28. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.js +1948 -0
  29. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.js +7 -0
  30. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/attachments/link-attachment.component.js +1 -1
  31. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/qms-ckeditor-link.component.js +5 -5
  32. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-load-template/qms-ckeditor-load-template.component.js +1 -1
  33. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-relation/qmsckeditor-related.component.js +1 -1
  34. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-template/qms-ckeditor-template.component.js +1 -1
  35. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-tooltip/qms-ckeditor-tooltip.component.js +1 -1
  36. package/esm2015/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.js +22 -0
  37. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +68 -5
  38. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.module.js +16 -2
  39. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.js +26 -0
  40. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.js +1156 -0
  41. package/esm2015/public-api.js +14 -1
  42. package/esm2015/qms-angular.js +3 -1
  43. package/fesm2015/qms-angular.js +7017 -226
  44. package/fesm2015/qms-angular.js.map +1 -1
  45. package/lib/components/breadcrumb/breadcrumb.d.ts +6 -3
  46. package/lib/model/en.d.ts +143 -0
  47. package/lib/model/no.d.ts +143 -0
  48. package/lib/qms-ckeditor-components/common/bpmn/inspector.function.d.ts +1825 -0
  49. package/lib/qms-ckeditor-components/common/bpmn/toolbar.function.d.ts +163 -0
  50. package/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.d.ts +5 -0
  51. package/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.d.ts +34 -0
  52. package/lib/qms-ckeditor-components/common/constants/iconSvg.constants.d.ts +7 -0
  53. package/lib/qms-ckeditor-components/common/enums/flowchart-view-mode.enum.d.ts +4 -0
  54. package/lib/qms-ckeditor-components/common/enums/image-mode.enum.d.ts +7 -0
  55. package/lib/qms-ckeditor-components/common/enums/protocol-type.enum.d.ts +9 -2
  56. package/lib/qms-ckeditor-components/common/enums/related-to-item-type.d.ts +9 -0
  57. package/lib/qms-ckeditor-components/common/enums/target-type.enum.d.ts +6 -0
  58. package/lib/qms-ckeditor-components/common/helper/guidHelper.d.ts +6 -0
  59. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn-template.model.d.ts +7 -0
  60. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-bpmn.model.d.ts +7 -0
  61. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.d.ts +1 -0
  62. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.d.ts +7 -7
  63. package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.d.ts +37 -0
  64. package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.d.ts +23 -0
  65. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.d.ts +123 -0
  66. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.d.ts +542 -0
  67. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.d.ts +2 -0
  68. package/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.d.ts +20 -0
  69. package/lib/qms-ckeditor-components/qms-ckeditor.component.d.ts +7 -2
  70. package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.d.ts +10 -0
  71. package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.d.ts +33 -0
  72. package/lib.theme.scss +4 -1
  73. package/package.json +1 -1
  74. package/public-api.d.ts +12 -0
  75. package/qms-angular.d.ts +2 -0
  76. package/qms-angular.metadata.json +1 -1
  77. package/src/assets/images/panel-stencil-container-background-image.png +0 -0
  78. package/src/assets/jointjs/js/backbone/backbone.js +2096 -0
  79. package/src/assets/jointjs/js/client.js +17 -0
  80. package/src/assets/jointjs/js/example.js +42 -0
  81. package/src/assets/jointjs/js/gd.js +135 -0
  82. package/src/assets/jointjs/js/joint.format.raster.js +386 -0
  83. package/src/assets/jointjs/js/joint.format.svg.js +252 -0
  84. package/src/assets/jointjs/js/jquery/jquery.js +10872 -0
  85. package/src/assets/jointjs/js/lodash/LICENSE +47 -0
  86. package/src/assets/jointjs/js/lodash/README.md +39 -0
  87. package/src/assets/jointjs/js/lodash/_DataView.js +7 -0
  88. package/src/assets/jointjs/js/lodash/_Hash.js +32 -0
  89. package/src/assets/jointjs/js/lodash/_LazyWrapper.js +28 -0
  90. package/src/assets/jointjs/js/lodash/_ListCache.js +32 -0
  91. package/src/assets/jointjs/js/lodash/_LodashWrapper.js +22 -0
  92. package/src/assets/jointjs/js/lodash/_Map.js +7 -0
  93. package/src/assets/jointjs/js/lodash/_MapCache.js +32 -0
  94. package/src/assets/jointjs/js/lodash/_Promise.js +7 -0
  95. package/src/assets/jointjs/js/lodash/_Set.js +7 -0
  96. package/src/assets/jointjs/js/lodash/_SetCache.js +27 -0
  97. package/src/assets/jointjs/js/lodash/_Stack.js +27 -0
  98. package/src/assets/jointjs/js/lodash/_Symbol.js +6 -0
  99. package/src/assets/jointjs/js/lodash/_Uint8Array.js +6 -0
  100. package/src/assets/jointjs/js/lodash/_WeakMap.js +7 -0
  101. package/src/assets/jointjs/js/lodash/_apply.js +21 -0
  102. package/src/assets/jointjs/js/lodash/_arrayAggregator.js +22 -0
  103. package/src/assets/jointjs/js/lodash/_arrayEach.js +22 -0
  104. package/src/assets/jointjs/js/lodash/_arrayEachRight.js +21 -0
  105. package/src/assets/jointjs/js/lodash/_arrayEvery.js +23 -0
  106. package/src/assets/jointjs/js/lodash/_arrayFilter.js +25 -0
  107. package/src/assets/jointjs/js/lodash/_arrayIncludes.js +17 -0
  108. package/src/assets/jointjs/js/lodash/_arrayIncludesWith.js +22 -0
  109. package/src/assets/jointjs/js/lodash/_arrayLikeKeys.js +49 -0
  110. package/src/assets/jointjs/js/lodash/_arrayMap.js +21 -0
  111. package/src/assets/jointjs/js/lodash/_arrayPush.js +20 -0
  112. package/src/assets/jointjs/js/lodash/_arrayReduce.js +26 -0
  113. package/src/assets/jointjs/js/lodash/_arrayReduceRight.js +24 -0
  114. package/src/assets/jointjs/js/lodash/_arraySample.js +15 -0
  115. package/src/assets/jointjs/js/lodash/_arraySampleSize.js +17 -0
  116. package/src/assets/jointjs/js/lodash/_arrayShuffle.js +15 -0
  117. package/src/assets/jointjs/js/lodash/_arraySome.js +23 -0
  118. package/src/assets/jointjs/js/lodash/_asciiSize.js +12 -0
  119. package/src/assets/jointjs/js/lodash/_asciiToArray.js +12 -0
  120. package/src/assets/jointjs/js/lodash/_asciiWords.js +15 -0
  121. package/src/assets/jointjs/js/lodash/_assignMergeValue.js +20 -0
  122. package/src/assets/jointjs/js/lodash/_assignValue.js +28 -0
  123. package/src/assets/jointjs/js/lodash/_assocIndexOf.js +21 -0
  124. package/src/assets/jointjs/js/lodash/_baseAggregator.js +21 -0
  125. package/src/assets/jointjs/js/lodash/_baseAssign.js +17 -0
  126. package/src/assets/jointjs/js/lodash/_baseAssignIn.js +17 -0
  127. package/src/assets/jointjs/js/lodash/_baseAssignValue.js +25 -0
  128. package/src/assets/jointjs/js/lodash/_baseAt.js +23 -0
  129. package/src/assets/jointjs/js/lodash/_baseClamp.js +22 -0
  130. package/src/assets/jointjs/js/lodash/_baseClone.js +165 -0
  131. package/src/assets/jointjs/js/lodash/_baseConforms.js +18 -0
  132. package/src/assets/jointjs/js/lodash/_baseConformsTo.js +27 -0
  133. package/src/assets/jointjs/js/lodash/_baseCreate.js +30 -0
  134. package/src/assets/jointjs/js/lodash/_baseDelay.js +21 -0
  135. package/src/assets/jointjs/js/lodash/_baseDifference.js +67 -0
  136. package/src/assets/jointjs/js/lodash/_baseEach.js +14 -0
  137. package/src/assets/jointjs/js/lodash/_baseEachRight.js +14 -0
  138. package/src/assets/jointjs/js/lodash/_baseEvery.js +21 -0
  139. package/src/assets/jointjs/js/lodash/_baseExtremum.js +32 -0
  140. package/src/assets/jointjs/js/lodash/_baseFill.js +32 -0
  141. package/src/assets/jointjs/js/lodash/_baseFilter.js +21 -0
  142. package/src/assets/jointjs/js/lodash/_baseFindIndex.js +24 -0
  143. package/src/assets/jointjs/js/lodash/_baseFindKey.js +23 -0
  144. package/src/assets/jointjs/js/lodash/_baseFlatten.js +38 -0
  145. package/src/assets/jointjs/js/lodash/_baseFor.js +16 -0
  146. package/src/assets/jointjs/js/lodash/_baseForOwn.js +16 -0
  147. package/src/assets/jointjs/js/lodash/_baseForOwnRight.js +16 -0
  148. package/src/assets/jointjs/js/lodash/_baseForRight.js +15 -0
  149. package/src/assets/jointjs/js/lodash/_baseFunctions.js +19 -0
  150. package/src/assets/jointjs/js/lodash/_baseGet.js +24 -0
  151. package/src/assets/jointjs/js/lodash/_baseGetAllKeys.js +20 -0
  152. package/src/assets/jointjs/js/lodash/_baseGetTag.js +28 -0
  153. package/src/assets/jointjs/js/lodash/_baseGt.js +14 -0
  154. package/src/assets/jointjs/js/lodash/_baseHas.js +19 -0
  155. package/src/assets/jointjs/js/lodash/_baseHasIn.js +13 -0
  156. package/src/assets/jointjs/js/lodash/_baseInRange.js +18 -0
  157. package/src/assets/jointjs/js/lodash/_baseIndexOf.js +20 -0
  158. package/src/assets/jointjs/js/lodash/_baseIndexOfWith.js +23 -0
  159. package/src/assets/jointjs/js/lodash/_baseIntersection.js +74 -0
  160. package/src/assets/jointjs/js/lodash/_baseInverter.js +21 -0
  161. package/src/assets/jointjs/js/lodash/_baseInvoke.js +24 -0
  162. package/src/assets/jointjs/js/lodash/_baseIsArguments.js +18 -0
  163. package/src/assets/jointjs/js/lodash/_baseIsArrayBuffer.js +17 -0
  164. package/src/assets/jointjs/js/lodash/_baseIsDate.js +18 -0
  165. package/src/assets/jointjs/js/lodash/_baseIsEqual.js +28 -0
  166. package/src/assets/jointjs/js/lodash/_baseIsEqualDeep.js +83 -0
  167. package/src/assets/jointjs/js/lodash/_baseIsMap.js +18 -0
  168. package/src/assets/jointjs/js/lodash/_baseIsMatch.js +62 -0
  169. package/src/assets/jointjs/js/lodash/_baseIsNaN.js +12 -0
  170. package/src/assets/jointjs/js/lodash/_baseIsNative.js +47 -0
  171. package/src/assets/jointjs/js/lodash/_baseIsRegExp.js +18 -0
  172. package/src/assets/jointjs/js/lodash/_baseIsSet.js +18 -0
  173. package/src/assets/jointjs/js/lodash/_baseIsTypedArray.js +60 -0
  174. package/src/assets/jointjs/js/lodash/_baseIteratee.js +31 -0
  175. package/src/assets/jointjs/js/lodash/_baseKeys.js +30 -0
  176. package/src/assets/jointjs/js/lodash/_baseKeysIn.js +33 -0
  177. package/src/assets/jointjs/js/lodash/_baseLodash.js +10 -0
  178. package/src/assets/jointjs/js/lodash/_baseLt.js +14 -0
  179. package/src/assets/jointjs/js/lodash/_baseMap.js +22 -0
  180. package/src/assets/jointjs/js/lodash/_baseMatches.js +22 -0
  181. package/src/assets/jointjs/js/lodash/_baseMatchesProperty.js +33 -0
  182. package/src/assets/jointjs/js/lodash/_baseMean.js +20 -0
  183. package/src/assets/jointjs/js/lodash/_baseMerge.js +42 -0
  184. package/src/assets/jointjs/js/lodash/_baseMergeDeep.js +94 -0
  185. package/src/assets/jointjs/js/lodash/_baseNth.js +20 -0
  186. package/src/assets/jointjs/js/lodash/_baseOrderBy.js +34 -0
  187. package/src/assets/jointjs/js/lodash/_basePick.js +19 -0
  188. package/src/assets/jointjs/js/lodash/_basePickBy.js +30 -0
  189. package/src/assets/jointjs/js/lodash/_baseProperty.js +14 -0
  190. package/src/assets/jointjs/js/lodash/_basePropertyDeep.js +16 -0
  191. package/src/assets/jointjs/js/lodash/_basePropertyOf.js +14 -0
  192. package/src/assets/jointjs/js/lodash/_basePullAll.js +51 -0
  193. package/src/assets/jointjs/js/lodash/_basePullAt.js +37 -0
  194. package/src/assets/jointjs/js/lodash/_baseRandom.js +18 -0
  195. package/src/assets/jointjs/js/lodash/_baseRange.js +28 -0
  196. package/src/assets/jointjs/js/lodash/_baseReduce.js +23 -0
  197. package/src/assets/jointjs/js/lodash/_baseRepeat.js +35 -0
  198. package/src/assets/jointjs/js/lodash/_baseRest.js +17 -0
  199. package/src/assets/jointjs/js/lodash/_baseSample.js +15 -0
  200. package/src/assets/jointjs/js/lodash/_baseSampleSize.js +18 -0
  201. package/src/assets/jointjs/js/lodash/_baseSet.js +47 -0
  202. package/src/assets/jointjs/js/lodash/_baseSetData.js +17 -0
  203. package/src/assets/jointjs/js/lodash/_baseSetToString.js +22 -0
  204. package/src/assets/jointjs/js/lodash/_baseShuffle.js +15 -0
  205. package/src/assets/jointjs/js/lodash/_baseSlice.js +31 -0
  206. package/src/assets/jointjs/js/lodash/_baseSome.js +22 -0
  207. package/src/assets/jointjs/js/lodash/_baseSortBy.js +21 -0
  208. package/src/assets/jointjs/js/lodash/_baseSortedIndex.js +42 -0
  209. package/src/assets/jointjs/js/lodash/_baseSortedIndexBy.js +64 -0
  210. package/src/assets/jointjs/js/lodash/_baseSortedUniq.js +30 -0
  211. package/src/assets/jointjs/js/lodash/_baseSum.js +24 -0
  212. package/src/assets/jointjs/js/lodash/_baseTimes.js +20 -0
  213. package/src/assets/jointjs/js/lodash/_baseToNumber.js +24 -0
  214. package/src/assets/jointjs/js/lodash/_baseToPairs.js +18 -0
  215. package/src/assets/jointjs/js/lodash/_baseToString.js +37 -0
  216. package/src/assets/jointjs/js/lodash/_baseUnary.js +14 -0
  217. package/src/assets/jointjs/js/lodash/_baseUniq.js +72 -0
  218. package/src/assets/jointjs/js/lodash/_baseUnset.js +20 -0
  219. package/src/assets/jointjs/js/lodash/_baseUpdate.js +18 -0
  220. package/src/assets/jointjs/js/lodash/_baseValues.js +19 -0
  221. package/src/assets/jointjs/js/lodash/_baseWhile.js +26 -0
  222. package/src/assets/jointjs/js/lodash/_baseWrapperValue.js +25 -0
  223. package/src/assets/jointjs/js/lodash/_baseXor.js +36 -0
  224. package/src/assets/jointjs/js/lodash/_baseZipObject.js +23 -0
  225. package/src/assets/jointjs/js/lodash/_cacheHas.js +13 -0
  226. package/src/assets/jointjs/js/lodash/_castArrayLikeObject.js +14 -0
  227. package/src/assets/jointjs/js/lodash/_castFunction.js +14 -0
  228. package/src/assets/jointjs/js/lodash/_castPath.js +21 -0
  229. package/src/assets/jointjs/js/lodash/_castRest.js +14 -0
  230. package/src/assets/jointjs/js/lodash/_castSlice.js +18 -0
  231. package/src/assets/jointjs/js/lodash/_charsEndIndex.js +19 -0
  232. package/src/assets/jointjs/js/lodash/_charsStartIndex.js +20 -0
  233. package/src/assets/jointjs/js/lodash/_cloneArrayBuffer.js +16 -0
  234. package/src/assets/jointjs/js/lodash/_cloneBuffer.js +35 -0
  235. package/src/assets/jointjs/js/lodash/_cloneDataView.js +16 -0
  236. package/src/assets/jointjs/js/lodash/_cloneRegExp.js +17 -0
  237. package/src/assets/jointjs/js/lodash/_cloneSymbol.js +18 -0
  238. package/src/assets/jointjs/js/lodash/_cloneTypedArray.js +16 -0
  239. package/src/assets/jointjs/js/lodash/_compareAscending.js +41 -0
  240. package/src/assets/jointjs/js/lodash/_compareMultiple.js +44 -0
  241. package/src/assets/jointjs/js/lodash/_composeArgs.js +39 -0
  242. package/src/assets/jointjs/js/lodash/_composeArgsRight.js +41 -0
  243. package/src/assets/jointjs/js/lodash/_copyArray.js +20 -0
  244. package/src/assets/jointjs/js/lodash/_copyObject.js +40 -0
  245. package/src/assets/jointjs/js/lodash/_copySymbols.js +16 -0
  246. package/src/assets/jointjs/js/lodash/_copySymbolsIn.js +16 -0
  247. package/src/assets/jointjs/js/lodash/_coreJsData.js +6 -0
  248. package/src/assets/jointjs/js/lodash/_countHolders.js +21 -0
  249. package/src/assets/jointjs/js/lodash/_createAggregator.js +23 -0
  250. package/src/assets/jointjs/js/lodash/_createAssigner.js +37 -0
  251. package/src/assets/jointjs/js/lodash/_createBaseEach.js +32 -0
  252. package/src/assets/jointjs/js/lodash/_createBaseFor.js +25 -0
  253. package/src/assets/jointjs/js/lodash/_createBind.js +28 -0
  254. package/src/assets/jointjs/js/lodash/_createCaseFirst.js +33 -0
  255. package/src/assets/jointjs/js/lodash/_createCompounder.js +24 -0
  256. package/src/assets/jointjs/js/lodash/_createCtor.js +37 -0
  257. package/src/assets/jointjs/js/lodash/_createCurry.js +46 -0
  258. package/src/assets/jointjs/js/lodash/_createFind.js +25 -0
  259. package/src/assets/jointjs/js/lodash/_createFlow.js +78 -0
  260. package/src/assets/jointjs/js/lodash/_createHybrid.js +92 -0
  261. package/src/assets/jointjs/js/lodash/_createInverter.js +17 -0
  262. package/src/assets/jointjs/js/lodash/_createMathOperation.js +38 -0
  263. package/src/assets/jointjs/js/lodash/_createOver.js +27 -0
  264. package/src/assets/jointjs/js/lodash/_createPadding.js +33 -0
  265. package/src/assets/jointjs/js/lodash/_createPartial.js +43 -0
  266. package/src/assets/jointjs/js/lodash/_createRange.js +30 -0
  267. package/src/assets/jointjs/js/lodash/_createRecurry.js +56 -0
  268. package/src/assets/jointjs/js/lodash/_createRelationalOperation.js +20 -0
  269. package/src/assets/jointjs/js/lodash/_createRound.js +35 -0
  270. package/src/assets/jointjs/js/lodash/_createSet.js +19 -0
  271. package/src/assets/jointjs/js/lodash/_createToPairs.js +30 -0
  272. package/src/assets/jointjs/js/lodash/_createWrap.js +106 -0
  273. package/src/assets/jointjs/js/lodash/_customDefaultsAssignIn.js +29 -0
  274. package/src/assets/jointjs/js/lodash/_customDefaultsMerge.js +28 -0
  275. package/src/assets/jointjs/js/lodash/_customOmitClone.js +16 -0
  276. package/src/assets/jointjs/js/lodash/_deburrLetter.js +71 -0
  277. package/src/assets/jointjs/js/lodash/_defineProperty.js +11 -0
  278. package/src/assets/jointjs/js/lodash/_equalArrays.js +83 -0
  279. package/src/assets/jointjs/js/lodash/_equalByTag.js +112 -0
  280. package/src/assets/jointjs/js/lodash/_equalObjects.js +89 -0
  281. package/src/assets/jointjs/js/lodash/_escapeHtmlChar.js +21 -0
  282. package/src/assets/jointjs/js/lodash/_escapeStringChar.js +22 -0
  283. package/src/assets/jointjs/js/lodash/_flatRest.js +16 -0
  284. package/src/assets/jointjs/js/lodash/_freeGlobal.js +4 -0
  285. package/src/assets/jointjs/js/lodash/_getAllKeys.js +16 -0
  286. package/src/assets/jointjs/js/lodash/_getAllKeysIn.js +17 -0
  287. package/src/assets/jointjs/js/lodash/_getData.js +15 -0
  288. package/src/assets/jointjs/js/lodash/_getFuncName.js +31 -0
  289. package/src/assets/jointjs/js/lodash/_getHolder.js +13 -0
  290. package/src/assets/jointjs/js/lodash/_getMapData.js +18 -0
  291. package/src/assets/jointjs/js/lodash/_getMatchData.js +24 -0
  292. package/src/assets/jointjs/js/lodash/_getNative.js +17 -0
  293. package/src/assets/jointjs/js/lodash/_getPrototype.js +6 -0
  294. package/src/assets/jointjs/js/lodash/_getRawTag.js +46 -0
  295. package/src/assets/jointjs/js/lodash/_getSymbols.js +30 -0
  296. package/src/assets/jointjs/js/lodash/_getSymbolsIn.js +25 -0
  297. package/src/assets/jointjs/js/lodash/_getTag.js +58 -0
  298. package/src/assets/jointjs/js/lodash/_getValue.js +13 -0
  299. package/src/assets/jointjs/js/lodash/_getView.js +33 -0
  300. package/src/assets/jointjs/js/lodash/_getWrapDetails.js +17 -0
  301. package/src/assets/jointjs/js/lodash/_hasPath.js +39 -0
  302. package/src/assets/jointjs/js/lodash/_hasUnicode.js +26 -0
  303. package/src/assets/jointjs/js/lodash/_hasUnicodeWord.js +15 -0
  304. package/src/assets/jointjs/js/lodash/_hashClear.js +15 -0
  305. package/src/assets/jointjs/js/lodash/_hashDelete.js +17 -0
  306. package/src/assets/jointjs/js/lodash/_hashGet.js +30 -0
  307. package/src/assets/jointjs/js/lodash/_hashHas.js +23 -0
  308. package/src/assets/jointjs/js/lodash/_hashSet.js +23 -0
  309. package/src/assets/jointjs/js/lodash/_initCloneArray.js +26 -0
  310. package/src/assets/jointjs/js/lodash/_initCloneByTag.js +77 -0
  311. package/src/assets/jointjs/js/lodash/_initCloneObject.js +18 -0
  312. package/src/assets/jointjs/js/lodash/_insertWrapDetails.js +23 -0
  313. package/src/assets/jointjs/js/lodash/_isFlattenable.js +20 -0
  314. package/src/assets/jointjs/js/lodash/_isIndex.js +25 -0
  315. package/src/assets/jointjs/js/lodash/_isIterateeCall.js +30 -0
  316. package/src/assets/jointjs/js/lodash/_isKey.js +29 -0
  317. package/src/assets/jointjs/js/lodash/_isKeyable.js +15 -0
  318. package/src/assets/jointjs/js/lodash/_isLaziable.js +28 -0
  319. package/src/assets/jointjs/js/lodash/_isMaskable.js +14 -0
  320. package/src/assets/jointjs/js/lodash/_isMasked.js +20 -0
  321. package/src/assets/jointjs/js/lodash/_isPrototype.js +18 -0
  322. package/src/assets/jointjs/js/lodash/_isStrictComparable.js +15 -0
  323. package/src/assets/jointjs/js/lodash/_iteratorToArray.js +18 -0
  324. package/src/assets/jointjs/js/lodash/_lazyClone.js +23 -0
  325. package/src/assets/jointjs/js/lodash/_lazyReverse.js +23 -0
  326. package/src/assets/jointjs/js/lodash/_lazyValue.js +69 -0
  327. package/src/assets/jointjs/js/lodash/_listCacheClear.js +13 -0
  328. package/src/assets/jointjs/js/lodash/_listCacheDelete.js +35 -0
  329. package/src/assets/jointjs/js/lodash/_listCacheGet.js +19 -0
  330. package/src/assets/jointjs/js/lodash/_listCacheHas.js +16 -0
  331. package/src/assets/jointjs/js/lodash/_listCacheSet.js +26 -0
  332. package/src/assets/jointjs/js/lodash/_mapCacheClear.js +21 -0
  333. package/src/assets/jointjs/js/lodash/_mapCacheDelete.js +18 -0
  334. package/src/assets/jointjs/js/lodash/_mapCacheGet.js +16 -0
  335. package/src/assets/jointjs/js/lodash/_mapCacheHas.js +16 -0
  336. package/src/assets/jointjs/js/lodash/_mapCacheSet.js +22 -0
  337. package/src/assets/jointjs/js/lodash/_mapToArray.js +18 -0
  338. package/src/assets/jointjs/js/lodash/_matchesStrictComparable.js +20 -0
  339. package/src/assets/jointjs/js/lodash/_memoizeCapped.js +26 -0
  340. package/src/assets/jointjs/js/lodash/_mergeData.js +90 -0
  341. package/src/assets/jointjs/js/lodash/_metaMap.js +6 -0
  342. package/src/assets/jointjs/js/lodash/_nativeCreate.js +6 -0
  343. package/src/assets/jointjs/js/lodash/_nativeKeys.js +6 -0
  344. package/src/assets/jointjs/js/lodash/_nativeKeysIn.js +20 -0
  345. package/src/assets/jointjs/js/lodash/_nodeUtil.js +30 -0
  346. package/src/assets/jointjs/js/lodash/_objectToString.js +22 -0
  347. package/src/assets/jointjs/js/lodash/_overArg.js +15 -0
  348. package/src/assets/jointjs/js/lodash/_overRest.js +36 -0
  349. package/src/assets/jointjs/js/lodash/_parent.js +16 -0
  350. package/src/assets/jointjs/js/lodash/_reEscape.js +4 -0
  351. package/src/assets/jointjs/js/lodash/_reEvaluate.js +4 -0
  352. package/src/assets/jointjs/js/lodash/_reInterpolate.js +4 -0
  353. package/src/assets/jointjs/js/lodash/_realNames.js +4 -0
  354. package/src/assets/jointjs/js/lodash/_reorder.js +29 -0
  355. package/src/assets/jointjs/js/lodash/_replaceHolders.js +29 -0
  356. package/src/assets/jointjs/js/lodash/_root.js +9 -0
  357. package/src/assets/jointjs/js/lodash/_safeGet.js +21 -0
  358. package/src/assets/jointjs/js/lodash/_setCacheAdd.js +19 -0
  359. package/src/assets/jointjs/js/lodash/_setCacheHas.js +14 -0
  360. package/src/assets/jointjs/js/lodash/_setData.js +20 -0
  361. package/src/assets/jointjs/js/lodash/_setToArray.js +18 -0
  362. package/src/assets/jointjs/js/lodash/_setToPairs.js +18 -0
  363. package/src/assets/jointjs/js/lodash/_setToString.js +14 -0
  364. package/src/assets/jointjs/js/lodash/_setWrapToString.js +21 -0
  365. package/src/assets/jointjs/js/lodash/_shortOut.js +37 -0
  366. package/src/assets/jointjs/js/lodash/_shuffleSelf.js +28 -0
  367. package/src/assets/jointjs/js/lodash/_stackClear.js +15 -0
  368. package/src/assets/jointjs/js/lodash/_stackDelete.js +18 -0
  369. package/src/assets/jointjs/js/lodash/_stackGet.js +14 -0
  370. package/src/assets/jointjs/js/lodash/_stackHas.js +14 -0
  371. package/src/assets/jointjs/js/lodash/_stackSet.js +34 -0
  372. package/src/assets/jointjs/js/lodash/_strictIndexOf.js +23 -0
  373. package/src/assets/jointjs/js/lodash/_strictLastIndexOf.js +21 -0
  374. package/src/assets/jointjs/js/lodash/_stringSize.js +18 -0
  375. package/src/assets/jointjs/js/lodash/_stringToArray.js +18 -0
  376. package/src/assets/jointjs/js/lodash/_stringToPath.js +27 -0
  377. package/src/assets/jointjs/js/lodash/_toKey.js +21 -0
  378. package/src/assets/jointjs/js/lodash/_toSource.js +26 -0
  379. package/src/assets/jointjs/js/lodash/_unescapeHtmlChar.js +21 -0
  380. package/src/assets/jointjs/js/lodash/_unicodeSize.js +44 -0
  381. package/src/assets/jointjs/js/lodash/_unicodeToArray.js +40 -0
  382. package/src/assets/jointjs/js/lodash/_unicodeWords.js +69 -0
  383. package/src/assets/jointjs/js/lodash/_updateWrapDetails.js +46 -0
  384. package/src/assets/jointjs/js/lodash/_wrapperClone.js +23 -0
  385. package/src/assets/jointjs/js/lodash/add.js +22 -0
  386. package/src/assets/jointjs/js/lodash/after.js +42 -0
  387. package/src/assets/jointjs/js/lodash/array.js +67 -0
  388. package/src/assets/jointjs/js/lodash/ary.js +29 -0
  389. package/src/assets/jointjs/js/lodash/assign.js +58 -0
  390. package/src/assets/jointjs/js/lodash/assignIn.js +40 -0
  391. package/src/assets/jointjs/js/lodash/assignInWith.js +38 -0
  392. package/src/assets/jointjs/js/lodash/assignWith.js +37 -0
  393. package/src/assets/jointjs/js/lodash/at.js +23 -0
  394. package/src/assets/jointjs/js/lodash/attempt.js +35 -0
  395. package/src/assets/jointjs/js/lodash/before.js +40 -0
  396. package/src/assets/jointjs/js/lodash/bind.js +57 -0
  397. package/src/assets/jointjs/js/lodash/bindAll.js +41 -0
  398. package/src/assets/jointjs/js/lodash/bindKey.js +68 -0
  399. package/src/assets/jointjs/js/lodash/camelCase.js +29 -0
  400. package/src/assets/jointjs/js/lodash/capitalize.js +23 -0
  401. package/src/assets/jointjs/js/lodash/castArray.js +44 -0
  402. package/src/assets/jointjs/js/lodash/ceil.js +26 -0
  403. package/src/assets/jointjs/js/lodash/chain.js +38 -0
  404. package/src/assets/jointjs/js/lodash/chunk.js +50 -0
  405. package/src/assets/jointjs/js/lodash/clamp.js +39 -0
  406. package/src/assets/jointjs/js/lodash/clone.js +36 -0
  407. package/src/assets/jointjs/js/lodash/cloneDeep.js +29 -0
  408. package/src/assets/jointjs/js/lodash/cloneDeepWith.js +40 -0
  409. package/src/assets/jointjs/js/lodash/cloneWith.js +42 -0
  410. package/src/assets/jointjs/js/lodash/collection.js +30 -0
  411. package/src/assets/jointjs/js/lodash/commit.js +33 -0
  412. package/src/assets/jointjs/js/lodash/compact.js +31 -0
  413. package/src/assets/jointjs/js/lodash/concat.js +43 -0
  414. package/src/assets/jointjs/js/lodash/cond.js +60 -0
  415. package/src/assets/jointjs/js/lodash/conforms.js +35 -0
  416. package/src/assets/jointjs/js/lodash/conformsTo.js +32 -0
  417. package/src/assets/jointjs/js/lodash/constant.js +26 -0
  418. package/src/assets/jointjs/js/lodash/core.js +3854 -0
  419. package/src/assets/jointjs/js/lodash/core.min.js +29 -0
  420. package/src/assets/jointjs/js/lodash/countBy.js +40 -0
  421. package/src/assets/jointjs/js/lodash/create.js +43 -0
  422. package/src/assets/jointjs/js/lodash/curry.js +57 -0
  423. package/src/assets/jointjs/js/lodash/curryRight.js +54 -0
  424. package/src/assets/jointjs/js/lodash/date.js +3 -0
  425. package/src/assets/jointjs/js/lodash/debounce.js +191 -0
  426. package/src/assets/jointjs/js/lodash/deburr.js +45 -0
  427. package/src/assets/jointjs/js/lodash/defaultTo.js +25 -0
  428. package/src/assets/jointjs/js/lodash/defaults.js +64 -0
  429. package/src/assets/jointjs/js/lodash/defaultsDeep.js +30 -0
  430. package/src/assets/jointjs/js/lodash/defer.js +26 -0
  431. package/src/assets/jointjs/js/lodash/delay.js +28 -0
  432. package/src/assets/jointjs/js/lodash/difference.js +33 -0
  433. package/src/assets/jointjs/js/lodash/differenceBy.js +44 -0
  434. package/src/assets/jointjs/js/lodash/differenceWith.js +40 -0
  435. package/src/assets/jointjs/js/lodash/divide.js +22 -0
  436. package/src/assets/jointjs/js/lodash/drop.js +38 -0
  437. package/src/assets/jointjs/js/lodash/dropRight.js +39 -0
  438. package/src/assets/jointjs/js/lodash/dropRightWhile.js +45 -0
  439. package/src/assets/jointjs/js/lodash/dropWhile.js +45 -0
  440. package/src/assets/jointjs/js/lodash/each.js +1 -0
  441. package/src/assets/jointjs/js/lodash/eachRight.js +1 -0
  442. package/src/assets/jointjs/js/lodash/endsWith.js +43 -0
  443. package/src/assets/jointjs/js/lodash/entries.js +1 -0
  444. package/src/assets/jointjs/js/lodash/entriesIn.js +1 -0
  445. package/src/assets/jointjs/js/lodash/eq.js +37 -0
  446. package/src/assets/jointjs/js/lodash/escape.js +43 -0
  447. package/src/assets/jointjs/js/lodash/escapeRegExp.js +32 -0
  448. package/src/assets/jointjs/js/lodash/every.js +56 -0
  449. package/src/assets/jointjs/js/lodash/extend.js +1 -0
  450. package/src/assets/jointjs/js/lodash/extendWith.js +1 -0
  451. package/src/assets/jointjs/js/lodash/fill.js +45 -0
  452. package/src/assets/jointjs/js/lodash/filter.js +48 -0
  453. package/src/assets/jointjs/js/lodash/find.js +42 -0
  454. package/src/assets/jointjs/js/lodash/findIndex.js +55 -0
  455. package/src/assets/jointjs/js/lodash/findKey.js +44 -0
  456. package/src/assets/jointjs/js/lodash/findLast.js +25 -0
  457. package/src/assets/jointjs/js/lodash/findLastIndex.js +59 -0
  458. package/src/assets/jointjs/js/lodash/findLastKey.js +44 -0
  459. package/src/assets/jointjs/js/lodash/first.js +1 -0
  460. package/src/assets/jointjs/js/lodash/flatMap.js +29 -0
  461. package/src/assets/jointjs/js/lodash/flatMapDeep.js +31 -0
  462. package/src/assets/jointjs/js/lodash/flatMapDepth.js +31 -0
  463. package/src/assets/jointjs/js/lodash/flatten.js +22 -0
  464. package/src/assets/jointjs/js/lodash/flattenDeep.js +25 -0
  465. package/src/assets/jointjs/js/lodash/flattenDepth.js +33 -0
  466. package/src/assets/jointjs/js/lodash/flip.js +28 -0
  467. package/src/assets/jointjs/js/lodash/floor.js +26 -0
  468. package/src/assets/jointjs/js/lodash/flow.js +27 -0
  469. package/src/assets/jointjs/js/lodash/flowRight.js +26 -0
  470. package/src/assets/jointjs/js/lodash/forEach.js +41 -0
  471. package/src/assets/jointjs/js/lodash/forEachRight.js +31 -0
  472. package/src/assets/jointjs/js/lodash/forIn.js +39 -0
  473. package/src/assets/jointjs/js/lodash/forInRight.js +37 -0
  474. package/src/assets/jointjs/js/lodash/forOwn.js +36 -0
  475. package/src/assets/jointjs/js/lodash/forOwnRight.js +34 -0
  476. package/src/assets/jointjs/js/lodash/fp/F.js +1 -0
  477. package/src/assets/jointjs/js/lodash/fp/T.js +1 -0
  478. package/src/assets/jointjs/js/lodash/fp/__.js +1 -0
  479. package/src/assets/jointjs/js/lodash/fp/_baseConvert.js +569 -0
  480. package/src/assets/jointjs/js/lodash/fp/_convertBrowser.js +18 -0
  481. package/src/assets/jointjs/js/lodash/fp/_falseOptions.js +7 -0
  482. package/src/assets/jointjs/js/lodash/fp/_mapping.js +358 -0
  483. package/src/assets/jointjs/js/lodash/fp/_util.js +16 -0
  484. package/src/assets/jointjs/js/lodash/fp/add.js +5 -0
  485. package/src/assets/jointjs/js/lodash/fp/after.js +5 -0
  486. package/src/assets/jointjs/js/lodash/fp/all.js +1 -0
  487. package/src/assets/jointjs/js/lodash/fp/allPass.js +1 -0
  488. package/src/assets/jointjs/js/lodash/fp/always.js +1 -0
  489. package/src/assets/jointjs/js/lodash/fp/any.js +1 -0
  490. package/src/assets/jointjs/js/lodash/fp/anyPass.js +1 -0
  491. package/src/assets/jointjs/js/lodash/fp/apply.js +1 -0
  492. package/src/assets/jointjs/js/lodash/fp/array.js +2 -0
  493. package/src/assets/jointjs/js/lodash/fp/ary.js +5 -0
  494. package/src/assets/jointjs/js/lodash/fp/assign.js +5 -0
  495. package/src/assets/jointjs/js/lodash/fp/assignAll.js +5 -0
  496. package/src/assets/jointjs/js/lodash/fp/assignAllWith.js +5 -0
  497. package/src/assets/jointjs/js/lodash/fp/assignIn.js +5 -0
  498. package/src/assets/jointjs/js/lodash/fp/assignInAll.js +5 -0
  499. package/src/assets/jointjs/js/lodash/fp/assignInAllWith.js +5 -0
  500. package/src/assets/jointjs/js/lodash/fp/assignInWith.js +5 -0
  501. package/src/assets/jointjs/js/lodash/fp/assignWith.js +5 -0
  502. package/src/assets/jointjs/js/lodash/fp/assoc.js +1 -0
  503. package/src/assets/jointjs/js/lodash/fp/assocPath.js +1 -0
  504. package/src/assets/jointjs/js/lodash/fp/at.js +5 -0
  505. package/src/assets/jointjs/js/lodash/fp/attempt.js +5 -0
  506. package/src/assets/jointjs/js/lodash/fp/before.js +5 -0
  507. package/src/assets/jointjs/js/lodash/fp/bind.js +5 -0
  508. package/src/assets/jointjs/js/lodash/fp/bindAll.js +5 -0
  509. package/src/assets/jointjs/js/lodash/fp/bindKey.js +5 -0
  510. package/src/assets/jointjs/js/lodash/fp/camelCase.js +5 -0
  511. package/src/assets/jointjs/js/lodash/fp/capitalize.js +5 -0
  512. package/src/assets/jointjs/js/lodash/fp/castArray.js +5 -0
  513. package/src/assets/jointjs/js/lodash/fp/ceil.js +5 -0
  514. package/src/assets/jointjs/js/lodash/fp/chain.js +5 -0
  515. package/src/assets/jointjs/js/lodash/fp/chunk.js +5 -0
  516. package/src/assets/jointjs/js/lodash/fp/clamp.js +5 -0
  517. package/src/assets/jointjs/js/lodash/fp/clone.js +5 -0
  518. package/src/assets/jointjs/js/lodash/fp/cloneDeep.js +5 -0
  519. package/src/assets/jointjs/js/lodash/fp/cloneDeepWith.js +5 -0
  520. package/src/assets/jointjs/js/lodash/fp/cloneWith.js +5 -0
  521. package/src/assets/jointjs/js/lodash/fp/collection.js +2 -0
  522. package/src/assets/jointjs/js/lodash/fp/commit.js +5 -0
  523. package/src/assets/jointjs/js/lodash/fp/compact.js +5 -0
  524. package/src/assets/jointjs/js/lodash/fp/complement.js +1 -0
  525. package/src/assets/jointjs/js/lodash/fp/compose.js +1 -0
  526. package/src/assets/jointjs/js/lodash/fp/concat.js +5 -0
  527. package/src/assets/jointjs/js/lodash/fp/cond.js +5 -0
  528. package/src/assets/jointjs/js/lodash/fp/conforms.js +1 -0
  529. package/src/assets/jointjs/js/lodash/fp/conformsTo.js +5 -0
  530. package/src/assets/jointjs/js/lodash/fp/constant.js +5 -0
  531. package/src/assets/jointjs/js/lodash/fp/contains.js +1 -0
  532. package/src/assets/jointjs/js/lodash/fp/convert.js +18 -0
  533. package/src/assets/jointjs/js/lodash/fp/countBy.js +5 -0
  534. package/src/assets/jointjs/js/lodash/fp/create.js +5 -0
  535. package/src/assets/jointjs/js/lodash/fp/curry.js +5 -0
  536. package/src/assets/jointjs/js/lodash/fp/curryN.js +5 -0
  537. package/src/assets/jointjs/js/lodash/fp/curryRight.js +5 -0
  538. package/src/assets/jointjs/js/lodash/fp/curryRightN.js +5 -0
  539. package/src/assets/jointjs/js/lodash/fp/date.js +2 -0
  540. package/src/assets/jointjs/js/lodash/fp/debounce.js +5 -0
  541. package/src/assets/jointjs/js/lodash/fp/deburr.js +5 -0
  542. package/src/assets/jointjs/js/lodash/fp/defaultTo.js +5 -0
  543. package/src/assets/jointjs/js/lodash/fp/defaults.js +5 -0
  544. package/src/assets/jointjs/js/lodash/fp/defaultsAll.js +5 -0
  545. package/src/assets/jointjs/js/lodash/fp/defaultsDeep.js +5 -0
  546. package/src/assets/jointjs/js/lodash/fp/defaultsDeepAll.js +5 -0
  547. package/src/assets/jointjs/js/lodash/fp/defer.js +5 -0
  548. package/src/assets/jointjs/js/lodash/fp/delay.js +5 -0
  549. package/src/assets/jointjs/js/lodash/fp/difference.js +5 -0
  550. package/src/assets/jointjs/js/lodash/fp/differenceBy.js +5 -0
  551. package/src/assets/jointjs/js/lodash/fp/differenceWith.js +5 -0
  552. package/src/assets/jointjs/js/lodash/fp/dissoc.js +1 -0
  553. package/src/assets/jointjs/js/lodash/fp/dissocPath.js +1 -0
  554. package/src/assets/jointjs/js/lodash/fp/divide.js +5 -0
  555. package/src/assets/jointjs/js/lodash/fp/drop.js +5 -0
  556. package/src/assets/jointjs/js/lodash/fp/dropLast.js +1 -0
  557. package/src/assets/jointjs/js/lodash/fp/dropLastWhile.js +1 -0
  558. package/src/assets/jointjs/js/lodash/fp/dropRight.js +5 -0
  559. package/src/assets/jointjs/js/lodash/fp/dropRightWhile.js +5 -0
  560. package/src/assets/jointjs/js/lodash/fp/dropWhile.js +5 -0
  561. package/src/assets/jointjs/js/lodash/fp/each.js +1 -0
  562. package/src/assets/jointjs/js/lodash/fp/eachRight.js +1 -0
  563. package/src/assets/jointjs/js/lodash/fp/endsWith.js +5 -0
  564. package/src/assets/jointjs/js/lodash/fp/entries.js +1 -0
  565. package/src/assets/jointjs/js/lodash/fp/entriesIn.js +1 -0
  566. package/src/assets/jointjs/js/lodash/fp/eq.js +5 -0
  567. package/src/assets/jointjs/js/lodash/fp/equals.js +1 -0
  568. package/src/assets/jointjs/js/lodash/fp/escape.js +5 -0
  569. package/src/assets/jointjs/js/lodash/fp/escapeRegExp.js +5 -0
  570. package/src/assets/jointjs/js/lodash/fp/every.js +5 -0
  571. package/src/assets/jointjs/js/lodash/fp/extend.js +1 -0
  572. package/src/assets/jointjs/js/lodash/fp/extendAll.js +1 -0
  573. package/src/assets/jointjs/js/lodash/fp/extendAllWith.js +1 -0
  574. package/src/assets/jointjs/js/lodash/fp/extendWith.js +1 -0
  575. package/src/assets/jointjs/js/lodash/fp/fill.js +5 -0
  576. package/src/assets/jointjs/js/lodash/fp/filter.js +5 -0
  577. package/src/assets/jointjs/js/lodash/fp/find.js +5 -0
  578. package/src/assets/jointjs/js/lodash/fp/findFrom.js +5 -0
  579. package/src/assets/jointjs/js/lodash/fp/findIndex.js +5 -0
  580. package/src/assets/jointjs/js/lodash/fp/findIndexFrom.js +5 -0
  581. package/src/assets/jointjs/js/lodash/fp/findKey.js +5 -0
  582. package/src/assets/jointjs/js/lodash/fp/findLast.js +5 -0
  583. package/src/assets/jointjs/js/lodash/fp/findLastFrom.js +5 -0
  584. package/src/assets/jointjs/js/lodash/fp/findLastIndex.js +5 -0
  585. package/src/assets/jointjs/js/lodash/fp/findLastIndexFrom.js +5 -0
  586. package/src/assets/jointjs/js/lodash/fp/findLastKey.js +5 -0
  587. package/src/assets/jointjs/js/lodash/fp/first.js +1 -0
  588. package/src/assets/jointjs/js/lodash/fp/flatMap.js +5 -0
  589. package/src/assets/jointjs/js/lodash/fp/flatMapDeep.js +5 -0
  590. package/src/assets/jointjs/js/lodash/fp/flatMapDepth.js +5 -0
  591. package/src/assets/jointjs/js/lodash/fp/flatten.js +5 -0
  592. package/src/assets/jointjs/js/lodash/fp/flattenDeep.js +5 -0
  593. package/src/assets/jointjs/js/lodash/fp/flattenDepth.js +5 -0
  594. package/src/assets/jointjs/js/lodash/fp/flip.js +5 -0
  595. package/src/assets/jointjs/js/lodash/fp/floor.js +5 -0
  596. package/src/assets/jointjs/js/lodash/fp/flow.js +5 -0
  597. package/src/assets/jointjs/js/lodash/fp/flowRight.js +5 -0
  598. package/src/assets/jointjs/js/lodash/fp/forEach.js +5 -0
  599. package/src/assets/jointjs/js/lodash/fp/forEachRight.js +5 -0
  600. package/src/assets/jointjs/js/lodash/fp/forIn.js +5 -0
  601. package/src/assets/jointjs/js/lodash/fp/forInRight.js +5 -0
  602. package/src/assets/jointjs/js/lodash/fp/forOwn.js +5 -0
  603. package/src/assets/jointjs/js/lodash/fp/forOwnRight.js +5 -0
  604. package/src/assets/jointjs/js/lodash/fp/fromPairs.js +5 -0
  605. package/src/assets/jointjs/js/lodash/fp/function.js +2 -0
  606. package/src/assets/jointjs/js/lodash/fp/functions.js +5 -0
  607. package/src/assets/jointjs/js/lodash/fp/functionsIn.js +5 -0
  608. package/src/assets/jointjs/js/lodash/fp/get.js +5 -0
  609. package/src/assets/jointjs/js/lodash/fp/getOr.js +5 -0
  610. package/src/assets/jointjs/js/lodash/fp/groupBy.js +5 -0
  611. package/src/assets/jointjs/js/lodash/fp/gt.js +5 -0
  612. package/src/assets/jointjs/js/lodash/fp/gte.js +5 -0
  613. package/src/assets/jointjs/js/lodash/fp/has.js +5 -0
  614. package/src/assets/jointjs/js/lodash/fp/hasIn.js +5 -0
  615. package/src/assets/jointjs/js/lodash/fp/head.js +5 -0
  616. package/src/assets/jointjs/js/lodash/fp/identical.js +1 -0
  617. package/src/assets/jointjs/js/lodash/fp/identity.js +5 -0
  618. package/src/assets/jointjs/js/lodash/fp/inRange.js +5 -0
  619. package/src/assets/jointjs/js/lodash/fp/includes.js +5 -0
  620. package/src/assets/jointjs/js/lodash/fp/includesFrom.js +5 -0
  621. package/src/assets/jointjs/js/lodash/fp/indexBy.js +1 -0
  622. package/src/assets/jointjs/js/lodash/fp/indexOf.js +5 -0
  623. package/src/assets/jointjs/js/lodash/fp/indexOfFrom.js +5 -0
  624. package/src/assets/jointjs/js/lodash/fp/init.js +1 -0
  625. package/src/assets/jointjs/js/lodash/fp/initial.js +5 -0
  626. package/src/assets/jointjs/js/lodash/fp/intersection.js +5 -0
  627. package/src/assets/jointjs/js/lodash/fp/intersectionBy.js +5 -0
  628. package/src/assets/jointjs/js/lodash/fp/intersectionWith.js +5 -0
  629. package/src/assets/jointjs/js/lodash/fp/invert.js +5 -0
  630. package/src/assets/jointjs/js/lodash/fp/invertBy.js +5 -0
  631. package/src/assets/jointjs/js/lodash/fp/invertObj.js +1 -0
  632. package/src/assets/jointjs/js/lodash/fp/invoke.js +5 -0
  633. package/src/assets/jointjs/js/lodash/fp/invokeArgs.js +5 -0
  634. package/src/assets/jointjs/js/lodash/fp/invokeArgsMap.js +5 -0
  635. package/src/assets/jointjs/js/lodash/fp/invokeMap.js +5 -0
  636. package/src/assets/jointjs/js/lodash/fp/isArguments.js +5 -0
  637. package/src/assets/jointjs/js/lodash/fp/isArray.js +5 -0
  638. package/src/assets/jointjs/js/lodash/fp/isArrayBuffer.js +5 -0
  639. package/src/assets/jointjs/js/lodash/fp/isArrayLike.js +5 -0
  640. package/src/assets/jointjs/js/lodash/fp/isArrayLikeObject.js +5 -0
  641. package/src/assets/jointjs/js/lodash/fp/isBoolean.js +5 -0
  642. package/src/assets/jointjs/js/lodash/fp/isBuffer.js +5 -0
  643. package/src/assets/jointjs/js/lodash/fp/isDate.js +5 -0
  644. package/src/assets/jointjs/js/lodash/fp/isElement.js +5 -0
  645. package/src/assets/jointjs/js/lodash/fp/isEmpty.js +5 -0
  646. package/src/assets/jointjs/js/lodash/fp/isEqual.js +5 -0
  647. package/src/assets/jointjs/js/lodash/fp/isEqualWith.js +5 -0
  648. package/src/assets/jointjs/js/lodash/fp/isError.js +5 -0
  649. package/src/assets/jointjs/js/lodash/fp/isFinite.js +5 -0
  650. package/src/assets/jointjs/js/lodash/fp/isFunction.js +5 -0
  651. package/src/assets/jointjs/js/lodash/fp/isInteger.js +5 -0
  652. package/src/assets/jointjs/js/lodash/fp/isLength.js +5 -0
  653. package/src/assets/jointjs/js/lodash/fp/isMap.js +5 -0
  654. package/src/assets/jointjs/js/lodash/fp/isMatch.js +5 -0
  655. package/src/assets/jointjs/js/lodash/fp/isMatchWith.js +5 -0
  656. package/src/assets/jointjs/js/lodash/fp/isNaN.js +5 -0
  657. package/src/assets/jointjs/js/lodash/fp/isNative.js +5 -0
  658. package/src/assets/jointjs/js/lodash/fp/isNil.js +5 -0
  659. package/src/assets/jointjs/js/lodash/fp/isNull.js +5 -0
  660. package/src/assets/jointjs/js/lodash/fp/isNumber.js +5 -0
  661. package/src/assets/jointjs/js/lodash/fp/isObject.js +5 -0
  662. package/src/assets/jointjs/js/lodash/fp/isObjectLike.js +5 -0
  663. package/src/assets/jointjs/js/lodash/fp/isPlainObject.js +5 -0
  664. package/src/assets/jointjs/js/lodash/fp/isRegExp.js +5 -0
  665. package/src/assets/jointjs/js/lodash/fp/isSafeInteger.js +5 -0
  666. package/src/assets/jointjs/js/lodash/fp/isSet.js +5 -0
  667. package/src/assets/jointjs/js/lodash/fp/isString.js +5 -0
  668. package/src/assets/jointjs/js/lodash/fp/isSymbol.js +5 -0
  669. package/src/assets/jointjs/js/lodash/fp/isTypedArray.js +5 -0
  670. package/src/assets/jointjs/js/lodash/fp/isUndefined.js +5 -0
  671. package/src/assets/jointjs/js/lodash/fp/isWeakMap.js +5 -0
  672. package/src/assets/jointjs/js/lodash/fp/isWeakSet.js +5 -0
  673. package/src/assets/jointjs/js/lodash/fp/iteratee.js +5 -0
  674. package/src/assets/jointjs/js/lodash/fp/join.js +5 -0
  675. package/src/assets/jointjs/js/lodash/fp/juxt.js +1 -0
  676. package/src/assets/jointjs/js/lodash/fp/kebabCase.js +5 -0
  677. package/src/assets/jointjs/js/lodash/fp/keyBy.js +5 -0
  678. package/src/assets/jointjs/js/lodash/fp/keys.js +5 -0
  679. package/src/assets/jointjs/js/lodash/fp/keysIn.js +5 -0
  680. package/src/assets/jointjs/js/lodash/fp/lang.js +2 -0
  681. package/src/assets/jointjs/js/lodash/fp/last.js +5 -0
  682. package/src/assets/jointjs/js/lodash/fp/lastIndexOf.js +5 -0
  683. package/src/assets/jointjs/js/lodash/fp/lastIndexOfFrom.js +5 -0
  684. package/src/assets/jointjs/js/lodash/fp/lowerCase.js +5 -0
  685. package/src/assets/jointjs/js/lodash/fp/lowerFirst.js +5 -0
  686. package/src/assets/jointjs/js/lodash/fp/lt.js +5 -0
  687. package/src/assets/jointjs/js/lodash/fp/lte.js +5 -0
  688. package/src/assets/jointjs/js/lodash/fp/map.js +5 -0
  689. package/src/assets/jointjs/js/lodash/fp/mapKeys.js +5 -0
  690. package/src/assets/jointjs/js/lodash/fp/mapValues.js +5 -0
  691. package/src/assets/jointjs/js/lodash/fp/matches.js +1 -0
  692. package/src/assets/jointjs/js/lodash/fp/matchesProperty.js +5 -0
  693. package/src/assets/jointjs/js/lodash/fp/math.js +2 -0
  694. package/src/assets/jointjs/js/lodash/fp/max.js +5 -0
  695. package/src/assets/jointjs/js/lodash/fp/maxBy.js +5 -0
  696. package/src/assets/jointjs/js/lodash/fp/mean.js +5 -0
  697. package/src/assets/jointjs/js/lodash/fp/meanBy.js +5 -0
  698. package/src/assets/jointjs/js/lodash/fp/memoize.js +5 -0
  699. package/src/assets/jointjs/js/lodash/fp/merge.js +5 -0
  700. package/src/assets/jointjs/js/lodash/fp/mergeAll.js +5 -0
  701. package/src/assets/jointjs/js/lodash/fp/mergeAllWith.js +5 -0
  702. package/src/assets/jointjs/js/lodash/fp/mergeWith.js +5 -0
  703. package/src/assets/jointjs/js/lodash/fp/method.js +5 -0
  704. package/src/assets/jointjs/js/lodash/fp/methodOf.js +5 -0
  705. package/src/assets/jointjs/js/lodash/fp/min.js +5 -0
  706. package/src/assets/jointjs/js/lodash/fp/minBy.js +5 -0
  707. package/src/assets/jointjs/js/lodash/fp/mixin.js +5 -0
  708. package/src/assets/jointjs/js/lodash/fp/multiply.js +5 -0
  709. package/src/assets/jointjs/js/lodash/fp/nAry.js +1 -0
  710. package/src/assets/jointjs/js/lodash/fp/negate.js +5 -0
  711. package/src/assets/jointjs/js/lodash/fp/next.js +5 -0
  712. package/src/assets/jointjs/js/lodash/fp/noop.js +5 -0
  713. package/src/assets/jointjs/js/lodash/fp/now.js +5 -0
  714. package/src/assets/jointjs/js/lodash/fp/nth.js +5 -0
  715. package/src/assets/jointjs/js/lodash/fp/nthArg.js +5 -0
  716. package/src/assets/jointjs/js/lodash/fp/number.js +2 -0
  717. package/src/assets/jointjs/js/lodash/fp/object.js +2 -0
  718. package/src/assets/jointjs/js/lodash/fp/omit.js +5 -0
  719. package/src/assets/jointjs/js/lodash/fp/omitAll.js +1 -0
  720. package/src/assets/jointjs/js/lodash/fp/omitBy.js +5 -0
  721. package/src/assets/jointjs/js/lodash/fp/once.js +5 -0
  722. package/src/assets/jointjs/js/lodash/fp/orderBy.js +5 -0
  723. package/src/assets/jointjs/js/lodash/fp/over.js +5 -0
  724. package/src/assets/jointjs/js/lodash/fp/overArgs.js +5 -0
  725. package/src/assets/jointjs/js/lodash/fp/overEvery.js +5 -0
  726. package/src/assets/jointjs/js/lodash/fp/overSome.js +5 -0
  727. package/src/assets/jointjs/js/lodash/fp/pad.js +5 -0
  728. package/src/assets/jointjs/js/lodash/fp/padChars.js +5 -0
  729. package/src/assets/jointjs/js/lodash/fp/padCharsEnd.js +5 -0
  730. package/src/assets/jointjs/js/lodash/fp/padCharsStart.js +5 -0
  731. package/src/assets/jointjs/js/lodash/fp/padEnd.js +5 -0
  732. package/src/assets/jointjs/js/lodash/fp/padStart.js +5 -0
  733. package/src/assets/jointjs/js/lodash/fp/parseInt.js +5 -0
  734. package/src/assets/jointjs/js/lodash/fp/partial.js +5 -0
  735. package/src/assets/jointjs/js/lodash/fp/partialRight.js +5 -0
  736. package/src/assets/jointjs/js/lodash/fp/partition.js +5 -0
  737. package/src/assets/jointjs/js/lodash/fp/path.js +1 -0
  738. package/src/assets/jointjs/js/lodash/fp/pathEq.js +1 -0
  739. package/src/assets/jointjs/js/lodash/fp/pathOr.js +1 -0
  740. package/src/assets/jointjs/js/lodash/fp/paths.js +1 -0
  741. package/src/assets/jointjs/js/lodash/fp/pick.js +5 -0
  742. package/src/assets/jointjs/js/lodash/fp/pickAll.js +1 -0
  743. package/src/assets/jointjs/js/lodash/fp/pickBy.js +5 -0
  744. package/src/assets/jointjs/js/lodash/fp/pipe.js +1 -0
  745. package/src/assets/jointjs/js/lodash/fp/placeholder.js +6 -0
  746. package/src/assets/jointjs/js/lodash/fp/plant.js +5 -0
  747. package/src/assets/jointjs/js/lodash/fp/pluck.js +1 -0
  748. package/src/assets/jointjs/js/lodash/fp/prop.js +1 -0
  749. package/src/assets/jointjs/js/lodash/fp/propEq.js +1 -0
  750. package/src/assets/jointjs/js/lodash/fp/propOr.js +1 -0
  751. package/src/assets/jointjs/js/lodash/fp/property.js +1 -0
  752. package/src/assets/jointjs/js/lodash/fp/propertyOf.js +5 -0
  753. package/src/assets/jointjs/js/lodash/fp/props.js +1 -0
  754. package/src/assets/jointjs/js/lodash/fp/pull.js +5 -0
  755. package/src/assets/jointjs/js/lodash/fp/pullAll.js +5 -0
  756. package/src/assets/jointjs/js/lodash/fp/pullAllBy.js +5 -0
  757. package/src/assets/jointjs/js/lodash/fp/pullAllWith.js +5 -0
  758. package/src/assets/jointjs/js/lodash/fp/pullAt.js +5 -0
  759. package/src/assets/jointjs/js/lodash/fp/random.js +5 -0
  760. package/src/assets/jointjs/js/lodash/fp/range.js +5 -0
  761. package/src/assets/jointjs/js/lodash/fp/rangeRight.js +5 -0
  762. package/src/assets/jointjs/js/lodash/fp/rangeStep.js +5 -0
  763. package/src/assets/jointjs/js/lodash/fp/rangeStepRight.js +5 -0
  764. package/src/assets/jointjs/js/lodash/fp/rearg.js +5 -0
  765. package/src/assets/jointjs/js/lodash/fp/reduce.js +5 -0
  766. package/src/assets/jointjs/js/lodash/fp/reduceRight.js +5 -0
  767. package/src/assets/jointjs/js/lodash/fp/reject.js +5 -0
  768. package/src/assets/jointjs/js/lodash/fp/remove.js +5 -0
  769. package/src/assets/jointjs/js/lodash/fp/repeat.js +5 -0
  770. package/src/assets/jointjs/js/lodash/fp/replace.js +5 -0
  771. package/src/assets/jointjs/js/lodash/fp/rest.js +5 -0
  772. package/src/assets/jointjs/js/lodash/fp/restFrom.js +5 -0
  773. package/src/assets/jointjs/js/lodash/fp/result.js +5 -0
  774. package/src/assets/jointjs/js/lodash/fp/reverse.js +5 -0
  775. package/src/assets/jointjs/js/lodash/fp/round.js +5 -0
  776. package/src/assets/jointjs/js/lodash/fp/sample.js +5 -0
  777. package/src/assets/jointjs/js/lodash/fp/sampleSize.js +5 -0
  778. package/src/assets/jointjs/js/lodash/fp/seq.js +2 -0
  779. package/src/assets/jointjs/js/lodash/fp/set.js +5 -0
  780. package/src/assets/jointjs/js/lodash/fp/setWith.js +5 -0
  781. package/src/assets/jointjs/js/lodash/fp/shuffle.js +5 -0
  782. package/src/assets/jointjs/js/lodash/fp/size.js +5 -0
  783. package/src/assets/jointjs/js/lodash/fp/slice.js +5 -0
  784. package/src/assets/jointjs/js/lodash/fp/snakeCase.js +5 -0
  785. package/src/assets/jointjs/js/lodash/fp/some.js +5 -0
  786. package/src/assets/jointjs/js/lodash/fp/sortBy.js +5 -0
  787. package/src/assets/jointjs/js/lodash/fp/sortedIndex.js +5 -0
  788. package/src/assets/jointjs/js/lodash/fp/sortedIndexBy.js +5 -0
  789. package/src/assets/jointjs/js/lodash/fp/sortedIndexOf.js +5 -0
  790. package/src/assets/jointjs/js/lodash/fp/sortedLastIndex.js +5 -0
  791. package/src/assets/jointjs/js/lodash/fp/sortedLastIndexBy.js +5 -0
  792. package/src/assets/jointjs/js/lodash/fp/sortedLastIndexOf.js +5 -0
  793. package/src/assets/jointjs/js/lodash/fp/sortedUniq.js +5 -0
  794. package/src/assets/jointjs/js/lodash/fp/sortedUniqBy.js +5 -0
  795. package/src/assets/jointjs/js/lodash/fp/split.js +5 -0
  796. package/src/assets/jointjs/js/lodash/fp/spread.js +5 -0
  797. package/src/assets/jointjs/js/lodash/fp/spreadFrom.js +5 -0
  798. package/src/assets/jointjs/js/lodash/fp/startCase.js +5 -0
  799. package/src/assets/jointjs/js/lodash/fp/startsWith.js +5 -0
  800. package/src/assets/jointjs/js/lodash/fp/string.js +2 -0
  801. package/src/assets/jointjs/js/lodash/fp/stubArray.js +5 -0
  802. package/src/assets/jointjs/js/lodash/fp/stubFalse.js +5 -0
  803. package/src/assets/jointjs/js/lodash/fp/stubObject.js +5 -0
  804. package/src/assets/jointjs/js/lodash/fp/stubString.js +5 -0
  805. package/src/assets/jointjs/js/lodash/fp/stubTrue.js +5 -0
  806. package/src/assets/jointjs/js/lodash/fp/subtract.js +5 -0
  807. package/src/assets/jointjs/js/lodash/fp/sum.js +5 -0
  808. package/src/assets/jointjs/js/lodash/fp/sumBy.js +5 -0
  809. package/src/assets/jointjs/js/lodash/fp/symmetricDifference.js +1 -0
  810. package/src/assets/jointjs/js/lodash/fp/symmetricDifferenceBy.js +1 -0
  811. package/src/assets/jointjs/js/lodash/fp/symmetricDifferenceWith.js +1 -0
  812. package/src/assets/jointjs/js/lodash/fp/tail.js +5 -0
  813. package/src/assets/jointjs/js/lodash/fp/take.js +5 -0
  814. package/src/assets/jointjs/js/lodash/fp/takeLast.js +1 -0
  815. package/src/assets/jointjs/js/lodash/fp/takeLastWhile.js +1 -0
  816. package/src/assets/jointjs/js/lodash/fp/takeRight.js +5 -0
  817. package/src/assets/jointjs/js/lodash/fp/takeRightWhile.js +5 -0
  818. package/src/assets/jointjs/js/lodash/fp/takeWhile.js +5 -0
  819. package/src/assets/jointjs/js/lodash/fp/tap.js +5 -0
  820. package/src/assets/jointjs/js/lodash/fp/template.js +5 -0
  821. package/src/assets/jointjs/js/lodash/fp/templateSettings.js +5 -0
  822. package/src/assets/jointjs/js/lodash/fp/throttle.js +5 -0
  823. package/src/assets/jointjs/js/lodash/fp/thru.js +5 -0
  824. package/src/assets/jointjs/js/lodash/fp/times.js +5 -0
  825. package/src/assets/jointjs/js/lodash/fp/toArray.js +5 -0
  826. package/src/assets/jointjs/js/lodash/fp/toFinite.js +5 -0
  827. package/src/assets/jointjs/js/lodash/fp/toInteger.js +5 -0
  828. package/src/assets/jointjs/js/lodash/fp/toIterator.js +5 -0
  829. package/src/assets/jointjs/js/lodash/fp/toJSON.js +5 -0
  830. package/src/assets/jointjs/js/lodash/fp/toLength.js +5 -0
  831. package/src/assets/jointjs/js/lodash/fp/toLower.js +5 -0
  832. package/src/assets/jointjs/js/lodash/fp/toNumber.js +5 -0
  833. package/src/assets/jointjs/js/lodash/fp/toPairs.js +5 -0
  834. package/src/assets/jointjs/js/lodash/fp/toPairsIn.js +5 -0
  835. package/src/assets/jointjs/js/lodash/fp/toPath.js +5 -0
  836. package/src/assets/jointjs/js/lodash/fp/toPlainObject.js +5 -0
  837. package/src/assets/jointjs/js/lodash/fp/toSafeInteger.js +5 -0
  838. package/src/assets/jointjs/js/lodash/fp/toString.js +5 -0
  839. package/src/assets/jointjs/js/lodash/fp/toUpper.js +5 -0
  840. package/src/assets/jointjs/js/lodash/fp/transform.js +5 -0
  841. package/src/assets/jointjs/js/lodash/fp/trim.js +5 -0
  842. package/src/assets/jointjs/js/lodash/fp/trimChars.js +5 -0
  843. package/src/assets/jointjs/js/lodash/fp/trimCharsEnd.js +5 -0
  844. package/src/assets/jointjs/js/lodash/fp/trimCharsStart.js +5 -0
  845. package/src/assets/jointjs/js/lodash/fp/trimEnd.js +5 -0
  846. package/src/assets/jointjs/js/lodash/fp/trimStart.js +5 -0
  847. package/src/assets/jointjs/js/lodash/fp/truncate.js +5 -0
  848. package/src/assets/jointjs/js/lodash/fp/unapply.js +1 -0
  849. package/src/assets/jointjs/js/lodash/fp/unary.js +5 -0
  850. package/src/assets/jointjs/js/lodash/fp/unescape.js +5 -0
  851. package/src/assets/jointjs/js/lodash/fp/union.js +5 -0
  852. package/src/assets/jointjs/js/lodash/fp/unionBy.js +5 -0
  853. package/src/assets/jointjs/js/lodash/fp/unionWith.js +5 -0
  854. package/src/assets/jointjs/js/lodash/fp/uniq.js +5 -0
  855. package/src/assets/jointjs/js/lodash/fp/uniqBy.js +5 -0
  856. package/src/assets/jointjs/js/lodash/fp/uniqWith.js +5 -0
  857. package/src/assets/jointjs/js/lodash/fp/uniqueId.js +5 -0
  858. package/src/assets/jointjs/js/lodash/fp/unnest.js +1 -0
  859. package/src/assets/jointjs/js/lodash/fp/unset.js +5 -0
  860. package/src/assets/jointjs/js/lodash/fp/unzip.js +5 -0
  861. package/src/assets/jointjs/js/lodash/fp/unzipWith.js +5 -0
  862. package/src/assets/jointjs/js/lodash/fp/update.js +5 -0
  863. package/src/assets/jointjs/js/lodash/fp/updateWith.js +5 -0
  864. package/src/assets/jointjs/js/lodash/fp/upperCase.js +5 -0
  865. package/src/assets/jointjs/js/lodash/fp/upperFirst.js +5 -0
  866. package/src/assets/jointjs/js/lodash/fp/useWith.js +1 -0
  867. package/src/assets/jointjs/js/lodash/fp/util.js +2 -0
  868. package/src/assets/jointjs/js/lodash/fp/value.js +5 -0
  869. package/src/assets/jointjs/js/lodash/fp/valueOf.js +5 -0
  870. package/src/assets/jointjs/js/lodash/fp/values.js +5 -0
  871. package/src/assets/jointjs/js/lodash/fp/valuesIn.js +5 -0
  872. package/src/assets/jointjs/js/lodash/fp/where.js +1 -0
  873. package/src/assets/jointjs/js/lodash/fp/whereEq.js +1 -0
  874. package/src/assets/jointjs/js/lodash/fp/without.js +5 -0
  875. package/src/assets/jointjs/js/lodash/fp/words.js +5 -0
  876. package/src/assets/jointjs/js/lodash/fp/wrap.js +5 -0
  877. package/src/assets/jointjs/js/lodash/fp/wrapperAt.js +5 -0
  878. package/src/assets/jointjs/js/lodash/fp/wrapperChain.js +5 -0
  879. package/src/assets/jointjs/js/lodash/fp/wrapperLodash.js +5 -0
  880. package/src/assets/jointjs/js/lodash/fp/wrapperReverse.js +5 -0
  881. package/src/assets/jointjs/js/lodash/fp/wrapperValue.js +5 -0
  882. package/src/assets/jointjs/js/lodash/fp/xor.js +5 -0
  883. package/src/assets/jointjs/js/lodash/fp/xorBy.js +5 -0
  884. package/src/assets/jointjs/js/lodash/fp/xorWith.js +5 -0
  885. package/src/assets/jointjs/js/lodash/fp/zip.js +5 -0
  886. package/src/assets/jointjs/js/lodash/fp/zipAll.js +5 -0
  887. package/src/assets/jointjs/js/lodash/fp/zipObj.js +1 -0
  888. package/src/assets/jointjs/js/lodash/fp/zipObject.js +5 -0
  889. package/src/assets/jointjs/js/lodash/fp/zipObjectDeep.js +5 -0
  890. package/src/assets/jointjs/js/lodash/fp/zipWith.js +5 -0
  891. package/src/assets/jointjs/js/lodash/fp.js +2 -0
  892. package/src/assets/jointjs/js/lodash/fromPairs.js +28 -0
  893. package/src/assets/jointjs/js/lodash/function.js +25 -0
  894. package/src/assets/jointjs/js/lodash/functions.js +31 -0
  895. package/src/assets/jointjs/js/lodash/functionsIn.js +31 -0
  896. package/src/assets/jointjs/js/lodash/get.js +33 -0
  897. package/src/assets/jointjs/js/lodash/groupBy.js +41 -0
  898. package/src/assets/jointjs/js/lodash/gt.js +29 -0
  899. package/src/assets/jointjs/js/lodash/gte.js +30 -0
  900. package/src/assets/jointjs/js/lodash/has.js +35 -0
  901. package/src/assets/jointjs/js/lodash/hasIn.js +34 -0
  902. package/src/assets/jointjs/js/lodash/head.js +23 -0
  903. package/src/assets/jointjs/js/lodash/identity.js +21 -0
  904. package/src/assets/jointjs/js/lodash/inRange.js +55 -0
  905. package/src/assets/jointjs/js/lodash/includes.js +53 -0
  906. package/src/assets/jointjs/js/lodash/index.js +1 -0
  907. package/src/assets/jointjs/js/lodash/indexOf.js +42 -0
  908. package/src/assets/jointjs/js/lodash/initial.js +22 -0
  909. package/src/assets/jointjs/js/lodash/intersection.js +30 -0
  910. package/src/assets/jointjs/js/lodash/intersectionBy.js +45 -0
  911. package/src/assets/jointjs/js/lodash/intersectionWith.js +41 -0
  912. package/src/assets/jointjs/js/lodash/invert.js +42 -0
  913. package/src/assets/jointjs/js/lodash/invertBy.js +56 -0
  914. package/src/assets/jointjs/js/lodash/invoke.js +24 -0
  915. package/src/assets/jointjs/js/lodash/invokeMap.js +41 -0
  916. package/src/assets/jointjs/js/lodash/isArguments.js +36 -0
  917. package/src/assets/jointjs/js/lodash/isArray.js +26 -0
  918. package/src/assets/jointjs/js/lodash/isArrayBuffer.js +27 -0
  919. package/src/assets/jointjs/js/lodash/isArrayLike.js +33 -0
  920. package/src/assets/jointjs/js/lodash/isArrayLikeObject.js +33 -0
  921. package/src/assets/jointjs/js/lodash/isBoolean.js +29 -0
  922. package/src/assets/jointjs/js/lodash/isBuffer.js +38 -0
  923. package/src/assets/jointjs/js/lodash/isDate.js +27 -0
  924. package/src/assets/jointjs/js/lodash/isElement.js +25 -0
  925. package/src/assets/jointjs/js/lodash/isEmpty.js +77 -0
  926. package/src/assets/jointjs/js/lodash/isEqual.js +35 -0
  927. package/src/assets/jointjs/js/lodash/isEqualWith.js +41 -0
  928. package/src/assets/jointjs/js/lodash/isError.js +36 -0
  929. package/src/assets/jointjs/js/lodash/isFinite.js +36 -0
  930. package/src/assets/jointjs/js/lodash/isFunction.js +37 -0
  931. package/src/assets/jointjs/js/lodash/isInteger.js +33 -0
  932. package/src/assets/jointjs/js/lodash/isLength.js +35 -0
  933. package/src/assets/jointjs/js/lodash/isMap.js +27 -0
  934. package/src/assets/jointjs/js/lodash/isMatch.js +36 -0
  935. package/src/assets/jointjs/js/lodash/isMatchWith.js +41 -0
  936. package/src/assets/jointjs/js/lodash/isNaN.js +38 -0
  937. package/src/assets/jointjs/js/lodash/isNative.js +40 -0
  938. package/src/assets/jointjs/js/lodash/isNil.js +25 -0
  939. package/src/assets/jointjs/js/lodash/isNull.js +22 -0
  940. package/src/assets/jointjs/js/lodash/isNumber.js +38 -0
  941. package/src/assets/jointjs/js/lodash/isObject.js +31 -0
  942. package/src/assets/jointjs/js/lodash/isObjectLike.js +29 -0
  943. package/src/assets/jointjs/js/lodash/isPlainObject.js +62 -0
  944. package/src/assets/jointjs/js/lodash/isRegExp.js +27 -0
  945. package/src/assets/jointjs/js/lodash/isSafeInteger.js +37 -0
  946. package/src/assets/jointjs/js/lodash/isSet.js +27 -0
  947. package/src/assets/jointjs/js/lodash/isString.js +30 -0
  948. package/src/assets/jointjs/js/lodash/isSymbol.js +29 -0
  949. package/src/assets/jointjs/js/lodash/isTypedArray.js +27 -0
  950. package/src/assets/jointjs/js/lodash/isUndefined.js +22 -0
  951. package/src/assets/jointjs/js/lodash/isWeakMap.js +28 -0
  952. package/src/assets/jointjs/js/lodash/isWeakSet.js +28 -0
  953. package/src/assets/jointjs/js/lodash/iteratee.js +53 -0
  954. package/src/assets/jointjs/js/lodash/join.js +26 -0
  955. package/src/assets/jointjs/js/lodash/kebabCase.js +28 -0
  956. package/src/assets/jointjs/js/lodash/keyBy.js +36 -0
  957. package/src/assets/jointjs/js/lodash/keys.js +37 -0
  958. package/src/assets/jointjs/js/lodash/keysIn.js +32 -0
  959. package/src/assets/jointjs/js/lodash/lang.js +58 -0
  960. package/src/assets/jointjs/js/lodash/last.js +20 -0
  961. package/src/assets/jointjs/js/lodash/lastIndexOf.js +46 -0
  962. package/src/assets/jointjs/js/lodash/lodash.js +17112 -0
  963. package/src/assets/jointjs/js/lodash/lodash.min.js +137 -0
  964. package/src/assets/jointjs/js/lodash/lowerCase.js +27 -0
  965. package/src/assets/jointjs/js/lodash/lowerFirst.js +22 -0
  966. package/src/assets/jointjs/js/lodash/lt.js +29 -0
  967. package/src/assets/jointjs/js/lodash/lte.js +30 -0
  968. package/src/assets/jointjs/js/lodash/map.js +53 -0
  969. package/src/assets/jointjs/js/lodash/mapKeys.js +36 -0
  970. package/src/assets/jointjs/js/lodash/mapValues.js +43 -0
  971. package/src/assets/jointjs/js/lodash/matches.js +39 -0
  972. package/src/assets/jointjs/js/lodash/matchesProperty.js +37 -0
  973. package/src/assets/jointjs/js/lodash/math.js +17 -0
  974. package/src/assets/jointjs/js/lodash/max.js +29 -0
  975. package/src/assets/jointjs/js/lodash/maxBy.js +34 -0
  976. package/src/assets/jointjs/js/lodash/mean.js +22 -0
  977. package/src/assets/jointjs/js/lodash/meanBy.js +31 -0
  978. package/src/assets/jointjs/js/lodash/memoize.js +73 -0
  979. package/src/assets/jointjs/js/lodash/merge.js +39 -0
  980. package/src/assets/jointjs/js/lodash/mergeWith.js +39 -0
  981. package/src/assets/jointjs/js/lodash/method.js +34 -0
  982. package/src/assets/jointjs/js/lodash/methodOf.js +33 -0
  983. package/src/assets/jointjs/js/lodash/min.js +29 -0
  984. package/src/assets/jointjs/js/lodash/minBy.js +34 -0
  985. package/src/assets/jointjs/js/lodash/mixin.js +74 -0
  986. package/src/assets/jointjs/js/lodash/multiply.js +22 -0
  987. package/src/assets/jointjs/js/lodash/negate.js +40 -0
  988. package/src/assets/jointjs/js/lodash/next.js +35 -0
  989. package/src/assets/jointjs/js/lodash/noop.js +17 -0
  990. package/src/assets/jointjs/js/lodash/now.js +23 -0
  991. package/src/assets/jointjs/js/lodash/nth.js +29 -0
  992. package/src/assets/jointjs/js/lodash/nthArg.js +32 -0
  993. package/src/assets/jointjs/js/lodash/number.js +5 -0
  994. package/src/assets/jointjs/js/lodash/object.js +49 -0
  995. package/src/assets/jointjs/js/lodash/omit.js +57 -0
  996. package/src/assets/jointjs/js/lodash/omitBy.js +29 -0
  997. package/src/assets/jointjs/js/lodash/once.js +25 -0
  998. package/src/assets/jointjs/js/lodash/orderBy.js +47 -0
  999. package/src/assets/jointjs/js/lodash/org.js +39 -0
  1000. package/src/assets/jointjs/js/lodash/over.js +24 -0
  1001. package/src/assets/jointjs/js/lodash/overArgs.js +61 -0
  1002. package/src/assets/jointjs/js/lodash/overEvery.js +30 -0
  1003. package/src/assets/jointjs/js/lodash/overSome.js +30 -0
  1004. package/src/assets/jointjs/js/lodash/package.json +1 -0
  1005. package/src/assets/jointjs/js/lodash/pad.js +49 -0
  1006. package/src/assets/jointjs/js/lodash/padEnd.js +39 -0
  1007. package/src/assets/jointjs/js/lodash/padStart.js +39 -0
  1008. package/src/assets/jointjs/js/lodash/parseInt.js +43 -0
  1009. package/src/assets/jointjs/js/lodash/partial.js +50 -0
  1010. package/src/assets/jointjs/js/lodash/partialRight.js +49 -0
  1011. package/src/assets/jointjs/js/lodash/partition.js +43 -0
  1012. package/src/assets/jointjs/js/lodash/pick.js +25 -0
  1013. package/src/assets/jointjs/js/lodash/pickBy.js +37 -0
  1014. package/src/assets/jointjs/js/lodash/plant.js +48 -0
  1015. package/src/assets/jointjs/js/lodash/property.js +32 -0
  1016. package/src/assets/jointjs/js/lodash/propertyOf.js +30 -0
  1017. package/src/assets/jointjs/js/lodash/pull.js +29 -0
  1018. package/src/assets/jointjs/js/lodash/pullAll.js +29 -0
  1019. package/src/assets/jointjs/js/lodash/pullAllBy.js +33 -0
  1020. package/src/assets/jointjs/js/lodash/pullAllWith.js +32 -0
  1021. package/src/assets/jointjs/js/lodash/pullAt.js +43 -0
  1022. package/src/assets/jointjs/js/lodash/random.js +82 -0
  1023. package/src/assets/jointjs/js/lodash/range.js +46 -0
  1024. package/src/assets/jointjs/js/lodash/rangeRight.js +41 -0
  1025. package/src/assets/jointjs/js/lodash/rearg.js +33 -0
  1026. package/src/assets/jointjs/js/lodash/reduce.js +51 -0
  1027. package/src/assets/jointjs/js/lodash/reduceRight.js +36 -0
  1028. package/src/assets/jointjs/js/lodash/reject.js +46 -0
  1029. package/src/assets/jointjs/js/lodash/remove.js +53 -0
  1030. package/src/assets/jointjs/js/lodash/repeat.js +37 -0
  1031. package/src/assets/jointjs/js/lodash/replace.js +29 -0
  1032. package/src/assets/jointjs/js/lodash/rest.js +40 -0
  1033. package/src/assets/jointjs/js/lodash/result.js +56 -0
  1034. package/src/assets/jointjs/js/lodash/reverse.js +34 -0
  1035. package/src/assets/jointjs/js/lodash/round.js +26 -0
  1036. package/src/assets/jointjs/js/lodash/sample.js +24 -0
  1037. package/src/assets/jointjs/js/lodash/sampleSize.js +37 -0
  1038. package/src/assets/jointjs/js/lodash/seq.js +16 -0
  1039. package/src/assets/jointjs/js/lodash/set.js +35 -0
  1040. package/src/assets/jointjs/js/lodash/setWith.js +32 -0
  1041. package/src/assets/jointjs/js/lodash/shuffle.js +25 -0
  1042. package/src/assets/jointjs/js/lodash/size.js +46 -0
  1043. package/src/assets/jointjs/js/lodash/slice.js +37 -0
  1044. package/src/assets/jointjs/js/lodash/snakeCase.js +28 -0
  1045. package/src/assets/jointjs/js/lodash/some.js +51 -0
  1046. package/src/assets/jointjs/js/lodash/sortBy.js +48 -0
  1047. package/src/assets/jointjs/js/lodash/sortedIndex.js +24 -0
  1048. package/src/assets/jointjs/js/lodash/sortedIndexBy.js +33 -0
  1049. package/src/assets/jointjs/js/lodash/sortedIndexOf.js +31 -0
  1050. package/src/assets/jointjs/js/lodash/sortedLastIndex.js +25 -0
  1051. package/src/assets/jointjs/js/lodash/sortedLastIndexBy.js +33 -0
  1052. package/src/assets/jointjs/js/lodash/sortedLastIndexOf.js +31 -0
  1053. package/src/assets/jointjs/js/lodash/sortedUniq.js +24 -0
  1054. package/src/assets/jointjs/js/lodash/sortedUniqBy.js +26 -0
  1055. package/src/assets/jointjs/js/lodash/split.js +52 -0
  1056. package/src/assets/jointjs/js/lodash/spread.js +63 -0
  1057. package/src/assets/jointjs/js/lodash/startCase.js +29 -0
  1058. package/src/assets/jointjs/js/lodash/startsWith.js +39 -0
  1059. package/src/assets/jointjs/js/lodash/string.js +33 -0
  1060. package/src/assets/jointjs/js/lodash/stubArray.js +23 -0
  1061. package/src/assets/jointjs/js/lodash/stubFalse.js +18 -0
  1062. package/src/assets/jointjs/js/lodash/stubObject.js +23 -0
  1063. package/src/assets/jointjs/js/lodash/stubString.js +18 -0
  1064. package/src/assets/jointjs/js/lodash/stubTrue.js +18 -0
  1065. package/src/assets/jointjs/js/lodash/subtract.js +22 -0
  1066. package/src/assets/jointjs/js/lodash/sum.js +24 -0
  1067. package/src/assets/jointjs/js/lodash/sumBy.js +33 -0
  1068. package/src/assets/jointjs/js/lodash/tag.js +43 -0
  1069. package/src/assets/jointjs/js/lodash/tail.js +22 -0
  1070. package/src/assets/jointjs/js/lodash/take.js +37 -0
  1071. package/src/assets/jointjs/js/lodash/takeRight.js +39 -0
  1072. package/src/assets/jointjs/js/lodash/takeRightWhile.js +45 -0
  1073. package/src/assets/jointjs/js/lodash/takeWhile.js +45 -0
  1074. package/src/assets/jointjs/js/lodash/tap.js +29 -0
  1075. package/src/assets/jointjs/js/lodash/template.js +253 -0
  1076. package/src/assets/jointjs/js/lodash/templateSettings.js +67 -0
  1077. package/src/assets/jointjs/js/lodash/throttle.js +69 -0
  1078. package/src/assets/jointjs/js/lodash/thru.js +28 -0
  1079. package/src/assets/jointjs/js/lodash/times.js +51 -0
  1080. package/src/assets/jointjs/js/lodash/toArray.js +58 -0
  1081. package/src/assets/jointjs/js/lodash/toFinite.js +42 -0
  1082. package/src/assets/jointjs/js/lodash/toInteger.js +36 -0
  1083. package/src/assets/jointjs/js/lodash/toIterator.js +23 -0
  1084. package/src/assets/jointjs/js/lodash/toJSON.js +1 -0
  1085. package/src/assets/jointjs/js/lodash/toLength.js +38 -0
  1086. package/src/assets/jointjs/js/lodash/toLower.js +28 -0
  1087. package/src/assets/jointjs/js/lodash/toNumber.js +66 -0
  1088. package/src/assets/jointjs/js/lodash/toPairs.js +30 -0
  1089. package/src/assets/jointjs/js/lodash/toPairsIn.js +30 -0
  1090. package/src/assets/jointjs/js/lodash/toPath.js +33 -0
  1091. package/src/assets/jointjs/js/lodash/toPlainObject.js +32 -0
  1092. package/src/assets/jointjs/js/lodash/toSafeInteger.js +37 -0
  1093. package/src/assets/jointjs/js/lodash/toString.js +28 -0
  1094. package/src/assets/jointjs/js/lodash/toUpper.js +28 -0
  1095. package/src/assets/jointjs/js/lodash/transform.js +65 -0
  1096. package/src/assets/jointjs/js/lodash/trim.js +49 -0
  1097. package/src/assets/jointjs/js/lodash/trimEnd.js +43 -0
  1098. package/src/assets/jointjs/js/lodash/trimStart.js +43 -0
  1099. package/src/assets/jointjs/js/lodash/truncate.js +111 -0
  1100. package/src/assets/jointjs/js/lodash/unary.js +22 -0
  1101. package/src/assets/jointjs/js/lodash/unescape.js +34 -0
  1102. package/src/assets/jointjs/js/lodash/union.js +26 -0
  1103. package/src/assets/jointjs/js/lodash/unionBy.js +39 -0
  1104. package/src/assets/jointjs/js/lodash/unionWith.js +34 -0
  1105. package/src/assets/jointjs/js/lodash/uniq.js +25 -0
  1106. package/src/assets/jointjs/js/lodash/uniqBy.js +31 -0
  1107. package/src/assets/jointjs/js/lodash/uniqWith.js +28 -0
  1108. package/src/assets/jointjs/js/lodash/uniqueId.js +28 -0
  1109. package/src/assets/jointjs/js/lodash/unset.js +34 -0
  1110. package/src/assets/jointjs/js/lodash/unzip.js +45 -0
  1111. package/src/assets/jointjs/js/lodash/unzipWith.js +39 -0
  1112. package/src/assets/jointjs/js/lodash/update.js +35 -0
  1113. package/src/assets/jointjs/js/lodash/updateWith.js +33 -0
  1114. package/src/assets/jointjs/js/lodash/upperCase.js +27 -0
  1115. package/src/assets/jointjs/js/lodash/upperFirst.js +22 -0
  1116. package/src/assets/jointjs/js/lodash/util.js +34 -0
  1117. package/src/assets/jointjs/js/lodash/value.js +1 -0
  1118. package/src/assets/jointjs/js/lodash/valueOf.js +1 -0
  1119. package/src/assets/jointjs/js/lodash/values.js +34 -0
  1120. package/src/assets/jointjs/js/lodash/valuesIn.js +32 -0
  1121. package/src/assets/jointjs/js/lodash/without.js +31 -0
  1122. package/src/assets/jointjs/js/lodash/words.js +35 -0
  1123. package/src/assets/jointjs/js/lodash/wrap.js +30 -0
  1124. package/src/assets/jointjs/js/lodash/wrapperAt.js +48 -0
  1125. package/src/assets/jointjs/js/lodash/wrapperChain.js +34 -0
  1126. package/src/assets/jointjs/js/lodash/wrapperLodash.js +147 -0
  1127. package/src/assets/jointjs/js/lodash/wrapperReverse.js +44 -0
  1128. package/src/assets/jointjs/js/lodash/wrapperValue.js +21 -0
  1129. package/src/assets/jointjs/js/lodash/xor.js +28 -0
  1130. package/src/assets/jointjs/js/lodash/xorBy.js +39 -0
  1131. package/src/assets/jointjs/js/lodash/xorWith.js +34 -0
  1132. package/src/assets/jointjs/js/lodash/zip.js +22 -0
  1133. package/src/assets/jointjs/js/lodash/zipObject.js +24 -0
  1134. package/src/assets/jointjs/js/lodash/zipObjectDeep.js +23 -0
  1135. package/src/assets/jointjs/js/lodash/zipWith.js +32 -0
  1136. package/src/assets/jointjs/js/rappid.js +65022 -0
  1137. package/src/assets/jointjs/scss/bpmn.scss +884 -0
  1138. package/src/assets/jointjs/scss/rappid.scss +8879 -0
  1139. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +2 -2
  1140. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
  1141. package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +7 -4
  1142. package/src/assets/qms-ckeditor-plugin/src/plugins/bpmn/qmsCKEditorBpmnPlugin.js +63 -0
  1143. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorConstant.js +9 -1
  1144. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorService.js +20 -0
  1145. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/converters.js +378 -0
  1146. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemap.js +14 -0
  1147. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapediting.js +183 -0
  1148. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapui.js +49 -0
  1149. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/insertimagemapcommand.js +127 -0
  1150. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/resizeimagemapcommand.js +82 -0
  1151. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/utils.js +234 -0
  1152. package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkediting.js +1 -1
  1153. package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkimage.js +1 -1
  1154. package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkactionsview.js +1 -1
  1155. package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkformview.js +1 -1
  1156. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/inserttooltipcommand.js +1 -1
  1157. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/tooltipediting.js +1 -1
  1158. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/ui/actionsview.js +1 -1
  1159. package/src/assets/qms-ckeditor-plugin/src/themes/icons/bpmn.svg +20 -0
  1160. package/src/assets/qms-ckeditor-plugin/src/themes/icons/imagemap.svg +56 -0
  1161. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/anchor.css +0 -0
  1162. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/link.css +0 -0
  1163. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkactions.css +0 -0
  1164. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkform.css +0 -0
  1165. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkimage.css +0 -0
  1166. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/tooltip.css +0 -0
  1167. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.scss +156 -0
  1168. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.scss +0 -0
  1169. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.scss +27 -0
  1170. package/src/lib/qms-ckeditor-components/styles/_modules.scss +19 -1
  1171. package/src/themes/_color.scss +8 -0
  1172. package/src/themes/core/_colors.scss +2 -0
  1173. package/src/themes/core/_side-sheet.scss +1 -0
  1174. package/src/themes/core/_tab.scss +50 -49
@@ -0,0 +1,1948 @@
1
+ /**
2
+ * Image Map Editor (imgmap) - in-browser imagemap editor
3
+ * Copyright (C) 2006 - 2008 Adam Maschek (adam.maschek @ gmail.com)
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
+ */
19
+ /**
20
+ * @fileoverview
21
+ * Online Image Map Editor - main script file.
22
+ * This is the main script file of the Online Image Map Editor.
23
+ *
24
+ * @date 26-02-2007 2:24:50
25
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
26
+ * @copyright
27
+ * @version 2.2
28
+ *
29
+ */
30
+ /*jslint browser: true, newcap: false, white: false, onevar: false, plusplus: false, eqeqeq: false, nomen: false */
31
+ /*global imgmapStrings:true, window:false, G_vmlCanvasManager:false */
32
+ export class QMSCKEditorImageMapLib {
33
+ constructor(options) {
34
+ /** Version string of imgmap */
35
+ this.version = "2.2";
36
+ /** Build date of imgmap */
37
+ this.buildDate = "2009/08/12 22:18";
38
+ /** Sequential build number of imgmap */
39
+ this.buildNumber = "113";
40
+ /** Status flag to indicate current drawing mode */
41
+ this.is_drawing = 0;
42
+ /** Array to hold language strings */
43
+ this.strings = [];
44
+ /** Helper array for some drawing operations */
45
+ this.memory = [];
46
+ /** Array to hold reference to all areas (canvases) */
47
+ this.areas = [];
48
+ /** Associative array to hold bound event handlers */
49
+ this.eventHandlers = {};
50
+ this.currentid = 0;
51
+ this.draggedId = null;
52
+ this.selectedId = null;
53
+ this.nextShape = 'rect';
54
+ /** Callback events that you can handle in your GUI. */
55
+ this.event_types = [
56
+ 'onAddArea',
57
+ 'onRemoveArea',
58
+ 'onDrawArea',
59
+ 'onResizeArea',
60
+ 'onMoveArea',
61
+ 'onLoadImage',
62
+ 'onSelectArea',
63
+ 'onStatusMessage',
64
+ 'onAreaChanged'
65
+ ];
66
+ this.isLoaded = false;
67
+ /** holds the name of the actively edited map, use getMapName to read it */
68
+ this.mapname = '';
69
+ /** holds the id of the actively edited map, use getMapIdto read it */
70
+ this.mapid = '';
71
+ /** global scale of areas (1-normal, 2-doubled, 0.5-half, etc.) */
72
+ this.globalscale = 1;
73
+ /** is_drawing draw mode constant */
74
+ this.DM_RECTANGLE_DRAW = 1;
75
+ /** is_drawing draw mode constant */
76
+ this.DM_RECTANGLE_MOVE = 11;
77
+ /** is_drawing draw mode constant */
78
+ this.DM_RECTANGLE_RESIZE_TOP = 12;
79
+ /** is_drawing draw mode constant */
80
+ this.DM_RECTANGLE_RESIZE_RIGHT = 13;
81
+ /** is_drawing draw mode constant */
82
+ this.DM_RECTANGLE_RESIZE_BOTTOM = 14;
83
+ /** is_drawing draw mode constant */
84
+ this.DM_RECTANGLE_RESIZE_LEFT = 15;
85
+ /** is_drawing draw mode constant */
86
+ this.DM_SQUARE_DRAW = 2;
87
+ /** is_drawing draw mode constant */
88
+ this.DM_SQUARE_MOVE = 21;
89
+ /** is_drawing draw mode constant */
90
+ this.DM_SQUARE_RESIZE_TOP = 22;
91
+ /** is_drawing draw mode constant */
92
+ this.DM_SQUARE_RESIZE_RIGHT = 23;
93
+ /** is_drawing draw mode constant */
94
+ this.DM_SQUARE_RESIZE_BOTTOM = 24;
95
+ /** is_drawing draw mode constant */
96
+ this.DM_SQUARE_RESIZE_LEFT = 25;
97
+ /** is_drawing draw mode constant */
98
+ this.DM_POLYGON_DRAW = 3;
99
+ /** is_drawing draw mode constant */
100
+ this.DM_POLYGON_LASTDRAW = 30;
101
+ /** is_drawing draw mode constant */
102
+ this.DM_POLYGON_MOVE = 31;
103
+ //browser sniff
104
+ this.isMSIE = false;
105
+ this.isSafari = false;
106
+ /**
107
+ * Main setup function.
108
+ * Can be called manually or constructor will call it.
109
+ * @date 22-02-2007 0:15:42
110
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
111
+ * @param config config object
112
+ * @return True if all went ok.
113
+ */
114
+ this.setup = function (options) {
115
+ //copy non-default options parameters to this.config
116
+ for (var i in options) {
117
+ if (options.hasOwnProperty(i)) {
118
+ this.config[i] = options[i];
119
+ }
120
+ }
121
+ //set document event hooks
122
+ this.addEvent(document, 'keydown', this.eventHandlers.doc_keydown = this.doc_keydown.bind(this));
123
+ this.addEvent(document, 'keyup', this.eventHandlers.doc_keyup = this.doc_keyup.bind(this));
124
+ this.addEvent(document, 'mousedown', this.eventHandlers.doc_mousedown = this.doc_mousedown.bind(this));
125
+ //set imageElement element - supposedly it already exists in the DOM
126
+ this.imageElement = options.imageElement;
127
+ if (!this.imageElement) {
128
+ throw 'The image element must be existed in the DOM';
129
+ }
130
+ if (!this.imageElement.parentElement) {
131
+ throw 'The parent of the image element must be existed in the DOM';
132
+ }
133
+ this.parentImageElement = this.imageElement.parentElement;
134
+ this.disableSelection(this.parentImageElement);
135
+ //wipe all
136
+ this.removeAllAreas();
137
+ //reset scale
138
+ this.globalscale = 1;
139
+ //setup events
140
+ this.addEvent(this.imageElement, "dragstart", this.eventHandlers.img_dragstart = this.img_dragstart.bind(this));
141
+ this.addEvent(this.imageElement, 'mousedown', this.eventHandlers.img_mousedown = this.img_mousedown.bind(this));
142
+ this.addEvent(this.imageElement, 'mouseup', this.eventHandlers.img_mouseup = this.img_mouseup.bind(this));
143
+ this.addEvent(this.imageElement, 'mousemove', this.eventHandlers.img_mousemove = this.img_mousemove.bind(this));
144
+ this.imageElement.style.cursor = this.config.cursor_default;
145
+ //Load strings from a key:value object
146
+ if (options.strings) {
147
+ for (var key in options.strings) {
148
+ if (options.strings.hasOwnProperty(key)) {
149
+ this.strings[key] = options.strings[key];
150
+ }
151
+ }
152
+ }
153
+ //validate event hooks
154
+ var found, j, le;
155
+ for (i in this.config.custom_callbacks) {
156
+ if (this.config.custom_callbacks.hasOwnProperty(i)) {
157
+ found = false;
158
+ for (j = 0, le = this.event_types.length; j < le; j++) {
159
+ if (i == this.event_types[j]) {
160
+ found = true;
161
+ break;
162
+ }
163
+ }
164
+ //TODO: remove invalid callback
165
+ if (!found) {
166
+ this.log("Unknown custom callback: " + i, 1);
167
+ }
168
+ }
169
+ }
170
+ return true;
171
+ };
172
+ /**
173
+ * Attach new 'evt' event handler 'callback' to 'obj'
174
+ * @date 24-02-2007 21:16:20
175
+ * @param obj The object on which the handler is defined.
176
+ * @param evt The name of the event, like mousedown.
177
+ * @param callback The callback function (named if you want it to be removed).
178
+ */
179
+ this.addEvent = function (obj, evt, callback) {
180
+ if (obj.addEventListener) {
181
+ //W3C style model
182
+ obj.addEventListener(evt, callback, false);
183
+ return true;
184
+ }
185
+ else {
186
+ //Microsoft style registration model
187
+ return obj.attachEvent("on" + evt, callback);
188
+ }
189
+ };
190
+ /**
191
+ * Detach 'evt' event handled by 'callback' from 'obj' object.
192
+ * Callback must be a non anonymous function, see eventHandlers.
193
+ * @see #eventHandlers
194
+ * Example: myimgmap.removeEvent(myimgmap.pic, 'mousedown', myimgmap.eventHandlers.img_mousedown);
195
+ * @date 24-11-2007 15:22:17
196
+ * @param obj The object on which the handler is defined.
197
+ * @param evt The name of the event, like mousedown.
198
+ * @param callback The named callback function.
199
+ */
200
+ this.removeEvent = function (obj, evt, callback) {
201
+ if (obj.removeEventListener) {
202
+ //W3C style model
203
+ obj.removeEventListener(evt, callback, false);
204
+ return true;
205
+ }
206
+ else {
207
+ //Microsoft style detach model
208
+ return obj.detachEvent("on" + evt, callback);
209
+ }
210
+ };
211
+ /**
212
+ * Fires custom hook onStatusMessage, passing the status string.
213
+ * Use this to update your GUI.
214
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
215
+ * @date 26-07-2008 13:22:54
216
+ * @param str The status string
217
+ */
218
+ this.statusMessage = function (str) {
219
+ this.fireEvent('onStatusMessage', str);
220
+ };
221
+ /**
222
+ * Adds basic logging functionality using firebug console object if available.
223
+ * @date 20-02-2007 17:55:18
224
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
225
+ * @param obj The object or string you want to debug/echo.
226
+ */
227
+ this.log = function (obj, level) {
228
+ };
229
+ /**
230
+ * Get the map name of the current imagemap.
231
+ * If doesnt exist, nor map id, generate a new name based on timestamp.
232
+ * The most portable solution is to use the same value for id and name.
233
+ * This also conforms the HTML 5 specification, that says:
234
+ * "If the id attribute is also specified, both attributes must have the same value."
235
+ * @link http://www.w3.org/html/wg/html5/#the-map-element
236
+ * @author adam
237
+ * @see #getMapId
238
+ * @return The name of the map.
239
+ */
240
+ this.getMapName = function () {
241
+ if (!this.mapname) {
242
+ if (!!this.mapid) {
243
+ return this.mapid;
244
+ }
245
+ var now = new Date();
246
+ this.mapname = 'imagemap' + now.getFullYear() + (now.getMonth() + 1) + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds();
247
+ }
248
+ return this.mapname;
249
+ };
250
+ /**
251
+ * Get the map id of the current imagemap.
252
+ * If doesnt exist, use map name.
253
+ * @author adam
254
+ * @see #getMapName
255
+ * @return The id of the map.
256
+ */
257
+ this.getMapId = function () {
258
+ if (!this.mapid) {
259
+ this.mapid = this.getMapName();
260
+ }
261
+ return this.mapid;
262
+ };
263
+ this.getMapJson = function () {
264
+ var mapJson = {
265
+ name: this.getMapName(),
266
+ id: this.getMapId(),
267
+ areas: []
268
+ };
269
+ for (var i = 0; i < this.areas.length; i++) {
270
+ const area = this.areas[i];
271
+ if (area && area.lastInput && area.shape) {
272
+ const areaJson = {
273
+ coords: area.lastInput,
274
+ shape: area.shape,
275
+ target: area.atarget,
276
+ alt: area.aalt,
277
+ href: area.ahref
278
+ };
279
+ mapJson.areas.push(areaJson);
280
+ }
281
+ }
282
+ return mapJson;
283
+ };
284
+ /**
285
+ * Convert wild shape names to normal ones.
286
+ * @date 25-12-2008 19:27:06
287
+ * @param shape The name of the shape to convert.
288
+ * @return The normalized shape name, rect as default.
289
+ */
290
+ this._normShape = function (shape) {
291
+ if (!shape) {
292
+ return 'rect';
293
+ }
294
+ shape = trim(shape).toLowerCase();
295
+ if (shape.substring(0, 4) == 'rect') {
296
+ return 'rect';
297
+ }
298
+ if (shape.substring(0, 4) == 'circ') {
299
+ return 'circle';
300
+ }
301
+ if (shape.substring(0, 4) == 'poly') {
302
+ return 'poly';
303
+ }
304
+ return 'rect';
305
+ };
306
+ /**
307
+ * Try to normalize coordinates that came from:
308
+ * 1. html textarea
309
+ * 2. user input in the active area's input field
310
+ * 3. from the html source in case of plugins or highlighter
311
+ * Example of inputs that need to be handled:
312
+ * 035,035 075,062
313
+ * 150,217, 190,257, 150,297,110,257
314
+ * @author adam
315
+ * @param coords The coordinates in a string.
316
+ * @param shape The shape of the object (rect, circle, poly).
317
+ * @param flag Flags that modify the operation. (fromcircle, frompoly, fromrect, preserve)
318
+ * @returns The normalized coordinates.
319
+ */
320
+ this._normCoords = function (coords, shape, flag) {
321
+ //function level var declarations
322
+ var i; //generic cycle counter
323
+ var sx; //smallest x
324
+ var sy; //smallest y
325
+ var gx; //greatest x
326
+ var gy; //greatest y
327
+ var temp, le;
328
+ coords = trim(coords);
329
+ if (coords === '') {
330
+ return '';
331
+ }
332
+ var oldcoords = coords;
333
+ //replace some general junk
334
+ coords = coords.replace(/(\d)([^\d\.])+(\d)/g, "$1,$3"); // Other software might create decimal points, respect them
335
+ coords = coords.replace(/,\D+(\d)/g, ",$1"); //cut leading junk
336
+ coords = coords.replace(/,0+(\d)/g, ",$1"); //cut leading zeros
337
+ coords = coords.replace(/(\d)(\D)+,/g, "$1,");
338
+ coords = coords.replace(/^\D+(\d)/g, "$1"); //cut leading junk
339
+ coords = coords.replace(/^0+(\d)/g, "$1"); //cut leading zeros
340
+ coords = coords.replace(/(\d)(\D)+$/g, "$1"); //cut trailing junk
341
+ //now fix other issues
342
+ var parts = coords.split(',');
343
+ if (shape == 'rect') {
344
+ if (flag == 'fromcircle') {
345
+ var r = parts[2];
346
+ parts[0] = parts[0] - r;
347
+ parts[1] = parts[1] - r;
348
+ parts[2] = parseInt(parts[0], 10) + 2 * r;
349
+ parts[3] = parseInt(parts[1], 10) + 2 * r;
350
+ }
351
+ else if (flag == 'frompoly') {
352
+ sx = parseInt(parts[0], 10);
353
+ gx = parseInt(parts[0], 10);
354
+ sy = parseInt(parts[1], 10);
355
+ gy = parseInt(parts[1], 10);
356
+ for (i = 0, le = parts.length; i < le; i++) {
357
+ if (i % 2 === 0 && parseInt(parts[i], 10) < sx) {
358
+ sx = parseInt(parts[i], 10);
359
+ }
360
+ if (i % 2 === 1 && parseInt(parts[i], 10) < sy) {
361
+ sy = parseInt(parts[i], 10);
362
+ }
363
+ if (i % 2 === 0 && parseInt(parts[i], 10) > gx) {
364
+ gx = parseInt(parts[i], 10);
365
+ }
366
+ if (i % 2 === 1 && parseInt(parts[i], 10) > gy) {
367
+ gy = parseInt(parts[i], 10);
368
+ }
369
+ }
370
+ parts[0] = sx;
371
+ parts[1] = sy;
372
+ parts[2] = gx;
373
+ parts[3] = gy;
374
+ }
375
+ if (!(parseInt(parts[1], 10) >= 0)) {
376
+ parts[1] = parts[0];
377
+ }
378
+ if (!(parseInt(parts[2], 10) >= 0)) {
379
+ parts[2] = parseInt(parts[0], 10) + 10;
380
+ }
381
+ if (!(parseInt(parts[3], 10) >= 0)) {
382
+ parts[3] = parseInt(parts[1], 10) + 10;
383
+ }
384
+ if (parseInt(parts[0], 10) > parseInt(parts[2], 10)) {
385
+ temp = parts[0];
386
+ parts[0] = parts[2];
387
+ parts[2] = temp;
388
+ }
389
+ if (parseInt(parts[1], 10) > parseInt(parts[3], 10)) {
390
+ temp = parts[1];
391
+ parts[1] = parts[3];
392
+ parts[3] = temp;
393
+ }
394
+ coords = parts[0] + "," + parts[1] + "," + parts[2] + "," + parts[3];
395
+ }
396
+ else if (shape == 'circle') {
397
+ if (flag == 'fromrect') {
398
+ sx = parseInt(parts[0], 10);
399
+ gx = parseInt(parts[2], 10);
400
+ sy = parseInt(parts[1], 10);
401
+ gy = parseInt(parts[3], 10);
402
+ //use smaller side
403
+ parts[2] = (gx - sx < gy - sy) ? gx - sx : gy - sy;
404
+ parts[2] = Math.floor(parts[2] / 2); //radius
405
+ parts[0] = sx + parts[2];
406
+ parts[1] = sy + parts[2];
407
+ }
408
+ else if (flag == 'frompoly') {
409
+ sx = parseInt(parts[0], 10);
410
+ gx = parseInt(parts[0], 10);
411
+ sy = parseInt(parts[1], 10);
412
+ gy = parseInt(parts[1], 10);
413
+ for (i = 0, le = parts.length; i < le; i++) {
414
+ if (i % 2 === 0 && parseInt(parts[i], 10) < sx) {
415
+ sx = parseInt(parts[i], 10);
416
+ }
417
+ if (i % 2 === 1 && parseInt(parts[i], 10) < sy) {
418
+ sy = parseInt(parts[i], 10);
419
+ }
420
+ if (i % 2 === 0 && parseInt(parts[i], 10) > gx) {
421
+ gx = parseInt(parts[i], 10);
422
+ }
423
+ if (i % 2 === 1 && parseInt(parts[i], 10) > gy) {
424
+ gy = parseInt(parts[i], 10);
425
+ }
426
+ }
427
+ //use smaller side
428
+ parts[2] = (gx - sx < gy - sy) ? gx - sx : gy - sy;
429
+ parts[2] = Math.floor(parts[2] / 2); //radius
430
+ parts[0] = sx + parts[2];
431
+ parts[1] = sy + parts[2];
432
+ }
433
+ if (!(parseInt(parts[1], 10) > 0)) {
434
+ parts[1] = parts[0];
435
+ }
436
+ if (!(parseInt(parts[2], 10) > 0)) {
437
+ parts[2] = 10;
438
+ }
439
+ coords = parts[0] + "," + parts[1] + "," + parts[2];
440
+ }
441
+ else if (shape == 'poly') {
442
+ if (flag == 'fromrect') {
443
+ parts[4] = parts[2];
444
+ parts[5] = parts[3];
445
+ parts[2] = parts[0];
446
+ parts[6] = parts[4];
447
+ parts[7] = parts[1];
448
+ }
449
+ else if (flag == 'fromcircle') {
450
+ // @ url http://www.pixelwit.com/blog/2007/06/29/basic-circle-drawing-actionscript/
451
+ var centerX = parseInt(parts[0], 10);
452
+ var centerY = parseInt(parts[1], 10);
453
+ var radius = parseInt(parts[2], 10);
454
+ var j = 0;
455
+ parts[j++] = centerX + radius;
456
+ parts[j++] = centerY;
457
+ var sides = 60; //constant = sides the fake circle will have
458
+ for (i = 0; i <= sides; i++) {
459
+ var pointRatio = i / sides;
460
+ var xSteps = Math.cos(pointRatio * 2 * Math.PI);
461
+ var ySteps = Math.sin(pointRatio * 2 * Math.PI);
462
+ var pointX = centerX + xSteps * radius;
463
+ var pointY = centerY + ySteps * radius;
464
+ parts[j++] = Math.round(pointX);
465
+ parts[j++] = Math.round(pointY);
466
+ }
467
+ }
468
+ coords = parts.join(',');
469
+ }
470
+ if (flag == 'preserve' && oldcoords != coords) {
471
+ //return original and throw error
472
+ //throw "invalid coords";
473
+ return oldcoords;
474
+ }
475
+ return coords;
476
+ };
477
+ /**
478
+ * Sets the coordinates according to the given JSON map code or DOM object.
479
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
480
+ * @date 2006-06-07 11:47:16
481
+ * @param map DOM object or string of a map you want to apply.
482
+ * @return True on success
483
+ */
484
+ this.setMapJson = function (map) {
485
+ this.fireEvent('onSetMap', map);
486
+ //remove all areas
487
+ this.removeAllAreas();
488
+ this.mapname = map.name;
489
+ this.mapid = map.id;
490
+ var shape, coords, href, alt, title, target, id;
491
+ for (var i = 0, le = map.areas.length; i < le; i++) {
492
+ shape = coords = href = alt = title = target = '';
493
+ id = this.addNewArea(); //btw id == this.currentid, just this form is a bit clearer
494
+ shape = this._normShape(map.areas[i].shape);
495
+ this.initArea(id, shape);
496
+ if (map.areas[i].coords) {
497
+ //normalize coords
498
+ coords = this._normCoords(map.areas[i].coords, shape);
499
+ this.areas[id].lastInput = coords;
500
+ //for area this one will be set in recalculate
501
+ }
502
+ href = map.areas[i].href;
503
+ if (href) {
504
+ this.areas[id].ahref = href;
505
+ }
506
+ alt = map.areas[i].alt;
507
+ if (alt) {
508
+ this.areas[id].aalt = alt;
509
+ }
510
+ target = map.areas[i].target;
511
+ if (target) {
512
+ target = target.toLowerCase();
513
+ }
514
+ this.areas[id].atarget = target;
515
+ this._recalculate(id, coords); //contains repaint
516
+ this.relaxArea(id);
517
+ this.fireEvent('onAreaChanged', this.areas[id]);
518
+ } //end for areas
519
+ };
520
+ /**
521
+ * Adds a new area. It will later become a canvas.
522
+ * GUI should use the onAddArea callback to act accordingly.
523
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
524
+ * @date 2006-06-06 16:49:25
525
+ * @see #initArea
526
+ */
527
+ this.addNewArea = function () {
528
+ var lastarea = this._getLastArea();
529
+ var id = (lastarea) ? lastarea.aid + 1 : 0;
530
+ //insert new possibly? unknown area (will be initialized at mousedown)
531
+ var area = this.areas[id] = document.createElement('DIV');
532
+ area.id = this.mapname + 'area' + id;
533
+ area.aid = id;
534
+ area.shape = "undefined";
535
+ this.blurArea(this.currentid);
536
+ this.currentid = id;
537
+ return id;
538
+ };
539
+ /**
540
+ * Initialize a new area.
541
+ * Create the canvas, initialize it.
542
+ * Reset area parameters.
543
+ * @param id The id of the area (already existing with undefined shape)
544
+ * @param shape The shape the area will have (rect, circle, poly)
545
+ */
546
+ this.initArea = function (id, shape) {
547
+ var area = this.areas[id];
548
+ if (!area) {
549
+ return;
550
+ } //if all was erased, return
551
+ //remove preinited dummy div or already placed canvas
552
+ if (area.parentNode) {
553
+ area.parentNode.removeChild(area);
554
+ }
555
+ if (area.label) {
556
+ area.label.parentNode.removeChild(area.label);
557
+ }
558
+ //create CANVAS node
559
+ area = this.areas[id] = document.createElement('CANVAS');
560
+ this.parentImageElement.appendChild(area);
561
+ this.parentImageElement.style.position = 'relative';
562
+ // if (typeof G_vmlCanvasManager != "undefined") {
563
+ // //override CANVAS with VML object
564
+ // area = this.areas[id] = G_vmlCanvasManager.initElement(area);
565
+ // }
566
+ area.id = this.mapname + 'area' + id;
567
+ area.aid = id;
568
+ area.shape = shape;
569
+ area.ahref = '';
570
+ area.atitle = '';
571
+ area.aalt = '';
572
+ area.atarget = '';
573
+ area.style.position = 'absolute';
574
+ area.style.top = this.imageElement.offsetTop + 'px';
575
+ area.style.left = this.imageElement.offsetLeft + 'px';
576
+ this._setopacity(area, this.config.CL_DRAW_BG, this.config.draw_opacity);
577
+ //hook event handlers
578
+ area.onmousedown = this.area_mousedown.bind(this);
579
+ area.onmouseup = this.area_mouseup.bind(this);
580
+ area.onmousemove = this.area_mousemove.bind(this);
581
+ area.onmouseover = this.area_mouseover.bind(this);
582
+ area.onmouseout = this.area_mouseout.bind(this);
583
+ //initialize memory object
584
+ this.memory[id] = {};
585
+ this.memory[id].downx = 0;
586
+ this.memory[id].downy = 0;
587
+ this.memory[id].left = 0;
588
+ this.memory[id].top = 0;
589
+ this.memory[id].width = 0;
590
+ this.memory[id].height = 0;
591
+ this.memory[id].xpoints = [];
592
+ this.memory[id].ypoints = [];
593
+ //create label node
594
+ area.label = document.createElement('DIV');
595
+ this.parentImageElement.appendChild(area.label);
596
+ area.label.className = this.config.label_class;
597
+ this.assignCSS(area.label, this.config.label_style);
598
+ area.label.style.position = 'absolute';
599
+ this.fireEvent('onAddArea', id);
600
+ };
601
+ /**
602
+ * Resets area border and opacity to a normal state after drawing.
603
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
604
+ * @date 15-02-2007 22:07:28
605
+ * @param id The id of the area.
606
+
607
+ */
608
+ this.relaxArea = function (id) {
609
+ var area = this.areas[id];
610
+ if (!area) {
611
+ return;
612
+ }
613
+ if (id != this.currentid) {
614
+ this._setBorder(area, 'NORM');
615
+ this._setopacity(area, this.config.CL_NORM_BG, this.config.norm_opacity);
616
+ }
617
+ else
618
+ this.highlightArea(id);
619
+ };
620
+ /**
621
+ * Set border of a given area according to style flag.
622
+ * Possible values of style: NORM, HIGHLIGHT, DRAW.
623
+ * Non-rectangle shapes wont get a border if config.bounding_box is false.
624
+ * @date 26-12-2008 22:34:41
625
+ * @param id The id of the area to set the border on.
626
+ * @param style Coloring style (NORM, HIGHLIGHT, DRAW), see relevant colors in config.
627
+ * @since 2.1
628
+ */
629
+ this._setBorder = function (area, style) {
630
+ if (area.shape == 'rect' || this.config.bounding_box) {
631
+ area.style.borderWidth = '1px';
632
+ area.style.borderStyle = (style == 'DRAW' ? 'dotted' : 'solid');
633
+ area.style.borderColor = this.config['CL_' + style + '_' + (area.shape == 'rect' ? 'SHAPE' : 'BOX')];
634
+ }
635
+ else {
636
+ //clear border
637
+ area.style.border = '';
638
+ }
639
+ };
640
+ /**
641
+ * Set opacity of area to the given percentage, as well as set the background color.
642
+ * If percentage contains a dash(-), the setting of the opacity will be gradual.
643
+ * @param area The area object.
644
+ * @param bgcolor New background color
645
+ * @param pct Percentage of the opacity.
646
+ */
647
+ this._setopacity = function (area, bgcolor, pct) {
648
+ if (bgcolor) {
649
+ area.style.backgroundColor = bgcolor;
650
+ }
651
+ if (pct && typeof pct == 'string' && pct.match(/^\d*\-\d+$/)) {
652
+ //gradual fade
653
+ var parts = pct.split('-');
654
+ if (typeof parts[0] != 'undefined') {
655
+ //set initial opacity
656
+ parts[0] = parseInt(parts[0], 10);
657
+ this._setopacity(area, bgcolor, parts[0]);
658
+ }
659
+ if (typeof parts[1] != 'undefined') {
660
+ parts[1] = parseInt(parts[1], 10);
661
+ var curr = this._getopacity(area);
662
+ var _this = this;
663
+ var diff = Math.round(parts[1] - curr);
664
+ if (diff > 5) {
665
+ window.setTimeout(function () { _this._setopacity(area, null, '-' + parts[1]); }, 20);
666
+ pct = 1 * curr + 5;
667
+ }
668
+ else if (diff < -3) {
669
+ window.setTimeout(function () { _this._setopacity(area, null, '-' + parts[1]); }, 20);
670
+ pct = 1 * curr - 3;
671
+ }
672
+ else {
673
+ //final set
674
+ pct = parts[1];
675
+ }
676
+ }
677
+ }
678
+ if (!isNaN(pct)) {
679
+ pct = Math.round(parseInt(pct, 10));
680
+ area.style.opacity = pct / 100;
681
+ area.style.filter = 'alpha(opacity=' + pct + ')';
682
+ }
683
+ };
684
+ /**
685
+ * Get the currently set opacity of a given area.
686
+ * @author adam
687
+ * @param area The area (canvas) you want to get opacity info from.
688
+ * @return Opacity value in a range of 0-100.
689
+ */
690
+ this._getopacity = function (area) {
691
+ if (area.style.opacity <= 1) {
692
+ return area.style.opacity * 100;
693
+ }
694
+ if (area.style.filter) {
695
+ //alpha(opacity=NaN)
696
+ return parseInt(area.style.filter.replace(/alpha\(opacity\=([^\)]*)\)/ig, "$1"), 10);
697
+ }
698
+ return 100; //default opacity
699
+ };
700
+ /**
701
+ * Removes the area marked by id.
702
+ * Callback will call the GUI code to remove GUI elements.
703
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
704
+ * @date 11-02-2007 20:40:58
705
+ * @param id The id of the area to remove.
706
+ * @see #removeAllAreas
707
+ */
708
+ this.removeArea = function (id) {
709
+ if (id === null || typeof id == "undefined") {
710
+ return;
711
+ } //exit if no id given
712
+ try {
713
+ //remove area and label
714
+ //explicitly set some values to null to avoid IE circular reference memleak
715
+ this.areas[id].label.parentNode.removeChild(this.areas[id].label);
716
+ this.areas[id].parentNode.removeChild(this.areas[id]);
717
+ this.areas[id].label.className = null;
718
+ this.areas[id].label = null;
719
+ this.areas[id].onmouseover = null;
720
+ this.areas[id].onmouseout = null;
721
+ this.areas[id].onmouseup = null;
722
+ this.areas[id].onmousedown = null;
723
+ this.areas[id].onmousemove = null;
724
+ }
725
+ catch (err) {
726
+ }
727
+ this.areas[id] = null;
728
+ this.fireEvent('onRemoveArea', id);
729
+ };
730
+ /**
731
+ * Removes all areas.
732
+ * Will call removeArea on all areas.
733
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
734
+ * @date 2006-06-07 11:55:34
735
+ * @see #removeArea
736
+ */
737
+ this.removeAllAreas = function () {
738
+ for (var i = 0, le = this.areas.length; i < le; i++) {
739
+ if (this.areas[i]) {
740
+ this.removeArea(i);
741
+ }
742
+ }
743
+ };
744
+ /**
745
+ * Scales all areas.
746
+ * Will store scale parameter in globalscale property.
747
+ * This is needed to know how to draw new areas on an already scaled canvas.
748
+ * @author adam
749
+ * @date 02-11-2008 14:13:14
750
+ * @param scale Scale factor (1-original, 0.5-half, 2-double, etc.)
751
+ */
752
+ this.scaleAllAreas = function (scale) {
753
+ var rscale = scale / this.globalscale; //relative scale
754
+ this.globalscale = scale;
755
+ for (var i = 0, le = this.areas.length; i < le; i++) {
756
+ if (this.areas[i] && this.areas[i].shape != 'undefined') {
757
+ this.scaleArea(i, rscale);
758
+ }
759
+ }
760
+ };
761
+ /**
762
+ * Scales one area.
763
+ * @author adam
764
+ * @date 02-11-2008 14:13:14
765
+ * @param rscale Relative scale factor (1-keep, 0.5-half, 2-double, etc.)
766
+ */
767
+ this.scaleArea = function (id, rscale) {
768
+ var area = this.areas[id];
769
+ //set position and new dimensions
770
+ area.style.top = parseInt(area.style.top, 10) * rscale + 'px';
771
+ area.style.left = parseInt(area.style.left, 10) * rscale + 'px';
772
+ this.setAreaSize(id, area.width * rscale, area.height * rscale);
773
+ //handle polygon coordinates scaling
774
+ if (area.shape == 'poly') {
775
+ for (var i = 0, le = area.xpoints.length; i < le; i++) {
776
+ area.xpoints[i] *= rscale;
777
+ area.ypoints[i] *= rscale;
778
+ }
779
+ }
780
+ this._repaint(area, this.config.CL_NORM_SHAPE);
781
+ this._updatecoords(id);
782
+ };
783
+ /**
784
+ * Put label in the top left corner according to label config.
785
+ * By default it will contain the number of the area (area.aid)
786
+ * @param id The id of the area to add label to.
787
+ */
788
+ this._putlabel = function (id) {
789
+ var area = this.areas[id];
790
+ if (!area.label) {
791
+ return;
792
+ } //not yet inited
793
+ try {
794
+ if (!this.config.label) {
795
+ area.label.innerHTML = '';
796
+ area.label.style.display = 'none';
797
+ }
798
+ else {
799
+ area.label.style.display = '';
800
+ var label = this.config.label;
801
+ label = label.replace(/%n/g, String(id));
802
+ label = label.replace(/%c/g, String(area.lastInput));
803
+ label = label.replace(/%h/g, String(area.ahref));
804
+ label = label.replace(/%a/g, String(area.aalt));
805
+ label = label.replace(/%t/g, String(area.atitle));
806
+ area.label.innerHTML = label;
807
+ }
808
+ //align to the top left corner
809
+ area.label.style.top = area.style.top;
810
+ area.label.style.left = area.style.left;
811
+ }
812
+ catch (err) {
813
+ this.log("Error putting label", 1);
814
+ }
815
+ };
816
+ /**
817
+ * Set area title and alt (for IE) according to the hint configuration.
818
+ * This will show up in the usual yellow box when you hover over with the mouse.
819
+ * @param id The id of the area to set hint at.
820
+ */
821
+ this._puthint = function (id) {
822
+ try {
823
+ if (!this.config.hint) {
824
+ this.areas[id].title = '';
825
+ this.areas[id].alt = '';
826
+ }
827
+ else {
828
+ var hint = this.config.hint;
829
+ hint = hint.replace(/%n/g, String(id));
830
+ hint = hint.replace(/%c/g, String(this.areas[id].lastInput));
831
+ hint = hint.replace(/%h/g, String(this.areas[id].ahref));
832
+ hint = hint.replace(/%a/g, String(this.areas[id].aalt));
833
+ hint = hint.replace(/%t/g, String(this.areas[id].atitle));
834
+ this.areas[id].title = hint;
835
+ this.areas[id].alt = hint;
836
+ }
837
+ }
838
+ catch (err) {
839
+ this.log("Error putting hint", 1);
840
+ }
841
+ };
842
+ /**
843
+ * Will call repaint on all areas.
844
+ * Useful when you change labeling or hint config on the GUI.
845
+ * @see #_repaint
846
+ */
847
+ this._repaintAll = function () {
848
+ for (var i = 0, le = this.areas.length; i < le; i++) {
849
+ if (this.areas[i]) {
850
+ this._repaint(this.areas[i], this.config.CL_NORM_SHAPE);
851
+ }
852
+ }
853
+ };
854
+ /**
855
+ * Repaints the actual canvas content.
856
+ * This is the only canvas drawing magic that is happening.
857
+ * In fact rectangles will not have any canvas content, just a normal css border.
858
+ * After repainting the canvas, it will call putlabel and puthint methods.
859
+ * @param area The area object.
860
+ * @param color Color of the line to draw on the canvas.
861
+ * @param x Only used for polygons as the newest control point x.
862
+ * @param y Only used for polygons as the newest control point y.
863
+ */
864
+ this._repaint = function (area, color, x, y) {
865
+ var ctx; //canvas context
866
+ var width, height, left, top; //canvas properties
867
+ var i, le; //loop counter
868
+ if (area.shape == 'circle') {
869
+ width = parseInt(area.style.width, 10);
870
+ var radius = Math.floor(width / 2) - 1;
871
+ if (radius < 0)
872
+ radius = 0;
873
+ //get canvas context
874
+ ctx = area.getContext("2d");
875
+ //clear canvas
876
+ ctx.clearRect(0, 0, width, width);
877
+ //draw circle
878
+ ctx.beginPath();
879
+ ctx.strokeStyle = color;
880
+ ctx.arc(radius, radius, radius, 0, Math.PI * 2, 0);
881
+ ctx.stroke();
882
+ ctx.closePath();
883
+ //draw center
884
+ ctx.strokeStyle = this.config.CL_KNOB;
885
+ ctx.strokeRect(radius, radius, 1, 1);
886
+ //put label
887
+ this._putlabel(area.aid);
888
+ this._puthint(area.aid);
889
+ }
890
+ else if (area.shape == 'rect') {
891
+ //put label
892
+ this._putlabel(area.aid);
893
+ this._puthint(area.aid);
894
+ }
895
+ else if (area.shape == 'poly') {
896
+ width = parseInt(area.style.width, 10);
897
+ height = parseInt(area.style.height, 10);
898
+ left = parseInt(area.style.left, 10);
899
+ top = parseInt(area.style.top, 10);
900
+ if (area.xpoints) {
901
+ //get canvas context
902
+ ctx = area.getContext("2d");
903
+ //clear canvas
904
+ ctx.clearRect(0, 0, width, height);
905
+ //draw polygon
906
+ ctx.beginPath();
907
+ ctx.strokeStyle = color;
908
+ ctx.moveTo(area.xpoints[0] - left, area.ypoints[0] - top);
909
+ for (i = 1, le = area.xpoints.length; i < le; i++) {
910
+ ctx.lineTo(area.xpoints[i] - left, area.ypoints[i] - top);
911
+ }
912
+ if (this.is_drawing == this.DM_POLYGON_DRAW || this.is_drawing == this.DM_POLYGON_LASTDRAW) {
913
+ //only draw to the current position if not moving
914
+ ctx.lineTo(x - left, y - top);
915
+ }
916
+ ctx.lineTo(area.xpoints[0] - left, area.ypoints[0] - top);
917
+ ctx.stroke();
918
+ ctx.closePath();
919
+ }
920
+ //put label
921
+ this._putlabel(area.aid);
922
+ this._puthint(area.aid);
923
+ }
924
+ };
925
+ /**
926
+ * Updates Area coordinates.
927
+ * Called when needed, eg. on mousemove, mousedown.
928
+ * Also updates html container value (thru hook).
929
+ * Calls callback onAreaChanged so that GUI can follow.
930
+ * This is an important hook to your GUI.
931
+ * Uses globalscale to scale real coordinates to area coordinates.
932
+ * @date 2006.10.24. 22:39:27
933
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
934
+ * @param id The id of the area.
935
+ */
936
+ this._updatecoords = function (id) {
937
+ var area = this.areas[id];
938
+ var left = Math.round(parseInt(area.style.left, 10) / this.globalscale);
939
+ var top = Math.round(parseInt(area.style.top, 10) / this.globalscale);
940
+ var height = Math.round(parseInt(area.style.height, 10) / this.globalscale);
941
+ var width = Math.round(parseInt(area.style.width, 10) / this.globalscale);
942
+ var value = '';
943
+ if (area.shape == 'rect') {
944
+ value = left + ',' + top + ',' + (left + width) + ',' + (top + height);
945
+ area.lastInput = value;
946
+ }
947
+ else if (area.shape == 'circle') {
948
+ var radius = Math.floor(width / 2) - 1;
949
+ value = (left + radius) + ',' + (top + radius) + ',' + radius;
950
+ area.lastInput = value;
951
+ }
952
+ else if (area.shape == 'poly') {
953
+ if (area.xpoints) {
954
+ for (var i = 0, le = area.xpoints.length; i < le; i++) {
955
+ value += Math.round(area.xpoints[i] / this.globalscale) + ',' +
956
+ Math.round(area.ypoints[i] / this.globalscale) + ',';
957
+ }
958
+ value = value.substring(0, value.length - 1);
959
+ }
960
+ area.lastInput = value;
961
+ }
962
+ this.fireEvent('onAreaChanged', area);
963
+ };
964
+ /**
965
+ * Updates the visual representation of the area with the given id according
966
+ * to the new coordinates that typically come from an input on the GUI.
967
+ * Uses globalscale to scale area coordinates to real coordinates.
968
+ * @date 2006.10.24. 22:46:55
969
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
970
+ * @param id The id of the area.
971
+ * @param coords The new coords, they will be normalized.
972
+ */
973
+ this._recalculate = function (id, coords) {
974
+ var area = this.areas[id];
975
+ try {
976
+ if (coords) {
977
+ coords = this._normCoords(coords, area.shape, 'preserve');
978
+ }
979
+ else {
980
+ coords = area.lastInput || '';
981
+ }
982
+ var parts = coords.split(',');
983
+ if (area.shape == 'rect') {
984
+ if (parts.length != 4 ||
985
+ parseInt(parts[0], 10) > parseInt(parts[2], 10) ||
986
+ parseInt(parts[1], 10) > parseInt(parts[3], 10)) {
987
+ throw "invalid coords";
988
+ }
989
+ area.style.left = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[0], 10)) + 'px';
990
+ area.style.top = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[1], 10)) + 'px';
991
+ this.setAreaSize(id, this.globalscale * (parts[2] - parts[0]), this.globalscale * (parts[3] - parts[1]));
992
+ this._repaint(area, this.config.CL_NORM_SHAPE);
993
+ }
994
+ else if (area.shape == 'circle') {
995
+ if (parts.length != 3 ||
996
+ parseInt(parts[2], 10) < 0) {
997
+ throw "invalid coords";
998
+ }
999
+ var width = 2 * (parts[2]);
1000
+ this.setAreaSize(id, this.globalscale * width, this.globalscale * width);
1001
+ area.style.left = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[0], 10) - width / 2) + 'px';
1002
+ area.style.top = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[1], 10) - width / 2) + 'px';
1003
+ this._repaint(area, this.config.CL_NORM_SHAPE);
1004
+ }
1005
+ else if (area.shape == 'poly') {
1006
+ if (parts.length < 2) {
1007
+ throw "invalid coords";
1008
+ }
1009
+ area.xpoints = [];
1010
+ area.ypoints = [];
1011
+ for (var i = 0, le = parts.length; i < le; i += 2) {
1012
+ area.xpoints[area.xpoints.length] = this.globalscale * (this.imageElement.offsetLeft + parseInt(parts[i], 10));
1013
+ area.ypoints[area.ypoints.length] = this.globalscale * (this.imageElement.offsetTop + parseInt(parts[i + 1], 10));
1014
+ this._polygongrow(area, this.globalscale * parts[i], this.globalscale * parts[i + 1]);
1015
+ }
1016
+ this._polygonshrink(area); //includes repaint
1017
+ }
1018
+ }
1019
+ catch (err) {
1020
+ var msg = (err.message) ? err.message : 'error calculating coordinates';
1021
+ this.log(msg, 1);
1022
+ this.statusMessage(this.strings.ERR_INVALID_COORDS);
1023
+ if (area.lastInput) {
1024
+ this.fireEvent('onAreaChanged', area);
1025
+ }
1026
+ this._repaint(area, this.config.CL_NORM_SHAPE);
1027
+ return;
1028
+ }
1029
+ //on success update lastInput
1030
+ area.lastInput = coords;
1031
+ };
1032
+ /**
1033
+ * Grow polygon area to be able to contain the given new coordinates.
1034
+ * @author adam
1035
+ * @param area The area to grow.
1036
+ * @param newx The new coordinate x.
1037
+ * @param newy The new coordinate y.
1038
+ * @see #_polygonshrink
1039
+ */
1040
+ this._polygongrow = function (area, newx, newy) {
1041
+ var xdiff = newx - parseInt(area.style.left, 10);
1042
+ var ydiff = newy - parseInt(area.style.top, 10);
1043
+ var pad = 0; //padding on the edges
1044
+ var pad2 = 0; //twice the padding
1045
+ if (newx < parseInt(area.style.left, 10)) {
1046
+ area.style.left = (newx - pad) + 'px';
1047
+ this.setAreaSize(area.aid, parseInt(area.style.width, 10) + Math.abs(xdiff) + pad2, null);
1048
+ }
1049
+ else if (newx > parseInt(area.style.left, 10) + parseInt(area.style.width, 10)) {
1050
+ this.setAreaSize(area.aid, newx - parseInt(area.style.left, 10) + pad2, null);
1051
+ }
1052
+ if (newy < parseInt(area.style.top, 10)) {
1053
+ area.style.top = (newy - pad) + 'px';
1054
+ this.setAreaSize(area.aid, null, parseInt(area.style.height, 10) + Math.abs(ydiff) + pad2);
1055
+ }
1056
+ else if (newy > parseInt(area.style.top, 10) + parseInt(area.style.height, 10)) {
1057
+ this.setAreaSize(area.aid, null, newy - parseInt(area.style.top, 10) + pad2);
1058
+ }
1059
+ };
1060
+ /**
1061
+ * Shrink the polygon bounding area to the necessary size, by first reducing it
1062
+ * to the minimum, and then gradually growing it.
1063
+ * We need this because while we were drawing the polygon, it might have expanded
1064
+ * the canvas more than needed.
1065
+ * Will repaint the area.
1066
+ * @author adam
1067
+ * @param area The area to shrink.
1068
+ * @see #_polygongrow
1069
+ */
1070
+ this._polygonshrink = function (area) {
1071
+ area.style.left = (area.xpoints[0]) + 'px';
1072
+ area.style.top = (area.ypoints[0]) + 'px';
1073
+ this.setAreaSize(area.aid, 0, 0);
1074
+ for (var i = 0, le = area.xpoints.length; i < le; i++) {
1075
+ this._polygongrow(area, area.xpoints[i], area.ypoints[i]);
1076
+ }
1077
+ this._repaint(area, this.config.CL_NORM_SHAPE);
1078
+ };
1079
+ /**
1080
+ * EVENT HANDLER: Handles mousemove on the image.
1081
+ * This is the main drawing routine.
1082
+ * Depending on the current shape, will draw the rect/circle/poly to the new position.
1083
+ * @param e The event object.
1084
+ */
1085
+ this.img_mousemove = function (e) {
1086
+ //function level var declarations
1087
+ var xdiff, ydiff, diff;
1088
+ //event.x is relative to parent element, but page.x is NOT
1089
+ //pos coordinates are the same absolute coords, offset coords are relative to parent
1090
+ const windowEvent = window.event;
1091
+ var pos = this._getPos(this.imageElement), x = (this.isMSIE) ? (windowEvent.x + this.parentImageElement.scrollLeft - this.imageElement.offsetLeft) : (e.clientX - pos.x), y = (this.isMSIE) ? (windowEvent.y + this.parentImageElement.scrollTop - this.imageElement.offsetTop) : (e.clientY - pos.y);
1092
+ x = Math.round(x);
1093
+ y = Math.round(y);
1094
+ //exit if outside image
1095
+ if (x < 0 || y < 0 || x > this.imageElement.width || y > this.imageElement.height) {
1096
+ return;
1097
+ }
1098
+ //old dimensions that need to be updated in this function
1099
+ if (this.memory[this.currentid]) {
1100
+ var top = this.memory[this.currentid].top;
1101
+ var left = this.memory[this.currentid].left;
1102
+ var height = this.memory[this.currentid].height;
1103
+ var width = this.memory[this.currentid].width;
1104
+ }
1105
+ var area = this.areas[this.currentid];
1106
+ // Handle shift state for Safari
1107
+ // Safari doesn't generate keyboard events for modifiers: http://bugs.webkit.org/show_bug.cgi?id=11696
1108
+ if (this.isSafari) {
1109
+ if (e.shiftKey) {
1110
+ if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
1111
+ this.is_drawing = this.DM_SQUARE_DRAW;
1112
+ this.statusMessage(this.strings.SQUARE_DRAW);
1113
+ }
1114
+ }
1115
+ else {
1116
+ if (this.is_drawing == this.DM_SQUARE_DRAW && area.shape == 'rect') {
1117
+ //not for circle!
1118
+ this.is_drawing = this.DM_RECTANGLE_DRAW;
1119
+ this.statusMessage(this.strings.RECTANGLE_DRAW);
1120
+ }
1121
+ }
1122
+ }
1123
+ if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
1124
+ //rectangle mode
1125
+ this.fireEvent('onDrawArea', this.currentid);
1126
+ xdiff = x - this.memory[this.currentid].downx;
1127
+ ydiff = y - this.memory[this.currentid].downy;
1128
+ this.setAreaSize(this.currentid, Math.abs(xdiff), Math.abs(ydiff));
1129
+ if (xdiff < 0) {
1130
+ area.style.left = (x + 1) + 'px';
1131
+ }
1132
+ if (ydiff < 0) {
1133
+ area.style.top = (y + 1) + 'px';
1134
+ }
1135
+ }
1136
+ else if (this.is_drawing == this.DM_SQUARE_DRAW) {
1137
+ //square mode - align to shorter side
1138
+ this.fireEvent('onDrawArea', this.currentid);
1139
+ xdiff = x - this.memory[this.currentid].downx;
1140
+ ydiff = y - this.memory[this.currentid].downy;
1141
+ if (Math.abs(xdiff) < Math.abs(ydiff)) {
1142
+ diff = Math.abs(parseInt(xdiff, 10));
1143
+ }
1144
+ else {
1145
+ diff = Math.abs(parseInt(ydiff, 10));
1146
+ }
1147
+ this.setAreaSize(this.currentid, diff, diff);
1148
+ if (xdiff < 0) {
1149
+ area.style.left = (this.memory[this.currentid].downx + diff * -1) + 'px';
1150
+ }
1151
+ if (ydiff < 0) {
1152
+ area.style.top = (this.memory[this.currentid].downy + diff * -1 + 1) + 'px';
1153
+ }
1154
+ }
1155
+ else if (this.is_drawing == this.DM_POLYGON_DRAW) {
1156
+ //polygon mode
1157
+ this.fireEvent('onDrawArea', this.currentid);
1158
+ this._polygongrow(area, x, y);
1159
+ }
1160
+ else if (this.is_drawing == this.DM_RECTANGLE_MOVE || this.is_drawing == this.DM_SQUARE_MOVE) {
1161
+ this.fireEvent('onMoveArea', this.currentid);
1162
+ x = x - this.memory[this.currentid].rdownx;
1163
+ y = y - this.memory[this.currentid].rdowny;
1164
+ if (x + width > this.imageElement.width || y + height > this.imageElement.height) {
1165
+ return;
1166
+ }
1167
+ if (x < 0 || y < 0) {
1168
+ return;
1169
+ }
1170
+ area.style.left = x + 1 + 'px';
1171
+ area.style.top = y + 1 + 'px';
1172
+ }
1173
+ else if (this.is_drawing == this.DM_POLYGON_MOVE) {
1174
+ this.fireEvent('onMoveArea', this.currentid);
1175
+ x = x - this.memory[this.currentid].rdownx;
1176
+ y = y - this.memory[this.currentid].rdowny;
1177
+ if (x + width > this.imageElement.width || y + height > this.imageElement.height) {
1178
+ return;
1179
+ }
1180
+ if (x < 0 || y < 0) {
1181
+ return;
1182
+ }
1183
+ xdiff = x - left;
1184
+ ydiff = y - top;
1185
+ if (area.xpoints) {
1186
+ for (var i = 0, le = area.xpoints.length; i < le; i++) {
1187
+ area.xpoints[i] = this.memory[this.currentid].xpoints[i] + xdiff;
1188
+ area.ypoints[i] = this.memory[this.currentid].ypoints[i] + ydiff;
1189
+ }
1190
+ }
1191
+ area.style.left = x + 'px';
1192
+ area.style.top = y + 'px';
1193
+ }
1194
+ else if (this.is_drawing == this.DM_SQUARE_RESIZE_LEFT) {
1195
+ this.fireEvent('onResizeArea', this.currentid);
1196
+ diff = x - left;
1197
+ if ((width + (-1 * diff)) > 0) {
1198
+ //real resize left
1199
+ area.style.left = x + 1 + 'px';
1200
+ area.style.top = (top + (diff / 2)) + 'px';
1201
+ this.setAreaSize(this.currentid, parseInt(width + (-1 * diff), 10), parseInt(height + (-1 * diff), 10));
1202
+ }
1203
+ else {
1204
+ //jump to another state
1205
+ this.memory[this.currentid].width = 0;
1206
+ this.memory[this.currentid].height = 0;
1207
+ this.memory[this.currentid].left = x;
1208
+ this.memory[this.currentid].top = y;
1209
+ this.is_drawing = this.DM_SQUARE_RESIZE_RIGHT;
1210
+ }
1211
+ }
1212
+ else if (this.is_drawing == this.DM_SQUARE_RESIZE_RIGHT) {
1213
+ this.fireEvent('onResizeArea', this.currentid);
1214
+ diff = x - left - width;
1215
+ if ((width + (diff)) - 1 > 0) {
1216
+ //real resize right
1217
+ area.style.top = (top + (-1 * diff / 2)) + 'px';
1218
+ this.setAreaSize(this.currentid, (width + (diff)) - 1, (height + (diff)));
1219
+ }
1220
+ else {
1221
+ //jump to another state
1222
+ this.memory[this.currentid].width = 0;
1223
+ this.memory[this.currentid].height = 0;
1224
+ this.memory[this.currentid].left = x;
1225
+ this.memory[this.currentid].top = y;
1226
+ this.is_drawing = this.DM_SQUARE_RESIZE_LEFT;
1227
+ }
1228
+ }
1229
+ else if (this.is_drawing == this.DM_SQUARE_RESIZE_TOP) {
1230
+ this.fireEvent('onResizeArea', this.currentid);
1231
+ diff = y - top;
1232
+ if ((width + (-1 * diff)) > 0) {
1233
+ //real resize top
1234
+ area.style.top = y + 1 + 'px';
1235
+ area.style.left = (left + (diff / 2)) + 'px';
1236
+ this.setAreaSize(this.currentid, (width + (-1 * diff)), (height + (-1 * diff)));
1237
+ }
1238
+ else {
1239
+ //jump to another state
1240
+ this.memory[this.currentid].width = 0;
1241
+ this.memory[this.currentid].height = 0;
1242
+ this.memory[this.currentid].left = x;
1243
+ this.memory[this.currentid].top = y;
1244
+ this.is_drawing = this.DM_SQUARE_RESIZE_BOTTOM;
1245
+ }
1246
+ }
1247
+ else if (this.is_drawing == this.DM_SQUARE_RESIZE_BOTTOM) {
1248
+ this.fireEvent('onResizeArea', this.currentid);
1249
+ diff = y - top - height;
1250
+ if ((width + (diff)) - 1 > 0) {
1251
+ //real resize bottom
1252
+ area.style.left = (left + (-1 * diff / 2)) + 'px';
1253
+ this.setAreaSize(this.currentid, (width + (diff)) - 1, (height + (diff)) - 1);
1254
+ }
1255
+ else {
1256
+ //jump to another state
1257
+ this.memory[this.currentid].width = 0;
1258
+ this.memory[this.currentid].height = 0;
1259
+ this.memory[this.currentid].left = x;
1260
+ this.memory[this.currentid].top = y;
1261
+ this.is_drawing = this.DM_SQUARE_RESIZE_TOP;
1262
+ }
1263
+ }
1264
+ else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_LEFT) {
1265
+ this.fireEvent('onResizeArea', this.currentid);
1266
+ xdiff = x - left;
1267
+ if (width + (-1 * xdiff) > 0) {
1268
+ //real resize left
1269
+ area.style.left = x + 1 + 'px';
1270
+ this.setAreaSize(this.currentid, width + (-1 * xdiff), null);
1271
+ }
1272
+ else {
1273
+ //jump to another state
1274
+ this.memory[this.currentid].width = 0;
1275
+ this.memory[this.currentid].left = x;
1276
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_RIGHT;
1277
+ }
1278
+ }
1279
+ else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_RIGHT) {
1280
+ this.fireEvent('onResizeArea', this.currentid);
1281
+ xdiff = x - left - width;
1282
+ if ((width + (xdiff)) - 1 > 0) {
1283
+ //real resize right
1284
+ this.setAreaSize(this.currentid, (width + (xdiff)) - 1, null);
1285
+ }
1286
+ else {
1287
+ //jump to another state
1288
+ this.memory[this.currentid].width = 0;
1289
+ this.memory[this.currentid].left = x;
1290
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_LEFT;
1291
+ }
1292
+ }
1293
+ else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_TOP) {
1294
+ this.fireEvent('onResizeArea', this.currentid);
1295
+ ydiff = y - top;
1296
+ if ((height + (-1 * ydiff)) > 0) {
1297
+ //real resize top
1298
+ area.style.top = y + 1 + 'px';
1299
+ this.setAreaSize(this.currentid, null, (height + (-1 * ydiff)));
1300
+ }
1301
+ else {
1302
+ //jump to another state
1303
+ this.memory[this.currentid].height = 0;
1304
+ this.memory[this.currentid].top = y;
1305
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_BOTTOM;
1306
+ }
1307
+ }
1308
+ else if (this.is_drawing == this.DM_RECTANGLE_RESIZE_BOTTOM) {
1309
+ this.fireEvent('onResizeArea', this.currentid);
1310
+ ydiff = y - top - height;
1311
+ if ((height + (ydiff)) - 1 > 0) {
1312
+ //real resize bottom
1313
+ this.setAreaSize(this.currentid, null, (height + (ydiff)) - 1);
1314
+ }
1315
+ else {
1316
+ //jump to another state
1317
+ this.memory[this.currentid].height = 0;
1318
+ this.memory[this.currentid].top = y;
1319
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_TOP;
1320
+ }
1321
+ }
1322
+ //repaint canvas elements
1323
+ if (this.is_drawing) {
1324
+ this._repaint(area, this.config.CL_DRAW_SHAPE, x, y);
1325
+ this._updatecoords(this.currentid);
1326
+ }
1327
+ };
1328
+ /**
1329
+ * EVENT HANDLER: Handles mouseup on the image.
1330
+ * Handles dragging and resizing.
1331
+ * @param e The event object.
1332
+ */
1333
+ this.img_mouseup = function (e) {
1334
+ const windowEvent = window.event;
1335
+ var pos = this._getPos(this.imageElement), x = (this.isMSIE) ? (windowEvent.x + this.parentImageElement.scrollLeft - this.imageElement.offsetLeft) : (e.clientX - pos.x), y = (this.isMSIE) ? (windowEvent.y + this.parentImageElement.scrollTop - this.imageElement.offsetTop) : (e.clientY - pos.y);
1336
+ x = Math.round(x);
1337
+ y = Math.round(y);
1338
+ //for everything that is move or resize
1339
+ if (this.is_drawing != this.DM_RECTANGLE_DRAW &&
1340
+ this.is_drawing != this.DM_SQUARE_DRAW &&
1341
+ this.is_drawing != this.DM_POLYGON_DRAW &&
1342
+ this.is_drawing != this.DM_POLYGON_LASTDRAW) {
1343
+ //end dragging
1344
+ this.draggedId = null;
1345
+ //finish state
1346
+ this.is_drawing = 0;
1347
+ this.statusMessage(this.strings.READY);
1348
+ this.relaxArea(this.currentid);
1349
+ if (this.areas[this.currentid] == this._getLastArea()) {
1350
+ return;
1351
+ }
1352
+ this.memory[this.currentid].downx = x;
1353
+ this.memory[this.currentid].downy = y;
1354
+ }
1355
+ };
1356
+ this.img_dragstart = function (e) {
1357
+ e.preventDefault();
1358
+ };
1359
+ /**
1360
+ * EVENT HANDLER: Handles mousedown on the image.
1361
+ * Handles beggining or end of draw, or polygon point set.
1362
+ * @param e The event object.
1363
+ */
1364
+ this.img_mousedown = function (e) {
1365
+ if (!e)
1366
+ e = window.event;
1367
+ var pos = this._getPos(this.imageElement), x = Math.round(e.clientX - pos.x), y = Math.round(e.clientY - pos.y);
1368
+ // Handle the Shift state
1369
+ if (e.shiftKey) {
1370
+ if (this.is_drawing == this.DM_POLYGON_DRAW) {
1371
+ this.is_drawing = this.DM_POLYGON_LASTDRAW;
1372
+ }
1373
+ }
1374
+ var area = this.areas[this.currentid];
1375
+ if (this.is_drawing == this.DM_POLYGON_DRAW) {
1376
+ //its not finish state yet
1377
+ area.xpoints[area.xpoints.length] = x;
1378
+ area.ypoints[area.ypoints.length] = y;
1379
+ this.memory[this.currentid].downx = x;
1380
+ this.memory[this.currentid].downy = y;
1381
+ return;
1382
+ }
1383
+ else if (this.is_drawing && this.is_drawing != this.DM_POLYGON_DRAW) {
1384
+ //finish any other state
1385
+ if (this.is_drawing == this.DM_POLYGON_LASTDRAW) {
1386
+ //add last controlpoint and update coords
1387
+ area.xpoints[area.xpoints.length] = x;
1388
+ area.ypoints[area.ypoints.length] = y;
1389
+ this._updatecoords(this.currentid);
1390
+ this.is_drawing = 0;
1391
+ this._polygonshrink(area);
1392
+ }
1393
+ this.is_drawing = 0;
1394
+ this.statusMessage(this.strings.READY);
1395
+ this.relaxArea(this.currentid);
1396
+ if (this.areas[this.currentid] == this._getLastArea()) {
1397
+ return;
1398
+ }
1399
+ return;
1400
+ }
1401
+ if (!this.nextShape) {
1402
+ return;
1403
+ }
1404
+ this.addNewArea();
1405
+ this.initArea(this.currentid, this.nextShape);
1406
+ if (this.areas[this.currentid].shape == 'poly') {
1407
+ this.is_drawing = this.DM_POLYGON_DRAW;
1408
+ this.statusMessage(this.strings.POLYGON_DRAW);
1409
+ this.areas[this.currentid].style.left = x + 'px';
1410
+ this.areas[this.currentid].style.top = y + 'px';
1411
+ this.areas[this.currentid].style.width = 0;
1412
+ this.areas[this.currentid].style.height = 0;
1413
+ this.areas[this.currentid].xpoints = [];
1414
+ this.areas[this.currentid].ypoints = [];
1415
+ this.areas[this.currentid].xpoints[0] = x;
1416
+ this.areas[this.currentid].ypoints[0] = y;
1417
+ }
1418
+ else if (this.areas[this.currentid].shape == 'rect') {
1419
+ this.is_drawing = this.DM_RECTANGLE_DRAW;
1420
+ this.statusMessage(this.strings.RECTANGLE_DRAW);
1421
+ this.areas[this.currentid].style.left = x + 'px';
1422
+ this.areas[this.currentid].style.top = y + 'px';
1423
+ this.areas[this.currentid].style.width = 0;
1424
+ this.areas[this.currentid].style.height = 0;
1425
+ }
1426
+ else if (this.areas[this.currentid].shape == 'circle') {
1427
+ this.is_drawing = this.DM_SQUARE_DRAW;
1428
+ this.statusMessage(this.strings.CIRCLE_DRAW);
1429
+ this.areas[this.currentid].style.left = x + 'px';
1430
+ this.areas[this.currentid].style.top = y + 'px';
1431
+ this.areas[this.currentid].style.width = 0;
1432
+ this.areas[this.currentid].style.height = 0;
1433
+ }
1434
+ this._setBorder(this.areas[this.currentid], 'DRAW');
1435
+ this.memory[this.currentid].downx = x;
1436
+ this.memory[this.currentid].downy = y;
1437
+ };
1438
+ /**
1439
+ * Highlights a given area.
1440
+ * Sets opacity and repaints.
1441
+ * @date 2007.12.28. 18:23:00
1442
+ * @param id The id of the area to blur.
1443
+
1444
+ */
1445
+ this.highlightArea = function (id) {
1446
+ if (this.is_drawing) {
1447
+ return;
1448
+ } //exit if in drawing state
1449
+ var area = this.areas[id];
1450
+ if (area && area.shape != 'undefined') {
1451
+ //area exists - highlight it
1452
+ this._setBorder(area, 'HIGHLIGHT');
1453
+ this._setopacity(area, this.config.CL_HIGHLIGHT_BG, '-' + this.config.highlight_opacity);
1454
+ this._repaint(area, this.config.CL_HIGHLIGHT_SHAPE);
1455
+ }
1456
+ };
1457
+ /**
1458
+ * Blurs a given area.
1459
+ * Sets opacity and repaints.
1460
+ * @date 2007.12.28. 18:23:26
1461
+ * @param id The id of the area to blur.
1462
+
1463
+ */
1464
+ this.blurArea = function (id) {
1465
+ if (this.is_drawing) {
1466
+ return;
1467
+ } //exit if in drawing state
1468
+ var area = this.areas[id];
1469
+ if (area && area.shape != 'undefined') {
1470
+ //area exists - fade it back
1471
+ this._setBorder(area, 'NORM');
1472
+ this._setopacity(area, this.config.CL_NORM_BG, '-' + this.config.norm_opacity);
1473
+ this._repaint(area, this.config.CL_NORM_SHAPE);
1474
+ }
1475
+ };
1476
+ /**
1477
+ * EVENT HANDLER: Handles event of mousemove on imgmap areas.
1478
+ * - changes cursor depending where we are inside the area (buggy in opera)
1479
+ * - handles area resize
1480
+ * - handles area move
1481
+ * @url http://evolt.org/article/Mission_Impossible_mouse_position/17/23335/index.html
1482
+ * @url http://my.opera.com/community/forums/topic.dml?id=239498&t=1217158015&page=1
1483
+ * @author adam
1484
+ * @param e The event object.
1485
+ */
1486
+ this.area_mousemove = function (e) {
1487
+ if (!this.is_drawing) {
1488
+ if (!e)
1489
+ e = window.event;
1490
+ var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
1491
+ if (obj.tagName == 'DIV') {
1492
+ //do this because of label
1493
+ obj = obj.parentNode;
1494
+ }
1495
+ if (obj.tagName == 'image' || obj.tagName == 'group' ||
1496
+ obj.tagName == 'shape' || obj.tagName == 'stroke') {
1497
+ //do this because of excanvas
1498
+ obj = obj.parentNode.parentNode;
1499
+ }
1500
+ var target = e.target || e.srcElement, rect = target && target.getBoundingClientRect();
1501
+ const windowEvent = window.event;
1502
+ var xdiff = rect ? e.clientX - rect.left : windowEvent.offsetX;
1503
+ var ydiff = rect ? e.clientY - rect.top : windowEvent.offsetY;
1504
+ // Alfonso
1505
+ if (this.isSafari) {
1506
+ xdiff -= window.scrollX;
1507
+ ydiff -= window.scrollY;
1508
+ }
1509
+ var resizable = (obj.shape == 'rect' || obj.shape == 'circle');
1510
+ if (resizable && xdiff < 6 && ydiff > 6) {
1511
+ //move left
1512
+ obj.style.cursor = 'w-resize';
1513
+ }
1514
+ else if (resizable && xdiff > parseInt(obj.style.width, 10) - 6 && ydiff > 6) {
1515
+ //move right
1516
+ obj.style.cursor = 'e-resize';
1517
+ }
1518
+ else if (resizable && xdiff > 6 && ydiff < 6) {
1519
+ //move top
1520
+ obj.style.cursor = 'n-resize';
1521
+ }
1522
+ else if (resizable && ydiff > parseInt(obj.style.height, 10) - 6 && xdiff > 6) {
1523
+ //move bottom
1524
+ obj.style.cursor = 's-resize';
1525
+ }
1526
+ else {
1527
+ //move all
1528
+ obj.style.cursor = 'move';
1529
+ }
1530
+ if (obj.aid != this.draggedId) {
1531
+ //not dragged or different
1532
+ if (obj.style.cursor == 'move') {
1533
+ obj.style.cursor = 'default';
1534
+ }
1535
+ return;
1536
+ }
1537
+ var area = this.areas[this.currentid];
1538
+ //moved here from mousedown
1539
+ if (xdiff < 6 && ydiff > 6) {
1540
+ //move left
1541
+ if (area.shape == 'circle') {
1542
+ this.is_drawing = this.DM_SQUARE_RESIZE_LEFT;
1543
+ this.statusMessage(this.strings.SQUARE_RESIZE_LEFT);
1544
+ }
1545
+ else if (area.shape == 'rect') {
1546
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_LEFT;
1547
+ this.statusMessage(this.strings.RECTANGLE_RESIZE_LEFT);
1548
+ }
1549
+ }
1550
+ else if (xdiff > parseInt(area.style.width, 10) - 6 && ydiff > 6) {
1551
+ //move right
1552
+ if (area.shape == 'circle') {
1553
+ this.is_drawing = this.DM_SQUARE_RESIZE_RIGHT;
1554
+ this.statusMessage(this.strings.SQUARE_RESIZE_RIGHT);
1555
+ }
1556
+ else if (area.shape == 'rect') {
1557
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_RIGHT;
1558
+ this.statusMessage(this.strings.RECTANGLE_RESIZE_RIGHT);
1559
+ }
1560
+ }
1561
+ else if (xdiff > 6 && ydiff < 6) {
1562
+ //move top
1563
+ if (area.shape == 'circle') {
1564
+ this.is_drawing = this.DM_SQUARE_RESIZE_TOP;
1565
+ this.statusMessage(this.strings.SQUARE_RESIZE_TOP);
1566
+ }
1567
+ else if (area.shape == 'rect') {
1568
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_TOP;
1569
+ this.statusMessage(this.strings.RECTANGLE_RESIZE_TOP);
1570
+ }
1571
+ }
1572
+ else if (ydiff > parseInt(area.style.height, 10) - 6 && xdiff > 6) {
1573
+ //move bottom
1574
+ if (area.shape == 'circle') {
1575
+ this.is_drawing = this.DM_SQUARE_RESIZE_BOTTOM;
1576
+ this.statusMessage(this.strings.SQUARE_RESIZE_BOTTOM);
1577
+ }
1578
+ else if (area.shape == 'rect') {
1579
+ this.is_drawing = this.DM_RECTANGLE_RESIZE_BOTTOM;
1580
+ this.statusMessage(this.strings.RECTANGLE_RESIZE_BOTTOM);
1581
+ }
1582
+ }
1583
+ else /*if (xdiff < 10 && ydiff < 10 ) */ {
1584
+ //move all
1585
+ if (area.shape == 'circle') {
1586
+ this.is_drawing = this.DM_SQUARE_MOVE;
1587
+ this.statusMessage(this.strings.SQUARE_MOVE);
1588
+ this.memory[this.currentid].rdownx = xdiff;
1589
+ this.memory[this.currentid].rdowny = ydiff;
1590
+ }
1591
+ else if (area.shape == 'rect') {
1592
+ this.is_drawing = this.DM_RECTANGLE_MOVE;
1593
+ this.statusMessage(this.strings.RECTANGLE_MOVE);
1594
+ this.memory[this.currentid].rdownx = xdiff;
1595
+ this.memory[this.currentid].rdowny = ydiff;
1596
+ }
1597
+ else if (area.shape == 'poly') {
1598
+ if (area.xpoints) {
1599
+ for (var i = 0, le = area.xpoints.length; i < le; i++) {
1600
+ this.memory[this.currentid].xpoints[i] = area.xpoints[i];
1601
+ this.memory[this.currentid].ypoints[i] = area.ypoints[i];
1602
+ }
1603
+ }
1604
+ if (area.shape == 'poly') {
1605
+ this.is_drawing = this.DM_POLYGON_MOVE;
1606
+ this.statusMessage(this.strings.POLYGON_MOVE);
1607
+ }
1608
+ this.memory[this.currentid].rdownx = xdiff;
1609
+ this.memory[this.currentid].rdowny = ydiff;
1610
+ }
1611
+ }
1612
+ //common memory settings (preparing to move or resize)
1613
+ this.memory[this.currentid].width = parseInt(area.style.width, 10);
1614
+ this.memory[this.currentid].height = parseInt(area.style.height, 10);
1615
+ this.memory[this.currentid].top = parseInt(area.style.top, 10);
1616
+ this.memory[this.currentid].left = parseInt(area.style.left, 10);
1617
+ this._setBorder(area, 'DRAW');
1618
+ this._setopacity(area, this.config.CL_DRAW_BG, this.config.draw_opacity);
1619
+ }
1620
+ else {
1621
+ //if drawing and not ie, have to propagate to image event
1622
+ this.img_mousemove(e);
1623
+ }
1624
+ };
1625
+ /**
1626
+ * EVENT HANDLER: Handles event of mouseup on imgmap areas.
1627
+ * Basically clears draggedId.
1628
+ * @author adam
1629
+ * @param e The event object
1630
+ */
1631
+ this.area_mouseup = function (e) {
1632
+ if (!this.is_drawing) {
1633
+ var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
1634
+ if (obj.tagName == 'DIV') {
1635
+ //do this because of label
1636
+ obj = obj.parentNode;
1637
+ }
1638
+ if (obj.tagName == 'image' || obj.tagName == 'group' ||
1639
+ obj.tagName == 'shape' || obj.tagName == 'stroke') {
1640
+ //do this because of excanvas
1641
+ obj = obj.parentNode.parentNode;
1642
+ }
1643
+ if (this.areas[this.currentid] != obj) {
1644
+ //trying to draw on a different canvas,switch to this one
1645
+ if (typeof obj.aid == 'undefined') {
1646
+ this.log('Cannot identify target area', 1);
1647
+ return;
1648
+ }
1649
+ }
1650
+ this.draggedId = null;
1651
+ }
1652
+ else {
1653
+ //if drawing and not ie, have to propagate to image event
1654
+ this.img_mouseup(e);
1655
+ }
1656
+ };
1657
+ /**
1658
+ * EVENT HANDLER: Handles event of mouseover on imgmap areas.
1659
+ * Calls gradual highlight on the given area.
1660
+ * @author adam
1661
+ * @param e The event object
1662
+ */
1663
+ this.area_mouseover = function (e) {
1664
+ if (!this.is_drawing) {
1665
+ //identify source object
1666
+ var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
1667
+ if (obj.tagName == 'DIV') {
1668
+ //do this because of label
1669
+ obj = obj.parentNode;
1670
+ }
1671
+ if (obj.tagName == 'image' || obj.tagName == 'group' ||
1672
+ obj.tagName == 'shape' || obj.tagName == 'stroke') {
1673
+ //do this because of excanvas
1674
+ obj = obj.parentNode.parentNode;
1675
+ }
1676
+ this.highlightArea(obj.aid);
1677
+ }
1678
+ };
1679
+ /**
1680
+ * EVENT HANDLER: Handles event of mouseout on imgmap areas.
1681
+ * Calls gradient blur on the given area.
1682
+ * @author adam
1683
+ * @param e The event object
1684
+ */
1685
+ this.area_mouseout = function (e) {
1686
+ if (!this.is_drawing) {
1687
+ if (!e)
1688
+ e = window.event;
1689
+ if (this.isMSIE) {
1690
+ // When moving to a child, ignore this mouseout event
1691
+ if (e.toElement && e.srcElement == e.toElement.parentNode)
1692
+ return;
1693
+ }
1694
+ //identify source object
1695
+ var obj = (this.isMSIE) ? e.srcElement : e.currentTarget;
1696
+ var tagName = obj.tagName.toLowerCase();
1697
+ if (tagName == 'div') {
1698
+ //do this because of label
1699
+ obj = obj.parentNode;
1700
+ }
1701
+ if (tagName == 'image' || tagName == 'group' ||
1702
+ tagName == 'shape' || tagName == 'stroke') {
1703
+ //do this because of excanvas
1704
+ obj = obj.parentNode.parentNode;
1705
+ }
1706
+ // Only blur the area if it isn't the current one
1707
+ if (this.currentid != obj.aid)
1708
+ this.blurArea(obj.aid);
1709
+ }
1710
+ };
1711
+ /**
1712
+ * EVENT HANDLER: Handles event of mousedown on imgmap areas.
1713
+ * Sets the variables draggedid, selectedid and currentid to the given area.
1714
+ * @author adam
1715
+ * @param e The event object
1716
+ */
1717
+ this.area_mousedown = function (e) {
1718
+ if (!this.is_drawing) {
1719
+ var obj = (this.isMSIE) ? window.event.srcElement : e.currentTarget;
1720
+ if (obj.tagName == 'DIV') {
1721
+ //do this because of label
1722
+ obj = obj.parentNode;
1723
+ }
1724
+ if (obj.tagName == 'image' || obj.tagName == 'group' ||
1725
+ obj.tagName == 'shape' || obj.tagName == 'stroke') {
1726
+ //do this because of excanvas
1727
+ obj = obj.parentNode.parentNode;
1728
+ }
1729
+ if (this.areas[this.currentid] != obj) {
1730
+ //trying to draw on a different canvas, switch to this one
1731
+ if (typeof obj.aid == 'undefined') {
1732
+ this.log('Cannot identify target area', 1);
1733
+ return;
1734
+ }
1735
+ this.blurArea(this.currentid);
1736
+ this.currentid = obj.aid;
1737
+ this.highlightArea(obj.aid);
1738
+ }
1739
+ this.draggedId = this.currentid;
1740
+ this.selectedId = this.currentid;
1741
+ this.fireEvent('onSelectArea', this.areas[this.currentid]);
1742
+ //stop event propagation to document level
1743
+ if (this.isMSIE) {
1744
+ window.event.cancelBubble = true;
1745
+ }
1746
+ else {
1747
+ e.stopPropagation();
1748
+ }
1749
+ }
1750
+ else {
1751
+ //if drawing and not ie, have to propagate to image event
1752
+ this.img_mousedown(e);
1753
+ }
1754
+ };
1755
+ /**
1756
+ * EVENT HANDLER: Handles event 'keydown' on document.
1757
+ * Handles SHIFT hold while drawing.
1758
+ * Note: Safari doesn't generate keyboard events for modifiers:
1759
+ * @url http://bugs.webkit.org/show_bug.cgi?id=11696
1760
+ * @author adam
1761
+ * @param e The event object
1762
+ */
1763
+ this.doc_keydown = function (e) {
1764
+ if (e.keyCode == 46 || e.key == "Delete") {
1765
+ //delete key pressed
1766
+ if (this.selectedId !== null && !this.is_drawing) {
1767
+ this.removeArea(this.selectedId);
1768
+ }
1769
+ }
1770
+ else if (e.keyCode == 16 || e.key == "Shift") {
1771
+ //shift key pressed
1772
+ if (this.is_drawing == this.DM_RECTANGLE_DRAW) {
1773
+ this.is_drawing = this.DM_SQUARE_DRAW;
1774
+ this.statusMessage(this.strings.SQUARE_DRAW);
1775
+ }
1776
+ }
1777
+ };
1778
+ /**
1779
+ * EVENT HANDLER: Handles event 'keyup' on document.
1780
+ * Handles SHIFT release while drawing.
1781
+ * @author adam
1782
+ * @param e The event object
1783
+ */
1784
+ this.doc_keyup = function (e) {
1785
+ if (e.keyCode == 16 || e.key == "Shift") {
1786
+ //shift key released
1787
+ if (this.is_drawing == this.DM_SQUARE_DRAW && this.areas[this.currentid].shape == 'rect') {
1788
+ //not for circle!
1789
+ this.is_drawing = this.DM_RECTANGLE_DRAW;
1790
+ this.statusMessage(this.strings.RECTANGLE_DRAW);
1791
+ }
1792
+ }
1793
+ };
1794
+ /**
1795
+ * EVENT HANDLER: Handles event 'mousedown' on document.
1796
+ * @author adam
1797
+ * @param e The event object
1798
+ */
1799
+ this.doc_mousedown = function (e) {
1800
+ if (!this.is_drawing) {
1801
+ this.selectedId = null;
1802
+ }
1803
+ };
1804
+ /**
1805
+ * Get the real position of the element.
1806
+ * Deal with browser differences when trying to get the position of an area.
1807
+ * @param element The element you want the position of.
1808
+ * @return An object with x and y members.
1809
+ */
1810
+ this._getPos = function (element) {
1811
+ var bounding = element.getBoundingClientRect();
1812
+ return { x: bounding.left, y: bounding.top };
1813
+ };
1814
+ /**
1815
+ * Gets the last (visible and editable) area.
1816
+ * @author Adam Maschek (adam.maschek(at)gmail.com)
1817
+ * @date 2006-06-15 16:34:51
1818
+ * @returns The last area object or null.
1819
+ */
1820
+ this._getLastArea = function () {
1821
+ for (var i = this.areas.length - 1; i >= 0; i--) {
1822
+ if (this.areas[i]) {
1823
+ return this.areas[i];
1824
+ }
1825
+ }
1826
+ return null;
1827
+ };
1828
+ /**
1829
+ * Parses cssText to single style declarations.
1830
+ * @author adam
1831
+ * @date 25-09-2007 18:19:51
1832
+ * @param obj The DOM object to apply styles on.
1833
+ * @param cssText The css declarations to apply.
1834
+ */
1835
+ this.assignCSS = function (obj, cssText) {
1836
+ var parts = cssText.split(';');
1837
+ for (var i = 0; i < parts.length; i++) {
1838
+ var p = parts[i].split(':');
1839
+ //we need to camelcase by - signs
1840
+ var pp = trim(p[0]).split('-');
1841
+ var prop = pp[0];
1842
+ for (var j = 1; j < pp.length; j++) {
1843
+ //replace first letters to uppercase
1844
+ prop += pp[j].replace(/^\w/, pp[j].substring(0, 1).toUpperCase());
1845
+ }
1846
+ obj.style[trim(prop)] = trim(p[1]);
1847
+ }
1848
+ };
1849
+ /**
1850
+ * To fire callback hooks on custom events, passing them the object of the event.
1851
+ * @author adam
1852
+ * @date 13-10-2007 15:24:49
1853
+ * @param evt The type of event
1854
+ * @param obj The object of the event. (can be an id, a string, an object, whatever is most relevant)
1855
+ */
1856
+ this.fireEvent = function (evt, obj) {
1857
+ if (typeof this.config.custom_callbacks[evt] == 'function') {
1858
+ return this.config.custom_callbacks[evt](obj);
1859
+ }
1860
+ };
1861
+ /**
1862
+ * To set area dimensions.
1863
+ * This is needed to achieve the same result in all browsers.
1864
+ * @author adam
1865
+ * @date 10-12-2007 22:29:41
1866
+ * @param id The id of the area (canvas) to resize.
1867
+ * @param w The desired width in pixels.
1868
+ * @param h The desired height in pixels.
1869
+ */
1870
+ this.setAreaSize = function (id, w, h) {
1871
+ if (id === null) {
1872
+ id = this.currentid;
1873
+ }
1874
+ var area = this.areas[id];
1875
+ if (w !== null) {
1876
+ area.width = w;
1877
+ area.style.width = (w) + 'px';
1878
+ area.setAttribute('width', w);
1879
+ }
1880
+ if (h !== null) {
1881
+ area.height = h;
1882
+ area.style.height = (h) + 'px';
1883
+ area.setAttribute('height', h);
1884
+ }
1885
+ };
1886
+ /**
1887
+ * Disable selection on a given object.
1888
+ * This is especially useful in Safari, where dragging around areas
1889
+ * keeps selecting all sorts of things.
1890
+ * @author Bret Taylor
1891
+ * @url http://ajaxcookbook.org/disable-text-selection/
1892
+ * @date 27-07-2008 1:57:45
1893
+ * @param element The DOM element on which you want to disable selection.
1894
+ */
1895
+ this.disableSelection = function (element) {
1896
+ if (typeof element == 'undefined' || !element) {
1897
+ return false;
1898
+ }
1899
+ if (typeof element.onselectstart != "undefined") {
1900
+ element.onselectstart = function () {
1901
+ return false;
1902
+ };
1903
+ }
1904
+ if (typeof element.unselectable != "undefined") {
1905
+ element.unselectable = "on";
1906
+ }
1907
+ if (typeof element.style.MozUserSelect != "undefined") {
1908
+ element.style.MozUserSelect = "none";
1909
+ }
1910
+ };
1911
+ this.config = {
1912
+ custom_callbacks: {},
1913
+ //default color values
1914
+ CL_DRAW_SHAPE: '#d00',
1915
+ CL_DRAW_BG: '#fff',
1916
+ CL_NORM_SHAPE: '#d00',
1917
+ CL_NORM_BG: '#fff',
1918
+ CL_HIGHLIGHT_SHAPE: '#d00',
1919
+ CL_HIGHLIGHT_BG: '#fff',
1920
+ CL_KNOB: '#555',
1921
+ bounding_box: true,
1922
+ label: '%n',
1923
+ label_class: 'imgmap_label',
1924
+ label_style: 'font: bold 10px Arial',
1925
+ hint: '#%n %h',
1926
+ draw_opacity: '35',
1927
+ norm_opacity: '50',
1928
+ highlight_opacity: '70',
1929
+ cursor_default: 'crosshair' //the css cursor while hovering over the image
1930
+ };
1931
+ //browser sniff
1932
+ const navigator = window.navigator;
1933
+ const userAgent = window.navigator.userAgent;
1934
+ this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
1935
+ this.isSafari = userAgent.indexOf('Safari') != -1;
1936
+ this.setup(options);
1937
+ }
1938
+ }
1939
+ /**
1940
+ * Trims a string.
1941
+ * Changed not to extend String but use own function for better compatibility.
1942
+ * @param str The string to trim.
1943
+ */
1944
+ function trim(str) {
1945
+ return str.replace(/^\s+|\s+$/g, '');
1946
+ }
1947
+ ;
1948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW1zLWNrZWRpdG9yLWltYWdlbWFwLmxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Ftcy1hbmd1bGFyL3NyYy9saWIvcW1zLWNrZWRpdG9yLWNvbXBvbmVudHMvY29tcG9uZW50cy9xbXMtY2tlZGl0b3ItaW1hZ2VtYXAvcW1zLWNrZWRpdG9yLWltYWdlbWFwLmxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSDs7Ozs7Ozs7OztHQVVHO0FBQ0gsbUhBQW1IO0FBQ25ILHNFQUFzRTtBQXFEdEUsTUFBTSxPQUFPLHNCQUFzQjtJQWdHL0IsWUFBWSxPQUF5QjtRQS9GckMsK0JBQStCO1FBQy9CLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsMkJBQTJCO1FBQzNCLGNBQVMsR0FBRyxrQkFBa0IsQ0FBQztRQUUvQix3Q0FBd0M7UUFDeEMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFLcEIsbURBQW1EO1FBQ25ELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixxQ0FBcUM7UUFDckMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLCtDQUErQztRQUMvQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBRVosc0RBQXNEO1FBQy9DLFVBQUssR0FBRyxFQUFFLENBQUM7UUFLbEIscURBQXFEO1FBQ3JELGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUVuQix1REFBdUQ7UUFDdkQsZ0JBQVcsR0FBRztZQUNWLFdBQVc7WUFDWCxjQUFjO1lBQ2QsWUFBWTtZQUNaLGNBQWM7WUFDZCxZQUFZO1lBQ1osYUFBYTtZQUNiLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsZUFBZTtTQUNsQixD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LFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUU5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FB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O1lBQ3JCLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLGtCQUFrQixFQUFFLE1BQU07WUFDMUIsZUFBZSxFQUFFLE1BQU07WUFDdkIsT0FBTyxFQUFFLE1BQU07WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxjQUFjO1lBQzNCLFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxZQUFZLEVBQUUsSUFBSTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGNBQWMsRUFBRSxXQUFXLENBQUMsOENBQThDO1NBQzdFLENBQUM7UUFDRixlQUFlO1FBQ2YsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FzM0RKO0FBRUQ7Ozs7TUFJTTtBQUNOLFNBQVMsSUFBSSxDQUFDLEdBQUc7SUFDYixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqXHRJbWFnZSBNYXAgRWRpdG9yIChpbWdtYXApIC0gaW4tYnJvd3NlciBpbWFnZW1hcCBlZGl0b3JcclxuICpcdENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDggQWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsgQCBnbWFpbC5jb20pXHJcbiAqXHJcbiAqXHRUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXHJcbiAqXHRtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4gKlx0YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDJcclxuICpcdG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKlx0VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXHJcbiAqXHRidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxyXG4gKlx0TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4gKlx0R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICpcdFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXHJcbiAqXHRhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxyXG4gKlx0Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLlxyXG4gKi9cclxuLyoqXHJcbiAqXHRAZmlsZW92ZXJ2aWV3XHJcbiAqXHRPbmxpbmUgSW1hZ2UgTWFwIEVkaXRvciAtIG1haW4gc2NyaXB0IGZpbGUuXHJcbiAqXHRUaGlzIGlzIHRoZSBtYWluIHNjcmlwdCBmaWxlIG9mIHRoZSBPbmxpbmUgSW1hZ2UgTWFwIEVkaXRvci5cclxuICpcclxuICpcdEBkYXRlXHQyNi0wMi0yMDA3IDI6MjQ6NTBcclxuICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICpcdEBjb3B5cmlnaHRcclxuICpcdEB2ZXJzaW9uIDIuMlxyXG4gKlxyXG4gKi9cclxuLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgbmV3Y2FwOiBmYWxzZSwgd2hpdGU6IGZhbHNlLCBvbmV2YXI6IGZhbHNlLCBwbHVzcGx1czogZmFsc2UsIGVxZXFlcTogZmFsc2UsIG5vbWVuOiBmYWxzZSAqL1xyXG4vKmdsb2JhbCBpbWdtYXBTdHJpbmdzOnRydWUsIHdpbmRvdzpmYWxzZSwgR192bWxDYW52YXNNYW5hZ2VyOmZhbHNlICovXHJcblxyXG4vKipcclxuICpcdEBhdXRob3JcdEFkYW0gTWFzY2hla1xyXG4gKlx0QGNvbnN0cnVjdG9yXHJcbiAqXHRAcGFyYW0gY29uZmlnXHRUaGUgY29uZmlnIG9iamVjdC5cclxuICovXHJcbmludGVyZmFjZSBJSW1hZ2VNYXBDb25maWcge1xyXG4gICAgY3VzdG9tX2NhbGxiYWNrczogb2JqZWN0O1xyXG4gICAgQ0xfRFJBV19TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfRFJBV19CRzogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9CRzogc3RyaW5nO1xyXG4gICAgQ0xfSElHSExJR0hUX1NIQVBFOiBzdHJpbmc7XHJcbiAgICBDTF9ISUdITElHSFRfQkc6IHN0cmluZztcclxuICAgIENMX0tOT0I6IHN0cmluZztcclxuICAgIGJvdW5kaW5nX2JveDogYm9vbGVhbjtcclxuICAgIGxhYmVsOiBzdHJpbmc7IC8vdGhlIGZvcm1hdCBzdHJpbmcgb2YgdGhlIGFyZWEgbGFiZWxzIC0gcG9zc2libGUgdmFsdWVzOiAlbiAtIG51bWJlciwgJWMgLSBjb29yZHMsICVoIC0gaHJlZiwgJWEgLSBhbHQsICV0IC0gdGl0bGVcclxuICAgIGxhYmVsX2NsYXNzOiBzdHJpbmc7IC8vdGhlIGNzcyBjbGFzcyB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgIGxhYmVsX3N0eWxlOiBzdHJpbmc7IC8vdGhlIGNzcyBzdHlsZShzKSB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgIGhpbnQ6IHN0cmluZzsgLy90aGUgZm9ybWF0IHN0cmluZyBvZiB0aGUgYXJlYSBtb3VzZW92ZXIgaGludHMgLSBwb3NzaWJsZSB2YWx1ZXM6ICVuIC0gbnVtYmVyLCAlYyAtIGNvb3JkcywgJWggLSBocmVmLCAlYSAtIGFsdCwgJXQgLSB0aXRsZVxyXG4gICAgZHJhd19vcGFjaXR5OiBzdHJpbmc7IC8vdGhlIG9wYWNpdHkgdmFsdWUgb2YgdGhlIGFyZWEgd2hpbGUgZHJhd2luZywgbW92aW5nIG9yIHJlc2l6aW5nIC0gcG9zc2libGUgdmFsdWVzIDAgLSAxMDAgb3IgcmFuZ2UgXCIoeCkteVwiXHJcbiAgICBub3JtX29wYWNpdHk6IHN0cmluZzsgLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSByZWxheGVkIC0gcG9zc2libGUgdmFsdWVzIDAgLSAxMDBcdG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgaGlnaGxpZ2h0X29wYWNpdHk6IHN0cmluZzsgLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBoaWdobGlnaHRlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwIG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgY3Vyc29yX2RlZmF1bHQ6IHN0cmluZzsgLy90aGUgY3NzIGN1cnNvciB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSBpbWFnZVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZU1hcE9wdGlvbnMge1xyXG4gICAgaW1hZ2VFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGN1c3RvbV9jYWxsYmFja3M6IE9iamVjdDsvL1RPRE86IHR5cGluZ1xyXG4gICAgYm91bmRpbmdfYm94OiBib29sZWFuO1xyXG4gICAgQ0xfRFJBV19TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfTk9STV9TSEFQRTogc3RyaW5nO1xyXG4gICAgQ0xfSElHSExJR0hUX1NIQVBFOiBzdHJpbmc7XHJcbiAgICBzdHJpbmdzOiBPYmplY3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWFwRGF0YSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIGFyZWFzOiBJSW1hZ2VNYXBBcmVhW107XHJcbiAgICBpbWFnZVdpZHRoPzogbnVtYmVyO1xyXG4gICAgaW1hZ2VIZWlnaHQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlTWFwQXJlYSB7XHJcbiAgICBzaGFwZTogXCJyZWN0XCIgfCBcImNpcmNsZVwiIHwgXCJwb2x5XCIgfCBcIlwiO1xyXG4gICAgY29vcmRzOiBzdHJpbmc7XHJcbiAgICBocmVmOiBzdHJpbmc7XHJcbiAgICB0YXJnZXQ6IHN0cmluZztcclxuICAgIGFsdDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUU1TQ0tFZGl0b3JJbWFnZU1hcExpYiB7XHJcbiAgICAvKiogVmVyc2lvbiBzdHJpbmcgb2YgaW1nbWFwICovXHJcbiAgICB2ZXJzaW9uID0gXCIyLjJcIjtcclxuXHJcbiAgICAvKiogQnVpbGQgZGF0ZSBvZiBpbWdtYXAgKi9cclxuICAgIGJ1aWxkRGF0ZSA9IFwiMjAwOS8wOC8xMiAyMjoxOFwiO1xyXG5cclxuICAgIC8qKiBTZXF1ZW50aWFsIGJ1aWxkIG51bWJlciBvZiBpbWdtYXAgKi9cclxuICAgIGJ1aWxkTnVtYmVyID0gXCIxMTNcIjtcclxuXHJcbiAgICAvKiogQ29uZmlnIG9iamVjdCBvZiB0aGUgaW1nbWFwIGluc3RhbmNlICovXHJcbiAgICBjb25maWc6IElJbWFnZU1hcENvbmZpZztcclxuXHJcbiAgICAvKiogU3RhdHVzIGZsYWcgdG8gaW5kaWNhdGUgY3VycmVudCBkcmF3aW5nIG1vZGUgKi9cclxuICAgIGlzX2RyYXdpbmcgPSAwO1xyXG5cclxuICAgIC8qKlx0QXJyYXkgdG8gaG9sZCBsYW5ndWFnZSBzdHJpbmdzICovXHJcbiAgICBzdHJpbmdzID0gW107XHJcblxyXG4gICAgLyoqIEhlbHBlciBhcnJheSBmb3Igc29tZSBkcmF3aW5nIG9wZXJhdGlvbnMgKi9cclxuICAgIG1lbW9yeSA9IFtdO1xyXG5cclxuICAgIC8qKlx0QXJyYXkgdG8gaG9sZCByZWZlcmVuY2UgdG8gYWxsIGFyZWFzIChjYW52YXNlcykgKi9cclxuICAgIHB1YmxpYyBhcmVhcyA9IFtdO1xyXG5cclxuICAgIGltYWdlRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwYXJlbnRJbWFnZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKlx0QXNzb2NpYXRpdmUgYXJyYXkgdG8gaG9sZCBib3VuZCBldmVudCBoYW5kbGVycyAqL1xyXG4gICAgZXZlbnRIYW5kbGVycyA9IHt9O1xyXG5cclxuICAgIGN1cnJlbnRpZCA9IDA7XHJcbiAgICBkcmFnZ2VkSWQgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRJZCA9IG51bGw7XHJcbiAgICBuZXh0U2hhcGUgPSAncmVjdCc7XHJcblxyXG4gICAgLyoqXHRDYWxsYmFjayBldmVudHMgdGhhdCB5b3UgY2FuIGhhbmRsZSBpbiB5b3VyIEdVSS4gKi9cclxuICAgIGV2ZW50X3R5cGVzID0gW1xyXG4gICAgICAgICdvbkFkZEFyZWEnLFxyXG4gICAgICAgICdvblJlbW92ZUFyZWEnLFxyXG4gICAgICAgICdvbkRyYXdBcmVhJyxcclxuICAgICAgICAnb25SZXNpemVBcmVhJyxcclxuICAgICAgICAnb25Nb3ZlQXJlYScsXHJcbiAgICAgICAgJ29uTG9hZEltYWdlJyxcclxuICAgICAgICAnb25TZWxlY3RBcmVhJyxcclxuICAgICAgICAnb25TdGF0dXNNZXNzYWdlJyxcclxuICAgICAgICAnb25BcmVhQ2hhbmdlZCdcclxuICAgIF07XHJcblxyXG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcdGhvbGRzIHRoZSBuYW1lIG9mIHRoZSBhY3RpdmVseSBlZGl0ZWQgbWFwLCB1c2UgZ2V0TWFwTmFtZSB0byByZWFkIGl0ICovXHJcbiAgICBtYXBuYW1lID0gJyc7XHJcblxyXG4gICAgLyoqXHRob2xkcyB0aGUgaWQgb2YgdGhlIGFjdGl2ZWx5IGVkaXRlZCBtYXAsIHVzZSBnZXRNYXBJZHRvIHJlYWQgaXQgKi9cclxuICAgIG1hcGlkID0gJyc7XHJcblxyXG4gICAgLyoqIGdsb2JhbCBzY2FsZSBvZiBhcmVhcyAoMS1ub3JtYWwsIDItZG91YmxlZCwgMC41LWhhbGYsIGV0Yy4pICovXHJcbiAgICBnbG9iYWxzY2FsZSA9IDE7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9SRUNUQU5HTEVfRFJBVyA9IDE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9NT1ZFID0gMTE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QID0gMTI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1JFQ1RBTkdMRV9SRVNJWkVfUklHSFQgPSAxMztcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fUkVDVEFOR0xFX1JFU0laRV9CT1RUT00gPSAxNDtcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fUkVDVEFOR0xFX1JFU0laRV9MRUZUID0gMTU7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9TUVVBUkVfRFJBVyA9IDI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9NT1ZFID0gMjE7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9SRVNJWkVfVE9QID0gMjI7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1NRVUFSRV9SRVNJWkVfUklHSFQgPSAyMztcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fU1FVQVJFX1JFU0laRV9CT1RUT00gPSAyNDtcclxuICAgIC8qKiBpc19kcmF3aW5nIGRyYXcgbW9kZSBjb25zdGFudCAqL1xyXG4gICAgRE1fU1FVQVJFX1JFU0laRV9MRUZUID0gMjU7XHJcblxyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9QT0xZR09OX0RSQVcgPSAzO1xyXG4gICAgLyoqIGlzX2RyYXdpbmcgZHJhdyBtb2RlIGNvbnN0YW50ICovXHJcbiAgICBETV9QT0xZR09OX0xBU1REUkFXID0gMzA7XHJcbiAgICAvKiogaXNfZHJhd2luZyBkcmF3IG1vZGUgY29uc3RhbnQgKi9cclxuICAgIERNX1BPTFlHT05fTU9WRSA9IDMxO1xyXG5cclxuICAgIC8vYnJvd3NlciBzbmlmZlxyXG4gICAgaXNNU0lFID0gZmFsc2U7XHJcbiAgICBpc1NhZmFyaSA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSUltYWdlTWFwT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICAgICAgICBjdXN0b21fY2FsbGJhY2tzOiB7fSwgLy9wb3NzaWJsZSB2YWx1ZXM6IHNlZSBiZWxvdyFcclxuICAgICAgICAgICAgLy9kZWZhdWx0IGNvbG9yIHZhbHVlc1xyXG4gICAgICAgICAgICBDTF9EUkFXX1NIQVBFOiAnI2QwMCcsXHJcbiAgICAgICAgICAgIENMX0RSQVdfQkc6ICcjZmZmJyxcclxuICAgICAgICAgICAgQ0xfTk9STV9TSEFQRTogJyNkMDAnLFxyXG4gICAgICAgICAgICBDTF9OT1JNX0JHOiAnI2ZmZicsXHJcbiAgICAgICAgICAgIENMX0hJR0hMSUdIVF9TSEFQRTogJyNkMDAnLFxyXG4gICAgICAgICAgICBDTF9ISUdITElHSFRfQkc6ICcjZmZmJyxcclxuICAgICAgICAgICAgQ0xfS05PQjogJyM1NTUnLFxyXG4gICAgICAgICAgICBib3VuZGluZ19ib3g6IHRydWUsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnJW4nLC8vdGhlIGZvcm1hdCBzdHJpbmcgb2YgdGhlIGFyZWEgbGFiZWxzIC0gcG9zc2libGUgdmFsdWVzOiAlbiAtIG51bWJlciwgJWMgLSBjb29yZHMsICVoIC0gaHJlZiwgJWEgLSBhbHQsICV0IC0gdGl0bGVcclxuICAgICAgICAgICAgbGFiZWxfY2xhc3M6ICdpbWdtYXBfbGFiZWwnLC8vdGhlIGNzcyBjbGFzcyB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgICAgICAgICAgbGFiZWxfc3R5bGU6ICdmb250OiBib2xkIDEwcHggQXJpYWwnLC8vdGhlIGNzcyBzdHlsZShzKSB0byBhcHBseSBvbiBsYWJlbHNcclxuICAgICAgICAgICAgaGludDogJyMlbiAlaCcsLy90aGUgZm9ybWF0IHN0cmluZyBvZiB0aGUgYXJlYSBtb3VzZW92ZXIgaGludHMgLSBwb3NzaWJsZSB2YWx1ZXM6ICVuIC0gbnVtYmVyLCAlYyAtIGNvb3JkcywgJWggLSBocmVmLCAlYSAtIGFsdCwgJXQgLSB0aXRsZVxyXG4gICAgICAgICAgICBkcmF3X29wYWNpdHk6ICczNScsLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBkcmF3aW5nLCBtb3Zpbmcgb3IgcmVzaXppbmcgLSBwb3NzaWJsZSB2YWx1ZXMgMCAtIDEwMCBvciByYW5nZSBcIih4KS15XCJcclxuICAgICAgICAgICAgbm9ybV9vcGFjaXR5OiAnNTAnLC8vdGhlIG9wYWNpdHkgdmFsdWUgb2YgdGhlIGFyZWEgd2hpbGUgcmVsYXhlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwXHRvciByYW5nZSBcIih4KS15XCJcclxuICAgICAgICAgICAgaGlnaGxpZ2h0X29wYWNpdHk6ICc3MCcsLy90aGUgb3BhY2l0eSB2YWx1ZSBvZiB0aGUgYXJlYSB3aGlsZSBoaWdobGlnaHRlZCAtIHBvc3NpYmxlIHZhbHVlcyAwIC0gMTAwIG9yIHJhbmdlIFwiKHgpLXlcIlxyXG4gICAgICAgICAgICBjdXJzb3JfZGVmYXVsdDogJ2Nyb3NzaGFpcicgLy90aGUgY3NzIGN1cnNvciB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSBpbWFnZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9icm93c2VyIHNuaWZmXHJcbiAgICAgICAgY29uc3QgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcclxuICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgICAgICB0aGlzLmlzTVNJRSA9IChuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKTtcclxuICAgICAgICB0aGlzLmlzU2FmYXJpID0gdXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaScpICE9IC0xO1xyXG4gICAgICAgIHRoaXMuc2V0dXAob3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlx0TWFpbiBzZXR1cCBmdW5jdGlvbi5cclxuICAgICAqXHRDYW4gYmUgY2FsbGVkIG1hbnVhbGx5IG9yIGNvbnN0cnVjdG9yIHdpbGwgY2FsbCBpdC5cclxuICAgICAqXHRAZGF0ZVx0MjItMDItMjAwNyAwOjE1OjQyXHJcbiAgICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgICpcdEBwYXJhbVx0Y29uZmlnXHRjb25maWcgb2JqZWN0XHJcbiAgICAgKlx0QHJldHVyblx0VHJ1ZSBpZiBhbGwgd2VudCBvay5cclxuICAgICAqL1xyXG4gICAgc2V0dXAgPSBmdW5jdGlvbiAob3B0aW9uczogSUltYWdlTWFwT3B0aW9ucykge1xyXG4gICAgICAgIC8vY29weSBub24tZGVmYXVsdCBvcHRpb25zIHBhcmFtZXRlcnMgdG8gdGhpcy5jb25maWdcclxuICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnW2ldID0gb3B0aW9uc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zZXQgZG9jdW1lbnQgZXZlbnQgaG9va3NcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuZXZlbnRIYW5kbGVycy5kb2Nfa2V5ZG93biA9IHRoaXMuZG9jX2tleWRvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudChkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5ldmVudEhhbmRsZXJzLmRvY19rZXl1cCA9IHRoaXMuZG9jX2tleXVwLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnQoZG9jdW1lbnQsICdtb3VzZWRvd24nLCB0aGlzLmV2ZW50SGFuZGxlcnMuZG9jX21vdXNlZG93biA9IHRoaXMuZG9jX21vdXNlZG93bi5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgLy9zZXQgaW1hZ2VFbGVtZW50IGVsZW1lbnQgLSBzdXBwb3NlZGx5IGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBET01cclxuICAgICAgICB0aGlzLmltYWdlRWxlbWVudCA9IG9wdGlvbnMuaW1hZ2VFbGVtZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5pbWFnZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgJ1RoZSBpbWFnZSBlbGVtZW50IG11c3QgYmUgZXhpc3RlZCBpbiB0aGUgRE9NJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93ICdUaGUgcGFyZW50IG9mIHRoZSBpbWFnZSBlbGVtZW50IG11c3QgYmUgZXhpc3RlZCBpbiB0aGUgRE9NJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50ID0gdGhpcy5pbWFnZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgIHRoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnBhcmVudEltYWdlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIC8vd2lwZSBhbGxcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbEFyZWFzKCk7XHJcblxyXG4gICAgICAgIC8vcmVzZXQgc2NhbGVcclxuICAgICAgICB0aGlzLmdsb2JhbHNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLy9zZXR1cCBldmVudHNcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KHRoaXMuaW1hZ2VFbGVtZW50LCBcImRyYWdzdGFydFwiLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX2RyYWdzdGFydCA9IHRoaXMuaW1nX2RyYWdzdGFydC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50KHRoaXMuaW1hZ2VFbGVtZW50LCAnbW91c2Vkb3duJywgdGhpcy5ldmVudEhhbmRsZXJzLmltZ19tb3VzZWRvd24gPSB0aGlzLmltZ19tb3VzZWRvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudCh0aGlzLmltYWdlRWxlbWVudCwgJ21vdXNldXAnLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNldXAgPSB0aGlzLmltZ19tb3VzZXVwLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnQodGhpcy5pbWFnZUVsZW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNlbW92ZSA9IHRoaXMuaW1nX21vdXNlbW92ZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS5jdXJzb3IgPSB0aGlzLmNvbmZpZy5jdXJzb3JfZGVmYXVsdDtcclxuXHJcbiAgICAgICAgLy9Mb2FkIHN0cmluZ3MgZnJvbSBhIGtleTp2YWx1ZSBvYmplY3RcclxuICAgICAgICBpZiAob3B0aW9ucy5zdHJpbmdzKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnN0cmluZ3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZ3MuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nc1trZXldID0gb3B0aW9ucy5zdHJpbmdzW2tleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy92YWxpZGF0ZSBldmVudCBob29rc1xyXG4gICAgICAgIHZhciBmb3VuZCwgaiwgbGU7XHJcbiAgICAgICAgZm9yIChpIGluIHRoaXMuY29uZmlnLmN1c3RvbV9jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbV9jYWxsYmFja3MuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBsZSA9IHRoaXMuZXZlbnRfdHlwZXMubGVuZ3RoOyBqIDwgbGU7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IHRoaXMuZXZlbnRfdHlwZXNbal0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1RPRE86IHJlbW92ZSBpbnZhbGlkIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coXCJVbmtub3duIGN1c3RvbSBjYWxsYmFjazogXCIgKyBpLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEF0dGFjaCBuZXcgJ2V2dCcgZXZlbnQgaGFuZGxlciAnY2FsbGJhY2snIHRvICdvYmonXHJcbiAgICAqXHRAZGF0ZVx0MjQtMDItMjAwNyAyMToxNjoyMFxyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZGVmaW5lZC5cclxuICAgICpcdEBwYXJhbVx0ZXZ0XHRUaGUgbmFtZSBvZiB0aGUgZXZlbnQsIGxpa2UgbW91c2Vkb3duLlxyXG4gICAgKlx0QHBhcmFtXHRjYWxsYmFja1x0VGhlIGNhbGxiYWNrIGZ1bmN0aW9uIChuYW1lZCBpZiB5b3Ugd2FudCBpdCB0byBiZSByZW1vdmVkKS5cclxuICAgICovXHJcbiAgICBhZGRFdmVudCA9IGZ1bmN0aW9uIChvYmosIGV2dCwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAob2JqLmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgLy9XM0Mgc3R5bGUgbW9kZWxcclxuICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBjYWxsYmFjaywgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTWljcm9zb2Z0IHN0eWxlIHJlZ2lzdHJhdGlvbiBtb2RlbFxyXG4gICAgICAgICAgICByZXR1cm4gb2JqLmF0dGFjaEV2ZW50KFwib25cIiArIGV2dCwgY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHREZXRhY2ggJ2V2dCcgZXZlbnQgaGFuZGxlZCBieSAnY2FsbGJhY2snIGZyb20gJ29iaicgb2JqZWN0LlxyXG4gICAgKlx0Q2FsbGJhY2sgbXVzdCBiZSBhIG5vbiBhbm9ueW1vdXMgZnVuY3Rpb24sIHNlZSBldmVudEhhbmRsZXJzLlxyXG4gICAgKlx0QHNlZVx0I2V2ZW50SGFuZGxlcnNcclxuICAgICpcdEV4YW1wbGU6IG15aW1nbWFwLnJlbW92ZUV2ZW50KG15aW1nbWFwLnBpYywgJ21vdXNlZG93bicsIG15aW1nbWFwLmV2ZW50SGFuZGxlcnMuaW1nX21vdXNlZG93bik7XHJcbiAgICAqXHRAZGF0ZVx0MjQtMTEtMjAwNyAxNToyMjoxN1xyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZGVmaW5lZC5cclxuICAgICpcdEBwYXJhbVx0ZXZ0XHRUaGUgbmFtZSBvZiB0aGUgZXZlbnQsIGxpa2UgbW91c2Vkb3duLlxyXG4gICAgKlx0QHBhcmFtXHRjYWxsYmFja1x0VGhlIG5hbWVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgKi9cclxuICAgIHJlbW92ZUV2ZW50ID0gZnVuY3Rpb24gKG9iaiwgZXZ0LCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAvL1czQyBzdHlsZSBtb2RlbFxyXG4gICAgICAgICAgICBvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGNhbGxiYWNrLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9NaWNyb3NvZnQgc3R5bGUgZGV0YWNoIG1vZGVsXHJcbiAgICAgICAgICAgIHJldHVybiBvYmouZGV0YWNoRXZlbnQoXCJvblwiICsgZXZ0LCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRGaXJlcyBjdXN0b20gaG9vayBvblN0YXR1c01lc3NhZ2UsIHBhc3NpbmcgdGhlIHN0YXR1cyBzdHJpbmcuXHJcbiAgICAqXHRVc2UgdGhpcyB0byB1cGRhdGUgeW91ciBHVUkuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjYtMDctMjAwOCAxMzoyMjo1NFxyXG4gICAgKlx0QHBhcmFtXHRzdHJcdFRoZSBzdGF0dXMgc3RyaW5nXHJcbiAgICAqL1xyXG4gICAgc3RhdHVzTWVzc2FnZSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25TdGF0dXNNZXNzYWdlJywgc3RyKTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0QWRkcyBiYXNpYyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkgdXNpbmcgZmlyZWJ1ZyBjb25zb2xlIG9iamVjdCBpZiBhdmFpbGFibGUuXHJcbiAgICAqXHRAZGF0ZVx0MjAtMDItMjAwNyAxNzo1NToxOFxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QHBhcmFtXHRvYmpcdFRoZSBvYmplY3Qgb3Igc3RyaW5nIHlvdSB3YW50IHRvIGRlYnVnL2VjaG8uXHJcbiAgICAqL1xyXG4gICAgbG9nID0gZnVuY3Rpb24gKG9iaiwgbGV2ZWwpIHtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0R2V0IHRoZSBtYXAgbmFtZSBvZiB0aGUgY3VycmVudCBpbWFnZW1hcC5cclxuICAgICpcdElmIGRvZXNudCBleGlzdCwgbm9yIG1hcCBpZCwgZ2VuZXJhdGUgYSBuZXcgbmFtZSBiYXNlZCBvbiB0aW1lc3RhbXAuXHJcbiAgICAqXHRUaGUgbW9zdCBwb3J0YWJsZSBzb2x1dGlvbiBpcyB0byB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIGlkIGFuZCBuYW1lLlxyXG4gICAgKlx0VGhpcyBhbHNvIGNvbmZvcm1zIHRoZSBIVE1MIDUgc3BlY2lmaWNhdGlvbiwgdGhhdCBzYXlzOlxyXG4gICAgKlx0XCJJZiB0aGUgaWQgIGF0dHJpYnV0ZSBpcyBhbHNvIHNwZWNpZmllZCwgYm90aCBhdHRyaWJ1dGVzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS5cIlxyXG4gICAgKlx0QGxpbmtcdGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvaHRtbDUvI3RoZS1tYXAtZWxlbWVudFxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QHNlZVx0I2dldE1hcElkXHJcbiAgICAqXHRAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBtYXAuXHJcbiAgICAqL1xyXG4gICAgZ2V0TWFwTmFtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWFwbmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoISF0aGlzLm1hcGlkKSB7IHJldHVybiB0aGlzLm1hcGlkOyB9XHJcbiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcG5hbWUgPSAnaW1hZ2VtYXAnICsgbm93LmdldEZ1bGxZZWFyKCkgKyAobm93LmdldE1vbnRoKCkgKyAxKSArIG5vdy5nZXREYXRlKCkgKyBub3cuZ2V0SG91cnMoKSArIG5vdy5nZXRNaW51dGVzKCkgKyBub3cuZ2V0U2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5tYXBuYW1lO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHZXQgdGhlIG1hcCBpZCBvZiB0aGUgY3VycmVudCBpbWFnZW1hcC5cclxuICAgICpcdElmIGRvZXNudCBleGlzdCwgdXNlIG1hcCBuYW1lLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QHNlZVx0I2dldE1hcE5hbWVcclxuICAgICpcdEByZXR1cm5cdFRoZSBpZCBvZiB0aGUgbWFwLlxyXG4gICAgKi9cclxuICAgIGdldE1hcElkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tYXBpZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1hcGlkID0gdGhpcy5nZXRNYXBOYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hcGlkO1xyXG4gICAgfTtcclxuXHJcbiAgICBnZXRNYXBKc29uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBtYXBKc29uOiBJSW1hZ2VNYXBEYXRhID0ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdldE1hcE5hbWUoKSxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuZ2V0TWFwSWQoKSxcclxuICAgICAgICAgICAgYXJlYXM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5hcmVhc1tpXTtcclxuICAgICAgICAgICAgaWYgKGFyZWEgJiYgYXJlYS5sYXN0SW5wdXQgJiYgYXJlYS5zaGFwZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJlYUpzb246IElJbWFnZU1hcEFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzOiBhcmVhLmxhc3RJbnB1dCxcclxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogYXJlYS5zaGFwZSxcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGFyZWEuYXRhcmdldCxcclxuICAgICAgICAgICAgICAgICAgICBhbHQ6IGFyZWEuYWFsdCxcclxuICAgICAgICAgICAgICAgICAgICBocmVmOiBhcmVhLmFocmVmXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgbWFwSnNvbi5hcmVhcy5wdXNoKGFyZWFKc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFwSnNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICpcdENvbnZlcnQgd2lsZCBzaGFwZSBuYW1lcyB0byBub3JtYWwgb25lcy5cclxuICAgICpcdEBkYXRlXHQyNS0xMi0yMDA4IDE5OjI3OjA2XHJcbiAgICAqXHRAcGFyYW1cdHNoYXBlXHRUaGUgbmFtZSBvZiB0aGUgc2hhcGUgdG8gY29udmVydC5cclxuICAgICpcdEByZXR1cm5cdFRoZSBub3JtYWxpemVkIHNoYXBlIG5hbWUsIHJlY3QgYXMgZGVmYXVsdC5cclxuICAgICovXHJcbiAgICBfbm9ybVNoYXBlID0gZnVuY3Rpb24gKHNoYXBlKSB7XHJcbiAgICAgICAgaWYgKCFzaGFwZSkgeyByZXR1cm4gJ3JlY3QnOyB9XHJcbiAgICAgICAgc2hhcGUgPSB0cmltKHNoYXBlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzaGFwZS5zdWJzdHJpbmcoMCwgNCkgPT0gJ3JlY3QnKSB7IHJldHVybiAncmVjdCc7IH1cclxuICAgICAgICBpZiAoc2hhcGUuc3Vic3RyaW5nKDAsIDQpID09ICdjaXJjJykgeyByZXR1cm4gJ2NpcmNsZSc7IH1cclxuICAgICAgICBpZiAoc2hhcGUuc3Vic3RyaW5nKDAsIDQpID09ICdwb2x5JykgeyByZXR1cm4gJ3BvbHknOyB9XHJcbiAgICAgICAgcmV0dXJuICdyZWN0JztcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0VHJ5IHRvIG5vcm1hbGl6ZSBjb29yZGluYXRlcyB0aGF0IGNhbWUgZnJvbTpcclxuICAgICpcdDEuIGh0bWwgdGV4dGFyZWFcclxuICAgICpcdDIuIHVzZXIgaW5wdXQgaW4gdGhlIGFjdGl2ZSBhcmVhJ3MgaW5wdXQgZmllbGRcclxuICAgICpcdDMuIGZyb20gdGhlIGh0bWwgc291cmNlIGluIGNhc2Ugb2YgcGx1Z2lucyBvciBoaWdobGlnaHRlclxyXG4gICAgKlx0RXhhbXBsZSBvZiBpbnB1dHMgdGhhdCBuZWVkIHRvIGJlIGhhbmRsZWQ6XHJcbiAgICAqXHRcdDAzNSwwMzUgMDc1LDA2MlxyXG4gICAgKlx0XHQxNTAsMjE3LCAxOTAsMjU3LCAxNTAsMjk3LDExMCwyNTdcclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0Y29vcmRzXHRUaGUgY29vcmRpbmF0ZXMgaW4gYSBzdHJpbmcuXHJcbiAgICAqXHRAcGFyYW1cdHNoYXBlXHRUaGUgc2hhcGUgb2YgdGhlIG9iamVjdCAocmVjdCwgY2lyY2xlLCBwb2x5KS5cclxuICAgICpcdEBwYXJhbVx0ZmxhZ1x0RmxhZ3MgdGhhdCBtb2RpZnkgdGhlIG9wZXJhdGlvbi4gKGZyb21jaXJjbGUsIGZyb21wb2x5LCBmcm9tcmVjdCwgcHJlc2VydmUpXHJcbiAgICAqXHRAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBjb29yZGluYXRlcy5cclxuICAgICovXHJcbiAgICBfbm9ybUNvb3JkcyA9IGZ1bmN0aW9uIChjb29yZHMsIHNoYXBlLCBmbGFnKSB7XHJcbiAgICAgICAgLy9mdW5jdGlvbiBsZXZlbCB2YXIgZGVjbGFyYXRpb25zXHJcbiAgICAgICAgdmFyIGk7IC8vZ2VuZXJpYyBjeWNsZSBjb3VudGVyXHJcbiAgICAgICAgdmFyIHN4OyAvL3NtYWxsZXN0IHhcclxuICAgICAgICB2YXIgc3k7IC8vc21hbGxlc3QgeVxyXG4gICAgICAgIHZhciBneDsgLy9ncmVhdGVzdCB4XHJcbiAgICAgICAgdmFyIGd5OyAvL2dyZWF0ZXN0IHlcclxuICAgICAgICB2YXIgdGVtcCwgbGU7XHJcblxyXG4gICAgICAgIGNvb3JkcyA9IHRyaW0oY29vcmRzKTtcclxuICAgICAgICBpZiAoY29vcmRzID09PSAnJykgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICB2YXIgb2xkY29vcmRzID0gY29vcmRzO1xyXG4gICAgICAgIC8vcmVwbGFjZSBzb21lIGdlbmVyYWwganVua1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8oXFxkKShbXlxcZFxcLl0pKyhcXGQpL2csIFwiJDEsJDNcIik7IC8vIE90aGVyIHNvZnR3YXJlIG1pZ2h0IGNyZWF0ZSBkZWNpbWFsIHBvaW50cywgcmVzcGVjdCB0aGVtXHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoLyxcXEQrKFxcZCkvZywgXCIsJDFcIik7IC8vY3V0IGxlYWRpbmcganVua1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8sMCsoXFxkKS9nLCBcIiwkMVwiKTsgLy9jdXQgbGVhZGluZyB6ZXJvc1xyXG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5yZXBsYWNlKC8oXFxkKShcXEQpKywvZywgXCIkMSxcIik7XHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoL15cXEQrKFxcZCkvZywgXCIkMVwiKTsgLy9jdXQgbGVhZGluZyBqdW5rXHJcbiAgICAgICAgY29vcmRzID0gY29vcmRzLnJlcGxhY2UoL14wKyhcXGQpL2csIFwiJDFcIik7IC8vY3V0IGxlYWRpbmcgemVyb3NcclxuICAgICAgICBjb29yZHMgPSBjb29yZHMucmVwbGFjZSgvKFxcZCkoXFxEKSskL2csIFwiJDFcIik7IC8vY3V0IHRyYWlsaW5nIGp1bmtcclxuXHJcbiAgICAgICAgLy9ub3cgZml4IG90aGVyIGlzc3Vlc1xyXG4gICAgICAgIHZhciBwYXJ0cyA9IGNvb3Jkcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChzaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgaWYgKGZsYWcgPT0gJ2Zyb21jaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgciA9IHBhcnRzWzJdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXSAtIHI7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdIC0gcjtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKSArIDIgKiByO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbM10gPSBwYXJzZUludChwYXJ0c1sxXSwgMTApICsgMiAqIHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyA9PSAnZnJvbXBvbHknKSB7XHJcbiAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7IGd4ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgZ3kgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGUgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPCBzeCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMSAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApIDwgc3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDAgJiYgcGFyc2VJbnQocGFydHNbaV0sIDEwKSA+IGd4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd4ID0gcGFyc2VJbnQocGFydHNbaV0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAxICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPiBneSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBneSA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBzeDsgcGFydHNbMV0gPSBzeTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gZ3g7IHBhcnRzWzNdID0gZ3k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEocGFyc2VJbnQocGFydHNbMV0sIDEwKSA+PSAwKSkgeyBwYXJ0c1sxXSA9IHBhcnRzWzBdOyB9XHJcbiAgICAgICAgICAgIGlmICghKHBhcnNlSW50KHBhcnRzWzJdLCAxMCkgPj0gMCkpIHsgcGFydHNbMl0gPSBwYXJzZUludChwYXJ0c1swXSwgMTApICsgMTA7IH1cclxuICAgICAgICAgICAgaWYgKCEocGFyc2VJbnQocGFydHNbM10sIDEwKSA+PSAwKSkgeyBwYXJ0c1szXSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgKyAxMDsgfVxyXG4gICAgICAgICAgICBpZiAocGFyc2VJbnQocGFydHNbMF0sIDEwKSA+IHBhcnNlSW50KHBhcnRzWzJdLCAxMCkpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgPSBwYXJ0c1swXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzBdID0gcGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IHRlbXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgPiBwYXJzZUludChwYXJ0c1szXSwgMTApKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnRzWzNdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbM10gPSB0ZW1wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvb3JkcyA9IHBhcnRzWzBdICsgXCIsXCIgKyBwYXJ0c1sxXSArIFwiLFwiICsgcGFydHNbMl0gKyBcIixcIiArIHBhcnRzWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICBpZiAoZmxhZyA9PSAnZnJvbXJlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBzeCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7IGd4ID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgZ3kgPSBwYXJzZUludChwYXJ0c1szXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgLy91c2Ugc21hbGxlciBzaWRlXHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IChneCAtIHN4IDwgZ3kgLSBzeSkgPyBneCAtIHN4IDogZ3kgLSBzeTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gTWF0aC5mbG9vcihwYXJ0c1syXSAvIDIpOyAvL3JhZGl1c1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMF0gPSBzeCArIHBhcnRzWzJdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbMV0gPSBzeSArIHBhcnRzWzJdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZsYWcgPT0gJ2Zyb21wb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgc3ggPSBwYXJzZUludChwYXJ0c1swXSwgMTApOyBneCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBzeSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7IGd5ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlID0gcGFydHMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApIDwgc3gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ggPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDEgJiYgcGFyc2VJbnQocGFydHNbaV0sIDEwKSA8IHN5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gcGFyc2VJbnQocGFydHNbaV0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwICYmIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgPiBneCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBneCA9IHBhcnNlSW50KHBhcnRzW2ldLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMSAmJiBwYXJzZUludChwYXJ0c1tpXSwgMTApID4gZ3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3kgPSBwYXJzZUludChwYXJ0c1tpXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vdXNlIHNtYWxsZXIgc2lkZVxyXG4gICAgICAgICAgICAgICAgcGFydHNbMl0gPSAoZ3ggLSBzeCA8IGd5IC0gc3kpID8gZ3ggLSBzeCA6IGd5IC0gc3k7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IE1hdGguZmxvb3IocGFydHNbMl0gLyAyKTsgLy9yYWRpdXNcclxuICAgICAgICAgICAgICAgIHBhcnRzWzBdID0gc3ggKyBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzFdID0gc3kgKyBwYXJ0c1syXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIShwYXJzZUludChwYXJ0c1sxXSwgMTApID4gMCkpIHsgcGFydHNbMV0gPSBwYXJ0c1swXTsgfVxyXG4gICAgICAgICAgICBpZiAoIShwYXJzZUludChwYXJ0c1syXSwgMTApID4gMCkpIHsgcGFydHNbMl0gPSAxMDsgfVxyXG4gICAgICAgICAgICBjb29yZHMgPSBwYXJ0c1swXSArIFwiLFwiICsgcGFydHNbMV0gKyBcIixcIiArIHBhcnRzWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgaWYgKGZsYWcgPT0gJ2Zyb21yZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgcGFydHNbNF0gPSBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzVdID0gcGFydHNbM107XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzBdO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbNl0gPSBwYXJ0c1s0XTtcclxuICAgICAgICAgICAgICAgIHBhcnRzWzddID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyA9PSAnZnJvbWNpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIC8vIEAgdXJsIGh0dHA6Ly93d3cucGl4ZWx3aXQuY29tL2Jsb2cvMjAwNy8wNi8yOS9iYXNpYy1jaXJjbGUtZHJhd2luZy1hY3Rpb25zY3JpcHQvXHJcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyWCA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyWSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcnRzW2orK10gPSBjZW50ZXJYICsgcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgcGFydHNbaisrXSA9IGNlbnRlclk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2lkZXMgPSA2MDsgLy9jb25zdGFudCA9IHNpZGVzIHRoZSBmYWtlIGNpcmNsZSB3aWxsIGhhdmVcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gc2lkZXM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFJhdGlvID0gaSAvIHNpZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB4U3RlcHMgPSBNYXRoLmNvcyhwb2ludFJhdGlvICogMiAqIE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB5U3RlcHMgPSBNYXRoLnNpbihwb2ludFJhdGlvICogMiAqIE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFggPSBjZW50ZXJYICsgeFN0ZXBzICogcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludFkgPSBjZW50ZXJZICsgeVN0ZXBzICogcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzW2orK10gPSBNYXRoLnJvdW5kKHBvaW50WCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHNbaisrXSA9IE1hdGgucm91bmQocG9pbnRZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb29yZHMgPSBwYXJ0cy5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxhZyA9PSAncHJlc2VydmUnICYmIG9sZGNvb3JkcyAhPSBjb29yZHMpIHtcclxuICAgICAgICAgICAgLy9yZXR1cm4gb3JpZ2luYWwgYW5kIHRocm93IGVycm9yXHJcbiAgICAgICAgICAgIC8vdGhyb3cgXCJpbnZhbGlkIGNvb3Jkc1wiO1xyXG4gICAgICAgICAgICByZXR1cm4gb2xkY29vcmRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29vcmRzO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlx0U2V0cyB0aGUgY29vcmRpbmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBKU09OIG1hcCBjb2RlIG9yIERPTSBvYmplY3QuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi0wNi0wNyAxMTo0NzoxNlxyXG4gICAgKlx0QHBhcmFtXHRtYXBcdERPTSBvYmplY3Qgb3Igc3RyaW5nIG9mIGEgbWFwIHlvdSB3YW50IHRvIGFwcGx5LlxyXG4gICAgKlx0QHJldHVyblx0VHJ1ZSBvbiBzdWNjZXNzXHJcbiAgICAqL1xyXG4gICAgc2V0TWFwSnNvbiA9IGZ1bmN0aW9uIChtYXA6IElJbWFnZU1hcERhdGEpIHtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25TZXRNYXAnLCBtYXApO1xyXG5cclxuICAgICAgICAvL3JlbW92ZSBhbGwgYXJlYXNcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbEFyZWFzKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFwbmFtZSA9IG1hcC5uYW1lO1xyXG4gICAgICAgIHRoaXMubWFwaWQgPSBtYXAuaWQ7XHJcbiAgICAgICAgdmFyIHNoYXBlLCBjb29yZHMsIGhyZWYsIGFsdCwgdGl0bGUsIHRhcmdldCwgaWQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gbWFwLmFyZWFzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgc2hhcGUgPSBjb29yZHMgPSBocmVmID0gYWx0ID0gdGl0bGUgPSB0YXJnZXQgPSAnJztcclxuXHJcbiAgICAgICAgICAgIGlkID0gdGhpcy5hZGROZXdBcmVhKCk7IC8vYnR3IGlkID09IHRoaXMuY3VycmVudGlkLCBqdXN0IHRoaXMgZm9ybSBpcyBhIGJpdCBjbGVhcmVyXHJcblxyXG4gICAgICAgICAgICBzaGFwZSA9IHRoaXMuX25vcm1TaGFwZShtYXAuYXJlYXNbaV0uc2hhcGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0QXJlYShpZCwgc2hhcGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hcC5hcmVhc1tpXS5jb29yZHMpIHtcclxuICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplIGNvb3Jkc1xyXG4gICAgICAgICAgICAgICAgY29vcmRzID0gdGhpcy5fbm9ybUNvb3JkcyhtYXAuYXJlYXNbaV0uY29vcmRzLCBzaGFwZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5sYXN0SW5wdXQgPSBjb29yZHM7XHJcbiAgICAgICAgICAgICAgICAvL2ZvciBhcmVhIHRoaXMgb25lIHdpbGwgYmUgc2V0IGluIHJlY2FsY3VsYXRlXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGhyZWYgPSBtYXAuYXJlYXNbaV0uaHJlZjtcclxuICAgICAgICAgICAgaWYgKGhyZWYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmFocmVmID0gaHJlZjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWx0ID0gbWFwLmFyZWFzW2ldLmFsdDtcclxuICAgICAgICAgICAgaWYgKGFsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0uYWFsdCA9IGFsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGFyZ2V0ID0gbWFwLmFyZWFzW2ldLnRhcmdldDtcclxuICAgICAgICAgICAgaWYgKHRhcmdldCkgeyB0YXJnZXQgPSB0YXJnZXQudG9Mb3dlckNhc2UoKTsgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0uYXRhcmdldCA9IHRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlKGlkLCBjb29yZHMpOyAvL2NvbnRhaW5zIHJlcGFpbnRcclxuICAgICAgICAgICAgdGhpcy5yZWxheEFyZWEoaWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uQXJlYUNoYW5nZWQnLCB0aGlzLmFyZWFzW2lkXSk7XHJcblxyXG4gICAgICAgIH0gLy9lbmQgZm9yIGFyZWFzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRBZGRzIGEgbmV3IGFyZWEuIEl0IHdpbGwgbGF0ZXIgYmVjb21lIGEgY2FudmFzLlxyXG4gICAgKlx0R1VJIHNob3VsZCB1c2UgdGhlIG9uQWRkQXJlYSBjYWxsYmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi0wNi0wNiAxNjo0OToyNVxyXG4gICAgKlx0QHNlZVx0I2luaXRBcmVhXHJcbiAgICAqL1xyXG4gICAgYWRkTmV3QXJlYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgbGFzdGFyZWEgPSB0aGlzLl9nZXRMYXN0QXJlYSgpO1xyXG4gICAgICAgIHZhciBpZCA9IChsYXN0YXJlYSkgPyBsYXN0YXJlYS5haWQgKyAxIDogMDtcclxuXHJcbiAgICAgICAgLy9pbnNlcnQgbmV3IHBvc3NpYmx5PyB1bmtub3duIGFyZWEgKHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXQgbW91c2Vkb3duKVxyXG4gICAgICAgIHZhciBhcmVhOiBhbnkgPSB0aGlzLmFyZWFzW2lkXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIGFyZWEuaWQgPSB0aGlzLm1hcG5hbWUgKyAnYXJlYScgKyBpZDtcclxuICAgICAgICBhcmVhLmFpZCA9IGlkO1xyXG4gICAgICAgIGFyZWEuc2hhcGUgPSBcInVuZGVmaW5lZFwiO1xyXG5cclxuICAgICAgICB0aGlzLmJsdXJBcmVhKHRoaXMuY3VycmVudGlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50aWQgPSBpZDtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEluaXRpYWxpemUgYSBuZXcgYXJlYS5cclxuICAgICpcdENyZWF0ZSB0aGUgY2FudmFzLCBpbml0aWFsaXplIGl0LlxyXG4gICAgKlx0UmVzZXQgYXJlYSBwYXJhbWV0ZXJzLlxyXG4gICAgKlx0QHBhcmFtXHRpZFx0VGhlIGlkIG9mIHRoZSBhcmVhIChhbHJlYWR5IGV4aXN0aW5nIHdpdGggdW5kZWZpbmVkIHNoYXBlKVxyXG4gICAgKlx0QHBhcmFtXHRzaGFwZVx0VGhlIHNoYXBlIHRoZSBhcmVhIHdpbGwgaGF2ZSAocmVjdCwgY2lyY2xlLCBwb2x5KVxyXG4gICAgKi9cclxuICAgIGluaXRBcmVhID0gZnVuY3Rpb24gKGlkLCBzaGFwZSkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhKSB7IHJldHVybjsgfSAvL2lmIGFsbCB3YXMgZXJhc2VkLCByZXR1cm5cclxuICAgICAgICAvL3JlbW92ZSBwcmVpbml0ZWQgZHVtbXkgZGl2IG9yIGFscmVhZHkgcGxhY2VkIGNhbnZhc1xyXG4gICAgICAgIGlmIChhcmVhLnBhcmVudE5vZGUpIHsgYXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFyZWEpOyB9XHJcbiAgICAgICAgaWYgKGFyZWEubGFiZWwpIHsgYXJlYS5sYWJlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFyZWEubGFiZWwpOyB9XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIENBTlZBUyBub2RlXHJcbiAgICAgICAgYXJlYSA9IHRoaXMuYXJlYXNbaWRdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQ0FOVkFTJyk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LmFwcGVuZENoaWxkKGFyZWEpO1xyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgICAgICAgLy8gaWYgKHR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXIgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIC8vICAgICAvL292ZXJyaWRlIENBTlZBUyB3aXRoIFZNTCBvYmplY3RcclxuICAgICAgICAvLyAgICAgYXJlYSA9IHRoaXMuYXJlYXNbaWRdID0gR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGFyZWEpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBhcmVhLmlkID0gdGhpcy5tYXBuYW1lICsgJ2FyZWEnICsgaWQ7XHJcbiAgICAgICAgYXJlYS5haWQgPSBpZDtcclxuICAgICAgICBhcmVhLnNoYXBlID0gc2hhcGU7XHJcbiAgICAgICAgYXJlYS5haHJlZiA9ICcnO1xyXG4gICAgICAgIGFyZWEuYXRpdGxlID0gJyc7XHJcbiAgICAgICAgYXJlYS5hYWx0ID0gJyc7XHJcbiAgICAgICAgYXJlYS5hdGFyZ2V0ID0gJyc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRUb3AgKyAncHgnO1xyXG4gICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuX3NldG9wYWNpdHkoYXJlYSwgdGhpcy5jb25maWcuQ0xfRFJBV19CRywgdGhpcy5jb25maWcuZHJhd19vcGFjaXR5KTtcclxuICAgICAgICAvL2hvb2sgZXZlbnQgaGFuZGxlcnNcclxuXHJcbiAgICAgICAgYXJlYS5vbm1vdXNlZG93biA9IHRoaXMuYXJlYV9tb3VzZWRvd24uYmluZCh0aGlzKTtcclxuICAgICAgICBhcmVhLm9ubW91c2V1cCA9IHRoaXMuYXJlYV9tb3VzZXVwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgYXJlYS5vbm1vdXNlbW92ZSA9IHRoaXMuYXJlYV9tb3VzZW1vdmUuYmluZCh0aGlzKTtcclxuICAgICAgICBhcmVhLm9ubW91c2VvdmVyID0gdGhpcy5hcmVhX21vdXNlb3Zlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGFyZWEub25tb3VzZW91dCA9IHRoaXMuYXJlYV9tb3VzZW91dC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vaW5pdGlhbGl6ZSBtZW1vcnkgb2JqZWN0XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdID0ge307XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdLmRvd254ID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0uZG93bnkgPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS5sZWZ0ID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0udG9wID0gMDtcclxuICAgICAgICB0aGlzLm1lbW9yeVtpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMubWVtb3J5W2lkXS54cG9pbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbaWRdLnlwb2ludHMgPSBbXTtcclxuICAgICAgICAvL2NyZWF0ZSBsYWJlbCBub2RlXHJcbiAgICAgICAgYXJlYS5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LmFwcGVuZENoaWxkKGFyZWEubGFiZWwpO1xyXG4gICAgICAgIGFyZWEubGFiZWwuY2xhc3NOYW1lID0gdGhpcy5jb25maWcubGFiZWxfY2xhc3M7XHJcbiAgICAgICAgdGhpcy5hc3NpZ25DU1MoYXJlYS5sYWJlbCwgdGhpcy5jb25maWcubGFiZWxfc3R5bGUpO1xyXG4gICAgICAgIGFyZWEubGFiZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG5cclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25BZGRBcmVhJywgaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRSZXNldHMgYXJlYSBib3JkZXIgYW5kIG9wYWNpdHkgdG8gYSBub3JtYWwgc3RhdGUgYWZ0ZXIgZHJhd2luZy5cclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBkYXRlXHQxNS0wMi0yMDA3IDIyOjA3OjI4XHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEuXHJcblxyXG4gICAgKi9cclxuICAgIHJlbGF4QXJlYSA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBpZiAoaWQgIT0gdGhpcy5jdXJyZW50aWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0Qm9yZGVyKGFyZWEsICdOT1JNJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldG9wYWNpdHkoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9CRywgdGhpcy5jb25maWcubm9ybV9vcGFjaXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEFyZWEoaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTZXQgYm9yZGVyIG9mIGEgZ2l2ZW4gYXJlYSBhY2NvcmRpbmcgdG8gc3R5bGUgZmxhZy5cclxuICAgICpcdFBvc3NpYmxlIHZhbHVlcyBvZiBzdHlsZTogTk9STSwgSElHSExJR0hULCBEUkFXLlxyXG4gICAgKlx0Tm9uLXJlY3RhbmdsZSBzaGFwZXMgd29udCBnZXQgYSBib3JkZXIgaWYgY29uZmlnLmJvdW5kaW5nX2JveCBpcyBmYWxzZS5cclxuICAgICpcdEBkYXRlXHQyNi0xMi0yMDA4IDIyOjM0OjQxXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gc2V0IHRoZSBib3JkZXIgb24uXHJcbiAgICAqXHRAcGFyYW1cdHN0eWxlXHRDb2xvcmluZyBzdHlsZSAoTk9STSwgSElHSExJR0hULCBEUkFXKSwgc2VlIHJlbGV2YW50IGNvbG9ycyBpbiBjb25maWcuXHJcbiAgICAqXHRAc2luY2VcdDIuMVxyXG4gICAgKi9cclxuICAgIF9zZXRCb3JkZXIgPSBmdW5jdGlvbiAoYXJlYSwgc3R5bGUpIHtcclxuICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcgfHwgdGhpcy5jb25maWcuYm91bmRpbmdfYm94KSB7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5ib3JkZXJTdHlsZSA9IChzdHlsZSA9PSAnRFJBVycgPyAnZG90dGVkJyA6ICdzb2xpZCcpO1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5jb25maWdbJ0NMXycgKyBzdHlsZSArICdfJyArIChhcmVhLnNoYXBlID09ICdyZWN0JyA/ICdTSEFQRScgOiAnQk9YJyldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9jbGVhciBib3JkZXJcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5ib3JkZXIgPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFNldCBvcGFjaXR5IG9mIGFyZWEgdG8gdGhlIGdpdmVuIHBlcmNlbnRhZ2UsIGFzIHdlbGwgYXMgc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgKlx0SWYgcGVyY2VudGFnZSBjb250YWlucyBhIGRhc2goLSksIHRoZSBzZXR0aW5nIG9mIHRoZSBvcGFjaXR5IHdpbGwgYmUgZ3JhZHVhbC5cclxuICAgICpcdEBwYXJhbVx0YXJlYVx0VGhlIGFyZWEgb2JqZWN0LlxyXG4gICAgKlx0QHBhcmFtXHRiZ2NvbG9yXHROZXcgYmFja2dyb3VuZCBjb2xvclxyXG4gICAgKlx0QHBhcmFtXHRwY3RcdFx0UGVyY2VudGFnZSBvZiB0aGUgb3BhY2l0eS5cclxuICAgICovXHJcbiAgICBfc2V0b3BhY2l0eSA9IGZ1bmN0aW9uIChhcmVhLCBiZ2NvbG9yLCBwY3QpIHtcclxuICAgICAgICBpZiAoYmdjb2xvcikgeyBhcmVhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJnY29sb3I7IH1cclxuICAgICAgICBpZiAocGN0ICYmIHR5cGVvZiBwY3QgPT0gJ3N0cmluZycgJiYgcGN0Lm1hdGNoKC9eXFxkKlxcLVxcZCskLykpIHtcclxuICAgICAgICAgICAgLy9ncmFkdWFsIGZhZGVcclxuICAgICAgICAgICAgdmFyIHBhcnRzOiBhbnkgPSBwY3Quc3BsaXQoJy0nKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0c1swXSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgaW5pdGlhbCBvcGFjaXR5XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1swXSA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIGJnY29sb3IsIHBhcnRzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnRzWzFdICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VyciA9IHRoaXMuX2dldG9wYWNpdHkoYXJlYSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5yb3VuZChwYXJ0c1sxXSAtIGN1cnIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPiA1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2V0b3BhY2l0eShhcmVhLCBudWxsLCAnLScgKyBwYXJ0c1sxXSk7IH0sIDIwKTtcclxuICAgICAgICAgICAgICAgICAgICBwY3QgPSAxICogY3VyciArIDU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkaWZmIDwgLTMpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IF90aGlzLl9zZXRvcGFjaXR5KGFyZWEsIG51bGwsICctJyArIHBhcnRzWzFdKTsgfSwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgIHBjdCA9IDEgKiBjdXJyIC0gMztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZmluYWwgc2V0XHJcbiAgICAgICAgICAgICAgICAgICAgcGN0ID0gcGFydHNbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihwY3QpKSB7XHJcbiAgICAgICAgICAgIHBjdCA9IE1hdGgucm91bmQocGFyc2VJbnQocGN0LCAxMCkpO1xyXG5cclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5vcGFjaXR5ID0gcGN0IC8gMTAwO1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PScgKyBwY3QgKyAnKSc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHZXQgdGhlIGN1cnJlbnRseSBzZXQgb3BhY2l0eSBvZiBhIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIChjYW52YXMpIHlvdSB3YW50IHRvIGdldCBvcGFjaXR5IGluZm8gZnJvbS5cclxuICAgICpcdEByZXR1cm5cdE9wYWNpdHkgdmFsdWUgaW4gYSByYW5nZSBvZiAwLTEwMC5cclxuICAgICovXHJcbiAgICBfZ2V0b3BhY2l0eSA9IGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgaWYgKGFyZWEuc3R5bGUub3BhY2l0eSA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmVhLnN0eWxlLm9wYWNpdHkgKiAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcmVhLnN0eWxlLmZpbHRlcikge1xyXG4gICAgICAgICAgICAvL2FscGhhKG9wYWNpdHk9TmFOKVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoYXJlYS5zdHlsZS5maWx0ZXIucmVwbGFjZSgvYWxwaGFcXChvcGFjaXR5XFw9KFteXFwpXSopXFwpL2lnLCBcIiQxXCIpLCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAxMDA7IC8vZGVmYXVsdCBvcGFjaXR5XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFJlbW92ZXMgdGhlIGFyZWEgbWFya2VkIGJ5IGlkLlxyXG4gICAgKlx0Q2FsbGJhY2sgd2lsbCBjYWxsIHRoZSBHVUkgY29kZSB0byByZW1vdmUgR1VJIGVsZW1lbnRzLlxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QGRhdGVcdDExLTAyLTIwMDcgMjA6NDA6NThcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byByZW1vdmUuXHJcbiAgICAqXHRAc2VlXHQjcmVtb3ZlQWxsQXJlYXNcclxuICAgICovXHJcbiAgICByZW1vdmVBcmVhID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IHR5cGVvZiBpZCA9PSBcInVuZGVmaW5lZFwiKSB7IHJldHVybjsgfSAvL2V4aXQgaWYgbm8gaWQgZ2l2ZW5cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9yZW1vdmUgYXJlYSBhbmQgbGFiZWxcclxuICAgICAgICAgICAgLy9leHBsaWNpdGx5IHNldCBzb21lIHZhbHVlcyB0byBudWxsIHRvIGF2b2lkIElFIGNpcmN1bGFyIHJlZmVyZW5jZSBtZW1sZWFrXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmxhYmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hcmVhc1tpZF0ubGFiZWwpO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYXJlYXNbaWRdKTtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ubGFiZWwuY2xhc3NOYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmxhYmVsID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZW92ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5vbm1vdXNlb3V0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0ub25tb3VzZWRvd24gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5vbm1vdXNlbW92ZSA9IG51bGw7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXJlYXNbaWRdID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZW1vdmVBcmVhJywgaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRSZW1vdmVzIGFsbCBhcmVhcy5cclxuICAgICpcdFdpbGwgY2FsbCByZW1vdmVBcmVhIG9uIGFsbCBhcmVhcy5cclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBkYXRlXHQyMDA2LTA2LTA3IDExOjU1OjM0XHJcbiAgICAqXHRAc2VlXHQjcmVtb3ZlQXJlYVxyXG4gICAgKi9cclxuICAgIHJlbW92ZUFsbEFyZWFzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHRoaXMuYXJlYXMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBcmVhKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTY2FsZXMgYWxsIGFyZWFzLlxyXG4gICAgKlx0V2lsbCBzdG9yZSBzY2FsZSBwYXJhbWV0ZXIgaW4gZ2xvYmFsc2NhbGUgcHJvcGVydHkuXHJcbiAgICAqXHRUaGlzIGlzIG5lZWRlZCB0byBrbm93IGhvdyB0byBkcmF3IG5ldyBhcmVhcyBvbiBhbiBhbHJlYWR5IHNjYWxlZCBjYW52YXMuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAZGF0ZVx0MDItMTEtMjAwOCAxNDoxMzoxNFxyXG4gICAgKlx0QHBhcmFtIHNjYWxlXHRTY2FsZSBmYWN0b3IgKDEtb3JpZ2luYWwsIDAuNS1oYWxmLCAyLWRvdWJsZSwgZXRjLilcclxuICAgICovXHJcbiAgICBzY2FsZUFsbEFyZWFzID0gZnVuY3Rpb24gKHNjYWxlKSB7XHJcbiAgICAgICAgdmFyIHJzY2FsZSA9IHNjYWxlIC8gdGhpcy5nbG9iYWxzY2FsZTsgLy9yZWxhdGl2ZSBzY2FsZVxyXG4gICAgICAgIHRoaXMuZ2xvYmFsc2NhbGUgPSBzY2FsZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGUgPSB0aGlzLmFyZWFzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbaV0gJiYgdGhpcy5hcmVhc1tpXS5zaGFwZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZUFyZWEoaSwgcnNjYWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0U2NhbGVzIG9uZSBhcmVhLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QGRhdGVcdDAyLTExLTIwMDggMTQ6MTM6MTRcclxuICAgICpcdEBwYXJhbSByc2NhbGVcdFJlbGF0aXZlIHNjYWxlIGZhY3RvciAoMS1rZWVwLCAwLjUtaGFsZiwgMi1kb3VibGUsIGV0Yy4pXHJcbiAgICAqL1xyXG4gICAgc2NhbGVBcmVhID0gZnVuY3Rpb24gKGlkLCByc2NhbGUpIHtcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uIGFuZCBuZXcgZGltZW5zaW9uc1xyXG4gICAgICAgIGFyZWEuc3R5bGUudG9wID0gcGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSAqIHJzY2FsZSArICdweCc7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gcGFyc2VJbnQoYXJlYS5zdHlsZS5sZWZ0LCAxMCkgKiByc2NhbGUgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2V0QXJlYVNpemUoaWQsIGFyZWEud2lkdGggKiByc2NhbGUsIGFyZWEuaGVpZ2h0ICogcnNjYWxlKTtcclxuXHJcbiAgICAgICAgLy9oYW5kbGUgcG9seWdvbiBjb29yZGluYXRlcyBzY2FsaW5nXHJcbiAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ3BvbHknKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IGFyZWEueHBvaW50cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbaV0gKj0gcnNjYWxlO1xyXG4gICAgICAgICAgICAgICAgYXJlYS55cG9pbnRzW2ldICo9IHJzY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVjb29yZHMoaWQpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRQdXQgbGFiZWwgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciBhY2NvcmRpbmcgdG8gbGFiZWwgY29uZmlnLlxyXG4gICAgKlx0QnkgZGVmYXVsdCBpdCB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB0aGUgYXJlYSAoYXJlYS5haWQpXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gYWRkIGxhYmVsIHRvLlxyXG4gICAgKi9cclxuICAgIF9wdXRsYWJlbCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKCFhcmVhLmxhYmVsKSB7IHJldHVybjsgfSAvL25vdCB5ZXQgaW5pdGVkXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5sYWJlbC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5jb25maWcubGFiZWw7XHJcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnJlcGxhY2UoLyVuL2csIFN0cmluZyhpZCkpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5yZXBsYWNlKC8lYy9nLCBTdHJpbmcoYXJlYS5sYXN0SW5wdXQpKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSgvJWgvZywgU3RyaW5nKGFyZWEuYWhyZWYpKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSgvJWEvZywgU3RyaW5nKGFyZWEuYWFsdCkpO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5yZXBsYWNlKC8ldC9nLCBTdHJpbmcoYXJlYS5hdGl0bGUpKTtcclxuICAgICAgICAgICAgICAgIGFyZWEubGFiZWwuaW5uZXJIVE1MID0gbGFiZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9hbGlnbiB0byB0aGUgdG9wIGxlZnQgY29ybmVyXHJcbiAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUudG9wID0gYXJlYS5zdHlsZS50b3A7XHJcbiAgICAgICAgICAgIGFyZWEubGFiZWwuc3R5bGUubGVmdCA9IGFyZWEuc3R5bGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyhcIkVycm9yIHB1dHRpbmcgbGFiZWxcIiwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRTZXQgYXJlYSB0aXRsZSBhbmQgYWx0IChmb3IgSUUpIGFjY29yZGluZyB0byB0aGUgaGludCBjb25maWd1cmF0aW9uLlxyXG4gICAgKlx0VGhpcyB3aWxsIHNob3cgdXAgaW4gdGhlIHVzdWFsIHllbGxvdyBib3ggd2hlbiB5b3UgaG92ZXIgb3ZlciB3aXRoIHRoZSBtb3VzZS5cclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byBzZXQgaGludCBhdC5cclxuICAgICovXHJcbiAgICBfcHV0aGludCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcuaGludCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhc1tpZF0udGl0bGUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYXNbaWRdLmFsdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhpbnQgPSB0aGlzLmNvbmZpZy5oaW50O1xyXG4gICAgICAgICAgICAgICAgaGludCA9IGhpbnQucmVwbGFjZSgvJW4vZywgU3RyaW5nKGlkKSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8lYy9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0ubGFzdElucHV0KSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8laC9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0uYWhyZWYpKTtcclxuICAgICAgICAgICAgICAgIGhpbnQgPSBoaW50LnJlcGxhY2UoLyVhL2csIFN0cmluZyh0aGlzLmFyZWFzW2lkXS5hYWx0KSk7XHJcbiAgICAgICAgICAgICAgICBoaW50ID0gaGludC5yZXBsYWNlKC8ldC9nLCBTdHJpbmcodGhpcy5hcmVhc1tpZF0uYXRpdGxlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS50aXRsZSA9IGhpbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFzW2lkXS5hbHQgPSBoaW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2coXCJFcnJvciBwdXR0aW5nIGhpbnRcIiwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRXaWxsIGNhbGwgcmVwYWludCBvbiBhbGwgYXJlYXMuXHJcbiAgICAqXHRVc2VmdWwgd2hlbiB5b3UgY2hhbmdlIGxhYmVsaW5nIG9yIGhpbnQgY29uZmlnIG9uIHRoZSBHVUkuXHJcbiAgICAqXHRAc2VlICNfcmVwYWludFxyXG4gICAgKi9cclxuICAgIF9yZXBhaW50QWxsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHRoaXMuYXJlYXMubGVuZ3RoOyBpIDwgbGU7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwYWludCh0aGlzLmFyZWFzW2ldLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0UmVwYWludHMgdGhlIGFjdHVhbCBjYW52YXMgY29udGVudC5cclxuICAgICpcdFRoaXMgaXMgdGhlIG9ubHkgY2FudmFzIGRyYXdpbmcgbWFnaWMgdGhhdCBpcyBoYXBwZW5pbmcuXHJcbiAgICAqXHRJbiBmYWN0IHJlY3RhbmdsZXMgd2lsbCBub3QgaGF2ZSBhbnkgY2FudmFzIGNvbnRlbnQsIGp1c3QgYSBub3JtYWwgY3NzIGJvcmRlci5cclxuICAgICpcdEFmdGVyIHJlcGFpbnRpbmcgdGhlIGNhbnZhcywgaXQgd2lsbCBjYWxsIHB1dGxhYmVsIGFuZCBwdXRoaW50IG1ldGhvZHMuXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIG9iamVjdC5cclxuICAgICpcdEBwYXJhbVx0Y29sb3JcdENvbG9yIG9mIHRoZSBsaW5lIHRvIGRyYXcgb24gdGhlIGNhbnZhcy5cclxuICAgICpcdEBwYXJhbVx0eFx0T25seSB1c2VkIGZvciBwb2x5Z29ucyBhcyB0aGUgbmV3ZXN0IGNvbnRyb2wgcG9pbnQgeC5cclxuICAgICpcdEBwYXJhbVx0eVx0T25seSB1c2VkIGZvciBwb2x5Z29ucyBhcyB0aGUgbmV3ZXN0IGNvbnRyb2wgcG9pbnQgeS5cclxuICAgICovXHJcbiAgICBfcmVwYWludCA9IGZ1bmN0aW9uIChhcmVhLCBjb2xvciwgeCwgeSkge1xyXG4gICAgICAgIHZhciBjdHg7IC8vY2FudmFzIGNvbnRleHRcclxuICAgICAgICB2YXIgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wOyAvL2NhbnZhcyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdmFyIGksIGxlOyAvL2xvb3AgY291bnRlclxyXG4gICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApO1xyXG4gICAgICAgICAgICB2YXIgcmFkaXVzID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpIC0gMTtcclxuICAgICAgICAgICAgaWYgKHJhZGl1cyA8IDApXHJcbiAgICAgICAgICAgICAgICByYWRpdXMgPSAwO1xyXG5cclxuICAgICAgICAgICAgLy9nZXQgY2FudmFzIGNvbnRleHRcclxuICAgICAgICAgICAgY3R4ID0gYXJlYS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIC8vY2xlYXIgY2FudmFzXHJcbiAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIHdpZHRoKTtcclxuICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xyXG4gICAgICAgICAgICBjdHguYXJjKHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCAwKTtcclxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIC8vZHJhdyBjZW50ZXJcclxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb25maWcuQ0xfS05PQjtcclxuICAgICAgICAgICAgY3R4LnN0cm9rZVJlY3QocmFkaXVzLCByYWRpdXMsIDEsIDEpO1xyXG4gICAgICAgICAgICAvL3B1dCBsYWJlbFxyXG4gICAgICAgICAgICB0aGlzLl9wdXRsYWJlbChhcmVhLmFpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1dGhpbnQoYXJlYS5haWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAvL3B1dCBsYWJlbFxyXG4gICAgICAgICAgICB0aGlzLl9wdXRsYWJlbChhcmVhLmFpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1dGhpbnQoYXJlYS5haWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKTtcclxuICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApO1xyXG4gICAgICAgICAgICB0b3AgPSBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApO1xyXG4gICAgICAgICAgICBpZiAoYXJlYS54cG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjYW52YXMgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgY3R4ID0gYXJlYS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICAvL2NsZWFyIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBwb2x5Z29uXHJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYXJlYS54cG9pbnRzWzBdIC0gbGVmdCwgYXJlYS55cG9pbnRzWzBdIC0gdG9wKTtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKGFyZWEueHBvaW50c1tpXSAtIGxlZnQsIGFyZWEueXBvaW50c1tpXSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXIHx8IHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL29ubHkgZHJhdyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpZiBub3QgbW92aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0gbGVmdCwgeSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGFyZWEueHBvaW50c1swXSAtIGxlZnQsIGFyZWEueXBvaW50c1swXSAtIHRvcCk7XHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9wdXQgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5fcHV0bGFiZWwoYXJlYS5haWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9wdXRoaW50KGFyZWEuYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFVwZGF0ZXMgQXJlYSBjb29yZGluYXRlcy5cclxuICAgICpcdENhbGxlZCB3aGVuIG5lZWRlZCwgZWcuIG9uIG1vdXNlbW92ZSwgbW91c2Vkb3duLlxyXG4gICAgKlx0QWxzbyB1cGRhdGVzIGh0bWwgY29udGFpbmVyIHZhbHVlICh0aHJ1IGhvb2spLlxyXG4gICAgKlx0Q2FsbHMgY2FsbGJhY2sgb25BcmVhQ2hhbmdlZCBzbyB0aGF0IEdVSSBjYW4gZm9sbG93LlxyXG4gICAgKlx0VGhpcyBpcyBhbiBpbXBvcnRhbnQgaG9vayB0byB5b3VyIEdVSS5cclxuICAgICpcdFVzZXMgZ2xvYmFsc2NhbGUgdG8gc2NhbGUgcmVhbCBjb29yZGluYXRlcyB0byBhcmVhIGNvb3JkaW5hdGVzLlxyXG4gICAgKlx0QGRhdGVcdDIwMDYuMTAuMjQuIDIyOjM5OjI3XHJcbiAgICAqXHRAYXV0aG9yXHRBZGFtIE1hc2NoZWsgKGFkYW0ubWFzY2hlayhhdClnbWFpbC5jb20pXHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEuXHJcbiAgICAqL1xyXG4gICAgX3VwZGF0ZWNvb3JkcyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApIC8gdGhpcy5nbG9iYWxzY2FsZSk7XHJcbiAgICAgICAgdmFyIHRvcCA9IE1hdGgucm91bmQocGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSAvIHRoaXMuZ2xvYmFsc2NhbGUpO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUuaGVpZ2h0LCAxMCkgLyB0aGlzLmdsb2JhbHNjYWxlKTtcclxuICAgICAgICB2YXIgd2lkdGggPSBNYXRoLnJvdW5kKHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKSAvIHRoaXMuZ2xvYmFsc2NhbGUpO1xyXG5cclxuICAgICAgICB2YXIgdmFsdWUgPSAnJztcclxuICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBsZWZ0ICsgJywnICsgdG9wICsgJywnICsgKGxlZnQgKyB3aWR0aCkgKyAnLCcgKyAodG9wICsgaGVpZ2h0KTtcclxuICAgICAgICAgICAgYXJlYS5sYXN0SW5wdXQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICB2YXIgcmFkaXVzID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpIC0gMTtcclxuICAgICAgICAgICAgdmFsdWUgPSAobGVmdCArIHJhZGl1cykgKyAnLCcgKyAodG9wICsgcmFkaXVzKSArICcsJyArIHJhZGl1cztcclxuICAgICAgICAgICAgYXJlYS5sYXN0SW5wdXQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgaWYgKGFyZWEueHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBNYXRoLnJvdW5kKGFyZWEueHBvaW50c1tpXSAvIHRoaXMuZ2xvYmFsc2NhbGUpICsgJywnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChhcmVhLnlwb2ludHNbaV0gLyB0aGlzLmdsb2JhbHNjYWxlKSArICcsJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFyZWEubGFzdElucHV0ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25BcmVhQ2hhbmdlZCcsIGFyZWEpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRVcGRhdGVzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFyZWEgd2l0aCB0aGUgZ2l2ZW4gaWQgYWNjb3JkaW5nXHJcbiAgICAqXHR0byB0aGUgbmV3IGNvb3JkaW5hdGVzIHRoYXQgdHlwaWNhbGx5IGNvbWUgZnJvbSBhbiBpbnB1dCBvbiB0aGUgR1VJLlxyXG4gICAgKlx0VXNlcyBnbG9iYWxzY2FsZSB0byBzY2FsZSBhcmVhIGNvb3JkaW5hdGVzIHRvIHJlYWwgY29vcmRpbmF0ZXMuXHJcbiAgICAqXHRAZGF0ZVx0MjAwNi4xMC4yNC4gMjI6NDY6NTVcclxuICAgICpcdEBhdXRob3JcdEFkYW0gTWFzY2hlayAoYWRhbS5tYXNjaGVrKGF0KWdtYWlsLmNvbSlcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYS5cclxuICAgICpcdEBwYXJhbVx0Y29vcmRzXHRUaGUgbmV3IGNvb3JkcywgdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQuXHJcbiAgICAqL1xyXG4gICAgX3JlY2FsY3VsYXRlID0gZnVuY3Rpb24gKGlkLCBjb29yZHMpIHtcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChjb29yZHMpIHtcclxuICAgICAgICAgICAgICAgIGNvb3JkcyA9IHRoaXMuX25vcm1Db29yZHMoY29vcmRzLCBhcmVhLnNoYXBlLCAncHJlc2VydmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvb3JkcyA9IGFyZWEubGFzdElucHV0IHx8ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFydHMgPSBjb29yZHMuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQgfHxcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1swXSwgMTApID4gcGFyc2VJbnQocGFydHNbMl0sIDEwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgPiBwYXJzZUludChwYXJ0c1szXSwgMTApKSB7IHRocm93IFwiaW52YWxpZCBjb29yZHNcIjsgfVxyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gdGhpcy5nbG9iYWxzY2FsZSAqICh0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQocGFydHNbMF0sIDEwKSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUoaWQsIHRoaXMuZ2xvYmFsc2NhbGUgKiAocGFydHNbMl0gLSBwYXJ0c1swXSksIHRoaXMuZ2xvYmFsc2NhbGUgKiAocGFydHNbM10gLSBwYXJ0c1sxXSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDMgfHxcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChwYXJ0c1syXSwgMTApIDwgMCkgeyB0aHJvdyBcImludmFsaWQgY29vcmRzXCI7IH1cclxuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IDIgKiAocGFydHNbMl0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZShpZCwgdGhpcy5nbG9iYWxzY2FsZSAqIHdpZHRoLCB0aGlzLmdsb2JhbHNjYWxlICogd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gdGhpcy5nbG9iYWxzY2FsZSAqICh0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQocGFydHNbMF0sIDEwKSAtIHdpZHRoIC8gMikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSB3aWR0aCAvIDIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9TSEFQRSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncG9seScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7IHRocm93IFwiaW52YWxpZCBjb29yZHNcIjsgfVxyXG4gICAgICAgICAgICAgICAgYXJlYS54cG9pbnRzID0gW107XHJcbiAgICAgICAgICAgICAgICBhcmVhLnlwb2ludHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IHBhcnRzLmxlbmd0aDsgaSA8IGxlOyBpICs9IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbYXJlYS54cG9pbnRzLmxlbmd0aF0gPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQgKyBwYXJzZUludChwYXJ0c1tpXSwgMTApKTtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnlwb2ludHNbYXJlYS55cG9pbnRzLmxlbmd0aF0gPSB0aGlzLmdsb2JhbHNjYWxlICogKHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCArIHBhcnNlSW50KHBhcnRzW2kgKyAxXSwgMTApKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb2x5Z29uZ3JvdyhhcmVhLCB0aGlzLmdsb2JhbHNjYWxlICogcGFydHNbaV0sIHRoaXMuZ2xvYmFsc2NhbGUgKiBwYXJ0c1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seWdvbnNocmluayhhcmVhKTsgLy9pbmNsdWRlcyByZXBhaW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB2YXIgbXNnID0gKGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogJ2Vycm9yIGNhbGN1bGF0aW5nIGNvb3JkaW5hdGVzJztcclxuICAgICAgICAgICAgdGhpcy5sb2cobXNnLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5FUlJfSU5WQUxJRF9DT09SRFMpO1xyXG4gICAgICAgICAgICBpZiAoYXJlYS5sYXN0SW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvbkFyZWFDaGFuZ2VkJywgYXJlYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL29uIHN1Y2Nlc3MgdXBkYXRlIGxhc3RJbnB1dFxyXG4gICAgICAgIGFyZWEubGFzdElucHV0ID0gY29vcmRzO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRHcm93IHBvbHlnb24gYXJlYSB0byBiZSBhYmxlIHRvIGNvbnRhaW4gdGhlIGdpdmVuIG5ldyBjb29yZGluYXRlcy5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0YXJlYVx0VGhlIGFyZWEgdG8gZ3Jvdy5cclxuICAgICpcdEBwYXJhbVx0bmV3eFx0VGhlIG5ldyBjb29yZGluYXRlIHguXHJcbiAgICAqXHRAcGFyYW1cdG5ld3lcdFRoZSBuZXcgY29vcmRpbmF0ZSB5LlxyXG4gICAgKlx0QHNlZVx0I19wb2x5Z29uc2hyaW5rXHJcbiAgICAqL1xyXG4gICAgX3BvbHlnb25ncm93ID0gZnVuY3Rpb24gKGFyZWEsIG5ld3gsIG5ld3kpIHtcclxuICAgICAgICB2YXIgeGRpZmYgPSBuZXd4IC0gcGFyc2VJbnQoYXJlYS5zdHlsZS5sZWZ0LCAxMCk7XHJcbiAgICAgICAgdmFyIHlkaWZmID0gbmV3eSAtIHBhcnNlSW50KGFyZWEuc3R5bGUudG9wLCAxMCk7XHJcbiAgICAgICAgdmFyIHBhZCA9IDA7IC8vcGFkZGluZyBvbiB0aGUgZWRnZXNcclxuICAgICAgICB2YXIgcGFkMiA9IDA7IC8vdHdpY2UgdGhlIHBhZGRpbmdcclxuXHJcbiAgICAgICAgaWYgKG5ld3ggPCBwYXJzZUludChhcmVhLnN0eWxlLmxlZnQsIDEwKSkge1xyXG4gICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAobmV3eCAtIHBhZCkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBwYXJzZUludChhcmVhLnN0eWxlLndpZHRoLCAxMCkgKyBNYXRoLmFicyh4ZGlmZikgKyBwYWQyLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobmV3eCA+IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApICsgcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUoYXJlYS5haWQsIG5ld3ggLSBwYXJzZUludChhcmVhLnN0eWxlLmxlZnQsIDEwKSArIHBhZDIsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3eSA8IHBhcnNlSW50KGFyZWEuc3R5bGUudG9wLCAxMCkpIHtcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSAobmV3eSAtIHBhZCkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBudWxsLCBwYXJzZUludChhcmVhLnN0eWxlLmhlaWdodCwgMTApICsgTWF0aC5hYnMoeWRpZmYpICsgcGFkMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5ld3kgPiBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApICsgcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKGFyZWEuYWlkLCBudWxsLCBuZXd5IC0gcGFyc2VJbnQoYXJlYS5zdHlsZS50b3AsIDEwKSArIHBhZDIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0U2hyaW5rIHRoZSBwb2x5Z29uIGJvdW5kaW5nIGFyZWEgdG8gdGhlIG5lY2Vzc2FyeSBzaXplLCBieSBmaXJzdCByZWR1Y2luZyBpdFxyXG4gICAgKlx0dG8gdGhlIG1pbmltdW0sIGFuZCB0aGVuIGdyYWR1YWxseSBncm93aW5nIGl0LlxyXG4gICAgKlx0V2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2hpbGUgd2Ugd2VyZSBkcmF3aW5nIHRoZSBwb2x5Z29uLCBpdCBtaWdodCBoYXZlIGV4cGFuZGVkXHJcbiAgICAqXHR0aGUgY2FudmFzIG1vcmUgdGhhbiBuZWVkZWQuXHJcbiAgICAqXHRXaWxsIHJlcGFpbnQgdGhlIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGFyZWFcdFRoZSBhcmVhIHRvIHNocmluay5cclxuICAgICpcdEBzZWVcdCNfcG9seWdvbmdyb3dcclxuICAgICovXHJcbiAgICBfcG9seWdvbnNocmluayA9IGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gKGFyZWEueHBvaW50c1swXSkgKyAncHgnO1xyXG4gICAgICAgIGFyZWEuc3R5bGUudG9wID0gKGFyZWEueXBvaW50c1swXSkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuc2V0QXJlYVNpemUoYXJlYS5haWQsIDAsIDApO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZSA9IGFyZWEueHBvaW50cy5sZW5ndGg7IGkgPCBsZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvbHlnb25ncm93KGFyZWEsIGFyZWEueHBvaW50c1tpXSwgYXJlYS55cG9pbnRzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVwYWludChhcmVhLCB0aGlzLmNvbmZpZy5DTF9OT1JNX1NIQVBFKTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBtb3VzZW1vdmUgb24gdGhlIGltYWdlLlxyXG4gICAgKlx0VGhpcyBpcyB0aGUgbWFpbiBkcmF3aW5nIHJvdXRpbmUuXHJcbiAgICAqXHREZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc2hhcGUsIHdpbGwgZHJhdyB0aGUgcmVjdC9jaXJjbGUvcG9seSB0byB0aGUgbmV3IHBvc2l0aW9uLlxyXG4gICAgKlx0QHBhcmFtXHRlXHRUaGUgZXZlbnQgb2JqZWN0LlxyXG4gICAgKi9cclxuICAgIGltZ19tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vZnVuY3Rpb24gbGV2ZWwgdmFyIGRlY2xhcmF0aW9uc1xyXG4gICAgICAgIHZhciB4ZGlmZixcclxuICAgICAgICAgICAgeWRpZmYsXHJcbiAgICAgICAgICAgIGRpZmY7XHJcblxyXG4gICAgICAgIC8vZXZlbnQueCBpcyByZWxhdGl2ZSB0byBwYXJlbnQgZWxlbWVudCwgYnV0IHBhZ2UueCBpcyBOT1RcclxuICAgICAgICAvL3BvcyBjb29yZGluYXRlcyBhcmUgdGhlIHNhbWUgYWJzb2x1dGUgY29vcmRzLCBvZmZzZXQgY29vcmRzIGFyZSByZWxhdGl2ZSB0byBwYXJlbnRcclxuICAgICAgICBjb25zdCB3aW5kb3dFdmVudDogYW55ID0gd2luZG93LmV2ZW50O1xyXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLl9nZXRQb3ModGhpcy5pbWFnZUVsZW1lbnQpLFxyXG4gICAgICAgICAgICB4ID0gKHRoaXMuaXNNU0lFKSA/ICh3aW5kb3dFdmVudC54ICsgdGhpcy5wYXJlbnRJbWFnZUVsZW1lbnQuc2Nyb2xsTGVmdCAtIHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldExlZnQpIDogKGUuY2xpZW50WCAtIHBvcy54KSxcclxuICAgICAgICAgICAgeSA9ICh0aGlzLmlzTVNJRSkgPyAod2luZG93RXZlbnQueSArIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnNjcm9sbFRvcCAtIHRoaXMuaW1hZ2VFbGVtZW50Lm9mZnNldFRvcCkgOiAoZS5jbGllbnRZIC0gcG9zLnkpO1xyXG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xyXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpO1xyXG5cclxuICAgICAgICAvL2V4aXQgaWYgb3V0c2lkZSBpbWFnZVxyXG4gICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gdGhpcy5pbWFnZUVsZW1lbnQud2lkdGggfHwgeSA+IHRoaXMuaW1hZ2VFbGVtZW50LmhlaWdodCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy9vbGQgZGltZW5zaW9ucyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGlzIGZ1bmN0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXSkge1xyXG4gICAgICAgICAgICB2YXIgdG9wID0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnRvcDtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF07XHJcbiAgICAgICAgLy8gSGFuZGxlIHNoaWZ0IHN0YXRlIGZvciBTYWZhcmlcclxuICAgICAgICAvLyBTYWZhcmkgZG9lc24ndCBnZW5lcmF0ZSBrZXlib2FyZCBldmVudHMgZm9yIG1vZGlmaWVyczogaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2OTZcclxuICAgICAgICBpZiAodGhpcy5pc1NhZmFyaSkge1xyXG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfRFJBVztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9EUkFXKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfRFJBVyAmJiBhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbm90IGZvciBjaXJjbGUhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfRFJBVztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQ1RBTkdMRV9EUkFXKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vcmVjdGFuZ2xlIG1vZGVcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uRHJhd0FyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueDtcclxuICAgICAgICAgICAgeWRpZmYgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgTWF0aC5hYnMoeGRpZmYpLCBNYXRoLmFicyh5ZGlmZikpO1xyXG4gICAgICAgICAgICBpZiAoeGRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAoeCArIDEpICsgJ3B4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoeWRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9ICh5ICsgMSkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vc3F1YXJlIG1vZGUgLSBhbGlnbiB0byBzaG9ydGVyIHNpZGVcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uRHJhd0FyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueDtcclxuICAgICAgICAgICAgeWRpZmYgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255O1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoeGRpZmYpIDwgTWF0aC5hYnMoeWRpZmYpKSB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gTWF0aC5hYnMocGFyc2VJbnQoeGRpZmYsIDEwKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gTWF0aC5hYnMocGFyc2VJbnQoeWRpZmYsIDEwKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIGRpZmYsIGRpZmYpO1xyXG4gICAgICAgICAgICBpZiAoeGRpZmYgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAodGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd254ICsgZGlmZiAqIC0xKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHlkaWZmIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSAodGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd255ICsgZGlmZiAqIC0xICsgMSkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fRFJBVykge1xyXG4gICAgICAgICAgICAvL3BvbHlnb24gbW9kZVxyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25EcmF3QXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9seWdvbmdyb3coYXJlYSwgeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1JFQ1RBTkdMRV9NT1ZFIHx8IHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9NT1ZFKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvbk1vdmVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB4ID0geCAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bng7XHJcbiAgICAgICAgICAgIHkgPSB5IC0gdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueTtcclxuICAgICAgICAgICAgaWYgKHggKyB3aWR0aCA+IHRoaXMuaW1hZ2VFbGVtZW50LndpZHRoIHx8IHkgKyBoZWlnaHQgPiB0aGlzLmltYWdlRWxlbWVudC5oZWlnaHQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IHggKyAxICsgJ3B4JztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS50b3AgPSB5ICsgMSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTU9WRSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25Nb3ZlQXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgeCA9IHggLSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd254O1xyXG4gICAgICAgICAgICB5ID0geSAtIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnk7XHJcbiAgICAgICAgICAgIGlmICh4ICsgd2lkdGggPiB0aGlzLmltYWdlRWxlbWVudC53aWR0aCB8fCB5ICsgaGVpZ2h0ID4gdGhpcy5pbWFnZUVsZW1lbnQuaGVpZ2h0KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIGxlZnQ7XHJcbiAgICAgICAgICAgIHlkaWZmID0geSAtIHRvcDtcclxuICAgICAgICAgICAgaWYgKGFyZWEueHBvaW50cykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbaV0gPSB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ueHBvaW50c1tpXSArIHhkaWZmO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZWEueXBvaW50c1tpXSA9IHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS55cG9pbnRzW2ldICsgeWRpZmY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0geSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfTEVGVCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBkaWZmID0geCAtIGxlZnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoKHdpZHRoICsgKC0xICogZGlmZikpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSB4ICsgMSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9ICh0b3AgKyAoZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCBwYXJzZUludCh3aWR0aCArICgtMSAqIGRpZmYpLCAxMCksIHBhcnNlSW50KGhlaWdodCArICgtMSAqIGRpZmYpLCAxMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5sZWZ0ID0geDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX1JJR0hUO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfUklHSFQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uUmVzaXplQXJlYScsIHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgZGlmZiA9IHggLSBsZWZ0IC0gd2lkdGg7XHJcbiAgICAgICAgICAgIGlmICgod2lkdGggKyAoZGlmZikpIC0gMSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgcmlnaHRcclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0gKHRvcCArICgtMSAqIGRpZmYgLyAyKSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgKHdpZHRoICsgKGRpZmYpKSAtIDEsIChoZWlnaHQgKyAoZGlmZikpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0udG9wID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9MRUZUO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfVE9QKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvblJlc2l6ZUFyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIGRpZmYgPSB5IC0gdG9wO1xyXG4gICAgICAgICAgICBpZiAoKHdpZHRoICsgKC0xICogZGlmZikpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSB0b3BcclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUudG9wID0geSArIDEgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0gKGxlZnQgKyAoZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoLTEgKiBkaWZmKSksIChoZWlnaHQgKyAoLTEgKiBkaWZmKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5sZWZ0ID0geDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX0JPVFRPTTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfUkVTSVpFX0JPVFRPTSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBkaWZmID0geSAtIHRvcCAtIGhlaWdodDtcclxuICAgICAgICAgICAgaWYgKCh3aWR0aCArIChkaWZmKSkgLSAxID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBib3R0b21cclxuICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUubGVmdCA9IChsZWZ0ICsgKC0xICogZGlmZiAvIDIpKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoZGlmZikpIC0gMSwgKGhlaWdodCArIChkaWZmKSkgLSAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ud2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0udG9wID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9UT1A7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9MRUZUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdvblJlc2l6ZUFyZWEnLCB0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgIHhkaWZmID0geCAtIGxlZnQ7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCArICgtMSAqIHhkaWZmKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgbGVmdFxyXG4gICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5sZWZ0ID0geCArIDEgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcmVhU2l6ZSh0aGlzLmN1cnJlbnRpZCwgd2lkdGggKyAoLTEgKiB4ZGlmZiksIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfUklHSFQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9SSUdIVCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB4ZGlmZiA9IHggLSBsZWZ0IC0gd2lkdGg7XHJcbiAgICAgICAgICAgIGlmICgod2lkdGggKyAoeGRpZmYpKSAtIDEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL3JlYWwgcmVzaXplIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyZWFTaXplKHRoaXMuY3VycmVudGlkLCAod2lkdGggKyAoeGRpZmYpKSAtIDEsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfTEVGVDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX1RPUCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB5ZGlmZiA9IHkgLSB0b3A7XHJcbiAgICAgICAgICAgIGlmICgoaGVpZ2h0ICsgKC0xICogeWRpZmYpKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vcmVhbCByZXNpemUgdG9wXHJcbiAgICAgICAgICAgICAgICBhcmVhLnN0eWxlLnRvcCA9IHkgKyAxICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIG51bGwsIChoZWlnaHQgKyAoLTEgKiB5ZGlmZikpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vanVtcCB0byBhbm90aGVyIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSB5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnb25SZXNpemVBcmVhJywgdGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB5ZGlmZiA9IHkgLSB0b3AgLSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmICgoaGVpZ2h0ICsgKHlkaWZmKSkgLSAxID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9yZWFsIHJlc2l6ZSBib3R0b21cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJlYVNpemUodGhpcy5jdXJyZW50aWQsIG51bGwsIChoZWlnaHQgKyAoeWRpZmYpKSAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9qdW1wIHRvIGFub3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5oZWlnaHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnRvcCA9IHk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JlcGFpbnQgY2FudmFzIGVsZW1lbnRzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBhaW50KGFyZWEsIHRoaXMuY29uZmlnLkNMX0RSQVdfU0hBUEUsIHgsIHkpO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVjb29yZHModGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgbW91c2V1cCBvbiB0aGUgaW1hZ2UuXHJcbiAgICAqXHRIYW5kbGVzIGRyYWdnaW5nIGFuZCByZXNpemluZy5cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdC5cclxuICAgICovXHJcbiAgICBpbWdfbW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgY29uc3Qgd2luZG93RXZlbnQ6IGFueSA9IHdpbmRvdy5ldmVudDtcclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0UG9zKHRoaXMuaW1hZ2VFbGVtZW50KSxcclxuICAgICAgICAgICAgeCA9ICh0aGlzLmlzTVNJRSkgPyAod2luZG93RXZlbnQueCArIHRoaXMucGFyZW50SW1hZ2VFbGVtZW50LnNjcm9sbExlZnQgLSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRMZWZ0KSA6IChlLmNsaWVudFggLSBwb3MueCksXHJcbiAgICAgICAgICAgIHkgPSAodGhpcy5pc01TSUUpID8gKHdpbmRvd0V2ZW50LnkgKyB0aGlzLnBhcmVudEltYWdlRWxlbWVudC5zY3JvbGxUb3AgLSB0aGlzLmltYWdlRWxlbWVudC5vZmZzZXRUb3ApIDogKGUuY2xpZW50WSAtIHBvcy55KTtcclxuICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcclxuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcclxuXHJcbiAgICAgICAgLy9mb3IgZXZlcnl0aGluZyB0aGF0IGlzIG1vdmUgb3IgcmVzaXplXHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXICYmXHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1NRVUFSRV9EUkFXICYmXHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1BPTFlHT05fRFJBVyAmJlxyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgIT0gdGhpcy5ETV9QT0xZR09OX0xBU1REUkFXKSB7XHJcbiAgICAgICAgICAgIC8vZW5kIGRyYWdnaW5nXHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcclxuICAgICAgICAgICAgLy9maW5pc2ggc3RhdGVcclxuICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gMDtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUFEWSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVsYXhBcmVhKHRoaXMuY3VycmVudGlkKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdID09IHRoaXMuX2dldExhc3RBcmVhKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnggPSB4O1xyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIGltZ19kcmFnc3RhcnQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgbW91c2Vkb3duIG9uIHRoZSBpbWFnZS5cclxuICAgICpcdEhhbmRsZXMgYmVnZ2luaW5nIG9yIGVuZCBvZiBkcmF3LCBvciBwb2x5Z29uIHBvaW50IHNldC5cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdC5cclxuICAgICovXHJcbiAgICBpbWdfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIWUpXHJcblxyXG4gICAgICAgICAgICBlID0gd2luZG93LmV2ZW50O1xyXG5cclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0UG9zKHRoaXMuaW1hZ2VFbGVtZW50KSxcclxuICAgICAgICAgICAgeCA9IE1hdGgucm91bmQoZS5jbGllbnRYIC0gcG9zLngpLFxyXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChlLmNsaWVudFkgLSBwb3MueSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgU2hpZnQgc3RhdGVcclxuICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFyZWEgPSB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXTtcclxuICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUE9MWUdPTl9EUkFXKSB7XHJcbiAgICAgICAgICAgIC8vaXRzIG5vdCBmaW5pc2ggc3RhdGUgeWV0XHJcbiAgICAgICAgICAgIGFyZWEueHBvaW50c1thcmVhLnhwb2ludHMubGVuZ3RoXSA9IHg7XHJcbiAgICAgICAgICAgIGFyZWEueXBvaW50c1thcmVhLnlwb2ludHMubGVuZ3RoXSA9IHk7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5kb3dueSA9IHk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc19kcmF3aW5nICYmIHRoaXMuaXNfZHJhd2luZyAhPSB0aGlzLkRNX1BPTFlHT05fRFJBVykge1xyXG4gICAgICAgICAgICAvL2ZpbmlzaCBhbnkgb3RoZXIgc3RhdGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZyA9PSB0aGlzLkRNX1BPTFlHT05fTEFTVERSQVcpIHtcclxuICAgICAgICAgICAgICAgIC8vYWRkIGxhc3QgY29udHJvbHBvaW50IGFuZCB1cGRhdGUgY29vcmRzXHJcbiAgICAgICAgICAgICAgICBhcmVhLnhwb2ludHNbYXJlYS54cG9pbnRzLmxlbmd0aF0gPSB4O1xyXG4gICAgICAgICAgICAgICAgYXJlYS55cG9pbnRzW2FyZWEueXBvaW50cy5sZW5ndGhdID0geTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNvb3Jkcyh0aGlzLmN1cnJlbnRpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9seWdvbnNocmluayhhcmVhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQURZKTtcclxuICAgICAgICAgICAgdGhpcy5yZWxheEFyZWEodGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0gPT0gdGhpcy5fZ2V0TGFzdEFyZWEoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5uZXh0U2hhcGUpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5hZGROZXdBcmVhKCk7XHJcbiAgICAgICAgdGhpcy5pbml0QXJlYSh0aGlzLmN1cnJlbnRpZCwgdGhpcy5uZXh0U2hhcGUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc2hhcGUgPT0gJ3BvbHknKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fUE9MWUdPTl9EUkFXO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlBPTFlHT05fRFJBVyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLnRvcCA9IHkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnhwb2ludHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0ueXBvaW50cyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS54cG9pbnRzWzBdID0geDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0ueXBvaW50c1swXSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlJFQ1RBTkdMRV9EUkFXKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmxlZnQgPSB4ICsgJ3B4JztcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc3R5bGUudG9wID0geSArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc3R5bGUuaGVpZ2h0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0uc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfRFJBVztcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5DSVJDTEVfRFJBVyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS5sZWZ0ID0geCArICdweCc7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLnRvcCA9IHkgKyAncHgnO1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXRCb3JkZXIodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0sICdEUkFXJyk7XHJcbiAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmRvd254ID0geDtcclxuICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0uZG93bnkgPSB5O1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRIaWdobGlnaHRzIGEgZ2l2ZW4gYXJlYS5cclxuICAgICpcdFNldHMgb3BhY2l0eSBhbmQgcmVwYWludHMuXHJcbiAgICAqXHRAZGF0ZVx0MjAwNy4xMi4yOC4gMTg6MjM6MDBcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSB0byBibHVyLlxyXG5cclxuICAgICovXHJcbiAgICBoaWdobGlnaHRBcmVhID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNfZHJhd2luZykgeyByZXR1cm47IH0gLy9leGl0IGlmIGluIGRyYXdpbmcgc3RhdGVcclxuICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbaWRdO1xyXG4gICAgICAgIGlmIChhcmVhICYmIGFyZWEuc2hhcGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy9hcmVhIGV4aXN0cyAtIGhpZ2hsaWdodCBpdFxyXG4gICAgICAgICAgICB0aGlzLl9zZXRCb3JkZXIoYXJlYSwgJ0hJR0hMSUdIVCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIHRoaXMuY29uZmlnLkNMX0hJR0hMSUdIVF9CRywgJy0nICsgdGhpcy5jb25maWcuaGlnaGxpZ2h0X29wYWNpdHkpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBhaW50KGFyZWEsIHRoaXMuY29uZmlnLkNMX0hJR0hMSUdIVF9TSEFQRSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRCbHVycyBhIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRTZXRzIG9wYWNpdHkgYW5kIHJlcGFpbnRzLlxyXG4gICAgKlx0QGRhdGVcdDIwMDcuMTIuMjguIDE4OjIzOjI2XHJcbiAgICAqXHRAcGFyYW1cdGlkXHRUaGUgaWQgb2YgdGhlIGFyZWEgdG8gYmx1ci5cclxuXHJcbiAgICAqL1xyXG4gICAgYmx1ckFyZWEgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nKSB7IHJldHVybjsgfSAvL2V4aXQgaWYgaW4gZHJhd2luZyBzdGF0ZVxyXG4gICAgICAgIHZhciBhcmVhID0gdGhpcy5hcmVhc1tpZF07XHJcbiAgICAgICAgaWYgKGFyZWEgJiYgYXJlYS5zaGFwZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAvL2FyZWEgZXhpc3RzIC0gZmFkZSBpdCBiYWNrXHJcbiAgICAgICAgICAgIHRoaXMuX3NldEJvcmRlcihhcmVhLCAnTk9STScpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRvcGFjaXR5KGFyZWEsIHRoaXMuY29uZmlnLkNMX05PUk1fQkcsICctJyArIHRoaXMuY29uZmlnLm5vcm1fb3BhY2l0eSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQoYXJlYSwgdGhpcy5jb25maWcuQ0xfTk9STV9TSEFQRSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRFVkVOVCBIQU5ETEVSOiBIYW5kbGVzIGV2ZW50IG9mIG1vdXNlbW92ZSBvbiBpbWdtYXAgYXJlYXMuXHJcbiAgICAqXHQtIGNoYW5nZXMgY3Vyc29yIGRlcGVuZGluZyB3aGVyZSB3ZSBhcmUgaW5zaWRlIHRoZSBhcmVhIChidWdneSBpbiBvcGVyYSlcclxuICAgICpcdC0gaGFuZGxlcyBhcmVhIHJlc2l6ZVxyXG4gICAgKlx0LSBoYW5kbGVzIGFyZWEgbW92ZVxyXG4gICAgKlx0QHVybFx0aHR0cDovL2V2b2x0Lm9yZy9hcnRpY2xlL01pc3Npb25fSW1wb3NzaWJsZV9tb3VzZV9wb3NpdGlvbi8xNy8yMzMzNS9pbmRleC5odG1sXHJcbiAgICAqXHRAdXJsXHRodHRwOi8vbXkub3BlcmEuY29tL2NvbW11bml0eS9mb3J1bXMvdG9waWMuZG1sP2lkPTIzOTQ5OCZ0PTEyMTcxNTgwMTUmcGFnZT0xXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3QuXHJcbiAgICAqL1xyXG4gICAgYXJlYV9tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc19kcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICghZSlcclxuICAgICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgb2JqID0gKHRoaXMuaXNNU0lFKSA/IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50IDogZS5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ0RJVicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ2ltYWdlJyB8fCBvYmoudGFnTmFtZSA9PSAnZ3JvdXAnIHx8XHJcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA9PSAnc2hhcGUnIHx8IG9iai50YWdOYW1lID09ICdzdHJva2UnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBleGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlY3QgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd2luZG93RXZlbnQ6IGFueSA9IHdpbmRvdy5ldmVudDtcclxuICAgICAgICAgICAgdmFyIHhkaWZmID0gcmVjdCA/IGUuY2xpZW50WCAtIHJlY3QubGVmdCA6IHdpbmRvd0V2ZW50Lm9mZnNldFg7XHJcbiAgICAgICAgICAgIHZhciB5ZGlmZiA9IHJlY3QgPyBlLmNsaWVudFkgLSByZWN0LnRvcCA6IHdpbmRvd0V2ZW50Lm9mZnNldFk7XHJcblxyXG4gICAgICAgICAgICAvLyBBbGZvbnNvXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2FmYXJpKSB7XHJcbiAgICAgICAgICAgICAgICB4ZGlmZiAtPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICAgICAgICAgIHlkaWZmIC09IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAob2JqLnNoYXBlID09ICdyZWN0JyB8fCBvYmouc2hhcGUgPT0gJ2NpcmNsZScpO1xyXG4gICAgICAgICAgICBpZiAocmVzaXphYmxlICYmIHhkaWZmIDwgNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ3ctcmVzaXplJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXNpemFibGUgJiYgeGRpZmYgPiBwYXJzZUludChvYmouc3R5bGUud2lkdGgsIDEwKSAtIDYgJiYgeWRpZmYgPiA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgcmlnaHRcclxuICAgICAgICAgICAgICAgIG9iai5zdHlsZS5jdXJzb3IgPSAnZS1yZXNpemUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2l6YWJsZSAmJiB4ZGlmZiA+IDYgJiYgeWRpZmYgPCA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgdG9wXHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ24tcmVzaXplJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXNpemFibGUgJiYgeWRpZmYgPiBwYXJzZUludChvYmouc3R5bGUuaGVpZ2h0LCAxMCkgLSA2ICYmIHhkaWZmID4gNikge1xyXG4gICAgICAgICAgICAgICAgLy9tb3ZlIGJvdHRvbVxyXG4gICAgICAgICAgICAgICAgb2JqLnN0eWxlLmN1cnNvciA9ICdzLXJlc2l6ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgYWxsXHJcbiAgICAgICAgICAgICAgICBvYmouc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvYmouYWlkICE9IHRoaXMuZHJhZ2dlZElkKSB7XHJcbiAgICAgICAgICAgICAgICAvL25vdCBkcmFnZ2VkIG9yIGRpZmZlcmVudFxyXG4gICAgICAgICAgICAgICAgaWYgKG9iai5zdHlsZS5jdXJzb3IgPT0gJ21vdmUnKSB7IG9iai5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7IH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYXJlYSA9IHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdO1xyXG4gICAgICAgICAgICAvL21vdmVkIGhlcmUgZnJvbSBtb3VzZWRvd25cclxuICAgICAgICAgICAgaWYgKHhkaWZmIDwgNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBsZWZ0XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9MRUZUO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuU1FVQVJFX1JFU0laRV9MRUZUKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX0xFRlQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfUkVTSVpFX0xFRlQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHhkaWZmID4gcGFyc2VJbnQoYXJlYS5zdHlsZS53aWR0aCwgMTApIC0gNiAmJiB5ZGlmZiA+IDYpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSByaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfUklHSFQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5TUVVBUkVfUkVTSVpFX1JJR0hUKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZWEuc2hhcGUgPT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9SRUNUQU5HTEVfUkVTSVpFX1JJR0hUO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX1JFU0laRV9SSUdIVCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeGRpZmYgPiA2ICYmIHlkaWZmIDwgNikge1xyXG4gICAgICAgICAgICAgICAgLy9tb3ZlIHRvcFxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEuc2hhcGUgPT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1NRVUFSRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuU1FVQVJFX1JFU0laRV9UT1ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9SRVNJWkVfVE9QO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX1JFU0laRV9UT1ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHlkaWZmID4gcGFyc2VJbnQoYXJlYS5zdHlsZS5oZWlnaHQsIDEwKSAtIDYgJiYgeGRpZmYgPiA2KSB7XHJcbiAgICAgICAgICAgICAgICAvL21vdmUgYm90dG9tXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJlYS5zaGFwZSA9PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX1JFU0laRV9CT1RUT007XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5TUVVBUkVfUkVTSVpFX0JPVFRPTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdyZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fUkVDVEFOR0xFX1JFU0laRV9CT1RUT007XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfUkVTSVpFX0JPVFRPTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZS8qaWYgKHhkaWZmIDwgMTAgJiYgeWRpZmYgPCAxMCApICovIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSBhbGxcclxuICAgICAgICAgICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19kcmF3aW5nID0gdGhpcy5ETV9TUVVBUkVfTU9WRTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9NT1ZFKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd254ID0geGRpZmY7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueSA9IHlkaWZmO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJlYS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9NT1ZFO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSh0aGlzLnN0cmluZ3MuUkVDVEFOR0xFX01PVkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnggPSB4ZGlmZjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ucmRvd255ID0geWRpZmY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmVhLnhwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlID0gYXJlYS54cG9pbnRzLmxlbmd0aDsgaSA8IGxlOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS54cG9pbnRzW2ldID0gYXJlYS54cG9pbnRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnlwb2ludHNbaV0gPSBhcmVhLnlwb2ludHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmVhLnNoYXBlID09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1BPTFlHT05fTU9WRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5QT0xZR09OX01PVkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLnJkb3dueCA9IHhkaWZmO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS5yZG93bnkgPSB5ZGlmZjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb21tb24gbWVtb3J5IHNldHRpbmdzIChwcmVwYXJpbmcgdG8gbW92ZSBvciByZXNpemUpXHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS53aWR0aCA9IHBhcnNlSW50KGFyZWEuc3R5bGUud2lkdGgsIDEwKTtcclxuICAgICAgICAgICAgdGhpcy5tZW1vcnlbdGhpcy5jdXJyZW50aWRdLmhlaWdodCA9IHBhcnNlSW50KGFyZWEuc3R5bGUuaGVpZ2h0LCAxMCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVtb3J5W3RoaXMuY3VycmVudGlkXS50b3AgPSBwYXJzZUludChhcmVhLnN0eWxlLnRvcCwgMTApO1xyXG4gICAgICAgICAgICB0aGlzLm1lbW9yeVt0aGlzLmN1cnJlbnRpZF0ubGVmdCA9IHBhcnNlSW50KGFyZWEuc3R5bGUubGVmdCwgMTApO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRCb3JkZXIoYXJlYSwgJ0RSQVcnKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0b3BhY2l0eShhcmVhLCB0aGlzLmNvbmZpZy5DTF9EUkFXX0JHLCB0aGlzLmNvbmZpZy5kcmF3X29wYWNpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9pZiBkcmF3aW5nIGFuZCBub3QgaWUsIGhhdmUgdG8gcHJvcGFnYXRlIHRvIGltYWdlIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuaW1nX21vdXNlbW92ZShlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2V1cCBvbiBpbWdtYXAgYXJlYXMuXHJcbiAgICAqXHRCYXNpY2FsbHkgY2xlYXJzIGRyYWdnZWRJZC5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzX2RyYXdpbmcpIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9ICh0aGlzLmlzTVNJRSkgPyB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudCA6IGUuY3VycmVudFRhcmdldDtcclxuICAgICAgICAgICAgaWYgKG9iai50YWdOYW1lID09ICdESVYnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBsYWJlbFxyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9iai50YWdOYW1lID09ICdpbWFnZScgfHwgb2JqLnRhZ05hbWUgPT0gJ2dyb3VwJyB8fFxyXG4gICAgICAgICAgICAgICAgb2JqLnRhZ05hbWUgPT0gJ3NoYXBlJyB8fCBvYmoudGFnTmFtZSA9PSAnc3Ryb2tlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kbyB0aGlzIGJlY2F1c2Ugb2YgZXhjYW52YXNcclxuICAgICAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdICE9IG9iaikge1xyXG4gICAgICAgICAgICAgICAgLy90cnlpbmcgdG8gZHJhdyBvbiBhIGRpZmZlcmVudCBjYW52YXMsc3dpdGNoIHRvIHRoaXMgb25lXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5haWQgPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnQ2Fubm90IGlkZW50aWZ5IHRhcmdldCBhcmVhJywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vaWYgZHJhd2luZyBhbmQgbm90IGllLCBoYXZlIHRvIHByb3BhZ2F0ZSB0byBpbWFnZSBldmVudFxyXG4gICAgICAgICAgICB0aGlzLmltZ19tb3VzZXVwKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCBvZiBtb3VzZW92ZXIgb24gaW1nbWFwIGFyZWFzLlxyXG4gICAgKlx0Q2FsbHMgZ3JhZHVhbCBoaWdobGlnaHQgb24gdGhlIGdpdmVuIGFyZWEuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBhcmVhX21vdXNlb3ZlciA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzX2RyYXdpbmcpIHtcclxuICAgICAgICAgICAgLy9pZGVudGlmeSBzb3VyY2Ugb2JqZWN0XHJcbiAgICAgICAgICAgIHZhciBvYmogPSAodGhpcy5pc01TSUUpID8gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQgOiBlLmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGlmIChvYmoudGFnTmFtZSA9PSAnRElWJykge1xyXG4gICAgICAgICAgICAgICAgLy9kbyB0aGlzIGJlY2F1c2Ugb2YgbGFiZWxcclxuICAgICAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvYmoudGFnTmFtZSA9PSAnaW1hZ2UnIHx8IG9iai50YWdOYW1lID09ICdncm91cCcgfHxcclxuICAgICAgICAgICAgICAgIG9iai50YWdOYW1lID09ICdzaGFwZScgfHwgb2JqLnRhZ05hbWUgPT0gJ3N0cm9rZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGV4Y2FudmFzXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0QXJlYShvYmouYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2VvdXQgb24gaW1nbWFwIGFyZWFzLlxyXG4gICAgKlx0Q2FsbHMgZ3JhZGllbnQgYmx1ciBvbiB0aGUgZ2l2ZW4gYXJlYS5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2VvdXQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc19kcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICghZSlcclxuICAgICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc01TSUUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gbW92aW5nIHRvIGEgY2hpbGQsIGlnbm9yZSB0aGlzIG1vdXNlb3V0IGV2ZW50XHJcbiAgICAgICAgICAgICAgICBpZiAoZS50b0VsZW1lbnQgJiYgZS5zcmNFbGVtZW50ID09IGUudG9FbGVtZW50LnBhcmVudE5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2lkZW50aWZ5IHNvdXJjZSBvYmplY3RcclxuICAgICAgICAgICAgdmFyIG9iaiA9ICh0aGlzLmlzTVNJRSkgPyBlLnNyY0VsZW1lbnQgOiBlLmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciB0YWdOYW1lID0gb2JqLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gJ2RpdicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGFnTmFtZSA9PSAnaW1hZ2UnIHx8IHRhZ05hbWUgPT0gJ2dyb3VwJyB8fFxyXG4gICAgICAgICAgICAgICAgdGFnTmFtZSA9PSAnc2hhcGUnIHx8IHRhZ05hbWUgPT0gJ3N0cm9rZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGV4Y2FudmFzXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBPbmx5IGJsdXIgdGhlIGFyZWEgaWYgaXQgaXNuJ3QgdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRpZCAhPSBvYmouYWlkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibHVyQXJlYShvYmouYWlkKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgb2YgbW91c2Vkb3duIG9uIGltZ21hcCBhcmVhcy5cclxuICAgICpcdFNldHMgdGhlIHZhcmlhYmxlcyBkcmFnZ2VkaWQsIHNlbGVjdGVkaWQgYW5kIGN1cnJlbnRpZCB0byB0aGUgZ2l2ZW4gYXJlYS5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGFyZWFfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gKHRoaXMuaXNNU0lFKSA/IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50IDogZS5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ0RJVicpIHtcclxuICAgICAgICAgICAgICAgIC8vZG8gdGhpcyBiZWNhdXNlIG9mIGxhYmVsXHJcbiAgICAgICAgICAgICAgICBvYmogPSBvYmoucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob2JqLnRhZ05hbWUgPT0gJ2ltYWdlJyB8fCBvYmoudGFnTmFtZSA9PSAnZ3JvdXAnIHx8XHJcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA9PSAnc2hhcGUnIHx8IG9iai50YWdOYW1lID09ICdzdHJva2UnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RvIHRoaXMgYmVjYXVzZSBvZiBleGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1t0aGlzLmN1cnJlbnRpZF0gIT0gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RyeWluZyB0byBkcmF3IG9uIGEgZGlmZmVyZW50IGNhbnZhcywgc3dpdGNoIHRvIHRoaXMgb25lXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iai5haWQgPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnQ2Fubm90IGlkZW50aWZ5IHRhcmdldCBhcmVhJywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmx1ckFyZWEodGhpcy5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50aWQgPSBvYmouYWlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRBcmVhKG9iai5haWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRJZCA9IHRoaXMuY3VycmVudGlkO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWQgPSB0aGlzLmN1cnJlbnRpZDtcclxuICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ29uU2VsZWN0QXJlYScsIHRoaXMuYXJlYXNbdGhpcy5jdXJyZW50aWRdKTtcclxuICAgICAgICAgICAgLy9zdG9wIGV2ZW50IHByb3BhZ2F0aW9uIHRvIGRvY3VtZW50IGxldmVsXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTVNJRSkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL2lmIGRyYXdpbmcgYW5kIG5vdCBpZSwgaGF2ZSB0byBwcm9wYWdhdGUgdG8gaW1hZ2UgZXZlbnRcclxuICAgICAgICAgICAgdGhpcy5pbWdfbW91c2Vkb3duKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCAna2V5ZG93bicgb24gZG9jdW1lbnQuXHJcbiAgICAqXHRIYW5kbGVzIFNISUZUIGhvbGQgd2hpbGUgZHJhd2luZy5cclxuICAgICpcdE5vdGU6IFNhZmFyaSBkb2Vzbid0IGdlbmVyYXRlIGtleWJvYXJkIGV2ZW50cyBmb3IgbW9kaWZpZXJzOlxyXG4gICAgKlx0QHVybFx0aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2OTZcclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBwYXJhbVx0ZVx0VGhlIGV2ZW50IG9iamVjdFxyXG4gICAgKi9cclxuICAgIGRvY19rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoZS5rZXlDb2RlID09IDQ2IHx8IGUua2V5ID09IFwiRGVsZXRlXCIpIHtcclxuICAgICAgICAgICAgLy9kZWxldGUga2V5IHByZXNzZWRcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCAhPT0gbnVsbCAmJiAhdGhpcy5pc19kcmF3aW5nKSB7IHRoaXMucmVtb3ZlQXJlYSh0aGlzLnNlbGVjdGVkSWQpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxNiB8fCBlLmtleSA9PSBcIlNoaWZ0XCIpIHtcclxuICAgICAgICAgICAgLy9zaGlmdCBrZXkgcHJlc3NlZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc19kcmF3aW5nID09IHRoaXMuRE1fUkVDVEFOR0xFX0RSQVcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZHJhd2luZyA9IHRoaXMuRE1fU1FVQVJFX0RSQVc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UodGhpcy5zdHJpbmdzLlNRVUFSRV9EUkFXKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RVZFTlQgSEFORExFUjogSGFuZGxlcyBldmVudCAna2V5dXAnIG9uIGRvY3VtZW50LlxyXG4gICAgKlx0SGFuZGxlcyBTSElGVCByZWxlYXNlIHdoaWxlIGRyYXdpbmcuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBkb2Nfa2V5dXAgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTYgfHwgZS5rZXkgPT0gXCJTaGlmdFwiKSB7XHJcbiAgICAgICAgICAgIC8vc2hpZnQga2V5IHJlbGVhc2VkXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX2RyYXdpbmcgPT0gdGhpcy5ETV9TUVVBUkVfRFJBVyAmJiB0aGlzLmFyZWFzW3RoaXMuY3VycmVudGlkXS5zaGFwZSA9PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgIC8vbm90IGZvciBjaXJjbGUhXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2RyYXdpbmcgPSB0aGlzLkRNX1JFQ1RBTkdMRV9EUkFXO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlKHRoaXMuc3RyaW5ncy5SRUNUQU5HTEVfRFJBVyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEVWRU5UIEhBTkRMRVI6IEhhbmRsZXMgZXZlbnQgJ21vdXNlZG93bicgb24gZG9jdW1lbnQuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAcGFyYW1cdGVcdFRoZSBldmVudCBvYmplY3RcclxuICAgICovXHJcbiAgICBkb2NfbW91c2Vkb3duID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNfZHJhd2luZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0R2V0IHRoZSByZWFsIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKlx0RGVhbCB3aXRoIGJyb3dzZXIgZGlmZmVyZW5jZXMgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSBwb3NpdGlvbiBvZiBhbiBhcmVhLlxyXG4gICAgKlx0QHBhcmFtXHRlbGVtZW50XHRUaGUgZWxlbWVudCB5b3Ugd2FudCB0aGUgcG9zaXRpb24gb2YuXHJcbiAgICAqXHRAcmV0dXJuXHRBbiBvYmplY3Qgd2l0aCB4IGFuZCB5IG1lbWJlcnMuXHJcbiAgICAqL1xyXG4gICAgX2dldFBvcyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcblxyXG4gICAgICAgIHZhciBib3VuZGluZyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogYm91bmRpbmcubGVmdCwgeTogYm91bmRpbmcudG9wIH07XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdEdldHMgdGhlIGxhc3QgKHZpc2libGUgYW5kIGVkaXRhYmxlKSBhcmVhLlxyXG4gICAgKlx0QGF1dGhvclx0QWRhbSBNYXNjaGVrIChhZGFtLm1hc2NoZWsoYXQpZ21haWwuY29tKVxyXG4gICAgKlx0QGRhdGVcdDIwMDYtMDYtMTUgMTY6MzQ6NTFcclxuICAgICpcdEByZXR1cm5zXHRUaGUgbGFzdCBhcmVhIG9iamVjdCBvciBudWxsLlxyXG4gICAgKi9cclxuICAgIF9nZXRMYXN0QXJlYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5hcmVhcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcmVhc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJlYXNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICpcdFBhcnNlcyBjc3NUZXh0IHRvIHNpbmdsZSBzdHlsZSBkZWNsYXJhdGlvbnMuXHJcbiAgICAqXHRAYXV0aG9yXHRhZGFtXHJcbiAgICAqXHRAZGF0ZVx0MjUtMDktMjAwNyAxODoxOTo1MVxyXG4gICAgKlx0QHBhcmFtIG9ialx0VGhlIERPTSBvYmplY3QgdG8gYXBwbHkgc3R5bGVzIG9uLlxyXG4gICAgKlx0QHBhcmFtIGNzc1RleHRcdFRoZSBjc3MgZGVjbGFyYXRpb25zIHRvIGFwcGx5LlxyXG4gICAgKi9cclxuICAgIGFzc2lnbkNTUyA9IGZ1bmN0aW9uIChvYmosIGNzc1RleHQpIHtcclxuICAgICAgICB2YXIgcGFydHMgPSBjc3NUZXh0LnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcCA9IHBhcnRzW2ldLnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgICAgIC8vd2UgbmVlZCB0byBjYW1lbGNhc2UgYnkgLSBzaWduc1xyXG4gICAgICAgICAgICB2YXIgcHAgPSB0cmltKHBbMF0pLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9wID0gcHBbMF07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcHAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcmVwbGFjZSBmaXJzdCBsZXR0ZXJzIHRvIHVwcGVyY2FzZVxyXG4gICAgICAgICAgICAgICAgcHJvcCArPSBwcFtqXS5yZXBsYWNlKC9eXFx3LywgcHBbal0uc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9iai5zdHlsZVt0cmltKHByb3ApXSA9IHRyaW0ocFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRUbyBmaXJlIGNhbGxiYWNrIGhvb2tzIG9uIGN1c3RvbSBldmVudHMsIHBhc3NpbmcgdGhlbSB0aGUgb2JqZWN0IG9mIHRoZSBldmVudC5cclxuICAgICpcdEBhdXRob3JcdGFkYW1cclxuICAgICpcdEBkYXRlXHQxMy0xMC0yMDA3IDE1OjI0OjQ5XHJcbiAgICAqXHRAcGFyYW0gZXZ0XHRUaGUgdHlwZSBvZiBldmVudFxyXG4gICAgKlx0QHBhcmFtIG9ialx0VGhlIG9iamVjdCBvZiB0aGUgZXZlbnQuIChjYW4gYmUgYW4gaWQsIGEgc3RyaW5nLCBhbiBvYmplY3QsIHdoYXRldmVyIGlzIG1vc3QgcmVsZXZhbnQpXHJcbiAgICAqL1xyXG4gICAgZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGV2dCwgb2JqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5jdXN0b21fY2FsbGJhY2tzW2V2dF0gPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuY3VzdG9tX2NhbGxiYWNrc1tldnRdKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqXHRUbyBzZXQgYXJlYSBkaW1lbnNpb25zLlxyXG4gICAgKlx0VGhpcyBpcyBuZWVkZWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQgaW4gYWxsIGJyb3dzZXJzLlxyXG4gICAgKlx0QGF1dGhvclx0YWRhbVxyXG4gICAgKlx0QGRhdGVcdDEwLTEyLTIwMDcgMjI6Mjk6NDFcclxuICAgICpcdEBwYXJhbVx0aWRcdFRoZSBpZCBvZiB0aGUgYXJlYSAoY2FudmFzKSB0byByZXNpemUuXHJcbiAgICAqXHRAcGFyYW1cdHdcdFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cclxuICAgICpcdEBwYXJhbVx0aFx0VGhlIGRlc2lyZWQgaGVpZ2h0IGluIHBpeGVscy5cclxuICAgICovXHJcbiAgICBzZXRBcmVhU2l6ZSA9IGZ1bmN0aW9uIChpZCwgdywgaCkge1xyXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCkgeyBpZCA9IHRoaXMuY3VycmVudGlkOyB9XHJcbiAgICAgICAgdmFyIGFyZWEgPSB0aGlzLmFyZWFzW2lkXTtcclxuICAgICAgICBpZiAodyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcmVhLndpZHRoID0gdztcclxuICAgICAgICAgICAgYXJlYS5zdHlsZS53aWR0aCA9ICh3KSArICdweCc7XHJcbiAgICAgICAgICAgIGFyZWEuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcmVhLmhlaWdodCA9IGg7XHJcbiAgICAgICAgICAgIGFyZWEuc3R5bGUuaGVpZ2h0ID0gKGgpICsgJ3B4JztcclxuICAgICAgICAgICAgYXJlYS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKlx0RGlzYWJsZSBzZWxlY3Rpb24gb24gYSBnaXZlbiBvYmplY3QuXHJcbiAgICAqXHRUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIFNhZmFyaSwgd2hlcmUgZHJhZ2dpbmcgYXJvdW5kIGFyZWFzXHJcbiAgICAqXHRrZWVwcyBzZWxlY3RpbmcgYWxsIHNvcnRzIG9mIHRoaW5ncy5cclxuICAgICpcdEBhdXRob3JcdEJyZXQgVGF5bG9yXHJcbiAgICAqXHRAdXJsXHRodHRwOi8vYWpheGNvb2tib29rLm9yZy9kaXNhYmxlLXRleHQtc2VsZWN0aW9uL1xyXG4gICAgKlx0QGRhdGVcdDI3LTA3LTIwMDggMTo1Nzo0NVxyXG4gICAgKlx0QHBhcmFtXHRlbGVtZW50XHRUaGUgRE9NIGVsZW1lbnQgb24gd2hpY2ggeW91IHdhbnQgdG8gZGlzYWJsZSBzZWxlY3Rpb24uXHJcbiAgICAqL1xyXG4gICAgZGlzYWJsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICd1bmRlZmluZWQnIHx8ICFlbGVtZW50KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudW5zZWxlY3RhYmxlICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC51bnNlbGVjdGFibGUgPSBcIm9uXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5zdHlsZS5Nb3pVc2VyU2VsZWN0ICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAgICAqXHRUcmltcyBhIHN0cmluZy5cclxuICAgICpcdENoYW5nZWQgbm90IHRvIGV4dGVuZCBTdHJpbmcgYnV0IHVzZSBvd24gZnVuY3Rpb24gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxyXG4gICAgKlx0QHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIHRyaW0uXHJcbiAgICAqL1xyXG5mdW5jdGlvbiB0cmltKHN0cikge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XHJcbn07Il19