@bizdoc/core 1.16.20 → 1.16.23

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 (400) hide show
  1. package/assets/bizdoc-schema.json +4 -0
  2. package/esm2020/lib/admin/configuration-designer/declarations.mjs +2 -3
  3. package/esm2020/lib/admin/configuration-designer/designer-element.component.mjs +24 -23
  4. package/esm2020/lib/admin/configuration-designer/designer-privileges.component.mjs +6 -8
  5. package/esm2020/lib/admin/configuration-designer/designer.base.mjs +3 -1
  6. package/esm2020/lib/admin/configuration-designer/designer.component.mjs +48 -29
  7. package/esm2020/lib/admin/configuration-designer/elements/action.component.mjs +15 -13
  8. package/esm2020/lib/admin/configuration-designer/elements/cube.component.mjs +49 -26
  9. package/esm2020/lib/admin/configuration-designer/elements/folder.component.mjs +20 -17
  10. package/esm2020/lib/admin/configuration-designer/elements/form.component.mjs +80 -23
  11. package/esm2020/lib/admin/configuration-designer/elements/guide.component.mjs +8 -6
  12. package/esm2020/lib/admin/configuration-designer/elements/policy.component.mjs +9 -4
  13. package/esm2020/lib/admin/configuration-designer/elements/report.component.mjs +3 -2
  14. package/esm2020/lib/admin/configuration-designer/elements/role.component.mjs +4 -3
  15. package/esm2020/lib/admin/configuration-designer/elements/rule.component.mjs +9 -4
  16. package/esm2020/lib/admin/configuration-designer/elements/state.component.mjs +11 -9
  17. package/esm2020/lib/admin/configuration-designer/elements/type.component.mjs +12 -9
  18. package/esm2020/lib/admin/configuration-designer/elements/utility.component.mjs +4 -4
  19. package/esm2020/lib/admin/configuration-designer/elements/view.component.mjs +5 -4
  20. package/esm2020/lib/admin/configuration-designer/elements/widget.component.mjs +7 -5
  21. package/esm2020/lib/admin/system.service.mjs +1 -1
  22. package/esm2020/lib/core/pipes/time-ago.pipe.mjs +47 -1
  23. package/esm2020/lib/core/translations.mjs +11 -2
  24. package/esm2020/lib/shared.module.mjs +6 -6
  25. package/esm2020/public-api.mjs +2 -2
  26. package/fesm2015/bizdoc-core.mjs +273 -120
  27. package/fesm2015/bizdoc-core.mjs.map +1 -1
  28. package/fesm2020/bizdoc-core.mjs +272 -120
  29. package/fesm2020/bizdoc-core.mjs.map +1 -1
  30. package/lib/admin/configuration-designer/declarations.d.ts +1 -1
  31. package/lib/admin/configuration-designer/designer-element.component.d.ts +4 -7
  32. package/lib/admin/configuration-designer/designer.base.d.ts +1 -0
  33. package/lib/admin/configuration-designer/designer.component.d.ts +6 -4
  34. package/lib/admin/configuration-designer/elements/action.component.d.ts +1 -3
  35. package/lib/admin/configuration-designer/elements/cube.component.d.ts +14 -11
  36. package/lib/admin/configuration-designer/elements/folder.component.d.ts +12 -3
  37. package/lib/admin/configuration-designer/elements/form.component.d.ts +21 -5
  38. package/lib/admin/configuration-designer/elements/policy.component.d.ts +1 -2
  39. package/lib/admin/system.service.d.ts +8 -1
  40. package/lib/core/pipes/time-ago.pipe.d.ts +13 -0
  41. package/lib/core/translations.d.ts +9 -0
  42. package/lib/shared.module.d.ts +1 -1
  43. package/package.json +1 -1
  44. package/public-api.d.ts +1 -1
  45. package/bizdoc-core.d.ts.map +0 -1
  46. package/lib/admin/admin-dismiss.service.d.ts.map +0 -1
  47. package/lib/admin/admin-menu.component.d.ts.map +0 -1
  48. package/lib/admin/configuration-designer/cube-axes-filter.component.d.ts.map +0 -1
  49. package/lib/admin/configuration-designer/declarations.d.ts.map +0 -1
  50. package/lib/admin/configuration-designer/designer-element.component.d.ts.map +0 -1
  51. package/lib/admin/configuration-designer/designer-privileges.component.d.ts.map +0 -1
  52. package/lib/admin/configuration-designer/designer.base.d.ts.map +0 -1
  53. package/lib/admin/configuration-designer/designer.component.d.ts.map +0 -1
  54. package/lib/admin/configuration-designer/elements/action.component.d.ts.map +0 -1
  55. package/lib/admin/configuration-designer/elements/analysis-view.component.d.ts.map +0 -1
  56. package/lib/admin/configuration-designer/elements/analysis-widget.component.d.ts.map +0 -1
  57. package/lib/admin/configuration-designer/elements/anomaly-rule.component.d.ts.map +0 -1
  58. package/lib/admin/configuration-designer/elements/box-form.component.d.ts.map +0 -1
  59. package/lib/admin/configuration-designer/elements/configuration-datasource.component.d.ts.map +0 -1
  60. package/lib/admin/configuration-designer/elements/cube-index-utility.component.d.ts.map +0 -1
  61. package/lib/admin/configuration-designer/elements/cube-view.component.d.ts.map +0 -1
  62. package/lib/admin/configuration-designer/elements/cube.component.d.ts.map +0 -1
  63. package/lib/admin/configuration-designer/elements/documents-report.component.d.ts.map +0 -1
  64. package/lib/admin/configuration-designer/elements/documents-widget.component.d.ts.map +0 -1
  65. package/lib/admin/configuration-designer/elements/explore-view.component.d.ts.map +0 -1
  66. package/lib/admin/configuration-designer/elements/folder.component.d.ts.map +0 -1
  67. package/lib/admin/configuration-designer/elements/form.component.d.ts.map +0 -1
  68. package/lib/admin/configuration-designer/elements/guide.component.d.ts.map +0 -1
  69. package/lib/admin/configuration-designer/elements/matrix-view.component.d.ts.map +0 -1
  70. package/lib/admin/configuration-designer/elements/parallel-view.component.d.ts.map +0 -1
  71. package/lib/admin/configuration-designer/elements/performance-widget.component.d.ts.map +0 -1
  72. package/lib/admin/configuration-designer/elements/pivot-view.component.d.ts.map +0 -1
  73. package/lib/admin/configuration-designer/elements/policy.component.d.ts.map +0 -1
  74. package/lib/admin/configuration-designer/elements/report.component.d.ts.map +0 -1
  75. package/lib/admin/configuration-designer/elements/return-to-role-action.component.d.ts.map +0 -1
  76. package/lib/admin/configuration-designer/elements/role.component.d.ts.map +0 -1
  77. package/lib/admin/configuration-designer/elements/rule.component.d.ts.map +0 -1
  78. package/lib/admin/configuration-designer/elements/state.component.d.ts.map +0 -1
  79. package/lib/admin/configuration-designer/elements/sum-view.component.d.ts.map +0 -1
  80. package/lib/admin/configuration-designer/elements/tasks-report.component.d.ts.map +0 -1
  81. package/lib/admin/configuration-designer/elements/type.component.d.ts.map +0 -1
  82. package/lib/admin/configuration-designer/elements/usage-report.component.d.ts.map +0 -1
  83. package/lib/admin/configuration-designer/elements/utility.component.d.ts.map +0 -1
  84. package/lib/admin/configuration-designer/elements/view.component.d.ts.map +0 -1
  85. package/lib/admin/configuration-designer/elements/widget.component.d.ts.map +0 -1
  86. package/lib/admin/configuration-designer/icon-picker.component.d.ts.map +0 -1
  87. package/lib/admin/core/ace.input.d.ts.map +0 -1
  88. package/lib/admin/core/color-picker.input.d.ts.map +0 -1
  89. package/lib/admin/core/search.input.d.ts.map +0 -1
  90. package/lib/admin/diff/configuration-diff.component.d.ts.map +0 -1
  91. package/lib/admin/document-trace/document-trace.component.d.ts.map +0 -1
  92. package/lib/admin/document-trace/reassign.dialog.d.ts.map +0 -1
  93. package/lib/admin/document-trace/timeline.d.ts.map +0 -1
  94. package/lib/admin/document-trace/trace-element.component.d.ts.map +0 -1
  95. package/lib/admin/form/designer/designer.component.d.ts.map +0 -1
  96. package/lib/admin/form/form.resolve.service.d.ts.map +0 -1
  97. package/lib/admin/form/workflow/node-ref.d.ts.map +0 -1
  98. package/lib/admin/form/workflow/node.component.d.ts.map +0 -1
  99. package/lib/admin/form/workflow/role-node.component.d.ts.map +0 -1
  100. package/lib/admin/form/workflow/workflow.component.d.ts.map +0 -1
  101. package/lib/admin/indices/manage-cube-index.component.d.ts.map +0 -1
  102. package/lib/admin/patterns/patterns.component.d.ts.map +0 -1
  103. package/lib/admin/permissions/permissions.component.d.ts.map +0 -1
  104. package/lib/admin/positions/positions-popup.component.d.ts.map +0 -1
  105. package/lib/admin/positions/positions.component.d.ts.map +0 -1
  106. package/lib/admin/profiler/outofoffice.component.d.ts.map +0 -1
  107. package/lib/admin/profiler/profiler.component.d.ts.map +0 -1
  108. package/lib/admin/system.service.d.ts.map +0 -1
  109. package/lib/admin/utility-ref.d.ts.map +0 -1
  110. package/lib/admin/utility-wrapper.component.d.ts.map +0 -1
  111. package/lib/admin/utility.pane.component.d.ts.map +0 -1
  112. package/lib/app.component.d.ts.map +0 -1
  113. package/lib/bizdoc.module.d.ts.map +0 -1
  114. package/lib/browse/browse-items.component.d.ts.map +0 -1
  115. package/lib/browse/browse.mobile.component.d.ts.map +0 -1
  116. package/lib/browse/browse.pane.component.d.ts.map +0 -1
  117. package/lib/browse/expanded-item/expanded-item.component.d.ts.map +0 -1
  118. package/lib/browse/filter/filter.component.d.ts.map +0 -1
  119. package/lib/browse/folders-menu.component.d.ts.map +0 -1
  120. package/lib/chat/chat-info.d.ts.map +0 -1
  121. package/lib/chat/chat.mobile.component.d.ts.map +0 -1
  122. package/lib/chat/chat.service.d.ts.map +0 -1
  123. package/lib/chat/contacts.component.d.ts.map +0 -1
  124. package/lib/chat/contacts.pane.component.d.ts.map +0 -1
  125. package/lib/chat/conversation.component.d.ts.map +0 -1
  126. package/lib/chat/conversation.pane.component.d.ts.map +0 -1
  127. package/lib/compose/action/action-picker.component.d.ts.map +0 -1
  128. package/lib/compose/action/action-ref.d.ts.map +0 -1
  129. package/lib/compose/action/action.base.d.ts.map +0 -1
  130. package/lib/compose/action/action.dialog.d.ts.map +0 -1
  131. package/lib/compose/action/action.pane.dialog.exp.d.ts.map +0 -1
  132. package/lib/compose/action/assign-action.component.d.ts.map +0 -1
  133. package/lib/compose/action/moveto-action.component.d.ts.map +0 -1
  134. package/lib/compose/action/return-action.component.d.ts.map +0 -1
  135. package/lib/compose/attachments/attachments.component.d.ts.map +0 -1
  136. package/lib/compose/attachments/preview/attachment-preview.component.d.ts.map +0 -1
  137. package/lib/compose/attachments/progress-button.directive.d.ts.map +0 -1
  138. package/lib/compose/box/box.component.d.ts.map +0 -1
  139. package/lib/compose/can-deactivate-changes.service.d.ts.map +0 -1
  140. package/lib/compose/comments/comment.component.d.ts.map +0 -1
  141. package/lib/compose/comments/comments.component.d.ts.map +0 -1
  142. package/lib/compose/comments/comments.pane.component.d.ts.map +0 -1
  143. package/lib/compose/comments/edit-comment.component.d.ts.map +0 -1
  144. package/lib/compose/comments/edits.component.d.ts.map +0 -1
  145. package/lib/compose/comments/quick-comment.component.exp.d.ts.map +0 -1
  146. package/lib/compose/comments/votes.component.d.ts.map +0 -1
  147. package/lib/compose/compose-resolve.service.d.ts.map +0 -1
  148. package/lib/compose/compose.mobile.component.d.ts.map +0 -1
  149. package/lib/compose/compose.pane.component.d.ts.map +0 -1
  150. package/lib/compose/copy/copy.dialog.d.ts.map +0 -1
  151. package/lib/compose/dismiss.service.d.ts.map +0 -1
  152. package/lib/compose/document-resolver.service.d.ts.map +0 -1
  153. package/lib/compose/document.component.d.ts.map +0 -1
  154. package/lib/compose/document.mobile.component.d.ts.map +0 -1
  155. package/lib/compose/document.pane.component.d.ts.map +0 -1
  156. package/lib/compose/events/events.component.d.ts.map +0 -1
  157. package/lib/compose/form-ref.d.ts.map +0 -1
  158. package/lib/compose/form-selector/form-selector.sheet.d.ts.map +0 -1
  159. package/lib/compose/form.component.d.ts.map +0 -1
  160. package/lib/compose/new-menu.component.d.ts.map +0 -1
  161. package/lib/compose/privilage.directive.d.ts.map +0 -1
  162. package/lib/compose/recipient-resolver.service.d.ts.map +0 -1
  163. package/lib/compose/state.component.d.ts.map +0 -1
  164. package/lib/compose/tag/tags.component.d.ts.map +0 -1
  165. package/lib/compose/trace/flow.component.d.ts.map +0 -1
  166. package/lib/compose/trace/people.component.d.ts.map +0 -1
  167. package/lib/compose/trace/trace.base.d.ts.map +0 -1
  168. package/lib/compose/trace/trace.component.d.ts.map +0 -1
  169. package/lib/compose/trace/trace.pane.component.d.ts.map +0 -1
  170. package/lib/compose/version-compare/version-compare.component.d.ts.map +0 -1
  171. package/lib/compose/version-compare/version-compare.directive.d.ts.map +0 -1
  172. package/lib/compose/version-compare/version.pane.component.d.ts.map +0 -1
  173. package/lib/core/NgComponentOutlet.d.ts.map +0 -1
  174. package/lib/core/account.service.d.ts.map +0 -1
  175. package/lib/core/animated-icon/animated-icon.directive.d.ts.map +0 -1
  176. package/lib/core/animations.d.ts.map +0 -1
  177. package/lib/core/authentication.d.ts.map +0 -1
  178. package/lib/core/avatar/avatar.component.d.ts.map +0 -1
  179. package/lib/core/base.d.ts.map +0 -1
  180. package/lib/core/colors.d.ts.map +0 -1
  181. package/lib/core/component-factory-resolver.d.ts.map +0 -1
  182. package/lib/core/configuration.d.ts.map +0 -1
  183. package/lib/core/controls/address.input.d.ts.map +0 -1
  184. package/lib/core/controls/auto-complete.input.d.ts.map +0 -1
  185. package/lib/core/controls/combination-picker-body.d.ts.map +0 -1
  186. package/lib/core/controls/combination-picker.d.ts.map +0 -1
  187. package/lib/core/controls/combination-pool.d.ts.map +0 -1
  188. package/lib/core/controls/file.input.d.ts.map +0 -1
  189. package/lib/core/controls/select.input.d.ts.map +0 -1
  190. package/lib/core/controls/time-picker.d.ts.map +0 -1
  191. package/lib/core/controls/timespan.input.d.ts.map +0 -1
  192. package/lib/core/datasource.service.d.ts.map +0 -1
  193. package/lib/core/decorators.d.ts.map +0 -1
  194. package/lib/core/firebase.service.d.ts.map +0 -1
  195. package/lib/core/functions.d.ts.map +0 -1
  196. package/lib/core/guide/guide.component.d.ts.map +0 -1
  197. package/lib/core/guide/guide.service.d.ts.map +0 -1
  198. package/lib/core/guide/help-tip.component.d.ts.map +0 -1
  199. package/lib/core/http.interceptor.d.ts.map +0 -1
  200. package/lib/core/hub.service.d.ts.map +0 -1
  201. package/lib/core/identity/identity.component.d.ts.map +0 -1
  202. package/lib/core/info/attachment-info.service.d.ts.map +0 -1
  203. package/lib/core/info/document-info.service.d.ts.map +0 -1
  204. package/lib/core/info/location-info.component.d.ts.map +0 -1
  205. package/lib/core/info/map-info.d.ts.map +0 -1
  206. package/lib/core/layout/autocomplete.field.d.ts.map +0 -1
  207. package/lib/core/layout/checkbox.d.ts.map +0 -1
  208. package/lib/core/layout/checkbox.field.d.ts.map +0 -1
  209. package/lib/core/layout/date-range.field.d.ts.map +0 -1
  210. package/lib/core/layout/date.field.d.ts.map +0 -1
  211. package/lib/core/layout/expression.field.d.ts.map +0 -1
  212. package/lib/core/layout/file.field.d.ts.map +0 -1
  213. package/lib/core/layout/html.field.d.ts.map +0 -1
  214. package/lib/core/layout/input.base.d.ts.map +0 -1
  215. package/lib/core/layout/input.field.d.ts.map +0 -1
  216. package/lib/core/layout/layout.component.d.ts.map +0 -1
  217. package/lib/core/layout/numeric.field.d.ts.map +0 -1
  218. package/lib/core/layout/select.field.d.ts.map +0 -1
  219. package/lib/core/layout/switch.field.d.ts.map +0 -1
  220. package/lib/core/layout/textarea.field.d.ts.map +0 -1
  221. package/lib/core/layout/timespan.field.d.ts.map +0 -1
  222. package/lib/core/lottie-animation.d.ts.map +0 -1
  223. package/lib/core/mailbox.service.d.ts.map +0 -1
  224. package/lib/core/models.d.ts.map +0 -1
  225. package/lib/core/none.component.d.ts.map +0 -1
  226. package/lib/core/pipes/action.pipe.d.ts.map +0 -1
  227. package/lib/core/pipes/calendar.pipe.d.ts.map +0 -1
  228. package/lib/core/pipes/date-format.pipe.d.ts.map +0 -1
  229. package/lib/core/pipes/daterange.pipe.d.ts.map +0 -1
  230. package/lib/core/pipes/difference.pipe.d.ts.map +0 -1
  231. package/lib/core/pipes/duration-format.pipe.d.ts.map +0 -1
  232. package/lib/core/pipes/duration.pipe.d.ts.map +0 -1
  233. package/lib/core/pipes/form.pipe.d.ts.map +0 -1
  234. package/lib/core/pipes/join.pipe.d.ts.map +0 -1
  235. package/lib/core/pipes/role.pipe.d.ts.map +0 -1
  236. package/lib/core/pipes/sanitize-html.pipe.d.ts.map +0 -1
  237. package/lib/core/pipes/sort.pipe.d.ts.map +0 -1
  238. package/lib/core/pipes/state.pipe.d.ts.map +0 -1
  239. package/lib/core/pipes/time-ago.pipe.d.ts.map +0 -1
  240. package/lib/core/pipes/translate.pipe.d.ts.map +0 -1
  241. package/lib/core/pipes/type-value.pipe.d.ts.map +0 -1
  242. package/lib/core/pipes/user-name.pipe.d.ts.map +0 -1
  243. package/lib/core/popup/popup-ref.d.ts.map +0 -1
  244. package/lib/core/popup/popup.component.d.ts.map +0 -1
  245. package/lib/core/popup/popup.service.d.ts.map +0 -1
  246. package/lib/core/popup/tooltip.directive.d.ts.map +0 -1
  247. package/lib/core/prompt/ask/ask.dialog.d.ts.map +0 -1
  248. package/lib/core/prompt/mask/mask.component.d.ts.map +0 -1
  249. package/lib/core/prompt.service.d.ts.map +0 -1
  250. package/lib/core/router.d.ts.map +0 -1
  251. package/lib/core/save-changes.dialog.d.ts.map +0 -1
  252. package/lib/core/session.service.d.ts.map +0 -1
  253. package/lib/core/slots/pane-ref.d.ts.map +0 -1
  254. package/lib/core/slots/router.directive.d.ts.map +0 -1
  255. package/lib/core/slots/router.service.d.ts.map +0 -1
  256. package/lib/core/slots/slots.component.d.ts.map +0 -1
  257. package/lib/core/tagging/documents.component.d.ts.map +0 -1
  258. package/lib/core/tagging/edit-input.component.d.ts.map +0 -1
  259. package/lib/core/tagging/emoji.component.d.ts.map +0 -1
  260. package/lib/core/tagging/tagging-item.directive.d.ts.map +0 -1
  261. package/lib/core/tagging/tagging.component-base.d.ts.map +0 -1
  262. package/lib/core/tagging/tagging.directive.d.ts.map +0 -1
  263. package/lib/core/tagging/tagging.pipe.d.ts.map +0 -1
  264. package/lib/core/tagging/users.component.d.ts.map +0 -1
  265. package/lib/core/translate.service.d.ts.map +0 -1
  266. package/lib/core/translations.d.ts.map +0 -1
  267. package/lib/core/window-title.service.d.ts.map +0 -1
  268. package/lib/cube/accum/accum.component.d.ts.map +0 -1
  269. package/lib/cube/chart/chart.component.d.ts.map +0 -1
  270. package/lib/cube/cube-info.service.d.ts.map +0 -1
  271. package/lib/cube/cube-menu.component.d.ts.map +0 -1
  272. package/lib/cube/cube-view.component.d.ts.map +0 -1
  273. package/lib/cube/cube.service.d.ts.map +0 -1
  274. package/lib/cube/declarations.d.ts.map +0 -1
  275. package/lib/cube/explore/document-item.component.d.ts.map +0 -1
  276. package/lib/cube/explore/explore-item.component.d.ts.map +0 -1
  277. package/lib/cube/explore/explore-items.component.d.ts.map +0 -1
  278. package/lib/cube/explore/explore.pane.component.d.ts.map +0 -1
  279. package/lib/cube/explore/item-resolver.service.d.ts.map +0 -1
  280. package/lib/cube/explore/item.pane.component.d.ts.map +0 -1
  281. package/lib/cube/filter/filter-tags.component.exp.d.ts.map +0 -1
  282. package/lib/cube/filter/filter.component.d.ts.map +0 -1
  283. package/lib/cube/grid/grid.component.d.ts.map +0 -1
  284. package/lib/cube/grid/spreadsheet.component.d.ts.map +0 -1
  285. package/lib/cube/matrix/matrix.base.d.ts.map +0 -1
  286. package/lib/cube/matrix/matrix.mobile.component.d.ts.map +0 -1
  287. package/lib/cube/matrix/matrix.pane.component.d.ts.map +0 -1
  288. package/lib/cube/matrix/popup.component.d.ts.map +0 -1
  289. package/lib/cube/matrix/table.component.d.ts.map +0 -1
  290. package/lib/cube/parallel/item.d.ts.map +0 -1
  291. package/lib/cube/parallel/parallel.component.d.ts.map +0 -1
  292. package/lib/cube/pivot/pivot.component.d.ts.map +0 -1
  293. package/lib/cube/sum/sum.component.d.ts.map +0 -1
  294. package/lib/cube/view-base.d.ts.map +0 -1
  295. package/lib/cube/view.mobile.component.d.ts.map +0 -1
  296. package/lib/cube/view.pane.component.d.ts.map +0 -1
  297. package/lib/dashboard/actions/actions.widget.d.ts.map +0 -1
  298. package/lib/dashboard/cube/accum-cube.widget.d.ts.map +0 -1
  299. package/lib/dashboard/cube/compare.widget.d.ts.map +0 -1
  300. package/lib/dashboard/cube/cube-analysis.base.d.ts.map +0 -1
  301. package/lib/dashboard/cube/cube-analysis.widget.d.ts.map +0 -1
  302. package/lib/dashboard/cube/cube-chart.widget.d.ts.map +0 -1
  303. package/lib/dashboard/cube/documents.widget.d.ts.map +0 -1
  304. package/lib/dashboard/cube/filter/filter.component.d.ts.map +0 -1
  305. package/lib/dashboard/dashboard.component.d.ts.map +0 -1
  306. package/lib/dashboard/dashboard.pane.component.d.ts.map +0 -1
  307. package/lib/dashboard/recents/recents.widget.d.ts.map +0 -1
  308. package/lib/dashboard/score/activity.widget.d.ts.map +0 -1
  309. package/lib/dashboard/score/compare-groups.widget.d.ts.map +0 -1
  310. package/lib/dashboard/score/peers-performance.widget.d.ts.map +0 -1
  311. package/lib/dashboard/score/pending-results.widget.d.ts.map +0 -1
  312. package/lib/dashboard/score/personal-score.widget.d.ts.map +0 -1
  313. package/lib/dashboard/widget-item.component.d.ts.map +0 -1
  314. package/lib/dashboard/widget-ref.d.ts.map +0 -1
  315. package/lib/desktop.module.d.ts.map +0 -1
  316. package/lib/home/about/about.dialog.d.ts.map +0 -1
  317. package/lib/home/home-base.component.d.ts.map +0 -1
  318. package/lib/home/home.desktop.component.d.ts.map +0 -1
  319. package/lib/home/home.mobile.component.d.ts.map +0 -1
  320. package/lib/home/notifications/notifications.component.d.ts.map +0 -1
  321. package/lib/home/options/options.component.d.ts.map +0 -1
  322. package/lib/home/outofoffice/outofoffice.component.d.ts.map +0 -1
  323. package/lib/home/search.service.d.ts.map +0 -1
  324. package/lib/home/sign/sign.component.d.ts.map +0 -1
  325. package/lib/home/tools.component.d.ts.map +0 -1
  326. package/lib/impersonate/impersonate.component.d.ts.map +0 -1
  327. package/lib/mobile.module.d.ts.map +0 -1
  328. package/lib/modules/chart.module.d.ts.map +0 -1
  329. package/lib/modules/circular-gauge.module.d.ts.map +0 -1
  330. package/lib/modules/date.adapter.d.ts.map +0 -1
  331. package/lib/modules/datepicker.intl.d.ts.map +0 -1
  332. package/lib/modules/dayjs.module.d.ts.map +0 -1
  333. package/lib/modules/diagram.module.d.ts.map +0 -1
  334. package/lib/modules/gantt.module.d.ts.map +0 -1
  335. package/lib/modules/grid.module.d.ts.map +0 -1
  336. package/lib/modules/material.module.d.ts.map +0 -1
  337. package/lib/modules/paginator.intl.d.ts.map +0 -1
  338. package/lib/modules/pivot.module.d.ts.map +0 -1
  339. package/lib/modules/schedule.module.d.ts.map +0 -1
  340. package/lib/modules/spreadsheet.module.d.ts.map +0 -1
  341. package/lib/modules/stepper.intl.d.ts.map +0 -1
  342. package/lib/modules/texteditor.module.d.ts.map +0 -1
  343. package/lib/notifications/filter.component.d.ts.map +0 -1
  344. package/lib/notifications/notifications-table.component.d.ts.map +0 -1
  345. package/lib/notifications/notifications.component-base.d.ts.map +0 -1
  346. package/lib/notifications/notifications.mobile.component.d.ts.map +0 -1
  347. package/lib/notifications/notifications.pane.component.d.ts.map +0 -1
  348. package/lib/notifications/notifications.service.d.ts.map +0 -1
  349. package/lib/notifications/types/commented.notification.d.ts.map +0 -1
  350. package/lib/notifications/types/cube-anomaly.notification.d.ts.map +0 -1
  351. package/lib/notifications/types/escalated.notification.d.ts.map +0 -1
  352. package/lib/notifications/types/liked.notification.d.ts.map +0 -1
  353. package/lib/notifications/types/long-running-task.notification.d.ts.map +0 -1
  354. package/lib/notifications/types/notification-base.d.ts.map +0 -1
  355. package/lib/notifications/types/nudge.notification.d.ts.map +0 -1
  356. package/lib/notifications/types/state-changed.notification.d.ts.map +0 -1
  357. package/lib/notifications/types/tagged.notification.d.ts.map +0 -1
  358. package/lib/notifications/types/text.notification.d.ts.map +0 -1
  359. package/lib/notifications/types/upcoming-event.notification.d.ts.map +0 -1
  360. package/lib/options/options.component.d.ts.map +0 -1
  361. package/lib/options/options.service.d.ts.map +0 -1
  362. package/lib/reports/arguments-component.d.ts.map +0 -1
  363. package/lib/reports/cube/documents.component.d.ts.map +0 -1
  364. package/lib/reports/cube/grid-documents.component.d.ts.map +0 -1
  365. package/lib/reports/cube/table-documents.component.d.ts.map +0 -1
  366. package/lib/reports/cube/usage-args.component.d.ts.map +0 -1
  367. package/lib/reports/cube/usage-base.d.ts.map +0 -1
  368. package/lib/reports/cube/usage-chart.component.d.ts.map +0 -1
  369. package/lib/reports/cube/usage-pivot.component.d.ts.map +0 -1
  370. package/lib/reports/cube/usage.component.d.ts.map +0 -1
  371. package/lib/reports/report-ref.d.ts.map +0 -1
  372. package/lib/reports/report-viewer.component.d.ts.map +0 -1
  373. package/lib/reports/report.mobile.component.d.ts.map +0 -1
  374. package/lib/reports/report.pane.component.d.ts.map +0 -1
  375. package/lib/reports/reports-menu.component.d.ts.map +0 -1
  376. package/lib/reports/substitution/substitution.component.d.ts.map +0 -1
  377. package/lib/reports/table/table-view.component.d.ts.map +0 -1
  378. package/lib/reports/tasks/tasks.component.d.ts.map +0 -1
  379. package/lib/routes.desktop.d.ts.map +0 -1
  380. package/lib/routes.mobile.d.ts.map +0 -1
  381. package/lib/scheduler/schedule.component.d.ts.map +0 -1
  382. package/lib/scheduler/scheduler.mobile.component.d.ts.map +0 -1
  383. package/lib/scheduler/scheduler.pane.component.d.ts.map +0 -1
  384. package/lib/shared.module.d.ts.map +0 -1
  385. package/lib/system.module.d.ts.map +0 -1
  386. package/lib/views/cube/chart.component.d.ts.map +0 -1
  387. package/lib/views/cube/cube-base.d.ts.map +0 -1
  388. package/lib/views/cube/explore.component.d.ts.map +0 -1
  389. package/lib/views/cube/matrix.component.d.ts.map +0 -1
  390. package/lib/views/cube/parallel.component.d.ts.map +0 -1
  391. package/lib/views/cube/pivot.component.d.ts.map +0 -1
  392. package/lib/views/cube/sum.component.d.ts.map +0 -1
  393. package/lib/views/cube/view.component.d.ts.map +0 -1
  394. package/lib/views/document-view-ref.d.ts.map +0 -1
  395. package/lib/views/timeline/timeline.component.exp.d.ts.map +0 -1
  396. package/lib/views/view-item.component.d.ts.map +0 -1
  397. package/lib/views/views.component.d.ts.map +0 -1
  398. package/lib/views/views.mobile.component.d.ts.map +0 -1
  399. package/lib/views/views.pane.component.d.ts.map +0 -1
  400. package/public-api.d.ts.map +0 -1
