@ohioepa/oepa-ui-lib 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/account-search-input/account-search-input.component.mjs +147 -0
  3. package/esm2022/lib/account-search-modal/account-search-modal.component.mjs +151 -0
  4. package/esm2022/lib/action-btn/action-btn.component.mjs +70 -0
  5. package/esm2022/lib/action-btn/oepa-action-event.mjs +2 -0
  6. package/esm2022/lib/action-btn/oepa-action.mjs +2 -0
  7. package/esm2022/lib/action-btn-modal/action-btn-modal.component.mjs +21 -0
  8. package/esm2022/lib/address/address.component.mjs +174 -0
  9. package/esm2022/lib/address/oepa-address.service.mjs +64 -0
  10. package/esm2022/lib/address/oepa-form-address.mjs +2 -0
  11. package/esm2022/lib/blank/blank.component.mjs +14 -0
  12. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -0
  13. package/esm2022/lib/checkbox-input/checkbox-input.component.mjs +41 -0
  14. package/esm2022/lib/comment-modal/comment-modal.component.mjs +56 -0
  15. package/esm2022/lib/common-forms.module.mjs +291 -0
  16. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +120 -0
  17. package/esm2022/lib/contact/contact.component.mjs +102 -0
  18. package/esm2022/lib/contact/oepa-form-contact.mjs +2 -0
  19. package/esm2022/lib/date-input/date-input.component.mjs +52 -0
  20. package/esm2022/lib/date-input-modal/date-input-modal.component.mjs +68 -0
  21. package/esm2022/lib/datepicker/datepicker.component.mjs +131 -0
  22. package/esm2022/lib/daterangepicker/daterangepicker.component.mjs +70 -0
  23. package/esm2022/lib/document/document-editor/document-editor.component.mjs +225 -0
  24. package/esm2022/lib/document/document-event-entity-type.mjs +7 -0
  25. package/esm2022/lib/document/document-event-type.mjs +7 -0
  26. package/esm2022/lib/document/document-event.mjs +2 -0
  27. package/esm2022/lib/document/document-group/document-group.component.mjs +210 -0
  28. package/esm2022/lib/document/document-part/document-part.component.mjs +19 -0
  29. package/esm2022/lib/document/document-part-editor/document-part-editor.component.mjs +296 -0
  30. package/esm2022/lib/document/document-placeholder-modal/document-placeholder-modal.component.mjs +49 -0
  31. package/esm2022/lib/document/document-section/document-section.component.mjs +226 -0
  32. package/esm2022/lib/document/document.service.mjs +325 -0
  33. package/esm2022/lib/document/group-modal/group-modal.component.mjs +46 -0
  34. package/esm2022/lib/document/part-modal/part-modal.component.mjs +48 -0
  35. package/esm2022/lib/document/portal-document-class.mjs +2 -0
  36. package/esm2022/lib/document/portal-document-group.mjs +2 -0
  37. package/esm2022/lib/document/portal-document-part.mjs +2 -0
  38. package/esm2022/lib/document/portal-document-placeholder.mjs +2 -0
  39. package/esm2022/lib/document/portal-document-section.mjs +2 -0
  40. package/esm2022/lib/document/portal-document-text.mjs +2 -0
  41. package/esm2022/lib/document/portal-document-type.mjs +2 -0
  42. package/esm2022/lib/document/portal-document.mjs +2 -0
  43. package/esm2022/lib/document/portal-email-attachment-type.mjs +2 -0
  44. package/esm2022/lib/document/portal-email-attachment.mjs +2 -0
  45. package/esm2022/lib/document/portal-email-filter.mjs +2 -0
  46. package/esm2022/lib/document/portal-email.mjs +2 -0
  47. package/esm2022/lib/document/section-modal/section-modal.component.mjs +46 -0
  48. package/esm2022/lib/dual-list-box/array.pipes.mjs +71 -0
  49. package/esm2022/lib/dual-list-box/dual-list-box.component.mjs +339 -0
  50. package/esm2022/lib/dual-list-box/items-moved-event.mjs +2 -0
  51. package/esm2022/lib/dual-list-box/list-box-item.mjs +2 -0
  52. package/esm2022/lib/ebiz-address/ebiz-address.component.mjs +62 -0
  53. package/esm2022/lib/edoc-attachment/edoc-attachment.component.mjs +216 -0
  54. package/esm2022/lib/edoc-attachment/edoc-attachment.service.mjs +38 -0
  55. package/esm2022/lib/edoc-attachment/edocument-attachment-metadata.mjs +2 -0
  56. package/esm2022/lib/edoc-attachment/edocument-attachment.mjs +2 -0
  57. package/esm2022/lib/edoc-attachment/edocument-reference.mjs +2 -0
  58. package/esm2022/lib/entity/entity.service.mjs +104 -0
  59. package/esm2022/lib/entity/organization-create-modal/organization-create-modal.component.mjs +307 -0
  60. package/esm2022/lib/entity/organization-search-input/organization-search-input.component.mjs +127 -0
  61. package/esm2022/lib/entity/organization-search-modal/organization-search-modal.component.mjs +304 -0
  62. package/esm2022/lib/entity/person-create-modal/person-create-modal.component.mjs +316 -0
  63. package/esm2022/lib/entity/person-search-input/person-search-input.component.mjs +129 -0
  64. package/esm2022/lib/entity/person-search-modal/person-search-modal.component.mjs +311 -0
  65. package/esm2022/lib/entity/place-create-modal/place-create-modal.component.mjs +14 -0
  66. package/esm2022/lib/entity/place-search-input/place-search-input.component.mjs +126 -0
  67. package/esm2022/lib/entity/place-search-modal/place-search-modal.component.mjs +216 -0
  68. package/esm2022/lib/esri-map/esri-map.component.mjs +416 -0
  69. package/esm2022/lib/file-upload/file-upload.component.mjs +148 -0
  70. package/esm2022/lib/lynx-image-upload/lynx-image-upload.component.mjs +143 -0
  71. package/esm2022/lib/lynx-image-upload/lynx.service.mjs +47 -0
  72. package/esm2022/lib/masks/oepa-create-integer-mask.mjs +39 -0
  73. package/esm2022/lib/masks/oepa-integer-mask-args.mjs +2 -0
  74. package/esm2022/lib/message/message.component.mjs +19 -0
  75. package/esm2022/lib/message/oepa-message-type.mjs +7 -0
  76. package/esm2022/lib/message/oepa-message.mjs +31 -0
  77. package/esm2022/lib/message-list/message-list.component.mjs +24 -0
  78. package/esm2022/lib/multi-file-upload/multi-file-upload.component.mjs +137 -0
  79. package/esm2022/lib/notes-modal/notes-modal.component.mjs +177 -0
  80. package/esm2022/lib/notes-modal/oepa-note-result.mjs +2 -0
  81. package/esm2022/lib/notes-modal/oepa-note.mjs +2 -0
  82. package/esm2022/lib/numeric-input/numeric-input.component.mjs +50 -0
  83. package/esm2022/lib/numeric-input.directive.mjs +76 -0
  84. package/esm2022/lib/oepa-error-message/oepa-error-message.component.mjs +39 -0
  85. package/esm2022/lib/oepa-forms.service.mjs +199 -0
  86. package/esm2022/lib/oepa-images.mjs +59 -0
  87. package/esm2022/lib/oepa-wait-message/oepa-wait-message.component.mjs +29 -0
  88. package/esm2022/lib/ohio-lat-long/ohio-lat-long.component.mjs +176 -0
  89. package/esm2022/lib/parameter/parameter.mjs +2 -0
  90. package/esm2022/lib/parameter/parameter.service.mjs +47 -0
  91. package/esm2022/lib/params-help-button/params-help-button.component.mjs +42 -0
  92. package/esm2022/lib/phone-number/phone-number.component.mjs +44 -0
  93. package/esm2022/lib/pin-modal/oepa-attestation.mjs +2 -0
  94. package/esm2022/lib/pin-modal/oepa-pin.mjs +2 -0
  95. package/esm2022/lib/pin-modal/oepa-pin.service.mjs +54 -0
  96. package/esm2022/lib/pin-modal/oepa-security-question.mjs +2 -0
  97. package/esm2022/lib/pin-modal/pin-modal.component.mjs +186 -0
  98. package/esm2022/lib/progress-indicator/progress-info.mjs +2 -0
  99. package/esm2022/lib/select-input/select-input.component.mjs +96 -0
  100. package/esm2022/lib/server-timeout-modal/server-timeout-modal.component.mjs +63 -0
  101. package/esm2022/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.mjs +54 -0
  102. package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.mjs +2 -0
  103. package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.mjs +190 -0
  104. package/esm2022/lib/shopping-cart/shopping-cart.service.mjs +89 -0
  105. package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +126 -0
  106. package/esm2022/lib/table/oepa-p-column.mjs +2 -0
  107. package/esm2022/lib/table/oepa-table-cell-classname.pipe.mjs +22 -0
  108. package/esm2022/lib/table/oepa-table-cell-click-event.mjs +2 -0
  109. package/esm2022/lib/table/oepa-table-cell-colspan.pipe.mjs +22 -0
  110. package/esm2022/lib/table/oepa-table-cell-hidden.pipe.mjs +22 -0
  111. package/esm2022/lib/table/oepa-table-cell-icon-classname.pipe.mjs +22 -0
  112. package/esm2022/lib/table/oepa-table-cell-img-src.pipe.mjs +22 -0
  113. package/esm2022/lib/table/oepa-table-cell-inner-html.pipe.mjs +22 -0
  114. package/esm2022/lib/table/oepa-table-cell-input-component.pipe.mjs +22 -0
  115. package/esm2022/lib/table/oepa-table-cell-not-selectable.pipe.mjs +22 -0
  116. package/esm2022/lib/table/oepa-table-cell-value.pipe.mjs +22 -0
  117. package/esm2022/lib/table/oepa-table-cell.mjs +2 -0
  118. package/esm2022/lib/table/oepa-table-column.mjs +2 -0
  119. package/esm2022/lib/table/oepa-table-config.mjs +2 -0
  120. package/esm2022/lib/table/oepa-table-filter.mjs +2 -0
  121. package/esm2022/lib/table/oepa-table-filtering.directive.mjs +57 -0
  122. package/esm2022/lib/table/oepa-table-header.mjs +2 -0
  123. package/esm2022/lib/table/oepa-table-page-info.mjs +2 -0
  124. package/esm2022/lib/table/oepa-table-popover.mjs +2 -0
  125. package/esm2022/lib/table/oepa-table-row.mjs +2 -0
  126. package/esm2022/lib/table/oepa-table-sort-criterion.mjs +2 -0
  127. package/esm2022/lib/table/oepa-table-sorting.directive.mjs +57 -0
  128. package/esm2022/lib/table/oepa-table.mjs +2 -0
  129. package/esm2022/lib/table/p-table/p-table.component.mjs +826 -0
  130. package/esm2022/lib/table/table-data-cell/table-data-cell-click-event.mjs +2 -0
  131. package/esm2022/lib/table/table-data-cell/table-data-cell.component.mjs +60 -0
  132. package/esm2022/lib/table/table-export.service.mjs +57 -0
  133. package/esm2022/lib/table/table-header-cell/table-header-cell.component.mjs +61 -0
  134. package/esm2022/lib/table/table.component.mjs +793 -0
  135. package/esm2022/lib/table/table.service.mjs +112 -0
  136. package/esm2022/lib/template-confirmation-modal/template-confirmation-modal.component.mjs +46 -0
  137. package/esm2022/lib/text-area-input/text-area-input.component.mjs +48 -0
  138. package/esm2022/lib/text-input/text-input.component.mjs +48 -0
  139. package/esm2022/lib/timeout-modal/timeout-modal.component.mjs +31 -0
  140. package/esm2022/lib/timepicker/timepicker.component.mjs +48 -0
  141. package/esm2022/lib/validation/form-validator.mjs +2 -0
  142. package/esm2022/lib/validation/validation.service.mjs +134 -0
  143. package/esm2022/lib/yes-no/yes-no.component.mjs +44 -0
  144. package/esm2022/lib/yes-no-boolean/yes-no.component.mjs +44 -0
  145. package/esm2022/lib/yes-no-other-input/yes-no-other-input.component.mjs +41 -0
  146. package/esm2022/lib/zip-code/zip-code.component.mjs +42 -0
  147. package/esm2022/ohioepa-oepa-ui-lib.mjs +5 -0
  148. package/esm2022/public-api.mjs +142 -0
  149. package/fesm2022/ohioepa-oepa-ui-lib.mjs +10720 -0
  150. package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -0
  151. package/index.d.ts +5 -0
  152. package/lib/account-search-input/account-search-input.component.d.ts +36 -0
  153. package/lib/account-search-modal/account-search-modal.component.d.ts +40 -0
  154. package/lib/action-btn/action-btn.component.d.ts +34 -0
  155. package/lib/action-btn/oepa-action-event.d.ts +19 -0
  156. package/lib/action-btn/oepa-action.d.ts +13 -0
  157. package/lib/action-btn-modal/action-btn-modal.component.d.ts +12 -0
  158. package/lib/address/address.component.d.ts +43 -0
  159. package/lib/address/oepa-address.service.d.ts +28 -0
  160. package/lib/address/oepa-form-address.d.ts +19 -0
  161. package/lib/blank/blank.component.d.ts +8 -0
  162. package/lib/checkbox/checkbox.component.d.ts +15 -0
  163. package/lib/checkbox-input/checkbox-input.component.d.ts +17 -0
  164. package/lib/comment-modal/comment-modal.component.d.ts +22 -0
  165. package/lib/common-forms.module.d.ts +104 -0
  166. package/lib/confirmation-modal/confirmation-modal.component.d.ts +49 -0
  167. package/lib/contact/contact.component.d.ts +33 -0
  168. package/lib/contact/oepa-form-contact.d.ts +58 -0
  169. package/lib/date-input/date-input.component.d.ts +18 -0
  170. package/lib/date-input-modal/date-input-modal.component.d.ts +25 -0
  171. package/lib/datepicker/datepicker.component.d.ts +28 -0
  172. package/lib/daterangepicker/daterangepicker.component.d.ts +22 -0
  173. package/lib/document/document-editor/document-editor.component.d.ts +34 -0
  174. package/lib/document/document-event-entity-type.d.ts +5 -0
  175. package/lib/document/document-event-type.d.ts +5 -0
  176. package/lib/document/document-event.d.ts +9 -0
  177. package/lib/document/document-group/document-group.component.d.ts +38 -0
  178. package/lib/document/document-part/document-part.component.d.ts +10 -0
  179. package/lib/document/document-part-editor/document-part-editor.component.d.ts +46 -0
  180. package/lib/document/document-placeholder-modal/document-placeholder-modal.component.d.ts +19 -0
  181. package/lib/document/document-section/document-section.component.d.ts +37 -0
  182. package/lib/document/document.service.d.ts +90 -0
  183. package/lib/document/group-modal/group-modal.component.d.ts +20 -0
  184. package/lib/document/part-modal/part-modal.component.d.ts +20 -0
  185. package/lib/document/portal-document-class.d.ts +10 -0
  186. package/lib/document/portal-document-group.d.ts +15 -0
  187. package/lib/document/portal-document-part.d.ts +22 -0
  188. package/lib/document/portal-document-placeholder.d.ts +12 -0
  189. package/lib/document/portal-document-section.d.ts +13 -0
  190. package/lib/document/portal-document-text.d.ts +7 -0
  191. package/lib/document/portal-document-type.d.ts +15 -0
  192. package/lib/document/portal-document.d.ts +27 -0
  193. package/lib/document/portal-email-attachment-type.d.ts +6 -0
  194. package/lib/document/portal-email-attachment.d.ts +12 -0
  195. package/lib/document/portal-email-filter.d.ts +12 -0
  196. package/lib/document/portal-email.d.ts +18 -0
  197. package/lib/document/section-modal/section-modal.component.d.ts +20 -0
  198. package/lib/dual-list-box/array.pipes.d.ts +36 -0
  199. package/lib/dual-list-box/dual-list-box.component.d.ts +91 -0
  200. package/lib/dual-list-box/items-moved-event.d.ts +11 -0
  201. package/lib/dual-list-box/list-box-item.d.ts +7 -0
  202. package/lib/ebiz-address/ebiz-address.component.d.ts +23 -0
  203. package/lib/edoc-attachment/edoc-attachment.component.d.ts +44 -0
  204. package/lib/edoc-attachment/edoc-attachment.service.d.ts +16 -0
  205. package/lib/edoc-attachment/edocument-attachment-metadata.d.ts +16 -0
  206. package/lib/edoc-attachment/edocument-attachment.d.ts +12 -0
  207. package/lib/edoc-attachment/edocument-reference.d.ts +5 -0
  208. package/lib/entity/entity.service.d.ts +31 -0
  209. package/lib/entity/organization-create-modal/organization-create-modal.component.d.ts +53 -0
  210. package/lib/entity/organization-search-input/organization-search-input.component.d.ts +34 -0
  211. package/lib/entity/organization-search-modal/organization-search-modal.component.d.ts +56 -0
  212. package/lib/entity/person-create-modal/person-create-modal.component.d.ts +53 -0
  213. package/lib/entity/person-search-input/person-search-input.component.d.ts +34 -0
  214. package/lib/entity/person-search-modal/person-search-modal.component.d.ts +56 -0
  215. package/lib/entity/place-create-modal/place-create-modal.component.d.ts +8 -0
  216. package/lib/entity/place-search-input/place-search-input.component.d.ts +34 -0
  217. package/lib/entity/place-search-modal/place-search-modal.component.d.ts +41 -0
  218. package/lib/esri-map/esri-map.component.d.ts +41 -0
  219. package/lib/file-upload/file-upload.component.d.ts +37 -0
  220. package/lib/lynx-image-upload/lynx-image-upload.component.d.ts +36 -0
  221. package/lib/lynx-image-upload/lynx.service.d.ts +16 -0
  222. package/lib/masks/oepa-create-integer-mask.d.ts +8 -0
  223. package/lib/masks/oepa-integer-mask-args.d.ts +5 -0
  224. package/lib/message/message.component.d.ts +10 -0
  225. package/lib/message/oepa-message-type.d.ts +5 -0
  226. package/lib/message/oepa-message.d.ts +7 -0
  227. package/lib/message-list/message-list.component.d.ts +11 -0
  228. package/lib/multi-file-upload/multi-file-upload.component.d.ts +36 -0
  229. package/lib/notes-modal/notes-modal.component.d.ts +50 -0
  230. package/lib/notes-modal/oepa-note-result.d.ts +10 -0
  231. package/lib/notes-modal/oepa-note.d.ts +13 -0
  232. package/lib/numeric-input/numeric-input.component.d.ts +20 -0
  233. package/lib/numeric-input.directive.d.ts +19 -0
  234. package/lib/oepa-error-message/oepa-error-message.component.d.ts +9 -0
  235. package/lib/oepa-forms.service.d.ts +28 -0
  236. package/lib/oepa-images.d.ts +53 -0
  237. package/lib/oepa-wait-message/oepa-wait-message.component.d.ts +9 -0
  238. package/lib/ohio-lat-long/ohio-lat-long.component.d.ts +63 -0
  239. package/lib/parameter/parameter.d.ts +7 -0
  240. package/lib/parameter/parameter.service.d.ts +18 -0
  241. package/lib/params-help-button/params-help-button.component.d.ts +15 -0
  242. package/lib/phone-number/phone-number.component.d.ts +19 -0
  243. package/lib/pin-modal/oepa-attestation.d.ts +10 -0
  244. package/lib/pin-modal/oepa-pin.d.ts +26 -0
  245. package/lib/pin-modal/oepa-pin.service.d.ts +38 -0
  246. package/lib/pin-modal/oepa-security-question.d.ts +8 -0
  247. package/lib/pin-modal/pin-modal.component.d.ts +46 -0
  248. package/lib/progress-indicator/progress-info.d.ts +4 -0
  249. package/lib/select-input/select-input.component.d.ts +27 -0
  250. package/lib/server-timeout-modal/server-timeout-modal.component.d.ts +23 -0
  251. package/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.d.ts +18 -0
  252. package/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.d.ts +10 -0
  253. package/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.d.ts +51 -0
  254. package/lib/shopping-cart/shopping-cart.service.d.ts +44 -0
  255. package/lib/start-end-timepicker/start-end-timepicker.component.d.ts +29 -0
  256. package/lib/table/oepa-p-column.d.ts +4 -0
  257. package/lib/table/oepa-table-cell-classname.pipe.d.ts +9 -0
  258. package/lib/table/oepa-table-cell-click-event.d.ts +15 -0
  259. package/lib/table/oepa-table-cell-colspan.pipe.d.ts +9 -0
  260. package/lib/table/oepa-table-cell-hidden.pipe.d.ts +9 -0
  261. package/lib/table/oepa-table-cell-icon-classname.pipe.d.ts +9 -0
  262. package/lib/table/oepa-table-cell-img-src.pipe.d.ts +9 -0
  263. package/lib/table/oepa-table-cell-inner-html.pipe.d.ts +9 -0
  264. package/lib/table/oepa-table-cell-input-component.pipe.d.ts +9 -0
  265. package/lib/table/oepa-table-cell-not-selectable.pipe.d.ts +9 -0
  266. package/lib/table/oepa-table-cell-value.pipe.d.ts +9 -0
  267. package/lib/table/oepa-table-cell.d.ts +66 -0
  268. package/lib/table/oepa-table-column.d.ts +71 -0
  269. package/lib/table/oepa-table-config.d.ts +72 -0
  270. package/lib/table/oepa-table-filter.d.ts +10 -0
  271. package/lib/table/oepa-table-filtering.directive.d.ts +17 -0
  272. package/lib/table/oepa-table-header.d.ts +9 -0
  273. package/lib/table/oepa-table-page-info.d.ts +22 -0
  274. package/lib/table/oepa-table-popover.d.ts +28 -0
  275. package/lib/table/oepa-table-row.d.ts +84 -0
  276. package/lib/table/oepa-table-sort-criterion.d.ts +4 -0
  277. package/lib/table/oepa-table-sorting.directive.d.ts +16 -0
  278. package/lib/table/oepa-table.d.ts +42 -0
  279. package/lib/table/p-table/p-table.component.d.ts +155 -0
  280. package/lib/table/table-data-cell/table-data-cell-click-event.d.ts +5 -0
  281. package/lib/table/table-data-cell/table-data-cell.component.d.ts +23 -0
  282. package/lib/table/table-export.service.d.ts +33 -0
  283. package/lib/table/table-header-cell/table-header-cell.component.d.ts +24 -0
  284. package/lib/table/table.component.d.ts +144 -0
  285. package/lib/table/table.service.d.ts +28 -0
  286. package/lib/template-confirmation-modal/template-confirmation-modal.component.d.ts +19 -0
  287. package/lib/text-area-input/text-area-input.component.d.ts +19 -0
  288. package/lib/text-input/text-input.component.d.ts +19 -0
  289. package/lib/timeout-modal/timeout-modal.component.d.ts +13 -0
  290. package/lib/timepicker/timepicker.component.d.ts +17 -0
  291. package/lib/validation/form-validator.d.ts +10 -0
  292. package/lib/validation/validation.service.d.ts +16 -0
  293. package/lib/yes-no/yes-no.component.d.ts +19 -0
  294. package/lib/yes-no-boolean/yes-no.component.d.ts +19 -0
  295. package/lib/yes-no-other-input/yes-no-other-input.component.d.ts +18 -0
  296. package/lib/zip-code/zip-code.component.d.ts +19 -0
  297. package/ohioepa-oepa-ui-lib-1.1.0.tgz +0 -0
  298. package/package.json +25 -0
  299. package/public-api.d.ts +138 -0