@@ -4,28 +4,32 @@ import { startWith } from "rxjs";
4
4
  import { isArray } from "../../../core/functions";
5
5
  import { DesignerTypeElementComponent } from "../designer.base";
6
6
  import { DesignerRef, programName, arrayOf } from "../declarations";
7
+ import dayjs from 'dayjs';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/forms";
9
10
  import * as i2 from "../../system.service";
10
11
  import * as i3 from "../../../core/prompt.service";
11
12
  import * as i4 from "@angular/common";
12
- import * as i5 from "@angular/cdk/drag-drop";
13
- import * as i6 from "@angular/material/radio";
14
- import * as i7 from "@angular/material/progress-spinner";
15
- import * as i8 from "@angular/material/core";
16
- import * as i9 from "@angular/material/form-field";
17
- import * as i10 from "@angular/material/select";
18
- import * as i11 from "@angular/material/button";
19
- import * as i12 from "@angular/material/checkbox";
20
- import * as i13 from "@angular/material/input";
21
- import * as i14 from "@angular/material/icon";
22
- import * as i15 from "../../../core/popup/tooltip.directive";
23
- import * as i16 from "../designer-privileges.component";
24
- import * as i17 from "../icon-picker.component";
25
- import * as i18 from "../designer-element.component";
26
- import * as i19 from "../cube-axes-filter.component";
27
- import * as i20 from "../../../core/pipes/translate.pipe";
28
- import * as i21 from "../declarations";
13
+ import * as i5 from "@angular/flex-layout/flex";
14
+ import * as i6 from "@angular/cdk/drag-drop";
15
+ import * as i7 from "@angular/material/radio";
16
+ import * as i8 from "@angular/material/progress-spinner";
17
+ import * as i9 from "@angular/material/core";
18
+ import * as i10 from "@angular/material/form-field";
19
+ import * as i11 from "@angular/material/select";
20
+ import * as i12 from "@angular/material/button";
21
+ import * as i13 from "@angular/material/checkbox";
22
+ import * as i14 from "@angular/material/input";
23
+ import * as i15 from "@angular/material/icon";
24
+ import * as i16 from "../../../core/popup/tooltip.directive";
25
+ import * as i17 from "../../../core/controls/timespan.input";
26
+ import * as i18 from "../designer-privileges.component";
27
+ import * as i19 from "../icon-picker.component";
28
+ import * as i20 from "../designer-element.component";
29
+ import * as i21 from "../cube-axes-filter.component";
30
+ import * as i22 from "../../../core/pipes/time-ago.pipe";
31
+ import * as i23 from "../../../core/pipes/translate.pipe";
32
+ import * as i24 from "../declarations";
29
33
  export class CubeDesignComponent extends DesignerTypeElementComponent {
30
34
  constructor(fb, _service, _ps, element, ref) {
31
35
  super(fb, element, ref);
@@ -50,6 +54,7 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
50
54
  }
51
55
  };