@@ -0,0 +1,416 @@
1
+ /*
2
+ Copyright 2018 Esri
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+ Unless required by applicable law or agreed to in writing, software
8
+ distributed under the License is distributed on an "AS IS" BASIS,
9
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ See the License for the specific language governing permissions and
11
+ limitations under the License.
12
+ */
13
+ import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
14
+ import { loadModules } from 'esri-loader';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/common";
17
+ export class EsriMapComponent {
18
+ mapLoaded = new EventEmitter();
19
+ onNewCoordinates = new EventEmitter();
20
+ mapViewEl;
21
+ latLongSearchEl;
22
+ /**
23
+ * @private _zoom sets map zoom
24
+ * @private _center sets map center
25
+ * @private _basemap sets type of map
26
+ */
27
+ _zoom = 10;
28
+ _center = [0.1278, 51.5074];
29
+ _basemap = 'streets-vector';
30
+ currentMapView;
31
+ // private currentGraphic: esri.Graphic = null;
32
+ // private selectedPoint: esri.Point = null;
33
+ _currentLatLong;
34
+ set currentLatLong(currentLatLong) {
35
+ this._currentLatLong = currentLatLong;
36
+ }
37
+ get currentLatLong() {
38
+ return this._currentLatLong;
39
+ }
40
+ set zoom(zoom) {
41
+ this._zoom = zoom;
42
+ }
43
+ get zoom() {
44
+ return this._zoom;
45
+ }
46
+ set center(center) {
47
+ this._center = center;
48
+ }
49
+ get center() {
50
+ return this._center;
51
+ }
52
+ set basemap(basemap) {
53
+ this._basemap = basemap;
54
+ }
55
+ get basemap() {
56
+ return this._basemap;
57
+ }
58
+ showSearch = false;
59
+ constructor() { }
60
+ async initializeMap() {
61
+ // var mapView;
62
+ const [EsriMap, EsriMapView, EsriBasemapToggle, locator, Search] = await loadModules([
63
+ 'esri/Map',
64
+ 'esri/views/MapView',
65
+ "esri/widgets/BasemapToggle",
66
+ "esri/rest/locator",
67
+ "esri/widgets/Search"
68
+ ]);
69
+ const me = this;
70
+ // Set type of map
71
+ const mapProperties = {
72
+ basemap: this._basemap,
73
+ };
74
+ const map = new EsriMap(mapProperties);
75
+ // Set type of map view
76
+ const mapViewProperties = {
77
+ container: this.mapViewEl.nativeElement,
78
+ center: this._center,
79
+ zoom: this._zoom,
80
+ map: map,
81
+ popup: {
82
+ dockEnabled: false,
83
+ dockOptions: {
84
+ buttonEnabled: false,
85
+ breakpoint: false,
86
+ }
87
+ },
88
+ };
89
+ var mapView = new EsriMapView(mapViewProperties);
90
+ mapView.popup.actionsMenuEnabled = false;
91
+ mapView.popup._displayActionTextLimit = 0; // controls whether action button text is shown
92
+ this.currentMapView = mapView;
93
+ // All resources in the MapView and the map have loaded.
94
+ // Now execute additional processes
95
+ // this.currentMapView.when(() => {
96
+ // this.mapLoaded.emit(true);
97
+ // });
98
+ // 1 - Create the widget
99
+ const toggle = new EsriBasemapToggle({
100
+ // 2 - Set properties
101
+ view: mapView, // view that provides access to the map's 'topo' basemap
102
+ nextBasemap: "hybrid" // allows for toggling to the 'hybrid' basemap
103
+ });
104
+ // Add widget to the top right corner of the view
105
+ mapView.ui.add(toggle, "bottom-right");
106
+ var updateLatLongAction = {
107
+ title: "Yes",
108
+ id: "update-lat-long",
109
+ // image: "Measure_Distance16.png",
110
+ className: "bi bi-hand-thumbs-up-fill"
111
+ };
112
+ var cancelUpdateAction = {
113
+ title: "No",
114
+ id: "cancel-update",
115
+ // image: "Measure_Distance16.png",
116
+ className: "bi bi-hand-thumbs-down-fill"
117
+ };
118
+ //this.currentMapView.popup.content = '{facilityName}';
119
+ // this.currentMapView.on("click", event => {
120
+ // let clickSymbol: esri.SimpleMarkerSymbol = new SimpleMarkerSymbol({
121
+ // type: 'simple-marker',
122
+ // style: 'diamond',
123
+ // color: 'red',
124
+ // size: '20pt'
125
+ // });
126
+ // this.currentMapView.graphics.remove(this.currentGraphic);
127
+ // this.currentGraphic = new Graphic({
128
+ // geometry : event.mapPoint,
129
+ // symbol : clickSymbol
130
+ // })
131
+ // this.addPoint(String(event.mapPoint.latitude), String(event.mapPoint.longitude));
132
+ // });
133
+ // var symbol = new SimpleMarkerSymbol(
134
+ // SimpleMarkerSymbol.STYLE_CIRCLE,
135
+ // 12,
136
+ // new SimpleLineSymbol(
137
+ // SimpleLineSymbol.STYLE_NULL,
138
+ // new Color([247, 34, 101, 0.9]),
139
+ // 1
140
+ // ),
141
+ // new Color([207, 34, 171, 0.5])
142
+ // );
143
+ // mapView.when(() => {
144
+ // this.mapLoaded.emit(true);
145
+ // mapView.on("click", function(event) {
146
+ // // you must overwrite default click-for-popup
147
+ // // behavior to display your own popup
148
+ // // me.currentMapView.popup.autoOpenEnabled = false;
149
+ // // Get the coordinates of the click on the view
150
+ // var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
151
+ // var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
152
+ // var info = lat + ', ' + lon;
153
+ // mapView.graphics.clear();
154
+ // mapView.graphics.add(new Graphic(event.mapPoint, symbol));
155
+ // map.infoWindow.setContent("X: " + event.mapPoint.x.toString() + ", <br>Y: " + event.mapPoint.y.toString());
156
+ // mapView.infoWindow.show(event.mapPoint)
157
+ // const poptest = new Popup({
158
+ // title: "Reverse geocode: [" + lon + ", " + lat + "]",
159
+ // location: event.mapPoint, // Set the location of the popup to the clicked location
160
+ // content: "This is a point of interest" // content displayed in the popup
161
+ // })
162
+ // mapView.popup.open({
163
+ // // Set the popup's title to the coordinates of the location
164
+ // title: "Reverse geocode: [" + lon + ", " + lat + "]",
165
+ // location: event.mapPoint, // Set the location of the popup to the clicked location
166
+ // content: "This is a point of interest" // content displayed in the popup
167
+ // });
168
+ // // me.showPopup(info, event);
169
+ // });
170
+ // // mapView.popup.on("trigger-action", function(evt){
171
+ // // if(evt.action.id === "more-details"){
172
+ // // // add graphic at view.popup.location
173
+ // // }
174
+ // // });
175
+ // })
176
+ /*
177
+ * Create the Search Box widget used for address lookup. searchId is the id of the HTML tag (usually a DIV)
178
+ * that is the placeholder for the search box.
179
+ */
180
+ if (this.showSearch) {
181
+ var searchWidget = new Search({
182
+ view: mapView,
183
+ locationEnabled: false,
184
+ container: this.latLongSearchEl.nativeElement,
185
+ popupEnabled: false
186
+ });
187
+ }
188
+ mapView.when(function () {
189
+ if (me._currentLatLong &&
190
+ me._currentLatLong.latDecimal && me._currentLatLong.latDecimal !== '' &&
191
+ me._currentLatLong.longDecimal && me._currentLatLong.longDecimal !== '') {
192
+ me.addPoint(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal, 'xxx');
193
+ me.zoomToFacility(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal);
194
+ }
195
+ });
196
+ mapView.when(function () {
197
+ mapView.on("mouse-wheel", function (event) {
198
+ // prevents zooming with the mouse-wheel event
199
+ event.stopPropagation();
200
+ });
201
+ });
202
+ mapView.when(function () {
203
+ if (searchWidget) {
204
+ searchWidget.on("select-result", function (event) {
205
+ showPopup("xxx", event.result.feature.geometry);
206
+ // let newLatLong: LatLong = {
207
+ // latDecimal: mapView.popup.location.latitude,
208
+ // longDecimal: mapView.popup.location.longitude
209
+ // }
210
+ // me.onNewCoordinates.emit(newLatLong); // this updates lat/long fields as soon as you click selected address
211
+ });
212
+ }
213
+ });
214
+ mapView.when(function () {
215
+ mapView.popup.autoOpenEnabled = false;
216
+ mapView.on("click", function (event) {
217
+ searchWidget.clear();
218
+ mapView.popup.clear();
219
+ // Get the coordinates of the click on the view around the decimals to 3 decimals
220
+ // var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
221
+ // var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
222
+ // this.selectedPoint = event.mapPoint;
223
+ // mapView.popup.open({ //define
224
+ // title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude</div>",
225
+ // content:
226
+ // "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
227
+ // "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'>&nbsp;<input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
228
+ // location: event.mapPoint,
229
+ // actions: [updateLatLongAction, cancelUpdateAction],
230
+ // });
231
+ // Display the popup
232
+ // Execute a reverse geocode using the clicked location
233
+ locator.locationToAddress("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer", { location: event.mapPoint })
234
+ .then(function (response) {
235
+ // If an address is successfully found, show it in the popup's content
236
+ mapView.popup.content = response.address;
237
+ var address = response.address;
238
+ showPopup(address, event.mapPoint);
239
+ })
240
+ .catch(function (error) {
241
+ // If the promise fails and no result is found, show a generic message
242
+ mapView.popup.content = "No address was found for this location";
243
+ showPopup("No address found.", event.mapPoint);
244
+ });
245
+ mapView.popup.visible = true;
246
+ });
247
+ });
248
+ mapView.when(function () {
249
+ mapView.popup.on("trigger-action", function (event) {
250
+ // Execute the measureThis() function if the measure-this action is clicked
251
+ if (event.action.id === "update-lat-long") {
252
+ updateLatLong();
253
+ }
254
+ else if (event.action.id === "cancel-update") {
255
+ cancelUpdate();
256
+ }
257
+ });
258
+ });
259
+ function showPopup(address, pt) {
260
+ mapView.popup.open({
261
+ title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude?</div>",
262
+ content:
263
+ // "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
264
+ "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'><div>Would you like to update the latitude and longitude values as shown below?</div>" +
265
+ '<br/>' +
266
+ "<div>Latitude: " + Math.round(pt.latitude * 100000) / 100000 + "</div>" +
267
+ "<div>Longitude: " + Math.round(pt.longitude * 100000) / 100000 + "</div></div>",
268
+ // "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'>&nbsp;<input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
269
+ location: pt,
270
+ actions: [updateLatLongAction, cancelUpdateAction],
271
+ collapsed: true
272
+ });
273
+ // mapView.popup._displayActionTextLimit = 3; // controls whether action button text is shown
274
+ }
275
+ function updateLatLong() {
276
+ mapView.graphics.removeAll();
277
+ // mapView.graphics.add(new Graphic(event.mapPoint, symbol));
278
+ me.addPoint(mapView.popup.location.latitude, mapView.popup.location.longitude, 'xxx');
279
+ let newLatLong = {
280
+ latDecimal: mapView.popup.location.latitude,
281
+ longDecimal: mapView.popup.location.longitude
282
+ };
283
+ me.onNewCoordinates.emit(newLatLong);
284
+ cancelUpdate();
285
+ mapView.popup.close();
286
+ // console.log("updateLatLong called for lat: " + mapView.popup.location.latitude + ", long: " + mapView.popup.location.longitude);
287
+ }
288
+ function cancelUpdate() {
289
+ mapView.popup.close();
290
+ // console.log("cancelUpdate called");
291
+ }
292
+ //*** Add div element to show coordates ***//
293
+ var coordsWidget = document.createElement("div");
294
+ coordsWidget.id = "coordsWidget";
295
+ coordsWidget.className = "esri-widget esri-component";
296
+ coordsWidget.style.padding = "7px 15px 5px";
297
+ mapView.ui.add(coordsWidget, "bottom-right");
298
+ //*** Update lat, lon, zoom and scale ***//
299
+ function showCoordinates(pt) {
300
+ var coords = "Lat/Lon " + pt.latitude.toFixed(3) + " " + pt.longitude.toFixed(3) +
301
+ " | Scale 1:" + Math.round(mapView.scale * 1) / 1 +
302
+ " | Zoom " + mapView.zoom;
303
+ coordsWidget.innerHTML = coords;
304
+ }
305
+ //*** Add event and show center coordinates after the view is finished moving e.g. zoom, pan ***//
306
+ mapView.watch(["stationary"], function () {
307
+ showCoordinates(mapView.center);
308
+ });
309
+ //*** Add event to show mouse coordinates on click and move ***//
310
+ mapView.on(["pointer-down", "pointer-move"], function (evt) {
311
+ showCoordinates(mapView.toMap({ x: evt.x, y: evt.y }));
312
+ });
313
+ }
314
+ async resetMap() {
315
+ this.currentMapView.graphics.removeAll();
316
+ this.currentMapView.goTo({
317
+ target: this._center,
318
+ zoom: this._zoom
319
+ });
320
+ this.zoomToFacility;
321
+ }
322
+ async zoomToFacility(lat, long) {
323
+ const [Point] = await loadModules([
324
+ 'esri/geometry/Point'
325
+ ]);
326
+ let point = new Point({
327
+ latitude: lat, //39.957767,
328
+ longitude: long //-82.994939
329
+ });
330
+ this.currentMapView.goTo({
331
+ target: point,
332
+ zoom: 16
333
+ });
334
+ }
335
+ // async removeSelectedPoint() {
336
+ // if (this.currentGraphic) {
337
+ // this.currentMapView.map.
338
+ // }
339
+ // }
340
+ /**
341
+ * Adds a new point to the current map with the given lat/long values.
342
+ * @param lat
343
+ * @param long
344
+ */
345
+ async addPoint(lat, long, name) {
346
+ const [Point, Graphic, SimpleMarkerSymbol, ActionButton] = await loadModules([
347
+ 'esri/geometry/Point',
348
+ 'esri/Graphic',
349
+ 'esri/symbols/SimpleMarkerSymbol',
350
+ 'esri/support/actions/ActionButton'
351
+ ]);
352
+ let point = new Point({
353
+ latitude: lat, //39.957767,
354
+ longitude: long //-82.994939
355
+ });
356
+ let symbol = new SimpleMarkerSymbol({
357
+ // type: 'simple-marker',
358
+ style: 'circle',
359
+ color: 'blue',
360
+ size: '12px'
361
+ });
362
+ let actionButton = new ActionButton({
363
+ active: true,
364
+ visible: true,
365
+ disabled: false,
366
+ id: 'selectFacility',
367
+ title: 'Select Facility',
368
+ type: 'button'
369
+ });
370
+ let currentGraphic = new Graphic({
371
+ geometry: point,
372
+ symbol: symbol,
373
+ popupTemplate: {
374
+ title: name,
375
+ content: name,
376
+ },
377
+ actions: [actionButton]
378
+ });
379
+ this.currentMapView.graphics.add(currentGraphic);
380
+ this._currentLatLong = {
381
+ latDecimal: lat,
382
+ longDecimal: long
383
+ };
384
+ // console.log('Added point: ', lat, long);
385
+ }
386
+ ngOnInit() {
387
+ this.initializeMap();
388
+ }
389
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
390
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EsriMapComponent, selector: "oepa-esri-map", inputs: { currentLatLong: "currentLatLong", zoom: "zoom", center: "center", basemap: "basemap", showSearch: "showSearch" }, outputs: { mapLoaded: "mapLoaded", onNewCoordinates: "onNewCoordinates" }, viewQueries: [{ propertyName: "mapViewEl", first: true, predicate: ["mapViewNode"], descendants: true, static: true }, { propertyName: "latLongSearchEl", first: true, predicate: ["latLongSearchNode"], descendants: true }], ngImport: i0, template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
391
+ }
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, decorators: [{
393
+ type: Component,
394
+ args: [{ selector: 'oepa-esri-map', template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"] }]
395
+ }], ctorParameters: () => [], propDecorators: { mapLoaded: [{
396
+ type: Output
397
+ }], onNewCoordinates: [{
398
+ type: Output
399
+ }], mapViewEl: [{
400
+ type: ViewChild,
401
+ args: ['mapViewNode', { static: true }]
402
+ }], latLongSearchEl: [{
403
+ type: ViewChild,
404
+ args: ['latLongSearchNode', { static: false }]
405
+ }], currentLatLong: [{
406
+ type: Input
407
+ }], zoom: [{
408
+ type: Input
409
+ }], center: [{
410
+ type: Input
411
+ }], basemap: [{
412
+ type: Input
413
+ }], showSearch: [{
414
+ type: Input
415
+ }] } });
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9lc3JpLW1hcC9lc3JpLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2VzcmktbWFwL2VzcmktbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztFQVdFO0FBRUYsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBZ0I7SUFFakIsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDeEMsZ0JBQWdCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7SUFDNUIsU0FBUyxDQUFjO0lBQ3hCLGVBQWUsQ0FBYztJQUVoRjs7OztPQUlHO0lBQ0ssS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixPQUFPLEdBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQztJQUVwQyxjQUFjLENBQWdCO0lBQ3RDLCtDQUErQztJQUMvQyw0Q0FBNEM7SUFDcEMsZUFBZSxDQUFXO0lBRWxDLElBQ0ksY0FBYyxDQUFDLGNBQXVCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUNJLElBQUksQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7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Q0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFBO1FBQ0QsMkNBQTJDO0lBQzdDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7d0dBMWJVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLDJkQ3hCN0IsZ2VBV3dCOzs0RkRhWCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsZUFBZTt3REFNZixTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDNkMsU0FBUztzQkFBNUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNTLGVBQWU7c0JBQWpFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWlCN0MsY0FBYztzQkFEakIsS0FBSztnQkFVRixJQUFJO3NCQURQLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSztnQkFTRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgQ29weXJpZ2h0IDIwMTggRXNyaVxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgbG9hZE1vZHVsZXMgfSBmcm9tICdlc3JpLWxvYWRlcic7XG5pbXBvcnQgZXNyaSA9IF9fZXNyaTtcbmltcG9ydCB7IExhdExvbmcgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWViaXotbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1lc3JpLW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lc3JpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VzcmktbWFwLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFc3JpTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAT3V0cHV0KCkgbWFwTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25OZXdDb29yZGluYXRlczogRXZlbnRFbWl0dGVyPExhdExvbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxMYXRMb25nPigpO1xuICBAVmlld0NoaWxkKCdtYXBWaWV3Tm9kZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbWFwVmlld0VsITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbGF0TG9uZ1NlYXJjaE5vZGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgbGF0TG9uZ1NlYXJjaEVsITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQHByaXZhdGUgX3pvb20gc2V0cyBtYXAgem9vbVxuICAgKiBAcHJpdmF0ZSBfY2VudGVyIHNldHMgbWFwIGNlbnRlclxuICAgKiBAcHJpdmF0ZSBfYmFzZW1hcCBzZXRzIHR5cGUgb2YgbWFwXG4gICAqL1xuICBwcml2YXRlIF96b29tOiBudW1iZXIgPSAxMDtcbiAgcHJpdmF0ZSBfY2VudGVyOiBBcnJheTxudW1iZXI+ID0gWzAuMTI3OCwgNTEuNTA3NF07XG4gIHByaXZhdGUgX2Jhc2VtYXA6IHN0cmluZyA9ICdzdHJlZXRzLXZlY3Rvcic7XG5cbiAgcHJpdmF0ZSBjdXJyZW50TWFwVmlldyE6IGVzcmkuTWFwVmlldztcbiAgLy8gcHJpdmF0ZSBjdXJyZW50R3JhcGhpYzogZXNyaS5HcmFwaGljID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBzZWxlY3RlZFBvaW50OiBlc3JpLlBvaW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBfY3VycmVudExhdExvbmchOiBMYXRMb25nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjdXJyZW50TGF0TG9uZyhjdXJyZW50TGF0TG9uZzogTGF0TG9uZykge1xuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0gY3VycmVudExhdExvbmc7XG4gIH1cblxuICBnZXQgY3VycmVudExhdExvbmcoKTogTGF0TG9uZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRMYXRMb25nO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgdGhpcy5fem9vbSA9IHpvb207XG4gIH1cblxuICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl96b29tO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEFycmF5PG51bWJlcj4pIHtcbiAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gIH1cblxuICBnZXQgY2VudGVyKCk6IEFycmF5PG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYmFzZW1hcChiYXNlbWFwOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9iYXNlbWFwID0gYmFzZW1hcDtcbiAgfVxuXG4gIGdldCBiYXNlbWFwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VtYXA7XG4gIH1cblxuICBASW5wdXQoKSBzaG93U2VhcmNoID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBhc3luYyBpbml0aWFsaXplTWFwKCkge1xuICAgIC8vIHZhciBtYXBWaWV3O1xuICAgIGNvbnN0IFtFc3JpTWFwLCBFc3JpTWFwVmlldywgRXNyaUJhc2VtYXBUb2dnbGUsIGxvY2F0b3IgLCBTZWFyY2ggXSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL01hcCcsXG4gICAgICAnZXNyaS92aWV3cy9NYXBWaWV3JyxcbiAgICAgIFwiZXNyaS93aWRnZXRzL0Jhc2VtYXBUb2dnbGVcIixcbiAgICAgIFwiZXNyaS9yZXN0L2xvY2F0b3JcIixcbiAgICAgIFwiZXNyaS93aWRnZXRzL1NlYXJjaFwiXG4gICAgXSk7XG5cbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwXG4gICAgY29uc3QgbWFwUHJvcGVydGllczogZXNyaS5NYXBQcm9wZXJ0aWVzID0ge1xuICAgICAgYmFzZW1hcDogdGhpcy5fYmFzZW1hcCxcbiAgICB9O1xuXG4gICAgY29uc3QgbWFwOiBlc3JpLk1hcCA9IG5ldyBFc3JpTWFwKG1hcFByb3BlcnRpZXMpO1xuXG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwIHZpZXdcbiAgICBjb25zdCBtYXBWaWV3UHJvcGVydGllczogZXNyaS5NYXBWaWV3UHJvcGVydGllcyA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5tYXBWaWV3RWwubmF0aXZlRWxlbWVudCxcbiAgICAgIGNlbnRlcjogdGhpcy5fY2VudGVyLFxuICAgICAgem9vbTogdGhpcy5fem9vbSxcbiAgICAgIG1hcDogbWFwLFxuICAgICAgcG9wdXA6IHtcbiAgICAgICAgZG9ja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBkb2NrT3B0aW9uczoge1xuICAgICAgICAgIGJ1dHRvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGJyZWFrcG9pbnQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgbWFwVmlldyA9IG5ldyBFc3JpTWFwVmlldyhtYXBWaWV3UHJvcGVydGllcyk7XG4gICAgbWFwVmlldy5wb3B1cC5hY3Rpb25zTWVudUVuYWJsZWQgPSBmYWxzZTtcbiAgICBtYXBWaWV3LnBvcHVwLl9kaXNwbGF5QWN0aW9uVGV4dExpbWl0ID0gMDsgLy8gY29udHJvbHMgd2hldGhlciBhY3Rpb24gYnV0dG9uIHRleHQgaXMgc2hvd25cbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3ID0gbWFwVmlldztcblxuICAgIC8vIEFsbCByZXNvdXJjZXMgaW4gdGhlIE1hcFZpZXcgYW5kIHRoZSBtYXAgaGF2ZSBsb2FkZWQuXG4gICAgLy8gTm93IGV4ZWN1dGUgYWRkaXRpb25hbCBwcm9jZXNzZXNcbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3LndoZW4oKCkgPT4ge1xuICAgIC8vICAgdGhpcy5tYXBMb2FkZWQuZW1pdCh0cnVlKTtcbiAgICAvLyB9KTtcblxuICAgIC8vIDEgLSBDcmVhdGUgdGhlIHdpZGdldFxuICAgIGNvbnN0IHRvZ2dsZTogZXNyaS5CYXNlbWFwVG9nZ2xlID0gbmV3IEVzcmlCYXNlbWFwVG9nZ2xlKHtcbiAgICAgIC8vIDIgLSBTZXQgcHJvcGVydGllc1xuICAgICAgdmlldzogbWFwVmlldywgLy8gdmlldyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbWFwJ3MgJ3RvcG8nIGJhc2VtYXBcbiAgICAgIG5leHRCYXNlbWFwOiBcImh5YnJpZFwiIC8vIGFsbG93cyBmb3IgdG9nZ2xpbmcgdG8gdGhlICdoeWJyaWQnIGJhc2VtYXBcbiAgICB9KTtcblxuICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHZpZXdcbiAgICBtYXBWaWV3LnVpLmFkZCh0b2dnbGUsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgdmFyIHVwZGF0ZUxhdExvbmdBY3Rpb24gPSB7XG4gICAgICB0aXRsZTogXCJZZXNcIixcbiAgICAgIGlkOiBcInVwZGF0ZS1sYXQtbG9uZ1wiLFxuICAgICAgLy8gaW1hZ2U6IFwiTWVhc3VyZV9EaXN0YW5jZTE2LnBuZ1wiLFxuICAgICAgY2xhc3NOYW1lOiBcImJpIGJpLWhhbmQtdGh1bWJzLXVwLWZpbGxcIlxuICAgIH07XG5cbiAgICB2YXIgY2FuY2VsVXBkYXRlQWN0aW9uID0ge1xuICAgICAgdGl0bGU6IFwiTm9cIixcbiAgICAgIGlkOiBcImNhbmNlbC11cGRhdGVcIixcbiAgICAgIC8vIGltYWdlOiBcIk1lYXN1cmVfRGlzdGFuY2UxNi5wbmdcIixcbiAgICAgIGNsYXNzTmFtZTogXCJiaSBiaS1oYW5kLXRodW1icy1kb3duLWZpbGxcIlxuICAgIH07XG5cbiAgICAvL3RoaXMuY3VycmVudE1hcFZpZXcucG9wdXAuY29udGVudCA9ICd7ZmFjaWxpdHlOYW1lfSc7XG5cbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4ge1xuICAgIC8vICAgbGV0IGNsaWNrU3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgIC8vICAgICB0eXBlOiAnc2ltcGxlLW1hcmtlcicsXG4gICAgLy8gICAgIHN0eWxlOiAnZGlhbW9uZCcsXG4gICAgLy8gICAgIGNvbG9yOiAncmVkJyxcbiAgICAvLyAgICAgc2l6ZTogJzIwcHQnXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MucmVtb3ZlKHRoaXMuY3VycmVudEdyYXBoaWMpO1xuICAgIC8vICAgdGhpcy5jdXJyZW50R3JhcGhpYyA9IG5ldyBHcmFwaGljKHtcbiAgICAvLyAgICAgZ2VvbWV0cnkgOiBldmVudC5tYXBQb2ludCxcbiAgICAvLyAgICAgc3ltYm9sIDogY2xpY2tTeW1ib2xcbiAgICAvLyAgIH0pXG5cbiAgICAvLyAgIHRoaXMuYWRkUG9pbnQoU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlKSwgU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSkpO1xuICAgIC8vIH0pO1xuXG4gICAgLy8gdmFyIHN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woXG4gICAgLy8gICBTaW1wbGVNYXJrZXJTeW1ib2wuU1RZTEVfQ0lSQ0xFLFxuICAgIC8vICAgMTIsXG4gICAgLy8gICBuZXcgU2ltcGxlTGluZVN5bWJvbChcbiAgICAvLyAgICAgU2ltcGxlTGluZVN5bWJvbC5TVFlMRV9OVUxMLFxuICAgIC8vICAgICBuZXcgQ29sb3IoWzI0NywgMzQsIDEwMSwgMC45XSksXG4gICAgLy8gICAgIDFcbiAgICAvLyAgICksXG4gICAgLy8gICBuZXcgQ29sb3IoWzIwNywgMzQsIDE3MSwgMC41XSlcbiAgICAvLyApO1xuXG4gICAgLy8gbWFwVmlldy53aGVuKCgpID0+IHtcbiAgICAvLyAgIHRoaXMubWFwTG9hZGVkLmVtaXQodHJ1ZSk7XG4gICAgLy8gICBtYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyAgICAgLy8geW91IG11c3Qgb3ZlcndyaXRlIGRlZmF1bHQgY2xpY2stZm9yLXBvcHVwXG4gICAgLy8gICAgIC8vIGJlaGF2aW9yIHRvIGRpc3BsYXkgeW91ciBvd24gcG9wdXBcbiAgICAvLyAgICAgLy8gbWUuY3VycmVudE1hcFZpZXcucG9wdXAuYXV0b09wZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXdcbiAgICAvLyAgICAgdmFyIGxhdCA9IE1hdGgucm91bmQoZXZlbnQubWFwUG9pbnQubGF0aXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgLy8gICAgIHZhciBsb24gPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSAqIDEwMDApIC8gMTAwMDtcbiAgICAvLyAgICAgdmFyIGluZm8gPSBsYXQgKyAnLCAnICsgbG9uO1xuXG4gICAgLy8gICAgIG1hcFZpZXcuZ3JhcGhpY3MuY2xlYXIoKTtcbiAgICAvLyAgICAgbWFwVmlldy5ncmFwaGljcy5hZGQobmV3IEdyYXBoaWMoZXZlbnQubWFwUG9pbnQsIHN5bWJvbCkpO1xuICAgIC8vICAgICBtYXAuaW5mb1dpbmRvdy5zZXRDb250ZW50KFwiWDogXCIgKyBldmVudC5tYXBQb2ludC54LnRvU3RyaW5nKCkgKyBcIiwgPGJyPlk6IFwiICsgZXZlbnQubWFwUG9pbnQueS50b1N0cmluZygpKTtcbiAgICAvLyAgICAgbWFwVmlldy5pbmZvV2luZG93LnNob3coZXZlbnQubWFwUG9pbnQpXG5cbiAgICAvLyAgICAgY29uc3QgcG9wdGVzdCA9IG5ldyBQb3B1cCh7XG4gICAgLy8gICAgICAgdGl0bGU6IFwiUmV2ZXJzZSBnZW9jb2RlOiBbXCIgKyBsb24gKyBcIiwgXCIgKyBsYXQgKyBcIl1cIixcbiAgICAvLyAgICAgICBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQsIC8vIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBvcHVwIHRvIHRoZSBjbGlja2VkIGxvY2F0aW9uXG4gICAgLy8gICAgICAgY29udGVudDogXCJUaGlzIGlzIGEgcG9pbnQgb2YgaW50ZXJlc3RcIiAgLy8gY29udGVudCBkaXNwbGF5ZWQgaW4gdGhlIHBvcHVwXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgLy8gICAgICAgLy8gU2V0IHRoZSBwb3B1cCdzIHRpdGxlIHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbG9jYXRpb25cbiAgICAvLyAgICAgICB0aXRsZTogXCJSZXZlcnNlIGdlb2NvZGU6IFtcIiArIGxvbiArIFwiLCBcIiArIGxhdCArIFwiXVwiLFxuICAgIC8vICAgICAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCwgLy8gU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9wdXAgdG8gdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAvLyAgICAgICBjb250ZW50OiBcIlRoaXMgaXMgYSBwb2ludCBvZiBpbnRlcmVzdFwiICAvLyBjb250ZW50IGRpc3BsYXllZCBpbiB0aGUgcG9wdXBcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIC8vIG1lLnNob3dQb3B1cChpbmZvLCBldmVudCk7XG5cbiAgICAvLyAgICB9KTtcblxuICAgIC8vICAgLy8gIG1hcFZpZXcucG9wdXAub24oXCJ0cmlnZ2VyLWFjdGlvblwiLCBmdW5jdGlvbihldnQpe1xuICAgIC8vICAgLy8gICAgaWYoZXZ0LmFjdGlvbi5pZCA9PT0gXCJtb3JlLWRldGFpbHNcIil7XG4gICAgLy8gICAvLyAgICAgIC8vIGFkZCBncmFwaGljIGF0IHZpZXcucG9wdXAubG9jYXRpb25cbiAgICAvLyAgIC8vICAgIH1cbiAgICAvLyAgIC8vICB9KTtcblxuICAgIC8vICAgfSlcblxuICAgIC8qXG4gICAgICogQ3JlYXRlIHRoZSBTZWFyY2ggQm94IHdpZGdldCB1c2VkIGZvciBhZGRyZXNzIGxvb2t1cC4gc2VhcmNoSWQgaXMgdGhlIGlkIG9mIHRoZSBIVE1MIHRhZyAodXN1YWxseSBhIERJVilcbiAgICAgKiB0aGF0IGlzIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIHNlYXJjaCBib3guXG4gICAgICovXG4gICAgaWYgKHRoaXMuc2hvd1NlYXJjaCkge1xuICAgICAgdmFyIHNlYXJjaFdpZGdldCA9IG5ldyBTZWFyY2goe1xuICAgICAgICB2aWV3OiBtYXBWaWV3LFxuICAgICAgICBsb2NhdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBjb250YWluZXI6IHRoaXMubGF0TG9uZ1NlYXJjaEVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHBvcHVwRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWUuX2N1cnJlbnRMYXRMb25nICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgJiYgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgIT09ICcnICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsICYmIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCAhPT0gJycpIHtcbiAgICAgICAgbWUuYWRkUG9pbnQobWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwsIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCwgJ3h4eCcpO1xuICAgICAgICBtZS56b29tVG9GYWNpbGl0eShtZS5fY3VycmVudExhdExvbmcubGF0RGVjaW1hbCwgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsKTtcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hcFZpZXcub24oXCJtb3VzZS13aGVlbFwiLCBmdW5jdGlvbiAoZXZlbnQ6YW55KSB7XG4gICAgICAgIC8vIHByZXZlbnRzIHpvb21pbmcgd2l0aCB0aGUgbW91c2Utd2hlZWwgZXZlbnRcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlYXJjaFdpZGdldCkge1xuICAgICAgICBzZWFyY2hXaWRnZXQub24oXCJzZWxlY3QtcmVzdWx0XCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgICBzaG93UG9wdXAoXCJ4eHhcIiwgZXZlbnQucmVzdWx0LmZlYXR1cmUuZ2VvbWV0cnkpO1xuICBcbiAgICAgICAgICAvLyBsZXQgbmV3TGF0TG9uZzogTGF0TG9uZyA9IHtcbiAgICAgICAgICAvLyAgIGxhdERlY2ltYWw6IG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsXG4gICAgICAgICAgLy8gICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gbWUub25OZXdDb29yZGluYXRlcy5lbWl0KG5ld0xhdExvbmcpOyAvLyB0aGlzIHVwZGF0ZXMgbGF0L2xvbmcgZmllbGRzIGFzIHNvb24gYXMgeW91IGNsaWNrIHNlbGVjdGVkIGFkZHJlc3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmF1dG9PcGVuRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgbWFwVmlldy5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgc2VhcmNoV2lkZ2V0LmNsZWFyKCk7XG4gICAgICAgIG1hcFZpZXcucG9wdXAuY2xlYXIoKTtcbiAgICAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXcgYXJvdW5kIHRoZSBkZWNpbWFscyB0byAzIGRlY2ltYWxzXG4gICAgICAgIC8vIHZhciBsYXQgPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlICogMTAwMCkgLyAxMDAwO1xuICAgICAgICAvLyB2YXIgbG9uID0gTWF0aC5yb3VuZChldmVudC5tYXBQb2ludC5sb25naXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRQb2ludCA9IGV2ZW50Lm1hcFBvaW50O1xuXG4gICAgICAgIC8vIG1hcFZpZXcucG9wdXAub3Blbih7ICAgLy9kZWZpbmVcbiAgICAgICAgLy8gICB0aXRsZTogXCI8ZGl2IHN0eWxlPSdmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Jz5VcGRhdGUgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZTwvZGl2PlwiLFxuICAgICAgICAvLyAgIGNvbnRlbnQ6IFxuICAgICAgICAvLyAgICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAvLyAgIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICAvLyAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCxcbiAgICAgICAgLy8gICBhY3Rpb25zOiBbdXBkYXRlTGF0TG9uZ0FjdGlvbiwgY2FuY2VsVXBkYXRlQWN0aW9uXSxcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIERpc3BsYXkgdGhlIHBvcHVwXG4gICAgICAgIC8vIEV4ZWN1dGUgYSByZXZlcnNlIGdlb2NvZGUgdXNpbmcgdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAgICAgbG9jYXRvci5sb2NhdGlvblRvQWRkcmVzcyhcImh0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXJcIiwgeyBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2U6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBhZGRyZXNzIGlzIHN1Y2Nlc3NmdWxseSBmb3VuZCwgc2hvdyBpdCBpbiB0aGUgcG9wdXAncyBjb250ZW50XG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgc2hvd1BvcHVwKGFkZHJlc3MsIGV2ZW50Lm1hcFBvaW50KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBmYWlscyBhbmQgbm8gcmVzdWx0IGlzIGZvdW5kLCBzaG93IGEgZ2VuZXJpYyBtZXNzYWdlXG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSBcIk5vIGFkZHJlc3Mgd2FzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCI7XG4gICAgICAgICAgICBzaG93UG9wdXAoXCJObyBhZGRyZXNzIGZvdW5kLlwiLCBldmVudC5tYXBQb2ludCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgbWFwVmlldy5wb3B1cC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBtYXBWaWV3LndoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgbWFwVmlldy5wb3B1cC5vbihcInRyaWdnZXItYWN0aW9uXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWVhc3VyZVRoaXMoKSBmdW5jdGlvbiBpZiB0aGUgbWVhc3VyZS10aGlzIGFjdGlvbiBpcyBjbGlja2VkXG4gICAgICAgIGlmIChldmVudC5hY3Rpb24uaWQgPT09IFwidXBkYXRlLWxhdC1sb25nXCIpIHtcbiAgICAgICAgICB1cGRhdGVMYXRMb25nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWN0aW9uLmlkID09PSBcImNhbmNlbC11cGRhdGVcIikge1xuICAgICAgICAgIGNhbmNlbFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gc2hvd1BvcHVwKGFkZHJlc3M6YW55LCBwdDphbnkpIHtcbiAgICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgICAgIHRpdGxlOiBcIjxkaXYgc3R5bGU9J2ZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsnPlVwZGF0ZSBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlPzwvZGl2PlwiLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIC8vICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAgIFwiPGRpdiBzdHlsZT0nZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyc+PGRpdj5Xb3VsZCB5b3UgbGlrZSB0byB1cGRhdGUgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGFzIHNob3duIGJlbG93PzwvZGl2PlwiICtcbiAgICAgICAgICAnPGJyLz4nICtcbiAgICAgICAgICBcIjxkaXY+TGF0aXR1ZGU6IFwiICsgTWF0aC5yb3VuZChwdC5sYXRpdHVkZSAqIDEwMDAwMCkgLyAxMDAwMDAgKyBcIjwvZGl2PlwiICtcbiAgICAgICAgICBcIjxkaXY+TG9uZ2l0dWRlOiBcIiArIE1hdGgucm91bmQocHQubG9uZ2l0dWRlICogMTAwMDAwKSAvIDEwMDAwMCArIFwiPC9kaXY+PC9kaXY+XCIsXG4gICAgICAgIC8vIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICBsb2NhdGlvbjogcHQsXG4gICAgICAgIGFjdGlvbnM6IFt1cGRhdGVMYXRMb25nQWN0aW9uLCBjYW5jZWxVcGRhdGVBY3Rpb25dLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLy8gbWFwVmlldy5wb3B1cC5fZGlzcGxheUFjdGlvblRleHRMaW1pdCA9IDM7IC8vIGNvbnRyb2xzIHdoZXRoZXIgYWN0aW9uIGJ1dHRvbiB0ZXh0IGlzIHNob3duXG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMYXRMb25nKCkge1xuICAgICAgbWFwVmlldy5ncmFwaGljcy5yZW1vdmVBbGwoKTtcbiAgICAgIC8vIG1hcFZpZXcuZ3JhcGhpY3MuYWRkKG5ldyBHcmFwaGljKGV2ZW50Lm1hcFBvaW50LCBzeW1ib2wpKTtcbiAgICAgIG1lLmFkZFBvaW50KG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlLCAneHh4Jyk7XG5cbiAgICAgIGxldCBuZXdMYXRMb25nOiBMYXRMb25nID0ge1xuICAgICAgICBsYXREZWNpbWFsOiBtYXBWaWV3LnBvcHVwLmxvY2F0aW9uLmxhdGl0dWRlLFxuICAgICAgICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgIH1cbiAgICAgIG1lLm9uTmV3Q29vcmRpbmF0ZXMuZW1pdChuZXdMYXRMb25nKTtcblxuICAgICAgY2FuY2VsVXBkYXRlKCk7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInVwZGF0ZUxhdExvbmcgY2FsbGVkIGZvciBsYXQ6IFwiICsgbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sYXRpdHVkZSArIFwiLCBsb25nOiBcIiArIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5jZWxVcGRhdGUoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNhbmNlbFVwZGF0ZSBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGRpdiBlbGVtZW50IHRvIHNob3cgY29vcmRhdGVzICoqKi8vXG4gICAgdmFyIGNvb3Jkc1dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29vcmRzV2lkZ2V0LmlkID0gXCJjb29yZHNXaWRnZXRcIjtcbiAgICBjb29yZHNXaWRnZXQuY2xhc3NOYW1lID0gXCJlc3JpLXdpZGdldCBlc3JpLWNvbXBvbmVudFwiO1xuICAgIGNvb3Jkc1dpZGdldC5zdHlsZS5wYWRkaW5nID0gXCI3cHggMTVweCA1cHhcIjtcbiAgICBtYXBWaWV3LnVpLmFkZChjb29yZHNXaWRnZXQsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgLy8qKiogVXBkYXRlIGxhdCwgbG9uLCB6b29tIGFuZCBzY2FsZSAqKiovL1xuICAgIGZ1bmN0aW9uIHNob3dDb29yZGluYXRlcyhwdDphbnkpIHtcbiAgICAgIHZhciBjb29yZHMgPSBcIkxhdC9Mb24gXCIgKyBwdC5sYXRpdHVkZS50b0ZpeGVkKDMpICsgXCIgXCIgKyBwdC5sb25naXR1ZGUudG9GaXhlZCgzKSArXG4gICAgICAgIFwiIHwgU2NhbGUgMTpcIiArIE1hdGgucm91bmQobWFwVmlldy5zY2FsZSAqIDEpIC8gMSArXG4gICAgICAgIFwiIHwgWm9vbSBcIiArIG1hcFZpZXcuem9vbTtcbiAgICAgIGNvb3Jkc1dpZGdldC5pbm5lckhUTUwgPSBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGV2ZW50IGFuZCBzaG93IGNlbnRlciBjb29yZGluYXRlcyBhZnRlciB0aGUgdmlldyBpcyBmaW5pc2hlZCBtb3ZpbmcgZS5nLiB6b29tLCBwYW4gKioqLy9cbiAgICBtYXBWaWV3LndhdGNoKFtcInN0YXRpb25hcnlcIl0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dDb29yZGluYXRlcyhtYXBWaWV3LmNlbnRlcik7XG4gICAgfSk7XG5cbiAgICAvLyoqKiBBZGQgZXZlbnQgdG8gc2hvdyBtb3VzZSBjb29yZGluYXRlcyBvbiBjbGljayBhbmQgbW92ZSAqKiovL1xuICAgIG1hcFZpZXcub24oW1wicG9pbnRlci1kb3duXCIsIFwicG9pbnRlci1tb3ZlXCJdLCBmdW5jdGlvbiAoZXZ0OmFueSkge1xuICAgICAgc2hvd0Nvb3JkaW5hdGVzKG1hcFZpZXcudG9NYXAoeyB4OiBldnQueCwgeTogZXZ0LnkgfSkpO1xuICAgIH0pO1xuXG4gIH1cblxuICBhc3luYyByZXNldE1hcCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3LmdyYXBoaWNzLnJlbW92ZUFsbCgpO1xuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHRoaXMuX2NlbnRlcixcbiAgICAgIHpvb206IHRoaXMuX3pvb21cbiAgICB9XG4gICAgKTtcbiAgICB0aGlzLnpvb21Ub0ZhY2lsaXR5XG4gIH1cblxuICBhc3luYyB6b29tVG9GYWNpbGl0eShsYXQ6IHN0cmluZywgbG9uZzogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50XSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL2dlb21ldHJ5L1BvaW50J1xuICAgIF0pO1xuICAgIGxldCBwb2ludDogZXNyaS5Qb2ludCA9IG5ldyBQb2ludCh7XG4gICAgICBsYXRpdHVkZTogbGF0LCAvLzM5Ljk1Nzc2NyxcbiAgICAgIGxvbmdpdHVkZTogbG9uZyAvLy04Mi45OTQ5MzlcbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHBvaW50LFxuICAgICAgem9vbTogMTZcbiAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGFzeW5jIHJlbW92ZVNlbGVjdGVkUG9pbnQoKSB7XG4gIC8vICAgaWYgKHRoaXMuY3VycmVudEdyYXBoaWMpIHtcbiAgLy8gICAgIHRoaXMuY3VycmVudE1hcFZpZXcubWFwLlxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHBvaW50IHRvIHRoZSBjdXJyZW50IG1hcCB3aXRoIHRoZSBnaXZlbiBsYXQvbG9uZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSBsYXQgXG4gICAqIEBwYXJhbSBsb25nIFxuICAgKi9cbiAgYXN5bmMgYWRkUG9pbnQobGF0OiBzdHJpbmcsIGxvbmc6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50LCBHcmFwaGljLCBTaW1wbGVNYXJrZXJTeW1ib2wsIEFjdGlvbkJ1dHRvbl0gPSBhd2FpdCBsb2FkTW9kdWxlcyhbXG4gICAgICAnZXNyaS9nZW9tZXRyeS9Qb2ludCcsXG4gICAgICAnZXNyaS9HcmFwaGljJyxcbiAgICAgICdlc3JpL3N5bWJvbHMvU2ltcGxlTWFya2VyU3ltYm9sJyxcbiAgICAgICdlc3JpL3N1cHBvcnQvYWN0aW9ucy9BY3Rpb25CdXR0b24nXG4gICAgXSk7XG5cbiAgICBsZXQgcG9pbnQ6IGVzcmkuUG9pbnQgPSBuZXcgUG9pbnQoe1xuICAgICAgbGF0aXR1ZGU6IGxhdCwgLy8zOS45NTc3NjcsXG4gICAgICBsb25naXR1ZGU6IGxvbmcgLy8tODIuOTk0OTM5XG4gICAgfSk7XG5cbiAgICBsZXQgc3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgICAgLy8gdHlwZTogJ3NpbXBsZS1tYXJrZXInLFxuICAgICAgc3R5bGU6ICdjaXJjbGUnLFxuICAgICAgY29sb3I6ICdibHVlJyxcbiAgICAgIHNpemU6ICcxMnB4J1xuICAgIH0pO1xuXG4gICAgbGV0IGFjdGlvbkJ1dHRvbjogZXNyaS5BY3Rpb25CdXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uKHtcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBpZDogJ3NlbGVjdEZhY2lsaXR5JyxcbiAgICAgIHRpdGxlOiAnU2VsZWN0IEZhY2lsaXR5JyxcbiAgICAgIHR5cGU6ICdidXR0b24nXG4gICAgfSk7XG5cbiAgICBsZXQgY3VycmVudEdyYXBoaWMgPSBuZXcgR3JhcGhpYyh7XG4gICAgICBnZW9tZXRyeTogcG9pbnQsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICAgIHBvcHVwVGVtcGxhdGU6IHtcbiAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IG5hbWUsXG4gICAgICB9LFxuICAgICAgYWN0aW9uczogW2FjdGlvbkJ1dHRvbl1cbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MuYWRkKGN1cnJlbnRHcmFwaGljKTtcblxuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0ge1xuICAgICAgbGF0RGVjaW1hbDogbGF0LFxuICAgICAgbG9uZ0RlY2ltYWw6IGxvbmdcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ0FkZGVkIHBvaW50OiAnLCBsYXQsIGxvbmcpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplTWFwKCk7XG4gIH1cblxufSIsIjwhLS0gSGVyZSdzIHRoZSBESVYgdGhhdCB3ZSBpbmplY3QgdGhlIG1hcCBpbnRvIC0tPlxuPGRpdiAqbmdJZj1cInNob3dTZWFyY2hcIiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAgICAgIDxsYWJlbD5TZWFyY2ggZm9yIEFkZHJlc3M6PC9sYWJlbD5cbiAgICAgIDxkaXY+VHlwZSBhbiBhZGRyZXNzIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgYW5kIHNlbGVjdCBhIG1hdGNoIGZyb20gdGhlIGRyb3AgZG93biBsaXN0IG9yIHNlbGVjdCB0aGVcbiAgICAgICAgbWFnbmlmeWluZyBnbGFzcyBidXR0b24gdG8gcGxvdCB0aGUgYWRkcmVzcyBvbiB0aGUgbWFwLjwvZGl2PlxuICAgICAgPGRpdiAjbGF0TG9uZ1NlYXJjaE5vZGU+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2ICNtYXBWaWV3Tm9kZT48L2Rpdj4iXX0=