52
56
  this.form = this._fb.group({
57
+ schedule: null,
53
58
  patterns: this.patterns,
54
59
  views: this.views,
55
60
  axes: this.axes,
@@ -62,7 +67,11 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
62
67
  }
63
68
  sync() {
64
69
  this.syncing = true;
65
- this._service.synchrinize(this.model.name).subscribe(() => this.syncing = false, () => {
70
+ this._service.synchrinize(this.model.name).subscribe(e => {
71
+ this.jobInfo = e;
72
+ this._schedule(e.nextExecution);
73
+ this.syncing = false;
74
+ }, () => {
66
75
  this.syncing = false;
67
76
  this._ps.error();
68
77
  });
@@ -70,26 +79,40 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
70
79
  ngOnInit() {
71
80
  switch (this.mode) {
72
81
  case 'widget':
73
- this._service.cube(this.model.name).subscribe(r => this.usage = r);
82
+ this._service.cube(this.model.name).subscribe(r => {
83
+ this.jobInfo = r.jobInfo;
84
+ this._schedule(r.jobInfo?.nextExecution);
85
+ this.usage = r;
86
+ });
74
87
  break;
75
- //case 'add':
76
88
  case 'edit':
77
89
  this._buildForm();
78
90
  break;
79
91
  }
92
+ super.ngOnInit();
93
+ }
94
+ _schedule(date) {
95
+ if (!date)
96
+ return;
97
+ const ms = dayjs(date).diff().valueOf();
98
+ setTimeout(() => {
99
+ }, ms + 600000);
80
100
  }
81
101
  _buildForm() {
82
- this.model.axes.forEach((a, i) => {
102
+ this.model.axes.forEach(a => {
83
103
  this.axes.push(this.newAxis(a), { emitEvent: false });
84
104
  });
85
105
  this.model.indices?.forEach(i => this.indices.push(this.newIndex(i), { emitEvent: false }));
86
106
  this.model.patterns?.forEach(p => this.patterns.push(this.newPattern(p), { emitEvent: false }));
87
- this.model.views?.forEach((v, i) => {
107
+ this.model.views?.forEach(v => {
88
108
  this.views.push(this.newView(v), { emitEvent: false });
89
109
  });
90
110
  }
91
111
  complete() {
92
112
  this._buildForm();
113
+ if (!this.model.privileges)
114
+ this.model.privileges = {};
115
+ super.ngOnInit();
93
116
  }
94
117
  nameOf(axis) { return this.model.axes.filter(a => isArray(axis) ? axis.indexOf(a.name) > -1 : a.name === axis).join(', '); }
95
118
  newView(model) {
@@ -201,15 +224,15 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
201
224
  datatype(name) { return this.types.find(t => t.name == name)?.title; }
202
225
  }
203
226
  CubeDesignComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CubeDesignComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SystemService }, { token: i3.PromptService }, { token: i0.ElementRef }, { token: DesignerRef }], target: i0.ɵɵFactoryTarget.Component });
204
- CubeDesignComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CubeDesignComponent, selector: "ng-component", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<bizdoc-designer-element [form]=\"form\" (continue)=\"complete()\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n <div *ngIf=\"model.axes?.length\">\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.axes\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n <td class=\"mat-cell\">{{datatype(a.dataType)}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"model.indices?.length\">\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.indices\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <ng-container *ngIf=\"view; else main\">\r\n <h2 class=\"mat-title\">{{context.title|translate}}</h2>\r\n <div (document:keydown.escape)=\"closeView($event)\" #element class=\"column\">\r\n <ng-container *ngTemplateOutlet=\"view; context: context\"></ng-container>\r\n </div>\r\n <div class=\"row actions\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"closeView()\" type=\"button\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon>keyboard_return</mat-icon></button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!---->\r\n<ng-template #main>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <br />\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <!--Axes-->\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table formArrayName=\"axes\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <!--Indices-->\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-title\">{{'Patterns'|translate}}</h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <!--Views-->\r\n <h2 class=\"mat-title\">{{'Views'|translate}}</h2>\r\n <table formArrayName=\"views\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'View', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </form>\r\n</ng-template>\r\n<ng-template #indexform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </form>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-icon-picker formControlName=\"icon\" required></bizdoc-icon-picker>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple>\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple>\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <ng-container *ngIf=\"accumulative\">\r\n <mat-option value=\"Pie\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\">{{'Pyramid'|translate}}</mat-option>\r\n </ng-container>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </form>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <ng-container *ngFor=\"let t of types\">\r\n <mat-option *ngIf=\"t.name\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'Single'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Search'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'}}</mat-checkbox></div>\r\n </form>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-radio-group p{margin-inline-start:8px}.mat-table{width:100%}.mat-table .mat-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i6.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i6.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i9.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i15.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i16.DesignerPrivilegesComponent, selector: "bizdoc-designer-privileges", inputs: ["form"] }, { kind: "component", type: i17.IconPickerComponent, selector: "bizdoc-icon-picker", inputs: ["value", "required", "disabled"], outputs: ["valueChanges"] }, { kind: "directive", type: i18.EditContentDirective, selector: "[bizdocEditContent]" }, { kind: "directive", type: i18.WidgetContentDirective, selector: "[bizdocContent]" }, { kind: "component", type: i19.DesignerCubeFilterComponent, selector: "bizdoc-designer-cube-filter", inputs: ["cube", "form"] }, { kind: "component", type: i18.DesignerItemComponent, selector: "bizdoc-designer-element", inputs: ["form"], outputs: ["continue", "save"] }, { kind: "pipe", type: i20.TranslatePipe, name: "translate" }] });
227
+ CubeDesignComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CubeDesignComponent, selector: "ng-component", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row\" fxLayoutAlign=\"start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n <div *ngIf=\"model.axes?.length\">\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.axes\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n <td class=\"mat-cell\">{{datatype(a.dataType)}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n <!--<div *ngIf=\"model.indices?.length\">\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.indices\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n </tr>\r\n </table>\r\n </div>-->\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <ng-container *ngIf=\"view; else main\">\r\n <h2 class=\"mat-title\">{{context.title|translate}}</h2>\r\n <div (document:keydown.escape)=\"closeView($event)\" #element class=\"column\">\r\n <ng-container *ngTemplateOutlet=\"view; context: context\"></ng-container>\r\n </div>\r\n <div class=\"row actions\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"closeView()\" type=\"button\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon>keyboard_return</mat-icon></button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!---->\r\n<ng-template #main>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <br />\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <!--Axes-->\r\n <h2 class=\"mat-title row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-title row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-title row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-title\">\r\n {{'Views'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'View', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!---->\r\n<ng-template #indexform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </form>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-icon-picker formControlName=\"icon\" required></bizdoc-icon-picker>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple>\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple>\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <ng-container *ngIf=\"accumulative\">\r\n <mat-option value=\"Pie\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\">{{'Pyramid'|translate}}</mat-option>\r\n </ng-container>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </form>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <ng-container *ngFor=\"let t of types\">\r\n <mat-option *ngIf=\"t.name\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'Single'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Search'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'}}</mat-checkbox></div>\r\n </form>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-radio-group p{margin-inline-start:8px}.mat-table{width:100%}.mat-table .mat-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{float:left;width:35%;padding:0;margin:0;clear:both}dd{float:left;width:65%;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i10.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i17.TimespanInput, selector: "bizdoc-timespan-input", inputs: ["placeholder", "required", "disabled", "value"] }, { kind: "component", type: i18.DesignerPrivilegesComponent, selector: "bizdoc-designer-privileges", inputs: ["form"] }, { kind: "component", type: i19.IconPickerComponent, selector: "bizdoc-icon-picker", inputs: ["value", "required", "disabled"], outputs: ["valueChanges"] }, { kind: "directive", type: i20.EditContentDirective, selector: "[bizdocEditContent]" }, { kind: "directive", type: i20.WidgetContentDirective, selector: "[bizdocContent]" }, { kind: "component", type: i21.DesignerCubeFilterComponent, selector: "bizdoc-designer-cube-filter", inputs: ["cube", "form"] }, { kind: "component", type: i20.DesignerItemComponent, selector: "bizdoc-designer-element", inputs: ["privileges", "form"], outputs: ["continue", "save"] }, { kind: "pipe", type: i22.TimeAgoPipe, name: "amTimeAgo" }, { kind: "pipe", type: i23.TranslatePipe, name: "translate" }] });
205
228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CubeDesignComponent, decorators: [{
206
229
  type: Component,
207
- args: [{ template: "<bizdoc-designer-element [form]=\"form\" (continue)=\"complete()\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n <div *ngIf=\"model.axes?.length\">\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.axes\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n <td class=\"mat-cell\">{{datatype(a.dataType)}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"model.indices?.length\">\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.indices\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <ng-container *ngIf=\"view; else main\">\r\n <h2 class=\"mat-title\">{{context.title|translate}}</h2>\r\n <div (document:keydown.escape)=\"closeView($event)\" #element class=\"column\">\r\n <ng-container *ngTemplateOutlet=\"view; context: context\"></ng-container>\r\n </div>\r\n <div class=\"row actions\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"closeView()\" type=\"button\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon>keyboard_return</mat-icon></button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!---->\r\n<ng-template #main>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <br />\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <!--Axes-->\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table formArrayName=\"axes\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <!--Indices-->\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-title\">{{'Patterns'|translate}}</h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n <!--Views-->\r\n <h2 class=\"mat-title\">{{'Views'|translate}}</h2>\r\n <table formArrayName=\"views\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'View', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </form>\r\n</ng-template>\r\n<ng-template #indexform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </form>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-icon-picker formControlName=\"icon\" required></bizdoc-icon-picker>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple>\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple>\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <ng-container *ngIf=\"accumulative\">\r\n <mat-option value=\"Pie\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\">{{'Pyramid'|translate}}</mat-option>\r\n </ng-container>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </form>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <form [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <ng-container *ngFor=\"let t of types\">\r\n <mat-option *ngIf=\"t.name\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'Single'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Search'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'}}</mat-checkbox></div>\r\n </form>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-radio-group p{margin-inline-start:8px}.mat-table{width:100%}.mat-table .mat-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}\n"] }]
208
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SystemService }, { type: i3.PromptService }, { type: i0.ElementRef }, { type: i21.DesignerRef, decorators: [{
230
+ args: [{ template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row\" fxLayoutAlign=\"start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n <div *ngIf=\"model.axes?.length\">\r\n <h2 class=\"mat-title\">{{'Axes'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.axes\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n <td class=\"mat-cell\">{{datatype(a.dataType)}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n <!--<div *ngIf=\"model.indices?.length\">\r\n <h2 class=\"mat-title\">{{'Indices'|translate}}</h2>\r\n <table class=\"mat-table\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of model.indices\">\r\n <td class=\"mat-cell\">{{a.title}}</td>\r\n </tr>\r\n </table>\r\n </div>-->\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <ng-container *ngIf=\"view; else main\">\r\n <h2 class=\"mat-title\">{{context.title|translate}}</h2>\r\n <div (document:keydown.escape)=\"closeView($event)\" #element class=\"column\">\r\n <ng-container *ngTemplateOutlet=\"view; context: context\"></ng-container>\r\n </div>\r\n <div class=\"row actions\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"closeView()\" type=\"button\" [bizdocTooltip]=\"'Back'|translate\"><mat-icon>keyboard_return</mat-icon></button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!---->\r\n<ng-template #main>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <br />\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <!--Axes-->\r\n <h2 class=\"mat-title row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-title row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-title row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-title\">\r\n {{'Views'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'View', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-cell\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!---->\r\n<ng-template #indexform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </form>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </form>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-icon-picker formControlName=\"icon\" required></bizdoc-icon-picker>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple>\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple>\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <ng-container *ngIf=\"accumulative\">\r\n <mat-option value=\"Pie\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\">{{'Pyramid'|translate}}</mat-option>\r\n </ng-container>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </form>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <form autocomplete=\"off\" [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <ng-container *ngFor=\"let t of types\">\r\n <mat-option *ngIf=\"t.name\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'Single'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Search'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'}}</mat-checkbox></div>\r\n </form>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-radio-group p{margin-inline-start:8px}.mat-table{width:100%}.mat-table .mat-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{float:left;width:35%;padding:0;margin:0;clear:both}dd{float:left;width:65%;padding:0;margin:0}\n"] }]
231
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SystemService }, { type: i3.PromptService }, { type: i0.ElementRef }, { type: i24.DesignerRef, decorators: [{
209
232
  type: Inject,
210
233
  args: [DesignerRef]
211
234
  }] }]; }, propDecorators: { element: [{
212
235
  type: ViewChild,
213
236
  args: ['element']
214
237
  }] } });
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ViZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2NvbmZpZ3VyYXRpb24tZGVzaWduZXIvZWxlbWVudHMvY3ViZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2NvbmZpZ3VyYXRpb24tZGVzaWduZXIvZWxlbWVudHMvY3ViZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBc0QsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQTZELE9BQU8sRUFBOEIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNM0osTUFBTSxPQUFPLG1CQUFvQixTQUFRLDRCQUE0QjtJQStCbkUsWUFBWSxFQUFlLEVBQ2pCLFFBQXVCLEVBQ3ZCLEdBQWtCLEVBQzFCLE9BQXdCLEVBQ0gsR0FBZ0I7UUFDckMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFKaEIsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFlO1FBaENuQixVQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsU0FBSSxHQUFHLElB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cThzQkFrWEE7MkZEcldhLG1CQUFtQjtrQkFKL0IsU0FBUzs7OzBCQXVDTCxNQUFNOzJCQUFDLFdBQVc7NENBUEMsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHsgUHJvbXB0U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1YmVJbmZvLCBTeXN0ZW1TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3N5c3RlbS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlc2lnbmVyVHlwZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwiLi4vZGVzaWduZXIuYmFzZVwiO1xyXG5pbXBvcnQgeyBEZXNpZ25lclJlZiwgcHJvZ3JhbU5hbWUsIEVsZW1lbnRJbmZvLCBDdWJlQXhpc01vZGVsLCBDdWJlVmlld01vZGVsLCBDdWJlSW5kZXhNb2RlbCwgYXJyYXlPZiwgRWxlbWVudE1vZGVsLCBQYXR0ZXJuTW9kZWwgfSBmcm9tIFwiLi4vZGVjbGFyYXRpb25zXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZVVybDogJ2N1YmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydjdWJlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1YmVEZXNpZ25Db21wb25lbnQgZXh0ZW5kcyBEZXNpZ25lclR5cGVFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICByZWFkb25seSB2aWV3cyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICByZWFkb25seSBheGVzID0gdGhpcy5fZmIuYXJyYXkoW10pO1xyXG4gIHJlYWRvbmx5IGluZGljZXMgPSB0aGlzLl9mYi5hcnJheShbXSk7XHJcbiAgcmVhZG9ubHkgcGF0dGVybnMgPSB0aGlzLl9mYi5hcnJheShbXSk7XHJcbiAgcHJpdmF0ZSBfY3ViZUF4ZXNWYWxpZGF0b3IgPSAoXzogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICBpZiAoIXRoaXMubW9kZWwpIHJldHVybjtcclxuICAgIGNvbnN0IGF4ZXMgPSB0aGlzLm1vZGVsLmF4ZXMubWFwKHggPT4geC5uYW1lKTtcclxuICAgIGxldCBpID0gMCwgbiA9IHRoaXMubW9kZWwudmlld3MubGVuZ3RoO1xyXG4gICAgd2hpbGUgKGkgPCBuKSB7XHJcbiAgICAgIGxldCB2aWV3ID0gdGhpcy5tb2RlbC52aWV3c1tpXTtcclxuICAgICAgaWYgKHZpZXcueEF4aXMgJiYgdmlldy54QXhpcy5zb21lKHggPT4gYXhlcy5pbmRleE9mKHgpIDwgMCkpXHJcbiAgICAgICAgcmV0dXJuIHsgeEF4aXM6IGZhbHNlIH07XHJcbiAgICAgIGlmICh2aWV3LnNlcmllcyAmJiB2aWV3LnNlcmllcy5zb21lKHggPT4gYXhlcy5pbmRleE9mKHgpIDwgMCkpXHJcbiAgICAgICAgcmV0dXJuIHsgc2VyaWVzOiBmYWxzZSB9O1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgfTtcclxuICByZWFkb25seSBmb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgcGF0dGVybnM6IHRoaXMucGF0dGVybnMsXHJcbiAgICB2aWV3czogdGhpcy52aWV3cyxcclxuICAgIGF4ZXM6IHRoaXMuYXhlcyxcclxuICAgIGluZGljZXM6IHRoaXMuaW5kaWNlcyxcclxuICAgIHNjb3BlOiB0aGlzLl9mYi5jb250cm9sKG51bGwpLFxyXG4gICAgYW5vbWFseTogdGhpcy5fZmIuY29udHJvbCgnUG9zaXRpb25zJyksXHJcbiAgfSwgeyAvKnZhbGlkYXRvcnM6IHRoaXMuX2N1YmVBeGVzVmFsaWRhdG9yKi8gfSk7XHJcbiAgdXNhZ2U6IEN1YmVJbmZvO1xyXG4gIHN5bmNpbmcgPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdlbGVtZW50JykgZWxlbWVudDogRWxlbWVudFJlZjxhbnk+O1xyXG4gIHJlYWRvbmx5IHR5cGVzOiBFbGVtZW50SW5mb1tdO1xyXG4gIGFjY3VtdWxhdGl2ZTogYm9vbGVhbjtcclxuICBjb25zdHJ1Y3RvcihmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcHM6IFByb21wdFNlcnZpY2UsXHJcbiAgICBlbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXHJcbiAgICBASW5qZWN0KERlc2lnbmVyUmVmKSByZWY6IERlc2lnbmVyUmVmKSB7XHJcbiAgICBzdXBlcihmYiwgZWxlbWVudCwgcmVmKTtcclxuICAgIHRoaXMudHlwZXMgPSByZWYuZGVzaWduZXIudHlwZXMuZmlsdGVyKHQgPT4gIXQuZGlzYWJsZWQpO1xyXG4gIH1cclxuICBzeW5jKCkge1xyXG4gICAgdGhpcy5zeW5jaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuX3NlcnZpY2Uuc3luY2hyaW5pemUodGhpcy5tb2RlbC5uYW1lKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zeW5jaW5nID0gZmFsc2UsICgpID0+IHtcclxuICAgICAgdGhpcy5zeW5jaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3BzLmVycm9yKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xyXG4gICAgICBjYXNlICd3aWRnZXQnOlxyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuY3ViZSh0aGlzLm1vZGVsLm5hbWUpLnN1YnNjcmliZShyID0+IHRoaXMudXNhZ2UgPSByKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgLy9jYXNlICdhZGQnOlxyXG4gICAgICBjYXNlICdlZGl0JzpcclxuICAgICAgICB0aGlzLl9idWlsZEZvcm0oKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfYnVpbGRGb3JtKCkge1xyXG4gICAgdGhpcy5tb2RlbC5heGVzLmZvckVhY2goKGEsIGkpID0+IHtcclxuICAgICAgdGhpcy5heGVzLnB1c2godGhpcy5uZXdBeGlzKGEpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kZWwuaW5kaWNlcz8uZm9yRWFjaChpID0+XHJcbiAgICAgIHRoaXMuaW5kaWNlcy5wdXNoKHRoaXMubmV3SW5kZXgoaSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMubW9kZWwucGF0dGVybnM/LmZvckVhY2gocCA9PlxyXG4gICAgICB0aGlzLnBhdHRlcm5zLnB1c2godGhpcy5uZXdQYXR0ZXJuKHApLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLm1vZGVsLnZpZXdzPy5mb3JFYWNoKCh2LCBpKSA9PiB7XHJcbiAgICAgIHRoaXMudmlld3MucHVzaCh0aGlzLm5ld1ZpZXcodiksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBjb21wbGV0ZSgpIHtcclxuICAgIHRoaXMuX2J1aWxkRm9ybSgpO1xyXG4gIH1cclxuICBuYW1lT2YoYXhpczogc3RyaW5nIHwgc3RyaW5nW10pIHsgcmV0dXJuIHRoaXMubW9kZWwuYXhlcy5maWx0ZXIoYSA9PiBpc0FycmF5KGF4aXMpID8gYXhpcy5pbmRleE9mKGEubmFtZSkgPiAtMSA6IGEubmFtZSA9PT0gYXhpcykuam9pbignLCAnKSB9XHJcbiAgcHJpdmF0ZSBuZXdWaWV3KG1vZGVsPzogQ3ViZVZpZXdNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8ubmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRpdGxlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICB4QXhpcyA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgY2hhcnRUeXBlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8uY2hhcnRUeXBlIHx8IG51bGwpLFxyXG4gICAgICBpbmRpY2VzQ2hhcnRUeXBlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8uaW5kaWNlc0NoYXJ0VHlwZSB8fCBudWxsKSxcclxuICAgICAgc2VyaWVzID0gdGhpcy5fZmIuY29udHJvbChhcnJheU9mKG1vZGVsPy5zZXJpZXMpKSxcclxuICAgICAgaW5kaWNlcyA9IHRoaXMuX2ZiLmNvbnRyb2woYXJyYXlPZihtb2RlbD8uaW5kaWNlcykpLFxyXG4gICAgICB0eXBlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udHlwZSB8fCAnQ2hhcnQnKTtcclxuICAgIGlmICghbW9kZWwgfHwgdGhpcy5tb2RlbC5kcmFmdCkgdGl0bGUudmFsdWVDaGFuZ2VzLlxyXG4gICAgICBzdWJzY3JpYmUodCA9PiBuYW1lLnNldFZhbHVlKHByb2dyYW1OYW1lKHQpKSk7XHJcbiAgICB4QXhpcy52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgobW9kZWw/LnhBeGlzKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBpZiAodiAmJiB2Lmxlbmd0aCkge1xyXG4gICAgICAgIHNlcmllcy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGlmIChzZXJpZXMudmFsdWUpXHJcbiAgICAgICAgICBzZXJpZXMuc2V0VmFsdWUoKHRoaXMuYXhlcy52YWx1ZSBhcyBDdWJlQXhpc01vZGVsW10pLlxyXG4gICAgICAgICAgICBmaWx0ZXIoYSA9PiB2LmluZGV4T2YoYS5uYW1lKSA8IDAgJiYgc2VyaWVzLnZhbHVlLmluZGV4T2YoYS5uYW1lKSA+IC0xKS5cclxuICAgICAgICAgICAgbWFwKGEgPT4gYS5uYW1lKVxyXG4gICAgICAgICAgICAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc2VyaWVzLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICBzZXJpZXMudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy5zZXJpZXMpKS5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgIHRoaXMuYWNjdW11bGF0aXZlID0gIXYgfHwgdi5sZW5ndGggPT09IDA7XHJcbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGl2ZSB8fCAhdGhpcy5pbmRpY2VzLmxlbmd0aCkge1xyXG4gICAgICAgIGluZGljZXMuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpbmRpY2VzLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGluZGljZXMudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy5pbmRpY2VzKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBpZiAodiAmJiB2Lmxlbmd0aClcclxuICAgICAgICBpbmRpY2VzQ2hhcnRUeXBlLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpbmRpY2VzQ2hhcnRUeXBlLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgaWNvbjogbW9kZWw/Lmljb24gfHwgJ2luc2lnaHRzJyxcclxuICAgICAgeEF4aXMsXHJcbiAgICAgIHNlcmllcyxcclxuICAgICAgaW5kaWNlcyxcclxuICAgICAgdHlwZSxcclxuICAgICAgY2hhcnRUeXBlLFxyXG4gICAgICBpbmRpY2VzQ2hhcnRUeXBlLFxyXG4gICAgICBmaWx0ZXJzOiB0aGlzLl9mYi5ncm91cCh7fSksXHJcbiAgICAgIHByaXZpbGVnZXM6IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgICBydWxlOiBudWxsLFxyXG4gICAgICAgIHJvbGVzOiB0aGlzLl9mYi5jb250cm9sPHN0cmluZ1tdPihudWxsKSxcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgdHlwZS52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgobW9kZWw/LnR5cGUpKS5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgIHN3aXRjaCAodikge1xyXG4gICAgICAgIGNhc2UgJ1NwcmVhZHNoZWV0JzpcclxuICAgICAgICBjYXNlICdHcmlkJzpcclxuICAgICAgICAgIHNlcmllcy5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgY2hhcnRUeXBlLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHNlcmllcy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIGNoYXJ0VHlwZS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG4gIG5ld0F4aXMobW9kZWw/OiBDdWJlQXhpc01vZGVsKTogYW55IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGl0bGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICBpZiAoIW1vZGVsIHx8IHRoaXMubW9kZWwuZHJhZnQpIHRpdGxlLnZhbHVlQ2hhbmdlcy5cclxuICAgICAgc3Vic2NyaWJlKHQgPT4gbmFtZS5zZXRWYWx1ZShwcm9ncmFtTmFtZSh0KSkpO1xyXG4gICAgZWxzZSBuYW1lLmRpc2FibGUoKTtcclxuICAgIHJldHVybiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBkZXNjZW5kZW50T2Y6IG1vZGVsPy5kZXNjZW5kZW50T2YsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6IG1vZGVsPy5zZWxlY3Rpb25Nb2RlLFxyXG4gICAgICBjb21iaW5hdGlvbjogbW9kZWw/LmNvbWJpbmF0aW9uLFxyXG4gICAgICBzZW5zaXRpdmU6IG1vZGVsPy5zZW5zaXRpdmUsXHJcbiAgICAgIGluZGV4YWJsZTogbW9kZWw/LmluZGV4YWJsZSAhPT0gZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5kYXRhVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgIH0pO1xyXG4gIH1cclxuICBuZXdJbmRleChtb2RlbD86IEN1YmVJbmRleE1vZGVsKTogYW55IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGl0bGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICBpZiAoIW1vZGVsIHx8IHRoaXMubW9kZWwuZHJhZnQpIHRpdGxlLnZhbHVlQ2hhbmdlcy5cclxuICAgICAgc3Vic2NyaWJlKHQgPT4gbmFtZS5zZXRWYWx1ZShwcm9ncmFtTmFtZSh0KSkpO1xyXG4gICAgZWxzZSBuYW1lLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIGFjY3VtdWxhdGU6IG1vZGVsPy5hY2N1bXVsYXRlLFxyXG4gICAgICBoaWRkZW46IG1vZGVsPy5oaWRkZW4sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmV3UGF0dGVybihtb2RlbD86IFBhdHRlcm5Nb2RlbCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBheGVzOiB0aGlzLl9mYi5ncm91cChtb2RlbD8uYXhlcyB8fCB7fSksXHJcbiAgICAgIHRpdGxlOiB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIGhpZGRlbjogbW9kZWw/LmhpZGRlbixcclxuICAgICAgcnVsZTogbW9kZWw/LnJ1bGUsXHJcbiAgICAgIHJvbGVzOiB0aGlzLl9mYi5jb250cm9sPHN0cmluZ1tdPihtb2RlbD8ucm9sZXMpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRhdGF0eXBlKG5hbWU6IHN0cmluZykgeyByZXR1cm4gdGhpcy50eXBlcy5maW5kKHQgPT4gdC5uYW1lID09IG5hbWUpPy50aXRsZTsgfVxyXG59XHJcbiIsIjxiaXpkb2MtZGVzaWduZXItZWxlbWVudCBbZm9ybV09XCJmb3JtXCIgKGNvbnRpbnVlKT1cImNvbXBsZXRlKClcIj5cclxuICA8IS0tIHdpZGdldCAtLT5cclxuICA8bmctdGVtcGxhdGUgYml6ZG9jQ29udGVudD5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cInN5bmMoKVwiIFtkaXNhYmxlZF09XCJtb2RlbC5kcmFmdCB8fCBzeW5jaW5nXCI+XHJcbiAgICAgICAgPHNwYW4+IHt7J1N5bmNocm9uaXplJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgICZuYnNwO1xyXG4gICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJzeW5jaW5nXCIgZGlhbWV0ZXI9XCIyMlwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGRpdiAqbmdJZj1cIm1vZGVsLmF4ZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7J0F4ZXMnfHRyYW5zbGF0ZX19PC9oMj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJtYXQtdGFibGVcIj5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbmdGb3I9XCJsZXQgYSBvZiBtb2RlbC5heGVzXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsXCI+e3thLnRpdGxlfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPnt7ZGF0YXR5cGUoYS5kYXRhVHlwZSl9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibW9kZWwuaW5kaWNlcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3snSW5kaWNlcyd8dHJhbnNsYXRlfX08L2gyPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cIm1hdC10YWJsZVwiPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICpuZ0Zvcj1cImxldCBhIG9mIG1vZGVsLmluZGljZXNcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj57e2EudGl0bGV9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8IS0tIGVkaXQgLS0+XHJcbiAgPG5nLXRlbXBsYXRlIGJpemRvY0VkaXRDb250ZW50PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXc7IGVsc2UgbWFpblwiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57e2NvbnRleHQudGl0bGV8dHJhbnNsYXRlfX08L2gyPlxyXG4gICAgICA8ZGl2IChkb2N1bWVudDprZXlkb3duLmVzY2FwZSk9XCJjbG9zZVZpZXcoJGV2ZW50KVwiICNlbGVtZW50IGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpZXc7IGNvbnRleHQ6IGNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWN0aW9uc1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VWaWV3KClcIiB0eXBlPVwiYnV0dG9uXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0JhY2snfHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5rZXlib2FyZF9yZXR1cm48L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvYml6ZG9jLWRlc2lnbmVyLWVsZW1lbnQ+XHJcbjwhLS0tLT5cclxuPG5nLXRlbXBsYXRlICNtYWluPlxyXG4gIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWxhYmVsPnt7J1NlY3VyaXR5TGV2ZWwnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICA8bWF0LXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInNjb3BlXCI+XHJcbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNvbG9yPVwid2FyblwiPnt7J0dsb2JhbCd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgIDxiciAvPlxyXG4gICAgICA8cD57eydTZWN1cml0eUdsb2JhbEhlbHAnfHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlBvc2l0aW9uc1wiPnt7J1Bvc2l0aW9ucyd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgIDxwPnt7J1NlY3VyaXR5UG9zaXRpb25zSGVscCd8dHJhbnNsYXRlfX08L3A+XHJcbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiUGF0dGVybnNcIj57eydQYXR0ZXJucyd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgIDxwPnt7J1NlY3VyaXR5UGF0dGVybnNIZWxwJ3x0cmFuc2xhdGV9fTwvcD5cclxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgPCEtLUF4ZXMtLT5cclxuICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7J0F4ZXMnfHRyYW5zbGF0ZX19PC9oMj5cclxuICAgIDx0YWJsZSBmb3JtQXJyYXlOYW1lPVwiYXhlc1wiIGNsYXNzPVwibWF0LXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgYXhlcylcIj5cclxuICAgICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJhXCIgY2RrRHJhZz5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAge3thLmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImVkaXQoYSwgJ0F4aXMnLCBheGlzZm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJheGVzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoYXhlcywgbmV3QXhpcygpLCAnQXhpcycsIGF4aXNmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwhLS1JbmRpY2VzLS0+XHJcbiAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eydJbmRpY2VzJ3x0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImluZGljZXNcIiBjbGFzcz1cIm1hdC10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGluZGljZXMpXCI+XHJcbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbmdGb3I9XCJsZXQgaSBvZiBpbmRpY2VzLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwiaVwiIGNka0RyYWc+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgIHt7aS5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KGksICdJbmRleCcsIGluZGV4Zm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmRpY2VzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoaW5kaWNlcywgbmV3SW5kZXgoKSwgJ0luZGV4JywgaW5kZXhmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImluZGljZXMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snQW5vbWFseU5vdGlmaWNhdGlvbid8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiYW5vbWFseVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTm9uZVwiPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9zaXRpb25zXCI+e3snUG9zaXRpb25zJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJlY2lwaWVudHNcIj57eydFdmVyeW9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8IS0tUGF0dGVybnMtLT5cclxuICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7J1BhdHRlcm5zJ3x0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImluZGljZXNcIiBjbGFzcz1cIm1hdC10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIHBhdHRlcm5zKVwiPlxyXG4gICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm5nRm9yPVwibGV0IHAgb2YgcGF0dGVybnMuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJwXCIgY2RrRHJhZz5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAge3twLmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImVkaXQocCwgJ1BhdHRlcm4nLCBwYXR0ZXJuZm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwYXR0ZXJucy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKHBhdHRlcm5zLCBuZXdQYXR0ZXJuKCksICdQYXR0ZXJuJywgcGF0dGVybmZvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPCEtLVZpZXdzLS0+XHJcbiAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eydWaWV3cyd8dHJhbnNsYXRlfX08L2gyPlxyXG4gICAgPHRhYmxlIGZvcm1BcnJheU5hbWU9XCJ2aWV3c1wiIGNsYXNzPVwibWF0LXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgdmlld3MpXCI+XHJcbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbmdGb3I9XCJsZXQgdiBvZiB2aWV3cy5jb250cm9sczsgaW5kZXggYXMgaW5kZXhcIiBbZm9ybUdyb3VwXT1cInZcIiBjZGtEcmFnPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbCBmbGV4XCI+XHJcbiAgICAgICAgICB7e3YuZ2V0KCd0aXRsZScpLnZhbHVlfX1cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdCh2LCAnVmlldycsIHZpZXdmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFZGl0J3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInZpZXdzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQodmlld3MsIG5ld1ZpZXcoKSwgJ1ZpZXcnLCB2aWV3Zm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInQWRkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2luZGV4Zm9ybSBsZXQtZm9ybT5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignVGl0bGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAmbmJzcDtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydOYW1lJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgnbmFtZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ05hbWUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48IS0tIHBhdHRlcm4tLT5cclxuPG5nLXRlbXBsYXRlICNwYXR0ZXJuZm9ybSBsZXQtZm9ybT5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignVGl0bGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8Yml6ZG9jLWRlc2lnbmVyLWN1YmUtZmlsdGVyIFtjdWJlXT1cIm1vZGVsXCIgW2Zvcm1dPVwiZm9ybS5nZXQoJ2F4ZXMnKVwiPjwvYml6ZG9jLWRlc2lnbmVyLWN1YmUtZmlsdGVyPlxyXG4gICAgPGJpemRvYy1kZXNpZ25lci1wcml2aWxlZ2VzIFtmb3JtXT1cImZvcm1cIj48L2JpemRvYy1kZXNpZ25lci1wcml2aWxlZ2VzPlxyXG4gIDwvZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSB2aWV3IC0tPlxyXG48bmctdGVtcGxhdGUgI3ZpZXdmb3JtIGxldC1mb3JtPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxiaXpkb2MtaWNvbi1waWNrZXIgZm9ybUNvbnRyb2xOYW1lPVwiaWNvblwiIHJlcXVpcmVkPjwvYml6ZG9jLWljb24tcGlja2VyPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1R5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNoYXJ0XCI+e3snQ2hhcnQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGl2b3RcIj57eydQaXZvdCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHcmlkXCI+e3snR3JpZCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcHJlYWRzaGVldFwiPnt7J1NwcmVhZHNoZWV0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydYQXhpcyd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwieEF4aXNcIiByZXF1aXJlZCBtdWx0aXBsZT5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzXCIgW3ZhbHVlXT1cImEuZ2V0KCduYW1lJykudmFsdWVcIj57e2EuZ2V0KCd0aXRsZScpLnZhbHVlIHx8IGEuZ2V0KCduYW1lJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3hBeGlzJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignWEF4aXMnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snU2VyaWVzJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzZXJpZXNcIiBtdWx0aXBsZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHNcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJhLmdldCgnbmFtZScpLnZhbHVlXCIgKm5nSWY9XCJmb3JtLmdldCgneEF4aXMnKS52YWx1ZT8uaW5kZXhPZihhLmdldCgnbmFtZScpLnZhbHVlKTwwXCI+e3thLmdldCgndGl0bGUnKS52YWx1ZXx8IGEuZ2V0KCduYW1lJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydJbmRpY2VzJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJpbmRpY2VzXCIgbXVsdGlwbGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaSBvZiBpbmRpY2VzLmNvbnRyb2xzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaS5nZXQoJ25hbWUnKS52YWx1ZVwiPnt7aS5nZXQoJ3RpdGxlJykudmFsdWV8fCBpLmdldCgnbmFtZScpLnZhbHVlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snQ2hhcnRUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjaGFydFR5cGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmb3JtLmdldCgndHlwZScpLnZhbHVlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQ2hhcnQnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY2N1bXVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBpZVwiPnt7J1BpZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJEb3VnaG51dFwiPnt7J0RvdWdobnV0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkhhbGZEb3VnaG51dFwiPnt7J0hhbGZEb3VnaG51dCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJGdW5uZWxcIj57eydGdW5uZWwnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUHlyYW1pZFwiPnt7J1B5cmFtaWQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCI+e3snU3RhY2tpbmdDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uMTAwXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiPnt7J1N0YWNraW5nQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhcjEwMFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIj57eydTdGFja2luZ0xpbmUxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiPnt7J1N0YWNraW5nQXJlYTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1Bpdm90J1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbj57eydOb25lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiPnt7J1N0YWNraW5nQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhcjEwMFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lXCI+e3snU3BsaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVBcmVhXCI+e3snU3BsaW5lQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQXJlYVwiPnt7J0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiPnt7J1N0YWNraW5nQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhMTAwXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtblwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiPnt7J1N0YWNraW5nQ29sdW1uMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiPnt7J1N0YWNraW5nU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZVwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0luZGljZXNDaGFydFR5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImluZGljZXNDaGFydFR5cGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmb3JtLmdldCgndHlwZScpLnZhbHVlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQ2hhcnQnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtblwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiPnt7J1N0YWNraW5nQ29sdW1uMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIj57eydTdGFja2luZ0JhcjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZVwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVcIj57eydTcGxpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZUFyZWFcIj57eydTcGxpbmVBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBcmVhXCI+e3snQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhXCI+e3snU3RhY2tpbmdBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWExMDBcIj57eydTdGFja2luZ0FyZWExMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNjYXR0ZXJcIj57eydTY2F0dGVyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQb2xhclwiPnt7J1BvbGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSYWRhclwiPnt7J1JhZGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwTGluZVwiPnt7J1N0ZXBMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwQXJlYVwiPnt7J1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ1N0ZXBBcmVhXCI+e3snU3RhY2tpbmdTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidQaXZvdCdcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIj57eydTdGFja2luZ0JhcjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiPnt7J1N0YWNraW5nQXJlYTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW5cIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIj57eydTdGFja2luZ0NvbHVtbjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmVcIj57eydTdGFja2luZ0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZTEwMFwiPnt7J1N0YWNraW5nTGluZTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxiaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXIgKm5nSWY9XCJjdWJlXCIgW2N1YmVdPVwiY3ViZVwiIFtmb3JtXT1cImZvcm0uZ2V0KCdmaWx0ZXJzJylcIj48L2JpemRvYy1kZXNpZ25lci1jdWJlLWZpbHRlcj5cclxuICA8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gQXhpcyAtLT5cclxuPG5nLXRlbXBsYXRlICNheGlzZm9ybSBsZXQtZm9ybT5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAmbmJzcDtcclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3snTmFtZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCduYW1lJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignTmFtZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snRGF0YVR5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImRhdGFUeXBlXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdCBvZiB0eXBlc1wiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJ0Lm5hbWVcIiBbdmFsdWVdPVwidC5uYW1lXCI+e3t0LnRpdGxlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ0RhdGFUeXBlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGRpdj48bWF0LWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cImNvbWJpbmF0aW9uXCI+e3snQ29tYmluYXRpb24nfX08L21hdC1jaGVja2JveD48L2Rpdj5cclxuICAgIDxkaXY+PG1hdC1jaGVja2JveCBmb3JtQ29udHJvbE5hbWU9XCJzZW5zaXRpdmVcIj57eydTZW5zaXRpdmUnfX08L21hdC1jaGVja2JveD48L2Rpdj5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTZWxlY3Rpb25Nb2RlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJOb25lXCI+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24+e3snU2luZ2xlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIk11bHRpcGxlXCI+e3snTXVsdGlwbGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2VhcmNoXCI+e3snU2VhcmNoJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBhdHRlcm5cIj57eydQYXR0ZXJuJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignRGF0YVR5cGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snRGVzY2VuZGVudE9mJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkZXNjZW5kZW50T2ZcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHNcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJhLmdldCgnbmFtZScpLnZhbHVlXCIgKm5nSWY9XCJhIT1mb3JtXCI+e3thLmdldCgndGl0bGUnKS52YWx1ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGRpdj48bWF0LWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cImluZGV4YWJsZVwiPnt7J0luZGV4YWJsZSd9fTwvbWF0LWNoZWNrYm94PjwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ViZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2NvbmZpZ3VyYXRpb24tZGVzaWduZXIvZWxlbWVudHMvY3ViZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2NvbmZpZ3VyYXRpb24tZGVzaWduZXIvZWxlbWVudHMvY3ViZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFnQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBNkQsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBQzdJLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNMUIsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDRCQUE0QjtJQWlDbkUsWUFBWSxFQUFlLEVBQ2pCLFFBQXVCLEVBQ3ZCLEdBQWtCLEVBQzFCLE9BQXdCLEVBQ0gsR0FBZ0I7UUFDckMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFKaEIsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFlO1FBbENuQixVQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMs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SyxFQUFFLE1BQU07U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFVBQVUsQ0FBQyxLQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzFELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtZQUNyQixJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7WUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFXLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFFBQVEsQ0FBQyxJQUFZLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Z0hBN01uRSxtQkFBbUIsaUlBcUNwQixXQUFXO29HQXJDVixtQkFBbUIsK0tDZGhDLHkydkJBc1pBOzJGRHhZYSxtQkFBbUI7a0JBSi9CLFNBQVM7OzswQkF5Q0wsTUFBTTsyQkFBQyxXQUFXOzRDQVBDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgeyBQcm9tcHRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvcHJvbXB0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFja2dyb3VuZEpvYkluZm8sIEN1YmVJbmZvLCBTeXN0ZW1TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3N5c3RlbS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlc2lnbmVyVHlwZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwiLi4vZGVzaWduZXIuYmFzZVwiO1xyXG5pbXBvcnQgeyBEZXNpZ25lclJlZiwgcHJvZ3JhbU5hbWUsIEVsZW1lbnRJbmZvLCBDdWJlQXhpc01vZGVsLCBDdWJlVmlld01vZGVsLCBDdWJlSW5kZXhNb2RlbCwgYXJyYXlPZiwgUGF0dGVybk1vZGVsIH0gZnJvbSBcIi4uL2RlY2xhcmF0aW9uc1wiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICdjdWJlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnY3ViZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdWJlRGVzaWduQ29tcG9uZW50IGV4dGVuZHMgRGVzaWduZXJUeXBlRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcmVhZG9ubHkgdmlld3MgPSB0aGlzLl9mYi5hcnJheShbXSk7XHJcbiAgcmVhZG9ubHkgYXhlcyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICByZWFkb25seSBpbmRpY2VzID0gdGhpcy5fZmIuYXJyYXkoW10pO1xyXG4gIHJlYWRvbmx5IHBhdHRlcm5zID0gdGhpcy5fZmIuYXJyYXkoW10pO1xyXG4gIHByaXZhdGUgX2N1YmVBeGVzVmFsaWRhdG9yID0gKF86IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsKSByZXR1cm47XHJcbiAgICBjb25zdCBheGVzID0gdGhpcy5tb2RlbC5heGVzLm1hcCh4ID0+IHgubmFtZSk7XHJcbiAgICBsZXQgaSA9IDAsIG4gPSB0aGlzLm1vZGVsLnZpZXdzLmxlbmd0aDtcclxuICAgIHdoaWxlIChpIDwgbikge1xyXG4gICAgICBsZXQgdmlldyA9IHRoaXMubW9kZWwudmlld3NbaV07XHJcbiAgICAgIGlmICh2aWV3LnhBeGlzICYmIHZpZXcueEF4aXMuc29tZSh4ID0+IGF4ZXMuaW5kZXhPZih4KSA8IDApKVxyXG4gICAgICAgIHJldHVybiB7IHhBeGlzOiBmYWxzZSB9O1xyXG4gICAgICBpZiAodmlldy5zZXJpZXMgJiYgdmlldy5zZXJpZXMuc29tZSh4ID0+IGF4ZXMuaW5kZXhPZih4KSA8IDApKVxyXG4gICAgICAgIHJldHVybiB7IHNlcmllczogZmFsc2UgfTtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgcmVhZG9ubHkgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgIHNjaGVkdWxlOiBudWxsLFxyXG4gICAgcGF0dGVybnM6IHRoaXMucGF0dGVybnMsXHJcbiAgICB2aWV3czogdGhpcy52aWV3cyxcclxuICAgIGF4ZXM6IHRoaXMuYXhlcyxcclxuICAgIGluZGljZXM6IHRoaXMuaW5kaWNlcyxcclxuICAgIHNjb3BlOiB0aGlzLl9mYi5jb250cm9sKG51bGwpLFxyXG4gICAgYW5vbWFseTogdGhpcy5fZmIuY29udHJvbCgnUG9zaXRpb25zJyksXHJcbiAgfSwgeyAvKnZhbGlkYXRvcnM6IHRoaXMuX2N1YmVBeGVzVmFsaWRhdG9yKi8gfSk7XHJcbiAgdXNhZ2U6IEN1YmVJbmZvO1xyXG4gIGpvYkluZm86IEJhY2tncm91bmRKb2JJbmZvO1xyXG4gIHN5bmNpbmcgPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdlbGVtZW50JykgZWxlbWVudDogRWxlbWVudFJlZjxhbnk+O1xyXG4gIHJlYWRvbmx5IHR5cGVzOiBFbGVtZW50SW5mb1tdO1xyXG4gIGFjY3VtdWxhdGl2ZTogYm9vbGVhbjtcclxuICBjb25zdHJ1Y3RvcihmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcHM6IFByb21wdFNlcnZpY2UsXHJcbiAgICBlbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXHJcbiAgICBASW5qZWN0KERlc2lnbmVyUmVmKSByZWY6IERlc2lnbmVyUmVmKSB7XHJcbiAgICBzdXBlcihmYiwgZWxlbWVudCwgcmVmKTtcclxuICAgIHRoaXMudHlwZXMgPSByZWYuZGVzaWduZXIudHlwZXMuZmlsdGVyKHQgPT4gIXQuZGlzYWJsZWQpO1xyXG4gIH1cclxuICBzeW5jKCkge1xyXG4gICAgdGhpcy5zeW5jaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuX3NlcnZpY2Uuc3luY2hyaW5pemUodGhpcy5tb2RlbC5uYW1lKS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgIHRoaXMuam9iSW5mbyA9IGU7XHJcbiAgICAgIHRoaXMuX3NjaGVkdWxlKGUubmV4dEV4ZWN1dGlvbik7XHJcbiAgICAgIHRoaXMuc3luY2luZyA9IGZhbHNlO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnN5bmNpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fcHMuZXJyb3IoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XHJcbiAgICAgIGNhc2UgJ3dpZGdldCc6XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5jdWJlKHRoaXMubW9kZWwubmFtZSkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgdGhpcy5qb2JJbmZvID0gci5qb2JJbmZvO1xyXG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGUoci5qb2JJbmZvPy5uZXh0RXhlY3V0aW9uKTtcclxuICAgICAgICAgIHRoaXMudXNhZ2UgPSByO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdlZGl0JzpcclxuICAgICAgICB0aGlzLl9idWlsZEZvcm0oKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NjaGVkdWxlKGRhdGU6IERhdGUpIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbXMgPSBkYXlqcyhkYXRlKS5kaWZmKCkudmFsdWVPZigpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgfSwgbXMgKyA2MDAwMDApO1xyXG4gICAgfVxyXG4gIHByaXZhdGUgX2J1aWxkRm9ybSgpIHtcclxuICAgIHRoaXMubW9kZWwuYXhlcy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICB0aGlzLmF4ZXMucHVzaCh0aGlzLm5ld0F4aXMoYSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb2RlbC5pbmRpY2VzPy5mb3JFYWNoKGkgPT5cclxuICAgICAgdGhpcy5pbmRpY2VzLnB1c2godGhpcy5uZXdJbmRleChpKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5tb2RlbC5wYXR0ZXJucz8uZm9yRWFjaChwID0+XHJcbiAgICAgIHRoaXMucGF0dGVybnMucHVzaCh0aGlzLm5ld1BhdHRlcm4ocCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMubW9kZWwudmlld3M/LmZvckVhY2godiA9PiB7XHJcbiAgICAgIHRoaXMudmlld3MucHVzaCh0aGlzLm5ld1ZpZXcodiksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBjb21wbGV0ZSgpIHtcclxuICAgIHRoaXMuX2J1aWxkRm9ybSgpO1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsLnByaXZpbGVnZXMpIHRoaXMubW9kZWwucHJpdmlsZWdlcyA9IHt9O1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcbiAgbmFtZU9mKGF4aXM6IHN0cmluZyB8IHN0cmluZ1tdKSB7IHJldHVybiB0aGlzLm1vZGVsLmF4ZXMuZmlsdGVyKGEgPT4gaXNBcnJheShheGlzKSA/IGF4aXMuaW5kZXhPZihhLm5hbWUpID4gLTEgOiBhLm5hbWUgPT09IGF4aXMpLmpvaW4oJywgJykgfVxyXG4gIHByaXZhdGUgbmV3Vmlldyhtb2RlbD86IEN1YmVWaWV3TW9kZWwpOiBhbnkge1xyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/Lm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICB0aXRsZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgeEF4aXMgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIGNoYXJ0VHlwZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LmNoYXJ0VHlwZSB8fCBudWxsKSxcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LmluZGljZXNDaGFydFR5cGUgfHwgbnVsbCksXHJcbiAgICAgIHNlcmllcyA9IHRoaXMuX2ZiLmNvbnRyb2woYXJyYXlPZihtb2RlbD8uc2VyaWVzKSksXHJcbiAgICAgIGluZGljZXMgPSB0aGlzLl9mYi5jb250cm9sKGFycmF5T2YobW9kZWw/LmluZGljZXMpKSxcclxuICAgICAgdHlwZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnR5cGUgfHwgJ0NoYXJ0Jyk7XHJcbiAgICBpZiAoIW1vZGVsIHx8IHRoaXMubW9kZWwuZHJhZnQpIHRpdGxlLnZhbHVlQ2hhbmdlcy5cclxuICAgICAgc3Vic2NyaWJlKHQgPT4gbmFtZS5zZXRWYWx1ZShwcm9ncmFtTmFtZSh0KSkpO1xyXG4gICAgeEF4aXMudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy54QXhpcykpLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgaWYgKHYgJiYgdi5sZW5ndGgpIHtcclxuICAgICAgICBzZXJpZXMuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBpZiAoc2VyaWVzLnZhbHVlKVxyXG4gICAgICAgICAgc2VyaWVzLnNldFZhbHVlKCh0aGlzLmF4ZXMudmFsdWUgYXMgQ3ViZUF4aXNNb2RlbFtdKS5cclxuICAgICAgICAgICAgZmlsdGVyKGEgPT4gdi5pbmRleE9mKGEubmFtZSkgPCAwICYmIHNlcmllcy52YWx1ZS5pbmRleE9mKGEubmFtZSkgPiAtMSkuXHJcbiAgICAgICAgICAgIG1hcChhID0+IGEubmFtZSlcclxuICAgICAgICAgICAgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcmllcy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgc2VyaWVzLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChtb2RlbD8uc2VyaWVzKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICB0aGlzLmFjY3VtdWxhdGl2ZSA9ICF2IHx8IHYubGVuZ3RoID09PSAwO1xyXG4gICAgICBpZiAodGhpcy5hY2N1bXVsYXRpdmUgfHwgIXRoaXMuaW5kaWNlcy5sZW5ndGgpIHtcclxuICAgICAgICBpbmRpY2VzLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGluZGljZXNDaGFydFR5cGUuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaW5kaWNlcy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIGluZGljZXNDaGFydFR5cGUuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpbmRpY2VzLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChtb2RlbD8uaW5kaWNlcykpLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgaWYgKHYgJiYgdi5sZW5ndGgpXHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIGljb246IG1vZGVsPy5pY29uIHx8ICdpbnNpZ2h0cycsXHJcbiAgICAgIHhBeGlzLFxyXG4gICAgICBzZXJpZXMsXHJcbiAgICAgIGluZGljZXMsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIGNoYXJ0VHlwZSxcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZSxcclxuICAgICAgZmlsdGVyczogdGhpcy5fZmIuZ3JvdXAoe30pLFxyXG4gICAgICBwcml2aWxlZ2VzOiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgICAgcnVsZTogbnVsbCxcclxuICAgICAgICByb2xlczogdGhpcy5fZmIuY29udHJvbDxzdHJpbmdbXT4obnVsbCksXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy50eXBlKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHYpIHtcclxuICAgICAgICBjYXNlICdTcHJlYWRzaGVldCc6XHJcbiAgICAgICAgY2FzZSAnR3JpZCc6XHJcbiAgICAgICAgICBzZXJpZXMuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIGNoYXJ0VHlwZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBzZXJpZXMuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICBjaGFydFR5cGUuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuICBuZXdBeGlzKG1vZGVsPzogQ3ViZUF4aXNNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8ubmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRpdGxlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgaWYgKCFtb2RlbCB8fCB0aGlzLm1vZGVsLmRyYWZ0KSB0aXRsZS52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHN1YnNjcmliZSh0ID0+IG5hbWUuc2V0VmFsdWUocHJvZ3JhbU5hbWUodCkpKTtcclxuICAgIGVsc2UgbmFtZS5kaXNhYmxlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgZGVzY2VuZGVudE9mOiBtb2RlbD8uZGVzY2VuZGVudE9mLFxyXG4gICAgICBzZWxlY3Rpb25Nb2RlOiBtb2RlbD8uc2VsZWN0aW9uTW9kZSxcclxuICAgICAgY29tYmluYXRpb246IG1vZGVsPy5jb21iaW5hdGlvbixcclxuICAgICAgc2Vuc2l0aXZlOiBtb2RlbD8uc2Vuc2l0aXZlLFxyXG4gICAgICBpbmRleGFibGU6IG1vZGVsPy5pbmRleGFibGUgIT09IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogdGhpcy5fZmIuY29udHJvbChtb2RlbD8uZGF0YVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmV3SW5kZXgobW9kZWw/OiBDdWJlSW5kZXhNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8ubmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRpdGxlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgaWYgKCFtb2RlbCB8fCB0aGlzLm1vZGVsLmRyYWZ0KSB0aXRsZS52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHN1YnNjcmliZSh0ID0+IG5hbWUuc2V0VmFsdWUocHJvZ3JhbU5hbWUodCkpKTtcclxuICAgIGVsc2UgbmFtZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHJldHVybiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBhY2N1bXVsYXRlOiBtb2RlbD8uYWNjdW11bGF0ZSxcclxuICAgICAgaGlkZGVuOiBtb2RlbD8uaGlkZGVuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5ld1BhdHRlcm4obW9kZWw/OiBQYXR0ZXJuTW9kZWwpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgYXhlczogdGhpcy5fZmIuZ3JvdXAobW9kZWw/LmF4ZXMgfHwge30pLFxyXG4gICAgICB0aXRsZTogdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICBoaWRkZW46IG1vZGVsPy5oaWRkZW4sXHJcbiAgICAgIHJ1bGU6IG1vZGVsPy5ydWxlLFxyXG4gICAgICByb2xlczogdGhpcy5fZmIuY29udHJvbDxzdHJpbmdbXT4obW9kZWw/LnJvbGVzKSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBkYXRhdHlwZShuYW1lOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMudHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PSBuYW1lKT8udGl0bGU7IH1cclxufVxyXG4iLCI8Yml6ZG9jLWRlc2lnbmVyLWVsZW1lbnQgW2Zvcm1dPVwiZm9ybVwiIFtwcml2aWxlZ2VzXT1cInRydWVcIiAoY29udGludWUpPVwiY29tcGxldGUoKVwiPlxyXG4gIDwhLS0gd2lkZ2V0IC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSBiaXpkb2NDb250ZW50PlxyXG4gICAgPGRsICpuZ0lmPVwiam9iSW5mb1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiam9iSW5mby5sYXN0RXhlY3V0aW9uXCI+XHJcbiAgICAgICAgPGR0Pnt7J0xhc3RFeGVjdXRpb24nfHRyYW5zbGF0ZX19PC9kdD5cclxuICAgICAgICA8ZGQ+e3tqb2JJbmZvLmxhc3RFeGVjdXRpb258YW1UaW1lQWdvfX08L2RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImpvYkluZm8ubmV4dEV4ZWN1dGlvblwiPlxyXG4gICAgICAgIDxkdD57eydOZXh0RXhlY3V0aW9uJ3x0cmFuc2xhdGV9fTwvZHQ+XHJcbiAgICAgICAgPGRkPnt7am9iSW5mby5uZXh0RXhlY3V0aW9ufGFtVGltZUFnb319PC9kZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJqb2JJbmZvLmxhc3RKb2JTdGF0ZVwiPlxyXG4gICAgICAgIDxkdD57eydMYXN0Sm9iU3RhdGUnfHRyYW5zbGF0ZX19PC9kdD5cclxuICAgICAgICA8ZGQ+XHJcbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJqb2JJbmZvLmVycm9yXCIgW2JpemRvY1Rvb2x0aXBdPVwiam9iSW5mby5lcnJvclwiPnJlcG9ydDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImpvYi1zdGF0ZVwiPnt7am9iSW5mby5sYXN0Sm9iU3RhdGV8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kbD5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJzeW5jKClcIiBbZGlzYWJsZWRdPVwibW9kZWwuZHJhZnQgfHwgc3luY2luZ1wiPlxyXG4gICAgICAgIDxzcGFuPiB7eydTeW5jaHJvbml6ZSd8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAmbmJzcDtcclxuICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwic3luY2luZ1wiIGRpYW1ldGVyPVwiMjJcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJtb2RlbC5heGVzPy5sZW5ndGhcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eydBeGVzJ3x0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwibWF0LXRhYmxlXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm5nRm9yPVwibGV0IGEgb2YgbW9kZWwuYXhlc1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPnt7YS50aXRsZX19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj57e2RhdGF0eXBlKGEuZGF0YVR5cGUpfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLTxkaXYgKm5nSWY9XCJtb2RlbC5pbmRpY2VzPy5sZW5ndGhcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eydJbmRpY2VzJ3x0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwibWF0LXRhYmxlXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm5nRm9yPVwibGV0IGEgb2YgbW9kZWwuaW5kaWNlc1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPnt7YS50aXRsZX19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+LS0+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDwhLS0gZWRpdCAtLT5cclxuICA8bmctdGVtcGxhdGUgYml6ZG9jRWRpdENvbnRlbnQ+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlldzsgZWxzZSBtYWluXCI+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7Y29udGV4dC50aXRsZXx0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICAgIDxkaXYgKGRvY3VtZW50OmtleWRvd24uZXNjYXBlKT1cImNsb3NlVmlldygkZXZlbnQpXCIgI2VsZW1lbnQgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlldzsgY29udGV4dDogY29udGV4dFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhY3Rpb25zXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjbG9zZVZpZXcoKVwiIHR5cGU9XCJidXR0b25cIiBbYml6ZG9jVG9vbHRpcF09XCInQmFjayd8dHJhbnNsYXRlXCI+PG1hdC1pY29uPmtleWJvYXJkX3JldHVybjwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9iaXpkb2MtZGVzaWduZXItZWxlbWVudD5cclxuPCEtLS0tPlxyXG48bmctdGVtcGxhdGUgI21haW4+XHJcbiAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxtYXQtbGFiZWw+e3snU2VjdXJpdHlMZXZlbCd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgIDxtYXQtcmFkaW8tZ3JvdXAgZm9ybUNvbnRyb2xOYW1lPVwic2NvcGVcIj5cclxuICAgICAgPG1hdC1yYWRpby1idXR0b24gY29sb3I9XCJ3YXJuXCI+e3snR2xvYmFsJ3x0cmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgPGJyIC8+XHJcbiAgICAgIDxwPnt7J1NlY3VyaXR5R2xvYmFsSGVscCd8dHJhbnNsYXRlfX08L3A+XHJcbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiUG9zaXRpb25zXCI+e3snUG9zaXRpb25zJ3x0cmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgPHA+e3snU2VjdXJpdHlQb3NpdGlvbnNIZWxwJ3x0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJQYXR0ZXJuc1wiPnt7J1BhdHRlcm5zJ3x0cmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgPHA+e3snU2VjdXJpdHlQYXR0ZXJuc0hlbHAnfHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICA8IS0tQXhlcy0tPlxyXG4gICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlIHJvd1wiPlxyXG4gICAgICB7eydBeGVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoYXhlcywgbmV3QXhpcygpLCAnQXhpcycsIGF4aXNmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImF4ZXNcIiBjbGFzcz1cIm1hdC10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGF4ZXMpXCI+XHJcbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwiYVwiIGNka0RyYWc+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgIHt7YS5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KGEsICdBeGlzJywgYXhpc2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYXhlcy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8IS0tSW5kaWNlcy0tPlxyXG4gICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlIHJvd1wiPlxyXG4gICAgICB7eydJbmRpY2VzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoaW5kaWNlcywgbmV3SW5kZXgoKSwgJ0luZGV4JywgaW5kZXhmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImluZGljZXNcIiBjbGFzcz1cIm1hdC10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGluZGljZXMpXCI+XHJcbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbmdGb3I9XCJsZXQgaSBvZiBpbmRpY2VzLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwiaVwiIGNka0RyYWc+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgIHt7aS5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KGksICdJbmRleCcsIGluZGV4Zm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmRpY2VzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImluZGljZXMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snQW5vbWFseU5vdGlmaWNhdGlvbid8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiYW5vbWFseVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTm9uZVwiPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9zaXRpb25zXCI+e3snUG9zaXRpb25zJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJlY2lwaWVudHNcIj57eydFdmVyeW9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8IS0tUGF0dGVybnMtLT5cclxuICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZSByb3dcIj5cclxuICAgICAge3snUGF0dGVybnMnfHRyYW5zbGF0ZX19XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZChwYXR0ZXJucywgbmV3UGF0dGVybigpLCAnUGF0dGVybicsIHBhdHRlcm5mb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImluZGljZXNcIiBjbGFzcz1cIm1hdC10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIHBhdHRlcm5zKVwiPlxyXG4gICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm5nRm9yPVwibGV0IHAgb2YgcGF0dGVybnMuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJwXCIgY2RrRHJhZz5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAge3twLmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImVkaXQocCwgJ1BhdHRlcm4nLCBwYXR0ZXJuZm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwYXR0ZXJucy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8IS0tVmlld3MtLT5cclxuICAgIDxoMiBjbGFzcz1cInJvdyBtYXQtdGl0bGVcIj5cclxuICAgICAge3snVmlld3MnfHRyYW5zbGF0ZX19XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZCh2aWV3cywgbmV3VmlldygpLCAnVmlldycsIHZpZXdmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDwvaDI+XHJcbiAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cInZpZXdzXCIgY2xhc3M9XCJtYXQtdGFibGVcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50LCB2aWV3cylcIj5cclxuICAgICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICpuZ0Zvcj1cImxldCB2IG9mIHZpZXdzLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwidlwiIGNka0RyYWc+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgIHt7di5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KHYsICdWaWV3Jywgdmlld2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidmlld3MucmVtb3ZlQXQoaW5kZXgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1JlbW92ZSd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1NjaGVkdWxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8Yml6ZG9jLXRpbWVzcGFuLWlucHV0IGZvcm1Db250cm9sTmFtZT1cInNjaGVkdWxlXCI+PC9iaXpkb2MtdGltZXNwYW4taW5wdXQ+XHJcbiAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+dGltZXI8L21hdC1pY29uPlxyXG4gICAgICA8bWF0LWhpbnQ+PC9tYXQtaGludD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48IS0tLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaW5kZXhmb3JtIGxldC1mb3JtPlxyXG4gIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICZuYnNwO1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J05hbWUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCduYW1lJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignTmFtZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gcGF0dGVybi0tPlxyXG48bmctdGVtcGxhdGUgI3BhdHRlcm5mb3JtIGxldC1mb3JtPlxyXG4gIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxiaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXIgW2N1YmVdPVwibW9kZWxcIiBbZm9ybV09XCJmb3JtLmdldCgnYXhlcycpXCI+PC9iaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXI+XHJcbiAgICA8Yml6ZG9jLWRlc2lnbmVyLXByaXZpbGVnZXMgW2Zvcm1dPVwiZm9ybVwiPjwvYml6ZG9jLWRlc2lnbmVyLXByaXZpbGVnZXM+XHJcbiAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48IS0tIHZpZXcgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjdmlld2Zvcm0gbGV0LWZvcm0+XHJcbiAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGJpemRvYy1pY29uLXBpY2tlciBmb3JtQ29udHJvbE5hbWU9XCJpY29uXCIgcmVxdWlyZWQ+PC9iaXpkb2MtaWNvbi1waWNrZXI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ2hhcnRcIj57eydDaGFydCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQaXZvdFwiPnt7J1Bpdm90J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkdyaWRcIj57eydHcmlkJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwcmVhZHNoZWV0XCI+e3snU3ByZWFkc2hlZXQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1hBeGlzJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ4QXhpc1wiIHJlcXVpcmVkIG11bHRpcGxlPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHNcIiBbdmFsdWVdPVwiYS5nZXQoJ25hbWUnKS52YWx1ZVwiPnt7YS5nZXQoJ3RpdGxlJykudmFsdWUgfHwgYS5nZXQoJ25hbWUnKS52YWx1ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgneEF4aXMnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdYQXhpcyd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTZXJpZXMnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInNlcmllc1wiIG11bHRpcGxlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGEgb2YgYXhlcy5jb250cm9sc1wiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImEuZ2V0KCduYW1lJykudmFsdWVcIiAqbmdJZj1cImZvcm0uZ2V0KCd4QXhpcycpLnZhbHVlPy5pbmRleE9mKGEuZ2V0KCduYW1lJykudmFsdWUpPDBcIj57e2EuZ2V0KCd0aXRsZScpLnZhbHVlfHwgYS5nZXQoJ25hbWUnKS52YWx1ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0luZGljZXMnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImluZGljZXNcIiBtdWx0aXBsZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpIG9mIGluZGljZXMuY29udHJvbHNcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpLmdldCgnbmFtZScpLnZhbHVlXCI+e3tpLmdldCgndGl0bGUnKS52YWx1ZXx8IGkuZ2V0KCduYW1lJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydDaGFydFR5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNoYXJ0VHlwZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZvcm0uZ2V0KCd0eXBlJykudmFsdWVcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidDaGFydCdcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjY3VtdWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGllXCI+e3snUGllJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkRvdWdobnV0XCI+e3snRG91Z2hudXQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiSGFsZkRvdWdobnV0XCI+e3snSGFsZkRvdWdobnV0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkZ1bm5lbFwiPnt7J0Z1bm5lbCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQeXJhbWlkXCI+e3snUHlyYW1pZCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNvbHVtblwiPnt7J0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW5cIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIj57eydTdGFja2luZ0NvbHVtbjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQmFyXCI+e3snQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCdWJibGVcIj57eydCdWJibGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyXCI+e3snU3RhY2tpbmdCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyMTAwXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxpbmVcIj57eydMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmVcIj57eydTdGFja2luZ0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZTEwMFwiPnt7J1N0YWNraW5nTGluZTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lXCI+e3snU3BsaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVBcmVhXCI+e3snU3BsaW5lQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQXJlYVwiPnt7J0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiPnt7J1N0YWNraW5nQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhMTAwXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiPnt7J1N0YWNraW5nU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInUGl2b3QnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNvbHVtblwiPnt7J0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQmFyXCI+e3snQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCdWJibGVcIj57eydCdWJibGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyXCI+e3snU3RhY2tpbmdCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyMTAwXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxpbmVcIj57eydMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVcIj57eydTcGxpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZUFyZWFcIj57eydTcGxpbmVBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBcmVhXCI+e3snQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhXCI+e3snU3RhY2tpbmdBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWExMDBcIj57eydTdGFja2luZ0FyZWExMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCI+e3snU3RhY2tpbmdDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uMTAwXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNjYXR0ZXJcIj57eydTY2F0dGVyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQb2xhclwiPnt7J1BvbGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSYWRhclwiPnt7J1JhZGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwTGluZVwiPnt7J1N0ZXBMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwQXJlYVwiPnt7J1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ1N0ZXBBcmVhXCI+e3snU3RhY2tpbmdTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIj57eydTdGFja2luZ0xpbmUxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snSW5kaWNlc0NoYXJ0VHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaW5kaWNlc0NoYXJ0VHlwZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZvcm0uZ2V0KCd0eXBlJykudmFsdWVcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidDaGFydCdcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCI+e3snU3RhY2tpbmdDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uMTAwXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiPnt7J1N0YWNraW5nQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhcjEwMFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIj57eydTdGFja2luZ0xpbmUxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiPnt7J1N0YWNraW5nQXJlYTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1Bpdm90J1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbj57eydOb25lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiPnt7J1N0YWNraW5nQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhcjEwMFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lXCI+e3snU3BsaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVBcmVhXCI+e3snU3BsaW5lQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQXJlYVwiPnt7J0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiPnt7J1N0YWNraW5nQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhMTAwXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtblwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiPnt7J1N0YWNraW5nQ29sdW1uMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiPnt7J1N0YWNraW5nU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZVwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGJpemRvYy1kZXNpZ25lci1jdWJlLWZpbHRlciAqbmdJZj1cImN1YmVcIiBbY3ViZV09XCJjdWJlXCIgW2Zvcm1dPVwiZm9ybS5nZXQoJ2ZpbHRlcnMnKVwiPjwvYml6ZG9jLWRlc2lnbmVyLWN1YmUtZmlsdGVyPlxyXG4gIDwvZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBBeGlzIC0tPlxyXG48bmctdGVtcGxhdGUgI2F4aXNmb3JtIGxldC1mb3JtPlxyXG4gIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICZuYnNwO1xyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydOYW1lJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ25hbWUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdOYW1lJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydEYXRhVHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0IG9mIHR5cGVzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cInQubmFtZVwiIFt2YWx1ZV09XCJ0Lm5hbWVcIj57e3QudGl0bGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignRGF0YVR5cGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8ZGl2PjxtYXQtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwiY29tYmluYXRpb25cIj57eydDb21iaW5hdGlvbid9fTwvbWF0LWNoZWNrYm94PjwvZGl2PlxyXG4gICAgPGRpdj48bWF0LWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cInNlbnNpdGl2ZVwiPnt7J1NlbnNpdGl2ZSd9fTwvbWF0LWNoZWNrYm94PjwvZGl2PlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1NlbGVjdGlvbk1vZGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIk5vbmVcIj57eydOb25lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbj57eydTaW5nbGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTXVsdGlwbGVcIj57eydNdWx0aXBsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTZWFyY2hcIj57eydTZWFyY2gnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGF0dGVyblwiPnt7J1BhdHRlcm4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdEYXRhVHlwZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydEZXNjZW5kZW50T2YnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImRlc2NlbmRlbnRPZlwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGEgb2YgYXhlcy5jb250cm9sc1wiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImEuZ2V0KCduYW1lJykudmFsdWVcIiAqbmdJZj1cImEhPWZvcm1cIj57e2EuZ2V0KCd0aXRsZScpLnZhbHVlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8ZGl2PjxtYXQtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwiaW5kZXhhYmxlXCI+e3snSW5kZXhhYmxlJ319PC9tYXQtY2hlY2tib3g+PC9kaXY+XHJcbiAgPC9mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=