@pega/angular-sdk-components 24.2.10 → 25.1.10
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.
- package/fesm2022/pega-angular-sdk-components.mjs +5383 -3962
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
- package/lib/_bridge/angular-pconnect.d.ts +1 -1
- package/lib/_bridge/component-mapper/component-mapper.component.d.ts +1 -1
- package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +18 -0
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +1 -0
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +1 -0
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +14 -38
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +7 -6
- package/lib/_components/field/check-box/check-box.component.d.ts +10 -33
- package/lib/_components/field/currency/currency.component.d.ts +19 -35
- package/lib/_components/field/date/date.component.d.ts +7 -58
- package/lib/_components/field/date-time/date-time.component.d.ts +12 -40
- package/lib/_components/field/decimal/decimal.component.d.ts +17 -32
- package/lib/_components/field/dropdown/dropdown.component.d.ts +14 -38
- package/lib/_components/field/email/email.component.d.ts +7 -35
- package/lib/_components/field/field.base.d.ts +57 -0
- package/lib/_components/field/group/group.component.d.ts +5 -3
- package/lib/_components/field/integer/integer.component.d.ts +8 -35
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
- package/lib/_components/field/location/location.component.d.ts +47 -0
- package/lib/_components/field/multiselect/multiselect.component.d.ts +7 -39
- package/lib/_components/field/object-reference/object-reference.component.d.ts +45 -0
- package/lib/_components/field/percentage/percentage.component.d.ts +19 -37
- package/lib/_components/field/phone/phone.component.d.ts +8 -38
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +13 -34
- package/lib/_components/field/rich-text/rich-text.component.d.ts +7 -31
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +6 -22
- package/lib/_components/field/selectable-card/selectable-card.component.d.ts +62 -0
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +21 -1
- package/lib/_components/field/text/text.component.d.ts +0 -1
- package/lib/_components/field/text-area/text-area.component.d.ts +7 -35
- package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
- package/lib/_components/field/text-input/text-input.component.d.ts +7 -36
- package/lib/_components/field/time/time.component.d.ts +7 -36
- package/lib/_components/field/url/url.component.d.ts +7 -36
- package/lib/_components/field/user-reference/user-reference.component.d.ts +1 -2
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +1 -2
- package/lib/_components/infra/Containers/flow-container/helpers.d.ts +1 -0
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +5 -10
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
- package/lib/_components/infra/assignment/assignment.component.d.ts +8 -6
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +3 -3
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +7 -7
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
- package/lib/_components/infra/navbar/navbar.component.d.ts +0 -2
- package/lib/_components/infra/reference/reference.component.d.ts +23 -3
- package/lib/_components/infra/region/region.component.d.ts +0 -1
- package/lib/_components/infra/root-container/root-container.component.d.ts +3 -2
- package/lib/_components/infra/stages/stages.component.d.ts +2 -2
- package/lib/_components/infra/view/view.component.d.ts +0 -1
- package/lib/_components/template/advanced-search/advanced-search.component.d.ts +21 -0
- package/lib/_components/template/advanced-search/search-group/persist-utils.d.ts +23 -0
- package/lib/_components/template/advanced-search/search-groups/search-groups.component.d.ts +47 -0
- package/lib/_components/template/advanced-search/search-groups/utils.d.ts +15 -0
- package/lib/_components/template/app-shell/app-shell.component.d.ts +6 -3
- package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
- package/lib/_components/template/base/details-template-base.d.ts +1 -2
- package/lib/_components/template/base/form-template-base.d.ts +3 -1
- package/lib/_components/template/case-summary/case-summary.component.d.ts +3 -3
- package/lib/_components/template/case-view/case-view.component.d.ts +0 -2
- package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
- package/lib/_components/template/data-reference/data-reference.component.d.ts +27 -3
- package/lib/_components/template/data-reference/search-form/search-form.component.d.ts +39 -0
- package/lib/_components/template/data-reference/search-form/tabsData.d.ts +2 -0
- package/lib/_components/template/data-reference/utils.d.ts +14 -0
- package/lib/_components/template/default-form/default-form.component.d.ts +9 -4
- package/lib/_components/template/default-page/default-page.component.d.ts +29 -0
- package/lib/_components/template/details/details.component.d.ts +0 -1
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +0 -1
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +0 -1
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +0 -1
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +0 -1
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +0 -1
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +0 -1
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +0 -1
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +9 -8
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
- package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
- package/lib/_components/template/list-view/list-view.component.d.ts +22 -7
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
- package/lib/_components/template/object-page/object-page.component.d.ts +8 -0
- package/lib/_components/template/one-column/one-column.component.d.ts +0 -1
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
- package/lib/_components/template/page/page.component.d.ts +0 -1
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
- package/lib/_components/template/self-service-case-view/self-service-case-view.component.d.ts +58 -0
- package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
- package/lib/_components/template/simple-table-manual/helpers.d.ts +18 -3
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +9 -4
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +18 -3
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
- package/lib/_components/template/three-column/three-column.component.d.ts +0 -1
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column/two-column.component.d.ts +0 -1
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
- package/lib/_components/template/utils.d.ts +11 -0
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +0 -1
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +0 -1
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -6
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
- package/lib/_components/widget/attachment/Attachment.types.d.ts +87 -0
- package/lib/_components/widget/attachment/AttachmentUtils.d.ts +17 -0
- package/lib/_components/widget/attachment/attachment.component.d.ts +18 -34
- package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -3
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +3 -2
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
- package/lib/_components/widget/todo/todo.component.d.ts +5 -4
- package/lib/_components/widget/utility/utility.component.d.ts +0 -1
- package/lib/_helpers/field-group-utils.d.ts +1 -3
- package/lib/_helpers/filter-utils.d.ts +1 -3
- package/lib/_helpers/formatters/boolean.d.ts +1 -2
- package/lib/_helpers/formatters/common.d.ts +1 -1
- package/lib/_helpers/formatters/currency.d.ts +1 -2
- package/lib/_helpers/formatters/date.d.ts +1 -2
- package/lib/_helpers/formatters/index.d.ts +1 -2
- package/lib/_helpers/object-utils.d.ts +8 -0
- package/lib/_helpers/objectReference-utils.d.ts +6 -0
- package/lib/_helpers/semanticLink-utils.d.ts +9 -0
- package/lib/_helpers/tab-utils.d.ts +4 -0
- package/lib/_helpers/utils.d.ts +13 -1
- package/lib/_services/banner.service.d.ts +8 -0
- package/lib/_services/case.service.d.ts +1 -1
- package/lib/_services/data-reference-advanced-search.service.d.ts +9 -0
- package/lib/_services/datapage.service.d.ts +1 -1
- package/lib/_services/google-maps-loader.service.d.ts +7 -0
- package/package.json +20 -6
- package/public-api.d.ts +26 -9
- package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -107
- package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
- package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -83
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -34
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -143
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -288
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -225
- package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -190
- package/esm2022/lib/_components/field/date/date.component.mjs +0 -205
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -183
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -187
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -292
- package/esm2022/lib/_components/field/email/email.component.mjs +0 -157
- package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
- package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -160
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -44
- package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -314
- package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -182
- package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -160
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -182
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -102
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -95
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
- package/esm2022/lib/_components/field/text/text.component.mjs +0 -140
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -157
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -157
- package/esm2022/lib/_components/field/time/time.component.mjs +0 -162
- package/esm2022/lib/_components/field/url/url.component.mjs +0 -157
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -207
- package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
- package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -490
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -342
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
- package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +0 -22
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -211
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -382
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -141
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -133
- package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -228
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
- package/esm2022/lib/_components/infra/view/view.component.mjs +0 -188
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -156
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
- package/esm2022/lib/_components/template/base/details-template-base.mjs +0 -56
- package/esm2022/lib/_components/template/base/form-template-base.mjs +0 -13
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -185
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -242
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -49
- package/esm2022/lib/_components/template/details/details.component.mjs +0 -76
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -45
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -42
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -39
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -51
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -48
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -48
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -65
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -122
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1217
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
- package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -270
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -779
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -31
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/utils.mjs +0 -22
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -31
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -393
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -228
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
- package/esm2022/lib/_helpers/case-utils.mjs +0 -71
- package/esm2022/lib/_helpers/common.mjs +0 -20
- package/esm2022/lib/_helpers/createstage-utils.mjs +0 -15
- package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
- package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
- package/esm2022/lib/_helpers/event-util.mjs +0 -18
- package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
- package/esm2022/lib/_helpers/filter-utils.mjs +0 -105
- package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
- package/esm2022/lib/_helpers/formatters/common.mjs +0 -14
- package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
- package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
- package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -68
- package/esm2022/lib/_helpers/formatters/index.mjs +0 -124
- package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
- package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
- package/esm2022/lib/_helpers/template-utils.mjs +0 -56
- package/esm2022/lib/_helpers/utils.mjs +0 -386
- package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
- package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
- package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
- package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
- package/esm2022/lib/_services/case.service.mjs +0 -32
- package/esm2022/lib/_services/datapage.service.mjs +0 -52
- package/esm2022/lib/_services/endpoints.mjs +0 -60
- package/esm2022/lib/_services/server-config.service.mjs +0 -52
- package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
- package/esm2022/pega-angular-sdk-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -141
- package/esm2022/sdk-local-component-map.mjs +0 -9
|
@@ -1,662 +0,0 @@
|
|
|
1
|
-
import { getDefaultViewMeta } from './DefaultViewMeta';
|
|
2
|
-
const USER_REFERENCE = 'UserReference';
|
|
3
|
-
const PAGE = '!P!';
|
|
4
|
-
const PAGELIST = '!PL!';
|
|
5
|
-
export const formatConstants = {
|
|
6
|
-
WorkStatus: 'WorkStatus',
|
|
7
|
-
Integer: 'Integer',
|
|
8
|
-
WorkLink: 'WorkLink'
|
|
9
|
-
};
|
|
10
|
-
class DataApi {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.originalPropertyToMappedProperty = {};
|
|
13
|
-
this.mappedPropertyToOriginalProperty = {};
|
|
14
|
-
this.setPropertyMaps = this.setPropertyMaps.bind(this);
|
|
15
|
-
this.getMappedProperty = this.getMappedProperty.bind(this);
|
|
16
|
-
this.getOriginalProperty = this.getOriginalProperty.bind(this);
|
|
17
|
-
}
|
|
18
|
-
setPropertyMaps(originalToMappedPropertyObj = {}, mappedToOriginalPropertyObj = {}) {
|
|
19
|
-
this.originalPropertyToMappedProperty = {
|
|
20
|
-
...this.originalPropertyToMappedProperty,
|
|
21
|
-
...originalToMappedPropertyObj
|
|
22
|
-
};
|
|
23
|
-
this.mappedPropertyToOriginalProperty = {
|
|
24
|
-
...this.mappedPropertyToOriginalProperty,
|
|
25
|
-
...mappedToOriginalPropertyObj
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
getMappedProperty(propertyName) {
|
|
29
|
-
return this.originalPropertyToMappedProperty[propertyName] ?? propertyName;
|
|
30
|
-
}
|
|
31
|
-
getOriginalProperty(propertyName) {
|
|
32
|
-
return this.mappedPropertyToOriginalProperty[propertyName] ?? propertyName;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export async function getContext(componentConfig) {
|
|
36
|
-
const { promisesArray = [] // array of promises which can be invoked paralelly,
|
|
37
|
-
} = componentConfig;
|
|
38
|
-
const promisesResponseArray = await Promise.all(promisesArray);
|
|
39
|
-
const dataApi = new DataApi();
|
|
40
|
-
return {
|
|
41
|
-
promisesResponseArray,
|
|
42
|
-
setPropertyMaps: dataApi.setPropertyMaps,
|
|
43
|
-
getMappedProperty: dataApi.getMappedProperty,
|
|
44
|
-
getOriginalProperty: dataApi.getOriginalProperty
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* [getFieldNameFromEmbeddedFieldName]
|
|
49
|
-
* Description - converting embeddedField name starting with !P! or !PL! to normal field
|
|
50
|
-
* @ignore
|
|
51
|
-
* @param {string} propertyName EmbeddedField name starting with !P! or !PL!
|
|
52
|
-
* @returns {string} returns converted string without !P! or !PL! and :
|
|
53
|
-
*
|
|
54
|
-
* @example <caption>Example for getFieldNameFromEmbeddedFieldName </caption>
|
|
55
|
-
* getFieldNameFromEmbeddedFieldName('!P!Organisation:Name') return 'Organisation.Name'
|
|
56
|
-
* getFieldNameFromEmbeddedFieldName('!PL!Employees:Name') return 'Employees.Name'
|
|
57
|
-
*/
|
|
58
|
-
export function getFieldNameFromEmbeddedFieldName(propertyName) {
|
|
59
|
-
let value = propertyName;
|
|
60
|
-
if (value.startsWith(PAGE) || value.startsWith(PAGELIST)) {
|
|
61
|
-
value = value.substring(value.lastIndexOf('!') + 1);
|
|
62
|
-
value = value.replace(/:/g, '.');
|
|
63
|
-
}
|
|
64
|
-
return value;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* [updateMetaEmbeddedFieldID]
|
|
68
|
-
* Description - If the fieldID in meta starts with '!P!' or '!PL!' and contains ':' then replace them with .(dot)
|
|
69
|
-
* @ignore
|
|
70
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
71
|
-
*/
|
|
72
|
-
export function updateMetaEmbeddedFieldID(metaFields) {
|
|
73
|
-
return metaFields.forEach(metaField => {
|
|
74
|
-
if (metaField.fieldID?.startsWith(PAGE) || metaField.fieldID?.startsWith(PAGELIST)) {
|
|
75
|
-
metaField.fieldID = getFieldNameFromEmbeddedFieldName(metaField.fieldID);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
export const isEmbeddedField = field => {
|
|
80
|
-
if (field?.startsWith('@')) {
|
|
81
|
-
field = field.substring(field.indexOf(' ') + 1);
|
|
82
|
-
if (field[0] === '.')
|
|
83
|
-
field = field.substring(1);
|
|
84
|
-
}
|
|
85
|
-
return field?.indexOf('.') > 0;
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* [isPageListProperty]
|
|
89
|
-
* Description - checking if propertyName is pageList or not
|
|
90
|
-
* @ignore
|
|
91
|
-
* @param {string} propertyName PropertyName
|
|
92
|
-
* @returns {boolean} true if property is pageList else false
|
|
93
|
-
*
|
|
94
|
-
* @example <caption>Example for isPageListProperty </caption>
|
|
95
|
-
* isPageListProperty('!PL!Employees.Name') return true
|
|
96
|
-
* isPageListProperty('!P!Employees.Name') return false
|
|
97
|
-
* isPageListProperty('Name') return false
|
|
98
|
-
*/
|
|
99
|
-
export function isPageListProperty(propertyName) {
|
|
100
|
-
return propertyName.startsWith(PAGELIST);
|
|
101
|
-
}
|
|
102
|
-
export const isPageListInPath = (propertyName, currentClassID) => {
|
|
103
|
-
if (!propertyName.includes('.')) {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
const [first, ...rest] = propertyName.split('.');
|
|
107
|
-
const metadata = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
|
|
108
|
-
if (metadata?.type === 'Page List') {
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
return isPageListInPath(rest.join('.'), metadata?.pageClass);
|
|
112
|
-
};
|
|
113
|
-
/**
|
|
114
|
-
* [getEmbeddedFieldName]
|
|
115
|
-
* Description - converting normal field name to embedded field starting with !P! or !PL!
|
|
116
|
-
* @ignore
|
|
117
|
-
* @param {string} propertyName Field name
|
|
118
|
-
* @param {string} classID classID of datapage
|
|
119
|
-
* @returns {string} returns converted string with !P! or !PL! and :
|
|
120
|
-
*
|
|
121
|
-
* @example <caption>Example for getEmbeddedFieldName </caption>
|
|
122
|
-
* For page property, getEmbeddedFieldName('Organisation.Name') return '!P!Organisation:Name'
|
|
123
|
-
* For pageList property, getEmbeddedFieldName('Employees.Name') return '!PL!Employees:Name'
|
|
124
|
-
*/
|
|
125
|
-
export function getEmbeddedFieldName(propertyName, classID) {
|
|
126
|
-
let value = propertyName;
|
|
127
|
-
if (isPageListInPath(value, classID)) {
|
|
128
|
-
value = `!PL!${value.replace(/\./g, ':')}`;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
value = `!P!${value.replace(/\./g, ':')}`;
|
|
132
|
-
}
|
|
133
|
-
return value;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* [preparePropertyMaps]
|
|
137
|
-
* Description - preparing maps for property names and set it in dataApi context
|
|
138
|
-
* @ignore
|
|
139
|
-
* @param {Array} fields fields array
|
|
140
|
-
* @param {string} classID classID of datapage
|
|
141
|
-
* @param {string} context dataApi context
|
|
142
|
-
* @returns {boolean} true if pageListProperty is present
|
|
143
|
-
*/
|
|
144
|
-
export function preparePropertyMaps(fields, classID, context) {
|
|
145
|
-
const { setPropertyMaps } = context;
|
|
146
|
-
const maps = fields.reduce((acc, field) => {
|
|
147
|
-
let { value } = field.config;
|
|
148
|
-
if (value.startsWith('@')) {
|
|
149
|
-
value = value.substring(value.indexOf(' ') + 1);
|
|
150
|
-
if (value[0] === '.')
|
|
151
|
-
value = value.substring(1);
|
|
152
|
-
}
|
|
153
|
-
let name = value;
|
|
154
|
-
// Preparing name for embedded property
|
|
155
|
-
if (isEmbeddedField(name)) {
|
|
156
|
-
name = getEmbeddedFieldName(name, classID);
|
|
157
|
-
}
|
|
158
|
-
if (isPageListProperty(name) && !acc[2]) {
|
|
159
|
-
acc[2] = true;
|
|
160
|
-
}
|
|
161
|
-
acc[0][value] = name;
|
|
162
|
-
acc[1][name] = value;
|
|
163
|
-
return acc;
|
|
164
|
-
}, [{}, {}, false]);
|
|
165
|
-
setPropertyMaps(maps[0], maps[1]);
|
|
166
|
-
return maps[2];
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* [getConfigEmbeddedFieldsMeta]
|
|
170
|
-
* Description - Get the metadata for configured embedded fields
|
|
171
|
-
* @ignore
|
|
172
|
-
* @param {Set} configFields Set of config fields
|
|
173
|
-
* @param {string} classID clasID of datapage
|
|
174
|
-
* @returns {Array} Metadata of configured embedded fields
|
|
175
|
-
*/
|
|
176
|
-
export function getConfigEmbeddedFieldsMeta(configFields, classID) {
|
|
177
|
-
const configEmbeddedFieldsMeta = [];
|
|
178
|
-
configFields.forEach(field => {
|
|
179
|
-
let value = field;
|
|
180
|
-
if (isEmbeddedField(value)) {
|
|
181
|
-
// conversion Page.PageList[].property => Page.PageList.property
|
|
182
|
-
if (value.includes('[')) {
|
|
183
|
-
value = value.substring(0, value.indexOf('[')) + value.substring(value.indexOf(']') + 1);
|
|
184
|
-
}
|
|
185
|
-
const meta = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
|
|
186
|
-
meta.fieldID = field;
|
|
187
|
-
configEmbeddedFieldsMeta.push(meta);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
return configEmbeddedFieldsMeta;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* [mergeConfigEmbeddedFieldsMeta]
|
|
194
|
-
* Description - Get the metadata for configured embedded fields
|
|
195
|
-
* @ignore
|
|
196
|
-
* @param {Array} configEmbeddedFieldsMeta config fields metadata.
|
|
197
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields
|
|
198
|
-
*/
|
|
199
|
-
export function mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields) {
|
|
200
|
-
const mergedMetaFields = [...metaFields];
|
|
201
|
-
configEmbeddedFieldsMeta.forEach(configFieldMeta => {
|
|
202
|
-
const fieldMeta = metaFields.find(metaField => metaField.fieldID === configFieldMeta.fieldID);
|
|
203
|
-
if (!fieldMeta)
|
|
204
|
-
mergedMetaFields.push(configFieldMeta);
|
|
205
|
-
});
|
|
206
|
-
return mergedMetaFields;
|
|
207
|
-
}
|
|
208
|
-
const oldToNewFieldTypeMapping = {
|
|
209
|
-
'Date Time': 'Date & time',
|
|
210
|
-
Date: 'Date only'
|
|
211
|
-
};
|
|
212
|
-
/**
|
|
213
|
-
* [updateFieldType]
|
|
214
|
-
* Description - Updates the field type if its changed in the new implementation. Such mapping is maintained in oldToNewFieldTypeMapping.
|
|
215
|
-
* @ignore
|
|
216
|
-
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
217
|
-
*/
|
|
218
|
-
function updateFieldType(metaFields) {
|
|
219
|
-
metaFields.forEach(metaField => {
|
|
220
|
-
if (metaField.type)
|
|
221
|
-
metaField.type = oldToNewFieldTypeMapping[metaField.type] || metaField.type;
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
function getPresetMetaAttribute(attribute) {
|
|
225
|
-
const { type, config: { label, value } } = attribute;
|
|
226
|
-
return {
|
|
227
|
-
type,
|
|
228
|
-
name: value.startsWith('@') ? value.substring(4) : value,
|
|
229
|
-
label: label.startsWith('@') ? label.substring(3) : label
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* [generateViewMetaData]
|
|
234
|
-
* Description - Returns a list of metaobjects of the fields provided.
|
|
235
|
-
* @ignore
|
|
236
|
-
* @param {Array} rawFields List of fields to update meta for
|
|
237
|
-
* @param {string} classID Class ID from the response
|
|
238
|
-
* @returns {Array} List of fields with updated meta objects.
|
|
239
|
-
*/
|
|
240
|
-
function generateViewMetaData(rawFields, classID, showField) {
|
|
241
|
-
return rawFields.map(item => getDefaultViewMeta(item, classID, showField));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* [getConfigFields]
|
|
245
|
-
* Description - Returns list of config fields with primary fields meta updated.
|
|
246
|
-
* @ignore
|
|
247
|
-
* @param {Array} configFields List of Authored fields
|
|
248
|
-
* @param {Array} primaryFields List of Primary Fields
|
|
249
|
-
* @param {Array} metaFields Metadata of all fields
|
|
250
|
-
* @param {string} classID Class ID from the response
|
|
251
|
-
* @returns {Array} List of all fields with their meta updated.
|
|
252
|
-
*/
|
|
253
|
-
function getConfigFields(configFields, primaryFields, metaFields, classID) {
|
|
254
|
-
const presetConfigFields = configFields;
|
|
255
|
-
const primaryFieldsViewIndex = presetConfigFields.findIndex(field => field.config.value === 'pyPrimaryFields');
|
|
256
|
-
if (!primaryFields || !primaryFields.length) {
|
|
257
|
-
if (primaryFieldsViewIndex < 0)
|
|
258
|
-
return presetConfigFields;
|
|
259
|
-
presetConfigFields.splice(primaryFieldsViewIndex, 1);
|
|
260
|
-
return presetConfigFields;
|
|
261
|
-
}
|
|
262
|
-
if (primaryFieldsViewIndex > -1) {
|
|
263
|
-
// list of uncommon fields - non overlap of primary fields grouped view and independent entity columns of primary type
|
|
264
|
-
const uncommonFieldsList = primaryFields.filter(primaryField => !presetConfigFields.some(presetConfigField => presetConfigField.config.value.split('.')[1] === primaryField));
|
|
265
|
-
const uncommonFieldsRawMeta = [];
|
|
266
|
-
uncommonFieldsList.forEach(uncommonField => {
|
|
267
|
-
const uncommonFieldMeta = metaFields.find(metaField => metaField.fieldID === uncommonField);
|
|
268
|
-
if (uncommonFieldMeta)
|
|
269
|
-
uncommonFieldsRawMeta.push(uncommonFieldMeta);
|
|
270
|
-
});
|
|
271
|
-
const uncommonFieldsConfigMeta = generateViewMetaData(uncommonFieldsRawMeta, classID, true);
|
|
272
|
-
presetConfigFields.splice(primaryFieldsViewIndex, 1, ...uncommonFieldsConfigMeta);
|
|
273
|
-
}
|
|
274
|
-
return presetConfigFields;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* [getTableConfigFromPresetMeta]
|
|
278
|
-
* Description - Get the table config from the presets meta.
|
|
279
|
-
* @ignore
|
|
280
|
-
* @param {object} presetMeta Presets meta
|
|
281
|
-
* @param {boolean} isMetaWithPresets true if meta has presets else false
|
|
282
|
-
* @param {Function} getPConnect Callback to get the PConnect object
|
|
283
|
-
* @param {string} classID Class ID from the response
|
|
284
|
-
* @param {Array} primaryFields List of Primary Fields
|
|
285
|
-
* @param {Array} metaFields List of all metafields
|
|
286
|
-
* @returns {object} Table config object
|
|
287
|
-
*/
|
|
288
|
-
export function getTableConfigFromPresetMeta(presetMeta, isMetaWithPresets, pConn$, classID, primaryFields, metaFields) {
|
|
289
|
-
let presetId;
|
|
290
|
-
let presetName;
|
|
291
|
-
let cardHeader;
|
|
292
|
-
let secondaryText;
|
|
293
|
-
let timelineDate;
|
|
294
|
-
let timelineTitle;
|
|
295
|
-
let timelineStatus;
|
|
296
|
-
let timelineIcon;
|
|
297
|
-
let { filterExpression } = pConn$.getRawMetadata().config;
|
|
298
|
-
let fieldsMeta;
|
|
299
|
-
let configFields;
|
|
300
|
-
if (isMetaWithPresets) {
|
|
301
|
-
presetId = presetMeta.id;
|
|
302
|
-
presetName = presetMeta.label;
|
|
303
|
-
cardHeader = presetMeta.cardHeader && getPresetMetaAttribute(presetMeta.cardHeader);
|
|
304
|
-
secondaryText = presetMeta.secondaryText && getPresetMetaAttribute(presetMeta.secondaryText);
|
|
305
|
-
timelineDate = presetMeta.timelineDate && getPresetMetaAttribute(presetMeta.timelineDate);
|
|
306
|
-
timelineTitle = presetMeta.timelineTitle && getPresetMetaAttribute(presetMeta.timelineTitle);
|
|
307
|
-
timelineStatus = presetMeta.timelineStatus && getPresetMetaAttribute(presetMeta.timelineStatus);
|
|
308
|
-
timelineIcon = presetMeta.timelineIcon && getPresetMetaAttribute(presetMeta.timelineIcon);
|
|
309
|
-
filterExpression = presetMeta.config.filterExpression;
|
|
310
|
-
[fieldsMeta] = presetMeta.children;
|
|
311
|
-
if (presetMeta.timelineTitle &&
|
|
312
|
-
!fieldsMeta.children.find(fieldMeta => {
|
|
313
|
-
return fieldMeta?.config?.value === presetMeta.timelineTitle?.config?.value;
|
|
314
|
-
})) {
|
|
315
|
-
const { type, config } = presetMeta.timelineTitle;
|
|
316
|
-
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
317
|
-
}
|
|
318
|
-
if (presetMeta.timelineDate &&
|
|
319
|
-
!fieldsMeta.children.find(fieldMeta => {
|
|
320
|
-
return fieldMeta?.config?.value === presetMeta.timelineDate?.config?.value;
|
|
321
|
-
})) {
|
|
322
|
-
const { type, config } = presetMeta.timelineDate;
|
|
323
|
-
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
324
|
-
}
|
|
325
|
-
configFields = getConfigFields(fieldsMeta.children, primaryFields, metaFields, classID);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
fieldsMeta = presetMeta.props;
|
|
329
|
-
configFields = getConfigFields(fieldsMeta
|
|
330
|
-
.getPConnect()
|
|
331
|
-
.getChildren()
|
|
332
|
-
?.map(child => {
|
|
333
|
-
return child.getPConnect().getRawMetadata();
|
|
334
|
-
}), primaryFields, metaFields, classID);
|
|
335
|
-
}
|
|
336
|
-
return {
|
|
337
|
-
presetId,
|
|
338
|
-
presetName,
|
|
339
|
-
cardHeader,
|
|
340
|
-
secondaryText,
|
|
341
|
-
timelineDate,
|
|
342
|
-
timelineTitle,
|
|
343
|
-
timelineStatus,
|
|
344
|
-
timelineIcon,
|
|
345
|
-
filterExpression,
|
|
346
|
-
fieldsMeta,
|
|
347
|
-
configFields
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* [getReportColumns]
|
|
352
|
-
* Description - Returns a set of columns from the report response.
|
|
353
|
-
* @ignore
|
|
354
|
-
* @param {object} response -
|
|
355
|
-
* @returns {Set} Set of columns from the report response
|
|
356
|
-
*/
|
|
357
|
-
function getReportColumns(response) {
|
|
358
|
-
const { data: { data: reportColumns } } = response;
|
|
359
|
-
const reportColumnsSet = new Set();
|
|
360
|
-
reportColumns?.forEach(item => {
|
|
361
|
-
let val = item.pyFieldName;
|
|
362
|
-
// Remove '.' from index 0 only, if '.' is present
|
|
363
|
-
if (val[0] === '.') {
|
|
364
|
-
val = val.substring(1);
|
|
365
|
-
}
|
|
366
|
-
reportColumnsSet.add(val);
|
|
367
|
-
});
|
|
368
|
-
return reportColumnsSet;
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* [getConfigFieldValue]
|
|
372
|
-
* Descritpion - Returns a valid value for a configuration field. Remove any annotations and also "."
|
|
373
|
-
* @ignore
|
|
374
|
-
* @param {object} config
|
|
375
|
-
* config.value - Raw value
|
|
376
|
-
* @returns {string} value - Value with out any annotations or "."
|
|
377
|
-
*/
|
|
378
|
-
function getConfigFieldValue(config) {
|
|
379
|
-
let { value } = config;
|
|
380
|
-
if (value.startsWith('@')) {
|
|
381
|
-
value = value.substring(value.indexOf(' ') + 1);
|
|
382
|
-
if (value[0] === '.')
|
|
383
|
-
value = value.substring(1);
|
|
384
|
-
}
|
|
385
|
-
return value;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* [prepareConfigFields]
|
|
389
|
-
* Description - Prepares a set of configuration fields and pushes each config type to a set using the callback parameter.
|
|
390
|
-
* @ignore
|
|
391
|
-
* @param {object} configFields List of Authored fields
|
|
392
|
-
* @param {Function} pushToComponentsList Callback to push the field type to a set.
|
|
393
|
-
* @returns {Set} configFieldSet
|
|
394
|
-
*/
|
|
395
|
-
function prepareConfigFields(configFields, pushToComponentsList) {
|
|
396
|
-
const configFieldSet = new Set();
|
|
397
|
-
configFields.forEach(item => {
|
|
398
|
-
pushToComponentsList(item.type);
|
|
399
|
-
const val = getConfigFieldValue(item.config);
|
|
400
|
-
configFieldSet.add(val);
|
|
401
|
-
});
|
|
402
|
-
return configFieldSet;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* [findAuthoredField]
|
|
406
|
-
* Description - Finds an authored field from yhe list of config fields.
|
|
407
|
-
* @ignore
|
|
408
|
-
* @param {Array} configFields List of Authored fields
|
|
409
|
-
* @param {string} fieldID Filter
|
|
410
|
-
* @returns {object} config with its field value equal to fieldID, which means an authored field
|
|
411
|
-
*/
|
|
412
|
-
function findAuthoredField(configFields, fieldID) {
|
|
413
|
-
return configFields.find(configField => {
|
|
414
|
-
const val = getConfigFieldValue(configField.config);
|
|
415
|
-
return val === fieldID;
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* [findAndUpdateAuthoredFieldConfig]
|
|
420
|
-
* Description - Find the authored field, and update its config.
|
|
421
|
-
* @ignore
|
|
422
|
-
* @param {Array} configFields List of Authored fields
|
|
423
|
-
* @param {object} item Field item to copy displayAs and category information
|
|
424
|
-
* @param {string} classId classID from the response
|
|
425
|
-
*/
|
|
426
|
-
function findAndUpdateAuthoredFieldConfig(configFields, item, classId) {
|
|
427
|
-
const authoredField = findAuthoredField(configFields, item.fieldID);
|
|
428
|
-
if (authoredField?.config) {
|
|
429
|
-
if (item.displayAs) {
|
|
430
|
-
authoredField.config.displayAs = item.displayAs;
|
|
431
|
-
}
|
|
432
|
-
authoredField.config.classID = item.classID ?? classId;
|
|
433
|
-
if (authoredField.type === USER_REFERENCE) {
|
|
434
|
-
authoredField.config.associationID = item.associationID || item.fieldID;
|
|
435
|
-
}
|
|
436
|
-
authoredField.config.category = item.category;
|
|
437
|
-
// FieldType identifies whether the field is configured as pickList
|
|
438
|
-
authoredField.config.fieldType = item.fieldType;
|
|
439
|
-
// type defined on the property rule,
|
|
440
|
-
// used for the picklist field to assign the appropriate type
|
|
441
|
-
authoredField.config.propertyType = item.dataType || item.type;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* [isAnExtraField]
|
|
446
|
-
* Description - Returns true if the field is an extra field. Extra field is the one which is not authored but part of the report.
|
|
447
|
-
* @ignore
|
|
448
|
-
* @param {Array} configFields List of Authored fields
|
|
449
|
-
* @param {Set} configFieldSet Set if Authored filed values
|
|
450
|
-
* @param {Set} reportColumnsSet Set of columns from the report
|
|
451
|
-
* @param {object} item Config field item
|
|
452
|
-
* @param {string} classId Class ID from the response
|
|
453
|
-
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
454
|
-
* @returns {boolean} true If the field is an extra field else false.
|
|
455
|
-
*/
|
|
456
|
-
function isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classId, showDynamicFields) {
|
|
457
|
-
// Is the field already present in authoring metadata?
|
|
458
|
-
// Mutates config fields to copy displayAs and category information
|
|
459
|
-
if (configFieldSet.has(item.fieldID)) {
|
|
460
|
-
findAndUpdateAuthoredFieldConfig(configFields, item, classId);
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
// If field is not authored and not part of report columns then discard it
|
|
464
|
-
return showDynamicFields || !!reportColumnsSet.has(item.fieldID);
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* [prepareExtraFields]
|
|
468
|
-
* Description - Returns a list of extra fields with their meta updated.
|
|
469
|
-
* @ignore
|
|
470
|
-
* @param {Array} metaFields List of fields
|
|
471
|
-
* @param {Array} configFields List of Authored fields
|
|
472
|
-
* @param {Set} configFieldSet Set if Authored filed values
|
|
473
|
-
* @param {Set} reportColumnsSet Set of columns from the report
|
|
474
|
-
* @param {string} classID Class ID from the response
|
|
475
|
-
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
476
|
-
* @returns {Array} List of extra fields with their meta updated.
|
|
477
|
-
*/
|
|
478
|
-
function prepareExtraFields(metaFields, configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields) {
|
|
479
|
-
// Filter all the extra fields
|
|
480
|
-
const extraFileds = metaFields.filter(item => {
|
|
481
|
-
return isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classID, showDynamicFields);
|
|
482
|
-
});
|
|
483
|
-
return generateViewMetaData(extraFileds, classID, false);
|
|
484
|
-
// Update the meta object of each of the extra fields.
|
|
485
|
-
}
|
|
486
|
-
const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
|
|
487
|
-
function populateRenderingOptions(name, config, field) {
|
|
488
|
-
const shouldDisplayAsSemanticLink = 'displayAsLink' in field.config && field.config.displayAsLink;
|
|
489
|
-
if (shouldDisplayAsSemanticLink) {
|
|
490
|
-
config.customObject.isAssignmentLink = AssignDashObjects.includes(field.config.classID);
|
|
491
|
-
if (field.config.value.startsWith('@CA')) {
|
|
492
|
-
config.customObject.isAssociation = true;
|
|
493
|
-
}
|
|
494
|
-
config.cellRenderer = formatConstants.WorkLink;
|
|
495
|
-
}
|
|
496
|
-
else if (name === 'pyStatusWork' || name === 'pyAssignmentStatus') {
|
|
497
|
-
config.cellRenderer = formatConstants.WorkStatus;
|
|
498
|
-
}
|
|
499
|
-
else if (name === 'pxUrgencyWork') {
|
|
500
|
-
config.cellRenderer = formatConstants.Integer;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
export function initializeColumns(fields = [], getMappedProperty = null) {
|
|
504
|
-
return fields.map((field, originalColIndex) => {
|
|
505
|
-
let name = field.config.value;
|
|
506
|
-
if (name.startsWith('@')) {
|
|
507
|
-
name = name.substring(name.indexOf(' ') + 1);
|
|
508
|
-
if (name[0] === '.')
|
|
509
|
-
name = name.substring(1);
|
|
510
|
-
}
|
|
511
|
-
name = getMappedProperty?.(name) ?? name;
|
|
512
|
-
let label = field.config.label || field.config.caption;
|
|
513
|
-
const { show = true, displayAs } = field.config;
|
|
514
|
-
if (label.startsWith('@')) {
|
|
515
|
-
label = label.substring(3);
|
|
516
|
-
}
|
|
517
|
-
const config = {
|
|
518
|
-
name,
|
|
519
|
-
label,
|
|
520
|
-
show,
|
|
521
|
-
classID: field.config.classID,
|
|
522
|
-
id: field.id || name || originalColIndex,
|
|
523
|
-
displayAs,
|
|
524
|
-
associationID: field.config.associationID,
|
|
525
|
-
...(field.config.classID && { category: field.config.category }),
|
|
526
|
-
customObject: {},
|
|
527
|
-
fieldType: field.config.fieldType,
|
|
528
|
-
meta: {
|
|
529
|
-
...field
|
|
530
|
-
}
|
|
531
|
-
};
|
|
532
|
-
populateRenderingOptions(name, config, field);
|
|
533
|
-
return config;
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
export const getItemKey = fields => {
|
|
537
|
-
let itemKey;
|
|
538
|
-
if (fields.findIndex(field => field.id === 'pyGUID') > -1) {
|
|
539
|
-
itemKey = 'pyGUID';
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
itemKey = 'pzInsKey';
|
|
543
|
-
}
|
|
544
|
-
return itemKey;
|
|
545
|
-
};
|
|
546
|
-
export function preparePatchQueryFields(fields, isDataObject = false, classID = '') {
|
|
547
|
-
const queryFields = [];
|
|
548
|
-
fields.forEach(field => {
|
|
549
|
-
const patchFields = [];
|
|
550
|
-
if (field.cellRenderer === 'WorkLink') {
|
|
551
|
-
if (field.customObject && field.customObject.isAssignmentLink) {
|
|
552
|
-
const associationName = field.name.includes(':') ? `${field.name.split(':')[0]}:` : '';
|
|
553
|
-
patchFields.push(`${associationName}pzInsKey`);
|
|
554
|
-
patchFields.push(`${associationName}pxRefObjectClass`);
|
|
555
|
-
}
|
|
556
|
-
else if (field.customObject && field.customObject.isAssociation) {
|
|
557
|
-
const associationCategory = field.name.split(':')[0];
|
|
558
|
-
patchFields.push(`${associationCategory}:pyID`);
|
|
559
|
-
patchFields.push(`${associationCategory}:pzInsKey`);
|
|
560
|
-
patchFields.push(`${associationCategory}:pxObjClass`);
|
|
561
|
-
}
|
|
562
|
-
else if (isDataObject) {
|
|
563
|
-
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
564
|
-
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
565
|
-
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? patchFields.push(item.linkedField) : patchFields.push(item.keyName)));
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
patchFields.push('pyID');
|
|
569
|
-
patchFields.push('pzInsKey');
|
|
570
|
-
patchFields.push('pxObjClass');
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
patchFields.forEach(k => {
|
|
574
|
-
if (!queryFields.find(q => q === k)) {
|
|
575
|
-
queryFields.push(k);
|
|
576
|
-
}
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
return queryFields;
|
|
580
|
-
}
|
|
581
|
-
/**
|
|
582
|
-
* Update the renderer type for the properties of type Page.
|
|
583
|
-
*/
|
|
584
|
-
export function updatePageFieldsConfig(configFields, parentClassID) {
|
|
585
|
-
return configFields.forEach(item => {
|
|
586
|
-
const { type, config: { value } } = item;
|
|
587
|
-
const propertyName = PCore.getAnnotationUtils().getPropertyName(value);
|
|
588
|
-
if (isEmbeddedField(value) && !isPageListInPath(propertyName, parentClassID)) {
|
|
589
|
-
item.config.componentType = type;
|
|
590
|
-
item.type = 'PagePropertyRenderer';
|
|
591
|
-
}
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
export const readContextResponse = async (context, params) => {
|
|
595
|
-
const { pConn$, apiContext, children, showDynamicFields, referenceList, isDataObject } = params;
|
|
596
|
-
// let { listContext } = params;
|
|
597
|
-
const { promisesResponseArray, apiContext: otherContext } = context;
|
|
598
|
-
// eslint-disable-next-line sonarjs/no-unused-collection
|
|
599
|
-
const listOfComponents = [];
|
|
600
|
-
const { data: { fields: metaFields, classID, isQueryable } } = promisesResponseArray[0];
|
|
601
|
-
let { data: { primaryFields } } = promisesResponseArray[0];
|
|
602
|
-
// When list is configured with Include all class fields configuration, provide support for Primary fields column
|
|
603
|
-
if (showDynamicFields) {
|
|
604
|
-
const sourceMetadata = PCore.getMetadataUtils().getDataPageMetadata(referenceList);
|
|
605
|
-
if (sourceMetadata?.primaryFields) {
|
|
606
|
-
primaryFields = sourceMetadata.primaryFields;
|
|
607
|
-
}
|
|
608
|
-
// updating metaData fieldID to normal property if it has fieldID starts with !P! or !PL!
|
|
609
|
-
updateMetaEmbeddedFieldID(metaFields);
|
|
610
|
-
}
|
|
611
|
-
updateFieldType(metaFields);
|
|
612
|
-
if (isDataObject) {
|
|
613
|
-
const compositeKeys = [];
|
|
614
|
-
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
615
|
-
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
616
|
-
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? compositeKeys.push(item.linkedField) : compositeKeys.push(item.keyName)));
|
|
617
|
-
if (compositeKeys.length && otherContext) {
|
|
618
|
-
otherContext.setCompositeKeys(compositeKeys);
|
|
619
|
-
}
|
|
620
|
-
if (otherContext) {
|
|
621
|
-
otherContext.fetchRowActionDetails = null;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
const presetArray = [];
|
|
625
|
-
const rawMetadata = pConn$.getRawMetadata().config;
|
|
626
|
-
const rawPresets = rawMetadata.presets;
|
|
627
|
-
const isMetaWithPresets = rawPresets && rawPresets.length !== 0;
|
|
628
|
-
const childrenIterator = isMetaWithPresets ? rawPresets : children;
|
|
629
|
-
const resolvedPresets = pConn$.getConfigProps().presets;
|
|
630
|
-
let fields;
|
|
631
|
-
let tableConfig;
|
|
632
|
-
childrenIterator?.forEach((presetMeta, index) => {
|
|
633
|
-
const { configFields } = getTableConfigFromPresetMeta({ ...presetMeta, label: resolvedPresets[index].label }, isMetaWithPresets, pConn$, classID, primaryFields, metaFields);
|
|
634
|
-
const pushToComponentsList = fieldType => {
|
|
635
|
-
listOfComponents.push(fieldType);
|
|
636
|
-
};
|
|
637
|
-
// read report columns response - in case of nonqueryable ignore the response and rely only on the fields configured at authoing time in presets
|
|
638
|
-
const reportColumnsSet = isQueryable ? getReportColumns(promisesResponseArray[1]) : new Set();
|
|
639
|
-
const configFieldSet = prepareConfigFields(configFields, pushToComponentsList);
|
|
640
|
-
// FIXME #EmbeddedPropertyPatch
|
|
641
|
-
// TODO: Remove this merge logic when the metadata response includes all optimized embedded page and pagelists
|
|
642
|
-
// merging configured embedded properties with metadata so that while preparing extra fields, config fields can get other properties from meta(eg: category, displayAsLink)
|
|
643
|
-
// get configured embedded properties metadata and get new mergedMetaFields
|
|
644
|
-
const configEmbeddedFieldsMeta = getConfigEmbeddedFieldsMeta(configFieldSet, classID);
|
|
645
|
-
const mergedMetaFields = mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields);
|
|
646
|
-
const extraFields = prepareExtraFields(mergedMetaFields, // passing new merged meta fields which has meta of configured embedded fields of current preset
|
|
647
|
-
configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields);
|
|
648
|
-
if (isQueryable) {
|
|
649
|
-
updatePageFieldsConfig(configFields, classID);
|
|
650
|
-
preparePropertyMaps([...configFields, ...extraFields], classID, context);
|
|
651
|
-
}
|
|
652
|
-
const { getMappedProperty } = context;
|
|
653
|
-
fields = initializeColumns([...configFields, ...extraFields], getMappedProperty);
|
|
654
|
-
const patchQueryFields = preparePatchQueryFields(fields, isDataObject, classID);
|
|
655
|
-
const itemKey = getItemKey(fields);
|
|
656
|
-
tableConfig = { fieldDefs: fields, patchQueryFields, itemKey, isQueryable };
|
|
657
|
-
});
|
|
658
|
-
const meta = tableConfig;
|
|
659
|
-
params.listContext = { meta, presets: presetArray, apiContext: { ...apiContext } };
|
|
660
|
-
return params.listContext;
|
|
661
|
-
};
|
|
662
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvbGlzdC12aWV3L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBS3ZELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQztBQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPO0lBR1g7UUFDRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsZUFBZSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsRUFBRSwyQkFBMkIsR0FBRyxFQUFFO1FBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRztZQUN0QyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0M7WUFDeEMsR0FBRywyQkFBMkI7U0FDL0IsQ0FBQztRQUNGLElB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QXVCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsV0FBVyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFDekIsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNuRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RGVmYXVsdFZpZXdNZXRhIH0gZnJvbSAnLi9EZWZhdWx0Vmlld01ldGEnO1xuXG4vLyBSZW1vdmUgdGhpcyBhbmQgdXNlIFwicmVhbFwiIFBDb3JlIHR5cGUgb25jZSAuZC50cyBpcyBmaXhlZCAoY3VycmVudGx5IHNob3dzIDUgZXJyb3JzKVxuZGVjbGFyZSBjb25zdCBQQ29yZTogYW55O1xuXG5jb25zdCBVU0VSX1JFRkVSRU5DRSA9ICdVc2VyUmVmZXJlbmNlJztcbmNvbnN0IFBBR0UgPSAnIVAhJztcbmNvbnN0IFBBR0VMSVNUID0gJyFQTCEnO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0Q29uc3RhbnRzID0ge1xuICBXb3JrU3RhdHVzOiAnV29ya1N0YXR1cycsXG4gIEludGVnZXI6ICdJbnRlZ2VyJyxcbiAgV29ya0xpbms6ICdXb3JrTGluaydcbn07XG5cbmNsYXNzIERhdGFBcGkge1xuICBtYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eTogYW55O1xuICBvcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5ID0ge307XG4gICAgdGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSA9IHt9O1xuICAgIHRoaXMuc2V0UHJvcGVydHlNYXBzID0gdGhpcy5zZXRQcm9wZXJ0eU1hcHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE1hcHBlZFByb3BlcnR5ID0gdGhpcy5nZXRNYXBwZWRQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eSA9IHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgc2V0UHJvcGVydHlNYXBzKG9yaWdpbmFsVG9NYXBwZWRQcm9wZXJ0eU9iaiA9IHt9LCBtYXBwZWRUb09yaWdpbmFsUHJvcGVydHlPYmogPSB7fSkge1xuICAgIHRoaXMub3JpZ2luYWxQcm9wZXJ0eVRvTWFwcGVkUHJvcGVydHkgPSB7XG4gICAgICAuLi50aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5LFxuICAgICAgLi4ub3JpZ2luYWxUb01hcHBlZFByb3BlcnR5T2JqXG4gICAgfTtcbiAgICB0aGlzLm1hcHBlZFByb3BlcnR5VG9PcmlnaW5hbFByb3BlcnR5ID0ge1xuICAgICAgLi4udGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSxcbiAgICAgIC4uLm1hcHBlZFRvT3JpZ2luYWxQcm9wZXJ0eU9ialxuICAgIH07XG4gIH1cblxuICBnZXRNYXBwZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eVtwcm9wZXJ0eU5hbWVdID8/IHByb3BlcnR5TmFtZTtcbiAgfVxuXG4gIGdldE9yaWdpbmFsUHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHlbcHJvcGVydHlOYW1lXSA/PyBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoY29tcG9uZW50Q29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBwcm9taXNlc0FycmF5ID0gW10gLy8gYXJyYXkgb2YgcHJvbWlzZXMgd2hpY2ggY2FuIGJlIGludm9rZWQgcGFyYWxlbGx5LFxuICB9ID0gY29tcG9uZW50Q29uZmlnO1xuICBjb25zdCBwcm9taXNlc1Jlc3BvbnNlQXJyYXkgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlc0FycmF5KTtcbiAgY29uc3QgZGF0YUFwaSA9IG5ldyBEYXRhQXBpKCk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZXNSZXNwb25zZUFycmF5LFxuICAgIHNldFByb3BlcnR5TWFwczogZGF0YUFwaS5zZXRQcm9wZXJ0eU1hcHMsXG4gICAgZ2V0TWFwcGVkUHJvcGVydHk6IGRhdGFBcGkuZ2V0TWFwcGVkUHJvcGVydHksXG4gICAgZ2V0T3JpZ2luYWxQcm9wZXJ0eTogZGF0YUFwaS5nZXRPcmlnaW5hbFByb3BlcnR5XG4gIH07XG59XG5cbi8qKlxuICogW2dldEZpZWxkTmFtZUZyb21FbWJlZGRlZEZpZWxkTmFtZV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgICAgICBjb252ZXJ0aW5nIGVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhIHRvIG5vcm1hbCBmaWVsZFxuICogQGlnbm9yZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAgIEVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICAgICAgcmV0dXJucyBjb252ZXJ0ZWQgc3RyaW5nIHdpdGhvdXQgIVAhIG9yICFQTCEgYW5kIDpcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGZvciBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUgPC9jYXB0aW9uPlxuICogZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKCchUCFPcmdhbmlzYXRpb246TmFtZScpIHJldHVybiAnT3JnYW5pc2F0aW9uLk5hbWUnXG4gKiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUoJyFQTCFFbXBsb3llZXM6TmFtZScpIHJldHVybiAnRW1wbG95ZWVzLk5hbWUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUocHJvcGVydHlOYW1lKSB7XG4gIGxldCB2YWx1ZSA9IHByb3BlcnR5TmFtZTtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoUEFHRSkgfHwgdmFsdWUuc3RhcnRzV2l0aChQQUdFTElTVCkpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZignIScpICsgMSk7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC86L2csICcuJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFt1cGRhdGVNZXRhRW1iZWRkZWRGaWVsZElEXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgSWYgdGhlIGZpZWxkSUQgaW4gbWV0YSBzdGFydHMgd2l0aCAnIVAhJyBvciAnIVBMIScgYW5kIGNvbnRhaW5zICc6JyB0aGVuIHJlcGxhY2UgdGhlbSB3aXRoIC4oZG90KVxuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcykge1xuICByZXR1cm4gbWV0YUZpZWxkcy5mb3JFYWNoKG1ldGFGaWVsZCA9PiB7XG4gICAgaWYgKG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0UpIHx8IG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0VMSVNUKSkge1xuICAgICAgbWV0YUZpZWxkLmZpZWxkSUQgPSBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUobWV0YUZpZWxkLmZpZWxkSUQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBpc0VtYmVkZGVkRmllbGQgPSBmaWVsZCA9PiB7XG4gIGlmIChmaWVsZD8uc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcoZmllbGQuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKGZpZWxkWzBdID09PSAnLicpIGZpZWxkID0gZmllbGQuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiBmaWVsZD8uaW5kZXhPZignLicpID4gMDtcbn07XG5cbi8qKlxuICogW2lzUGFnZUxpc3RQcm9wZXJ0eV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgIGNoZWNraW5nIGlmIHByb3BlcnR5TmFtZSBpcyBwYWdlTGlzdCBvciBub3RcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgICBQcm9wZXJ0eU5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAgdHJ1ZSBpZiBwcm9wZXJ0eSBpcyBwYWdlTGlzdCBlbHNlIGZhbHNlXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBmb3IgaXNQYWdlTGlzdFByb3BlcnR5IDwvY2FwdGlvbj5cbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVBMIUVtcGxveWVlcy5OYW1lJykgcmV0dXJuIHRydWVcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVAhRW1wbG95ZWVzLk5hbWUnKSByZXR1cm4gZmFsc2VcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnTmFtZScpIHJldHVybiBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWdlTGlzdFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICByZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoUEFHRUxJU1QpO1xufVxuXG5leHBvcnQgY29uc3QgaXNQYWdlTGlzdEluUGF0aCA9IChwcm9wZXJ0eU5hbWUsIGN1cnJlbnRDbGFzc0lEKSA9PiB7XG4gIGlmICghcHJvcGVydHlOYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHByb3BlcnR5TmFtZS5zcGxpdCgnLicpO1xuICBjb25zdCBtZXRhZGF0YSA9IFBDb3JlLmdldE1ldGFkYXRhVXRpbHMoKS5nZXRQcm9wZXJ0eU1ldGFkYXRhKGZpcnN0LCBjdXJyZW50Q2xhc3NJRCk7XG4gIGlmIChtZXRhZGF0YT8udHlwZSA9PT0gJ1BhZ2UgTGlzdCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNQYWdlTGlzdEluUGF0aChyZXN0LmpvaW4oJy4nKSwgbWV0YWRhdGE/LnBhZ2VDbGFzcyk7XG59O1xuXG4vKipcbiAqIFtnZXRFbWJlZGRlZEZpZWxkTmFtZV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgICAgICBjb252ZXJ0aW5nIG5vcm1hbCBmaWVsZCBuYW1lIHRvIGVtYmVkZGVkIGZpZWxkIHN0YXJ0aW5nIHdpdGggIVAhIG9yICFQTCFcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgICBGaWVsZCBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NJRCAgICAgICAgY2xhc3NJRCBvZiBkYXRhcGFnZVxuICogQHJldHVybnMge3N0cmluZ30gICAgICAgICAgICAgIHJldHVybnMgY29udmVydGVkIHN0cmluZyB3aXRoICFQISBvciAhUEwhIGFuZCA6XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBmb3IgZ2V0RW1iZWRkZWRGaWVsZE5hbWUgPC9jYXB0aW9uPlxuICogRm9yIHBhZ2UgcHJvcGVydHksIGdldEVtYmVkZGVkRmllbGROYW1lKCdPcmdhbmlzYXRpb24uTmFtZScpIHJldHVybiAnIVAhT3JnYW5pc2F0aW9uOk5hbWUnXG4gKiBGb3IgcGFnZUxpc3QgcHJvcGVydHksIGdldEVtYmVkZGVkRmllbGROYW1lKCdFbXBsb3llZXMuTmFtZScpIHJldHVybiAnIVBMIUVtcGxveWVlczpOYW1lJ1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWJlZGRlZEZpZWxkTmFtZShwcm9wZXJ0eU5hbWUsIGNsYXNzSUQpIHtcbiAgbGV0IHZhbHVlID0gcHJvcGVydHlOYW1lO1xuICBpZiAoaXNQYWdlTGlzdEluUGF0aCh2YWx1ZSwgY2xhc3NJRCkpIHtcbiAgICB2YWx1ZSA9IGAhUEwhJHt2YWx1ZS5yZXBsYWNlKC9cXC4vZywgJzonKX1gO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYCFQISR7dmFsdWUucmVwbGFjZSgvXFwuL2csICc6Jyl9YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogW3ByZXBhcmVQcm9wZXJ0eU1hcHNdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICBwcmVwYXJpbmcgbWFwcyBmb3IgcHJvcGVydHkgbmFtZXMgYW5kIHNldCBpdCBpbiBkYXRhQXBpIGNvbnRleHRcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpZWxkcyAgIGZpZWxkcyBhcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzSUQgIGNsYXNzSUQgb2YgZGF0YXBhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0ICBkYXRhQXBpIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHBhZ2VMaXN0UHJvcGVydHkgaXMgcHJlc2VudFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVByb3BlcnR5TWFwcyhmaWVsZHMsIGNsYXNzSUQsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBzZXRQcm9wZXJ0eU1hcHMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG1hcHMgPSBmaWVsZHMucmVkdWNlKFxuICAgIChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgeyB2YWx1ZSB9ID0gZmllbGQuY29uZmlnO1xuICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgICAgaWYgKHZhbHVlWzBdID09PSAnLicpIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZTtcbiAgICAgIC8vIFByZXBhcmluZyBuYW1lIGZvciBlbWJlZGRlZCBwcm9wZXJ0eVxuICAgICAgaWYgKGlzRW1iZWRkZWRGaWVsZChuYW1lKSkge1xuICAgICAgICBuYW1lID0gZ2V0RW1iZWRkZWRGaWVsZE5hbWUobmFtZSwgY2xhc3NJRCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYWdlTGlzdFByb3BlcnR5KG5hbWUpICYmICFhY2NbMl0pIHtcbiAgICAgICAgYWNjWzJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGFjY1swXVt2YWx1ZV0gPSBuYW1lO1xuICAgICAgYWNjWzFdW25hbWVdID0gdmFsdWU7XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICBbe30sIHt9LCBmYWxzZV1cbiAgKTtcbiAgc2V0UHJvcGVydHlNYXBzKG1hcHNbMF0sIG1hcHNbMV0pO1xuICByZXR1cm4gbWFwc1syXTtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgR2V0IHRoZSBtZXRhZGF0YSBmb3IgY29uZmlndXJlZCBlbWJlZGRlZCBmaWVsZHNcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7U2V0fSBjb25maWdGaWVsZHMgIFNldCBvZiBjb25maWcgZmllbGRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NJRCAgICBjbGFzSUQgb2YgZGF0YXBhZ2VcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgIE1ldGFkYXRhIG9mIGNvbmZpZ3VyZWQgZW1iZWRkZWQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRmllbGRzLCBjbGFzc0lEKSB7XG4gIGNvbnN0IGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YTogYW55W10gPSBbXTtcbiAgY29uZmlnRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgIGxldCB2YWx1ZSA9IGZpZWxkO1xuICAgIGlmIChpc0VtYmVkZGVkRmllbGQodmFsdWUpKSB7XG4gICAgICAvLyBjb252ZXJzaW9uIFBhZ2UuUGFnZUxpc3RbXS5wcm9wZXJ0eSA9PiBQYWdlLlBhZ2VMaXN0LnByb3BlcnR5XG4gICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJ1snKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5pbmRleE9mKCdbJykpICsgdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJ10nKSArIDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWV0YSA9IFBDb3JlLmdldE1ldGFkYXRhVXRpbHMoKS5nZXRFbWJlZGRlZFByb3BlcnR5TWV0YWRhdGEodmFsdWUsIGNsYXNzSUQpO1xuICAgICAgbWV0YS5maWVsZElEID0gZmllbGQ7XG4gICAgICBjb25maWdFbWJlZGRlZEZpZWxkc01ldGEucHVzaChtZXRhKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhO1xufVxuXG4vKipcbiAqIFttZXJnZUNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgIEdldCB0aGUgbWV0YWRhdGEgZm9yIGNvbmZpZ3VyZWQgZW1iZWRkZWQgZmllbGRzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge0FycmF5fSBjb25maWdFbWJlZGRlZEZpZWxkc01ldGEgIGNvbmZpZyBmaWVsZHMgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRhRmllbGRzICBGaWVsZHMgbWV0YWRhdGEgQXJyYXkuIENvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCB0aGUgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdFbWJlZGRlZEZpZWxkc01ldGEsIG1ldGFGaWVsZHMpIHtcbiAgY29uc3QgbWVyZ2VkTWV0YUZpZWxkcyA9IFsuLi5tZXRhRmllbGRzXTtcbiAgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLmZvckVhY2goY29uZmlnRmllbGRNZXRhID0+IHtcbiAgICBjb25zdCBmaWVsZE1ldGEgPSBtZXRhRmllbGRzLmZpbmQobWV0YUZpZWxkID0+IG1ldGFGaWVsZC5maWVsZElEID09PSBjb25maWdGaWVsZE1ldGEuZmllbGRJRCk7XG4gICAgaWYgKCFmaWVsZE1ldGEpIG1lcmdlZE1ldGFGaWVsZHMucHVzaChjb25maWdGaWVsZE1ldGEpO1xuICB9KTtcbiAgcmV0dXJuIG1lcmdlZE1ldGFGaWVsZHM7XG59XG5cbmNvbnN0IG9sZFRvTmV3RmllbGRUeXBlTWFwcGluZyA9IHtcbiAgJ0RhdGUgVGltZSc6ICdEYXRlICYgdGltZScsXG4gIERhdGU6ICdEYXRlIG9ubHknXG59O1xuXG4vKipcbiAqIFt1cGRhdGVGaWVsZFR5cGVdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBVcGRhdGVzIHRoZSBmaWVsZCB0eXBlIGlmIGl0cyBjaGFuZ2VkIGluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24uIFN1Y2ggbWFwcGluZyBpcyBtYWludGFpbmVkIGluIG9sZFRvTmV3RmllbGRUeXBlTWFwcGluZy5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7QXJyYXl9IG1ldGFGaWVsZHMgIEZpZWxkcyBtZXRhZGF0YSBBcnJheS4gQ29udGFpbnMgbWV0YWRhdGEgb2YgYWxsIHRoZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUZpZWxkVHlwZShtZXRhRmllbGRzKSB7XG4gIG1ldGFGaWVsZHMuZm9yRWFjaChtZXRhRmllbGQgPT4ge1xuICAgIGlmIChtZXRhRmllbGQudHlwZSkgbWV0YUZpZWxkLnR5cGUgPSBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmdbbWV0YUZpZWxkLnR5cGVdIHx8IG1ldGFGaWVsZC50eXBlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShhdHRyaWJ1dGUpIHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgY29uZmlnOiB7IGxhYmVsLCB2YWx1ZSB9XG4gIH0gPSBhdHRyaWJ1dGU7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICBuYW1lOiB2YWx1ZS5zdGFydHNXaXRoKCdAJykgPyB2YWx1ZS5zdWJzdHJpbmcoNCkgOiB2YWx1ZSxcbiAgICBsYWJlbDogbGFiZWwuc3RhcnRzV2l0aCgnQCcpID8gbGFiZWwuc3Vic3RyaW5nKDMpIDogbGFiZWxcbiAgfTtcbn1cblxuLyoqXG4gKiBbZ2VuZXJhdGVWaWV3TWV0YURhdGFdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgYSBsaXN0IG9mICBtZXRhb2JqZWN0cyBvZiB0aGUgZmllbGRzIHByb3ZpZGVkLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIHJhd0ZpZWxkcyAgICAgICAgIExpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZSBtZXRhIGZvclxuICogQHBhcmFtICAge3N0cmluZ30gIGNsYXNzSUQgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZmllbGRzIHdpdGggdXBkYXRlZCBtZXRhIG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVmlld01ldGFEYXRhKHJhd0ZpZWxkcywgY2xhc3NJRCwgc2hvd0ZpZWxkKSB7XG4gIHJldHVybiByYXdGaWVsZHMubWFwKGl0ZW0gPT4gZ2V0RGVmYXVsdFZpZXdNZXRhKGl0ZW0sIGNsYXNzSUQsIHNob3dGaWVsZCkpO1xufVxuXG4vKipcbiAqIFtnZXRDb25maWdGaWVsZHNdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgbGlzdCBvZiBjb25maWcgZmllbGRzIHdpdGggcHJpbWFyeSBmaWVsZHMgbWV0YSB1cGRhdGVkLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyAgICAgIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgcHJpbWFyeUZpZWxkcyAgICAgTGlzdCBvZiBQcmltYXJ5IEZpZWxkc1xuICogQHBhcmFtICAge0FycmF5fSAgIG1ldGFGaWVsZHMgICAgICAgIE1ldGFkYXRhIG9mIGFsbCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgICBDbGFzcyBJRCBmcm9tIHRoZSByZXNwb25zZVxuICogQHJldHVybnMge0FycmF5fSAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIHRoZWlyIG1ldGEgdXBkYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29uZmlnRmllbGRzKGNvbmZpZ0ZpZWxkcywgcHJpbWFyeUZpZWxkcywgbWV0YUZpZWxkcywgY2xhc3NJRCkge1xuICBjb25zdCBwcmVzZXRDb25maWdGaWVsZHMgPSBjb25maWdGaWVsZHM7XG4gIGNvbnN0IHByaW1hcnlGaWVsZHNWaWV3SW5kZXggPSBwcmVzZXRDb25maWdGaWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmNvbmZpZy52YWx1ZSA9PT0gJ3B5UHJpbWFyeUZpZWxkcycpO1xuICBpZiAoIXByaW1hcnlGaWVsZHMgfHwgIXByaW1hcnlGaWVsZHMubGVuZ3RoKSB7XG4gICAgaWYgKHByaW1hcnlGaWVsZHNWaWV3SW5kZXggPCAwKSByZXR1cm4gcHJlc2V0Q29uZmlnRmllbGRzO1xuXG4gICAgcHJlc2V0Q29uZmlnRmllbGRzLnNwbGljZShwcmltYXJ5RmllbGRzVmlld0luZGV4LCAxKTtcblxuICAgIHJldHVybiBwcmVzZXRDb25maWdGaWVsZHM7XG4gIH1cblxuICBpZiAocHJpbWFyeUZpZWxkc1ZpZXdJbmRleCA+IC0xKSB7XG4gICAgLy8gbGlzdCBvZiB1bmNvbW1vbiBmaWVsZHMgLSBub24gb3ZlcmxhcCBvZiBwcmltYXJ5IGZpZWxkcyBncm91cGVkIHZpZXcgYW5kIGluZGVwZW5kZW50IGVudGl0eSBjb2x1bW5zIG9mIHByaW1hcnkgdHlwZVxuICAgIGNvbnN0IHVuY29tbW9uRmllbGRzTGlzdCA9IHByaW1hcnlGaWVsZHMuZmlsdGVyKFxuICAgICAgcHJpbWFyeUZpZWxkID0+ICFwcmVzZXRDb25maWdGaWVsZHMuc29tZShwcmVzZXRDb25maWdGaWVsZCA9PiBwcmVzZXRDb25maWdGaWVsZC5jb25maWcudmFsdWUuc3BsaXQoJy4nKVsxXSA9PT0gcHJpbWFyeUZpZWxkKVxuICAgICk7XG4gICAgY29uc3QgdW5jb21tb25GaWVsZHNSYXdNZXRhOiBhbnlbXSA9IFtdO1xuICAgIHVuY29tbW9uRmllbGRzTGlzdC5mb3JFYWNoKHVuY29tbW9uRmllbGQgPT4ge1xuICAgICAgY29uc3QgdW5jb21tb25GaWVsZE1ldGEgPSBtZXRhRmllbGRzLmZpbmQobWV0YUZpZWxkID0+IG1ldGFGaWVsZC5maWVsZElEID09PSB1bmNvbW1vbkZpZWxkKTtcbiAgICAgIGlmICh1bmNvbW1vbkZpZWxkTWV0YSkgdW5jb21tb25GaWVsZHNSYXdNZXRhLnB1c2godW5jb21tb25GaWVsZE1ldGEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuY29tbW9uRmllbGRzQ29uZmlnTWV0YSA9IGdlbmVyYXRlVmlld01ldGFEYXRhKHVuY29tbW9uRmllbGRzUmF3TWV0YSwgY2xhc3NJRCwgdHJ1ZSk7XG5cbiAgICBwcmVzZXRDb25maWdGaWVsZHMuc3BsaWNlKHByaW1hcnlGaWVsZHNWaWV3SW5kZXgsIDEsIC4uLnVuY29tbW9uRmllbGRzQ29uZmlnTWV0YSk7XG4gIH1cbiAgcmV0dXJuIHByZXNldENvbmZpZ0ZpZWxkcztcbn1cblxuLyoqXG4gKiBbZ2V0VGFibGVDb25maWdGcm9tUHJlc2V0TWV0YV1cbiAqIERlc2NyaXB0aW9uIC0gR2V0IHRoZSB0YWJsZSBjb25maWcgZnJvbSB0aGUgcHJlc2V0cyBtZXRhLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge29iamVjdH0gICAgcHJlc2V0TWV0YSAgICAgICAgICBQcmVzZXRzIG1ldGFcbiAqIEBwYXJhbSAgIHtib29sZWFufSAgIGlzTWV0YVdpdGhQcmVzZXRzICAgdHJ1ZSBpZiBtZXRhIGhhcyBwcmVzZXRzIGVsc2UgZmFsc2VcbiAqIEBwYXJhbSAgIHtGdW5jdGlvbn0gIGdldFBDb25uZWN0ICAgICAgICAgQ2FsbGJhY2sgdG8gZ2V0IHRoZSBQQ29ubmVjdCBvYmplY3RcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgIGNsYXNzSUQgICAgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgIHByaW1hcnlGaWVsZHMgICAgICAgTGlzdCBvZiBQcmltYXJ5IEZpZWxkc1xuICogQHBhcmFtICAge0FycmF5fSAgICAgbWV0YUZpZWxkcyAgICAgICAgICBMaXN0IG9mIGFsbCBtZXRhZmllbGRzXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIGNvbmZpZyBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29uZmlnRnJvbVByZXNldE1ldGEocHJlc2V0TWV0YSwgaXNNZXRhV2l0aFByZXNldHMsIHBDb25uJCwgY2xhc3NJRCwgcHJpbWFyeUZpZWxkcywgbWV0YUZpZWxkcykge1xuICBsZXQgcHJlc2V0SWQ7XG4gIGxldCBwcmVzZXROYW1lO1xuICBsZXQgY2FyZEhlYWRlcjtcbiAgbGV0IHNlY29uZGFyeVRleHQ7XG4gIGxldCB0aW1lbGluZURhdGU7XG4gIGxldCB0aW1lbGluZVRpdGxlO1xuICBsZXQgdGltZWxpbmVTdGF0dXM7XG4gIGxldCB0aW1lbGluZUljb247XG4gIGxldCB7IGZpbHRlckV4cHJlc3Npb24gfSA9IHBDb25uJC5nZXRSYXdNZXRhZGF0YSgpLmNvbmZpZztcbiAgbGV0IGZpZWxkc01ldGE7XG4gIGxldCBjb25maWdGaWVsZHM7XG4gIGlmIChpc01ldGFXaXRoUHJlc2V0cykge1xuICAgIHByZXNldElkID0gcHJlc2V0TWV0YS5pZDtcbiAgICBwcmVzZXROYW1lID0gcHJlc2V0TWV0YS5sYWJlbDtcbiAgICBjYXJkSGVhZGVyID0gcHJlc2V0TWV0YS5jYXJkSGVhZGVyICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS5jYXJkSGVhZGVyKTtcbiAgICBzZWNvbmRhcnlUZXh0ID0gcHJlc2V0TWV0YS5zZWNvbmRhcnlUZXh0ICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS5zZWNvbmRhcnlUZXh0KTtcbiAgICB0aW1lbGluZURhdGUgPSBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEudGltZWxpbmVEYXRlKTtcbiAgICB0aW1lbGluZVRpdGxlID0gcHJlc2V0TWV0YS50aW1lbGluZVRpdGxlICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS50aW1lbGluZVRpdGxlKTtcbiAgICB0aW1lbGluZVN0YXR1cyA9IHByZXNldE1ldGEudGltZWxpbmVTdGF0dXMgJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lU3RhdHVzKTtcbiAgICB0aW1lbGluZUljb24gPSBwcmVzZXRNZXRhLnRpbWVsaW5lSWNvbiAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEudGltZWxpbmVJY29uKTtcbiAgICBmaWx0ZXJFeHByZXNzaW9uID0gcHJlc2V0TWV0YS5jb25maWcuZmlsdGVyRXhwcmVzc2lvbjtcbiAgICBbZmllbGRzTWV0YV0gPSBwcmVzZXRNZXRhLmNoaWxkcmVuO1xuICAgIGlmIChcbiAgICAgIHByZXNldE1ldGEudGltZWxpbmVUaXRsZSAmJlxuICAgICAgIWZpZWxkc01ldGEuY2hpbGRyZW4uZmluZChmaWVsZE1ldGEgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGRNZXRhPy5jb25maWc/LnZhbHVlID09PSBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGU/LmNvbmZpZz8udmFsdWU7XG4gICAgICB9KVxuICAgICkge1xuICAgICAgY29uc3QgeyB0eXBlLCBjb25maWcgfSA9IHByZXNldE1ldGEudGltZWxpbmVUaXRsZTtcbiAgICAgIGZpZWxkc01ldGEuY2hpbGRyZW4ucHVzaCh7IHR5cGUsIGNvbmZpZzogeyAuLi5jb25maWcsIHNob3c6IGZhbHNlIH0gfSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHByZXNldE1ldGEudGltZWxpbmVEYXRlICYmXG4gICAgICAhZmllbGRzTWV0YS5jaGlsZHJlbi5maW5kKGZpZWxkTWV0YSA9PiB7XG4gICAgICAgIHJldHVybiBmaWVsZE1ldGE/LmNvbmZpZz8udmFsdWUgPT09IHByZXNldE1ldGEudGltZWxpbmVEYXRlPy5jb25maWc/LnZhbHVlO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgY29uZmlnIH0gPSBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZTtcbiAgICAgIGZpZWxkc01ldGEuY2hpbGRyZW4ucHVzaCh7IHR5cGUsIGNvbmZpZzogeyAuLi5jb25maWcsIHNob3c6IGZhbHNlIH0gfSk7XG4gICAgfVxuICAgIGNvbmZpZ0ZpZWxkcyA9IGdldENvbmZpZ0ZpZWxkcyhmaWVsZHNNZXRhLmNoaWxkcmVuLCBwcmltYXJ5RmllbGRzLCBtZXRhRmllbGRzLCBjbGFzc0lEKTtcbiAgfSBlbHNlIHtcbiAgICBmaWVsZHNNZXRhID0gcHJlc2V0TWV0YS5wcm9wcztcbiAgICBjb25maWdGaWVsZHMgPSBnZXRDb25maWdGaWVsZHMoXG4gICAgICBmaWVsZHNNZXRhXG4gICAgICAgIC5nZXRQQ29ubmVjdCgpXG4gICAgICAgIC5nZXRDaGlsZHJlbigpXG4gICAgICAgID8ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQuZ2V0UENvbm5lY3QoKS5nZXRSYXdNZXRhZGF0YSgpO1xuICAgICAgICB9KSxcbiAgICAgIHByaW1hcnlGaWVsZHMsXG4gICAgICBtZXRhRmllbGRzLFxuICAgICAgY2xhc3NJRFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcmVzZXRJZCxcbiAgICBwcmVzZXROYW1lLFxuICAgIGNhcmRIZWFkZXIsXG4gICAgc2Vjb25kYXJ5VGV4dCxcbiAgICB0aW1lbGluZURhdGUsXG4gICAgdGltZWxpbmVUaXRsZSxcbiAgICB0aW1lbGluZVN0YXR1cyxcbiAgICB0aW1lbGluZUljb24sXG4gICAgZmlsdGVyRXhwcmVzc2lvbixcbiAgICBmaWVsZHNNZXRhLFxuICAgIGNvbmZpZ0ZpZWxkc1xuICB9O1xufVxuXG4vKipcbiAqIFtnZXRSZXBvcnRDb2x1bW5zXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGEgc2V0IG9mIGNvbHVtbnMgZnJvbSB0aGUgcmVwb3J0IHJlc3BvbnNlLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge29iamVjdH0gcmVzcG9uc2UgLVxuICogQHJldHVybnMge1NldH0gU2V0IG9mIGNvbHVtbnMgZnJvbSB0aGUgcmVwb3J0IHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGdldFJlcG9ydENvbHVtbnMocmVzcG9uc2UpIHtcbiAgY29uc3Qge1xuICAgIGRhdGE6IHsgZGF0YTogcmVwb3J0Q29sdW1ucyB9XG4gIH0gPSByZXNwb25zZTtcbiAgY29uc3QgcmVwb3J0Q29sdW1uc1NldCA9IG5ldyBTZXQoKTtcbiAgcmVwb3J0Q29sdW1ucz8uZm9yRWFjaChpdGVtID0+IHtcbiAgICBsZXQgdmFsID0gaXRlbS5weUZpZWxkTmFtZTtcbiAgICAvLyBSZW1vdmUgJy4nIGZyb20gaW5kZXggMCBvbmx5LCBpZiAnLicgaXMgcHJlc2VudFxuICAgIGlmICh2YWxbMF0gPT09ICcuJykge1xuICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmVwb3J0Q29sdW1uc1NldC5hZGQodmFsKTtcbiAgfSk7XG4gIHJldHVybiByZXBvcnRDb2x1bW5zU2V0O1xufVxuXG4vKipcbiAqIFtnZXRDb25maWdGaWVsZFZhbHVlXVxuICogRGVzY3JpdHBpb24gLSBSZXR1cm5zIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBmaWVsZC4gUmVtb3ZlIGFueSBhbm5vdGF0aW9ucyBhbmQgYWxzbyBcIi5cIlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge29iamVjdH0gY29uZmlnXG4gKiAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWUgLSBSYXcgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgd2l0aCBvdXQgYW55IGFubm90YXRpb25zIG9yIFwiLlwiXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0ZpZWxkVmFsdWUoY29uZmlnKSB7XG4gIGxldCB7IHZhbHVlIH0gPSBjb25maWc7XG4gIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICBpZiAodmFsdWVbMF0gPT09ICcuJykgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFtwcmVwYXJlQ29uZmlnRmllbGRzXVxuICogRGVzY3JpcHRpb24gLSBQcmVwYXJlcyBhIHNldCBvZiBjb25maWd1cmF0aW9uIGZpZWxkcyBhbmQgcHVzaGVzIGVhY2ggY29uZmlnIHR5cGUgdG8gYSBzZXQgdXNpbmcgdGhlIGNhbGxiYWNrIHBhcmFtZXRlci5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgIGNvbmZpZ0ZpZWxkcyAgICAgICAgICBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge0Z1bmN0aW9ufSAgcHVzaFRvQ29tcG9uZW50c0xpc3QgQ2FsbGJhY2sgdG8gcHVzaCB0aGUgZmllbGQgdHlwZSB0byBhIHNldC5cbiAqIEByZXR1cm5zIHtTZXR9ICAgICAgIGNvbmZpZ0ZpZWxkU2V0XG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVDb25maWdGaWVsZHMoY29uZmlnRmllbGRzLCBwdXNoVG9Db21wb25lbnRzTGlzdCkge1xuICBjb25zdCBjb25maWdGaWVsZFNldCA9IG5ldyBTZXQoKTtcbiAgY29uZmlnRmllbGRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgcHVzaFRvQ29tcG9uZW50c0xpc3QoaXRlbS50eXBlKTtcbiAgICBjb25zdCB2YWwgPSBnZXRDb25maWdGaWVsZFZhbHVlKGl0ZW0uY29uZmlnKTtcbiAgICBjb25maWdGaWVsZFNldC5hZGQodmFsKTtcbiAgfSk7XG4gIHJldHVybiBjb25maWdGaWVsZFNldDtcbn1cblxuLyoqXG4gKiBbZmluZEF1dGhvcmVkRmllbGRdXG4gKiBEZXNjcmlwdGlvbiAtIEZpbmRzIGFuIGF1dGhvcmVkIGZpZWxkIGZyb20geWhlIGxpc3Qgb2YgY29uZmlnIGZpZWxkcy5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBjb25maWdGaWVsZHMgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBmaWVsZElEICAgICAgRmlsdGVyXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAgICAgICAgICAgICAgY29uZmlnIHdpdGggaXRzIGZpZWxkIHZhbHVlIGVxdWFsIHRvIGZpZWxkSUQsIHdoaWNoIG1lYW5zIGFuIGF1dGhvcmVkIGZpZWxkXG4gKi9cbmZ1bmN0aW9uIGZpbmRBdXRob3JlZEZpZWxkKGNvbmZpZ0ZpZWxkcywgZmllbGRJRCkge1xuICByZXR1cm4gY29uZmlnRmllbGRzLmZpbmQoY29uZmlnRmllbGQgPT4ge1xuICAgIGNvbnN0IHZhbCA9IGdldENvbmZpZ0ZpZWxkVmFsdWUoY29uZmlnRmllbGQuY29uZmlnKTtcbiAgICByZXR1cm4gdmFsID09PSBmaWVsZElEO1xuICB9KTtcbn1cblxuLyoqXG4gKiBbZmluZEFuZFVwZGF0ZUF1dGhvcmVkRmllbGRDb25maWddXG4gKiBEZXNjcmlwdGlvbiAtIEZpbmQgdGhlIGF1dGhvcmVkIGZpZWxkLCBhbmQgdXBkYXRlIGl0cyBjb25maWcuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgaXRlbSAgICAgICAgRmllbGQgaXRlbSB0byBjb3B5IGRpc3BsYXlBcyBhbmQgY2F0ZWdvcnkgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lkICAgICBjbGFzc0lEIGZyb20gdGhlIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmRVcGRhdGVBdXRob3JlZEZpZWxkQ29uZmlnKGNvbmZpZ0ZpZWxkcywgaXRlbSwgY2xhc3NJZCkge1xuICBjb25zdCBhdXRob3JlZEZpZWxkID0gZmluZEF1dGhvcmVkRmllbGQoY29uZmlnRmllbGRzLCBpdGVtLmZpZWxkSUQpO1xuICBpZiAoYXV0aG9yZWRGaWVsZD8uY29uZmlnKSB7XG4gICAgaWYgKGl0ZW0uZGlzcGxheUFzKSB7XG4gICAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5kaXNwbGF5QXMgPSBpdGVtLmRpc3BsYXlBcztcbiAgICB9XG4gICAgYXV0aG9yZWRGaWVsZC5jb25maWcuY2xhc3NJRCA9IGl0ZW0uY2xhc3NJRCA/PyBjbGFzc0lkO1xuXG4gICAgaWYgKGF1dGhvcmVkRmllbGQudHlwZSA9PT0gVVNFUl9SRUZFUkVOQ0UpIHtcbiAgICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLmFzc29jaWF0aW9uSUQgPSBpdGVtLmFzc29jaWF0aW9uSUQgfHwgaXRlbS5maWVsZElEO1xuICAgIH1cbiAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5jYXRlZ29yeSA9IGl0ZW0uY2F0ZWdvcnk7XG4gICAgLy8gRmllbGRUeXBlIGlkZW50aWZpZXMgd2hldGhlciB0aGUgZmllbGQgaXMgY29uZmlndXJlZCBhcyBwaWNrTGlzdFxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLmZpZWxkVHlwZSA9IGl0ZW0uZmllbGRUeXBlO1xuICAgIC8vIHR5cGUgZGVmaW5lZCBvbiB0aGUgcHJvcGVydHkgcnVsZSxcbiAgICAvLyB1c2VkIGZvciB0aGUgcGlja2xpc3QgZmllbGQgdG8gYXNzaWduIHRoZSBhcHByb3ByaWF0ZSB0eXBlXG4gICAgYXV0aG9yZWRGaWVsZC5jb25maWcucHJvcGVydHlUeXBlID0gaXRlbS5kYXRhVHlwZSB8fCBpdGVtLnR5cGU7XG4gIH1cbn1cblxuLyoqXG4gKiBbaXNBbkV4dHJhRmllbGRdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgYW4gZXh0cmEgZmllbGQuIEV4dHJhIGZpZWxkIGlzIHRoZSBvbmUgd2hpY2ggaXMgbm90IGF1dGhvcmVkIGJ1dCBwYXJ0IG9mIHRoZSByZXBvcnQuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtTZXR9ICAgICBjb25maWdGaWVsZFNldCAgICBTZXQgaWYgQXV0aG9yZWQgZmlsZWQgdmFsdWVzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgcmVwb3J0Q29sdW1uc1NldCBTZXQgb2YgY29sdW1ucyBmcm9tIHRoZSByZXBvcnRcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICBpdGVtICAgICAgICAgICAgIENvbmZpZyBmaWVsZCBpdGVtXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJZCAgICAgICAgICBDbGFzcyBJRCBmcm9tIHRoZSByZXNwb25zZVxuICogQHBhcmFtICAge2Jvb2xlYW59IHNob3dEeW5hbWljRmllbGRzIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGZpZWxkcyBhcmUgZmV0Y2hlZCBkeW5hbWljYWxseSBhdCBydW50aW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICB0cnVlIElmIHRoZSBmaWVsZCBpcyBhbiBleHRyYSBmaWVsZCBlbHNlIGZhbHNlLlxuICovXG5mdW5jdGlvbiBpc0FuRXh0cmFGaWVsZChjb25maWdGaWVsZHMsIGNvbmZpZ0ZpZWxkU2V0LCByZXBvcnRDb2x1bW5zU2V0LCBpdGVtLCBjbGFzc0lkLCBzaG93RHluYW1pY0ZpZWxkcykge1xuICAvLyBJcyB0aGUgZmllbGQgYWxyZWFkeSBwcmVzZW50IGluIGF1dGhvcmluZyBtZXRhZGF0YT9cbiAgLy8gTXV0YXRlcyBjb25maWcgZmllbGRzIHRvIGNvcHkgZGlzcGxheUFzIGFuZCBjYXRlZ29yeSBpbmZvcm1hdGlvblxuICBpZiAoY29uZmlnRmllbGRTZXQuaGFzKGl0ZW0uZmllbGRJRCkpIHtcbiAgICBmaW5kQW5kVXBkYXRlQXV0aG9yZWRGaWVsZENvbmZpZyhjb25maWdGaWVsZHMsIGl0ZW0sIGNsYXNzSWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIElmIGZpZWxkIGlzIG5vdCBhdXRob3JlZCBhbmQgbm90IHBhcnQgb2YgcmVwb3J0IGNvbHVtbnMgdGhlbiBkaXNjYXJkIGl0XG4gIHJldHVybiBzaG93RHluYW1pY0ZpZWxkcyB8fCAhIXJlcG9ydENvbHVtbnNTZXQuaGFzKGl0ZW0uZmllbGRJRCk7XG59XG5cbi8qKlxuICogW3ByZXBhcmVFeHRyYUZpZWxkc11cbiAqIERlc2NyaXB0aW9uIC0gUmV0dXJucyBhIGxpc3Qgb2YgZXh0cmEgZmllbGRzIHdpdGggdGhlaXIgbWV0YSB1cGRhdGVkLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIG1ldGFGaWVsZHMgICAgICAgTGlzdCBvZiBmaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBjb25maWdGaWVsZHMgICAgICBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge1NldH0gICAgIGNvbmZpZ0ZpZWxkU2V0ICAgIFNldCBpZiBBdXRob3JlZCBmaWxlZCB2YWx1ZXNcbiAqIEBwYXJhbSAgIHtTZXR9ICAgICByZXBvcnRDb2x1bW5zU2V0IFNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydFxuICogQHBhcmFtICAge3N0cmluZ30gIGNsYXNzSUQgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSAgIHtib29sZWFufSBzaG93RHluYW1pY0ZpZWxkcyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBmaWVsZHMgYXJlIGZldGNoZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZVxuICogQHJldHVybnMge0FycmF5fSAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBleHRyYSBmaWVsZHMgd2l0aCB0aGVpciBtZXRhIHVwZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVFeHRyYUZpZWxkcyhtZXRhRmllbGRzLCBjb25maWdGaWVsZHMsIGNvbmZpZ0ZpZWxkU2V0LCByZXBvcnRDb2x1bW5zU2V0LCBjbGFzc0lELCBzaG93RHluYW1pY0ZpZWxkcykge1xuICAvLyBGaWx0ZXIgYWxsIHRoZSBleHRyYSBmaWVsZHNcbiAgY29uc3QgZXh0cmFGaWxlZHMgPSBtZXRhRmllbGRzLmZpbHRlcihpdGVtID0+IHtcbiAgICByZXR1cm4gaXNBbkV4dHJhRmllbGQoY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgaXRlbSwgY2xhc3NJRCwgc2hvd0R5bmFtaWNGaWVsZHMpO1xuICB9KTtcbiAgcmV0dXJuIGdlbmVyYXRlVmlld01ldGFEYXRhKGV4dHJhRmlsZWRzLCBjbGFzc0lELCBmYWxzZSk7XG4gIC8vIFVwZGF0ZSB0aGUgbWV0YSBvYmplY3Qgb2YgZWFjaCBvZiB0aGUgZXh0cmEgZmllbGRzLlxufVxuXG5jb25zdCBBc3NpZ25EYXNoT2JqZWN0cyA9IFsnQXNzaWduLVdvcmtsaXN0JywgJ0Fzc2lnbi1Xb3JrQmFza2V0J107XG5cbmZ1bmN0aW9uIHBvcHVsYXRlUmVuZGVyaW5nT3B0aW9ucyhuYW1lLCBjb25maWcsIGZpZWxkKSB7XG4gIGNvbnN0IHNob3VsZERpc3BsYXlBc1NlbWFudGljTGluayA9ICdkaXNwbGF5QXNMaW5rJyBpbiBmaWVsZC5jb25maWcgJiYgZmllbGQuY29uZmlnLmRpc3BsYXlBc0xpbms7XG4gIGlmIChzaG91bGREaXNwbGF5QXNTZW1hbnRpY0xpbmspIHtcbiAgICBjb25maWcuY3VzdG9tT2JqZWN0LmlzQXNzaWdubWVudExpbmsgPSBBc3NpZ25EYXNoT2JqZWN0cy5pbmNsdWRlcyhmaWVsZC5jb25maWcuY2xhc3NJRCk7XG4gICAgaWYgKGZpZWxkLmNvbmZpZy52YWx1ZS5zdGFydHNXaXRoKCdAQ0EnKSkge1xuICAgICAgY29uZmlnLmN1c3RvbU9iamVjdC5pc0Fzc29jaWF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uZmlnLmNlbGxSZW5kZXJlciA9IGZvcm1hdENvbnN0YW50cy5Xb3JrTGluaztcbiAgfSBlbHNlIGlmIChuYW1lID09PSAncHlTdGF0dXNXb3JrJyB8fCBuYW1lID09PSAncHlBc3NpZ25tZW50U3RhdHVzJykge1xuICAgIGNvbmZpZy5jZWxsUmVuZGVyZXIgPSBmb3JtYXRDb25zdGFudHMuV29ya1N0YXR1cztcbiAgfSBlbHNlIGlmIChuYW1lID09PSAncHhVcmdlbmN5V29yaycpIHtcbiAgICBjb25maWcuY2VsbFJlbmRlcmVyID0gZm9ybWF0Q29uc3RhbnRzLkludGVnZXI7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29sdW1ucyhmaWVsZHM6IGFueVtdID0gW10sIGdldE1hcHBlZFByb3BlcnR5OiBhbnkgPSBudWxsKSB7XG4gIHJldHVybiBmaWVsZHMubWFwKChmaWVsZCwgb3JpZ2luYWxDb2xJbmRleCkgPT4ge1xuICAgIGxldCBuYW1lID0gZmllbGQuY29uZmlnLnZhbHVlO1xuXG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5pbmRleE9mKCcgJykgKyAxKTtcbiAgICAgIGlmIChuYW1lWzBdID09PSAnLicpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgbmFtZSA9IGdldE1hcHBlZFByb3BlcnR5Py4obmFtZSkgPz8gbmFtZTtcblxuICAgIGxldCBsYWJlbCA9IGZpZWxkLmNvbmZpZy5sYWJlbCB8fCBmaWVsZC5jb25maWcuY2FwdGlvbjtcbiAgICBjb25zdCB7IHNob3cgPSB0cnVlLCBkaXNwbGF5QXMgfSA9IGZpZWxkLmNvbmZpZztcbiAgICBpZiAobGFiZWwuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBsYWJlbCA9IGxhYmVsLnN1YnN0cmluZygzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAgbGFiZWwsXG4gICAgICBzaG93LFxuICAgICAgY2xhc3NJRDogZmllbGQuY29uZmlnLmNsYXNzSUQsXG4gICAgICBpZDogZmllbGQuaWQgfHwgbmFtZSB8fCBvcmlnaW5hbENvbEluZGV4LFxuICAgICAgZGlzcGxheUFzLFxuICAgICAgYXNzb2NpYXRpb25JRDogZmllbGQuY29uZmlnLmFzc29jaWF0aW9uSUQsXG4gICAgICAuLi4oZmllbGQuY29uZmlnLmNsYXNzSUQgJiYgeyBjYXRlZ29yeTogZmllbGQuY29uZmlnLmNhdGVnb3J5IH0pLFxuICAgICAgY3VzdG9tT2JqZWN0OiB7fSxcbiAgICAgIGZpZWxkVHlwZTogZmllbGQuY29uZmlnLmZpZWxkVHlwZSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4uZmllbGRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcG9wdWxhdGVSZW5kZXJpbmdPcHRpb25zKG5hbWUsIGNvbmZpZywgZmllbGQpO1xuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRJdGVtS2V5ID0gZmllbGRzID0+IHtcbiAgbGV0IGl0ZW1LZXk7XG4gIGlmIChmaWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmlkID09PSAncHlHVUlEJykgPiAtMSkge1xuICAgIGl0ZW1LZXkgPSAncHlHVUlEJztcbiAgfSBlbHNlIHtcbiAgICBpdGVtS2V5ID0gJ3B6SW5zS2V5JztcbiAgfVxuICByZXR1cm4gaXRlbUtleTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUGF0Y2hRdWVyeUZpZWxkcyhmaWVsZHMsIGlzRGF0YU9iamVjdCA9IGZhbHNlLCBjbGFzc0lEID0gJycpIHtcbiAgY29uc3QgcXVlcnlGaWVsZHM6IGFueVtdID0gW107XG4gIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBjb25zdCBwYXRjaEZpZWxkczogYW55W10gPSBbXTtcbiAgICBpZiAoZmllbGQuY2VsbFJlbmRlcmVyID09PSAnV29ya0xpbmsnKSB7XG4gICAgICBpZiAoZmllbGQuY3VzdG9tT2JqZWN0ICYmIGZpZWxkLmN1c3RvbU9iamVjdC5pc0Fzc2lnbm1lbnRMaW5rKSB7XG4gICAgICAgIGNvbnN0IGFzc29jaWF0aW9uTmFtZSA9IGZpZWxkLm5hbWUuaW5jbHVkZXMoJzonKSA/IGAke2ZpZWxkLm5hbWUuc3BsaXQoJzonKVswXX06YCA6ICcnO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKGAke2Fzc29jaWF0aW9uTmFtZX1wekluc0tleWApO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKGAke2Fzc29jaWF0aW9uTmFtZX1weFJlZk9iamVjdENsYXNzYCk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLmN1c3RvbU9iamVjdCAmJiBmaWVsZC5jdXN0b21PYmplY3QuaXNBc3NvY2lhdGlvbikge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbkNhdGVnb3J5ID0gZmllbGQubmFtZS5zcGxpdCgnOicpWzBdO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKGAke2Fzc29jaWF0aW9uQ2F0ZWdvcnl9OnB5SURgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpwekluc0tleWApO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKGAke2Fzc29jaWF0aW9uQ2F0ZWdvcnl9OnB4T2JqQ2xhc3NgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEYXRhT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3TmFtZSA9IFBDb3JlLmdldERhdGFUeXBlVXRpbHMoKS5nZXRTYXZhYmxlRGF0YVBhZ2UoY2xhc3NJRCk7XG4gICAgICAgIGNvbnN0IGRhdGFQYWdlS2V5cyA9IFBDb3JlLmdldERhdGFUeXBlVXRpbHMoKS5nZXREYXRhUGFnZUtleXMoZGF0YVZpZXdOYW1lKTtcbiAgICAgICAgZGF0YVBhZ2VLZXlzPy5mb3JFYWNoKGl0ZW0gPT4gKGl0ZW0uaXNBbHRlcm5hdGVLZXlTdG9yYWdlID8gcGF0Y2hGaWVsZHMucHVzaChpdGVtLmxpbmtlZEZpZWxkKSA6IHBhdGNoRmllbGRzLnB1c2goaXRlbS5rZXlOYW1lKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHlJRCcpO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKCdwekluc0tleScpO1xuICAgICAgICBwYXRjaEZpZWxkcy5wdXNoKCdweE9iakNsYXNzJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHBhdGNoRmllbGRzLmZvckVhY2goayA9PiB7XG4gICAgICBpZiAoIXF1ZXJ5RmllbGRzLmZpbmQocSA9PiBxID09PSBrKSkge1xuICAgICAgICBxdWVyeUZpZWxkcy5wdXNoKGspO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gcXVlcnlGaWVsZHM7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGUgcHJvcGVydGllcyBvZiB0eXBlIFBhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQYWdlRmllbGRzQ29uZmlnKGNvbmZpZ0ZpZWxkcywgcGFyZW50Q2xhc3NJRCkge1xuICByZXR1cm4gY29uZmlnRmllbGRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIGNvbmZpZzogeyB2YWx1ZSB9XG4gICAgfSA9IGl0ZW07XG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gUENvcmUuZ2V0QW5ub3RhdGlvblV0aWxzKCkuZ2V0UHJvcGVydHlOYW1lKHZhbHVlKTtcbiAgICBpZiAoaXNFbWJlZGRlZEZpZWxkKHZhbHVlKSAmJiAhaXNQYWdlTGlzdEluUGF0aChwcm9wZXJ0eU5hbWUsIHBhcmVudENsYXNzSUQpKSB7XG4gICAgICBpdGVtLmNvbmZpZy5jb21wb25lbnRUeXBlID0gdHlwZTtcbiAgICAgIGl0ZW0udHlwZSA9ICdQYWdlUHJvcGVydHlSZW5kZXJlcic7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlYWRDb250ZXh0UmVzcG9uc2UgPSBhc3luYyAoY29udGV4dCwgcGFyYW1zKSA9PiB7XG4gIGNvbnN0IHsgcENvbm4kLCBhcGlDb250ZXh0LCBjaGlsZHJlbiwgc2hvd0R5bmFtaWNGaWVsZHMsIHJlZmVyZW5jZUxpc3QsIGlzRGF0YU9iamVjdCB9ID0gcGFyYW1zO1xuICAvLyBsZXQgeyBsaXN0Q29udGV4dCB9ID0gcGFyYW1zO1xuICBjb25zdCB7IHByb21pc2VzUmVzcG9uc2VBcnJheSwgYXBpQ29udGV4dDogb3RoZXJDb250ZXh0IH0gPSBjb250ZXh0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9uby11bnVzZWQtY29sbGVjdGlvblxuICBjb25zdCBsaXN0T2ZDb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCB7XG4gICAgZGF0YTogeyBmaWVsZHM6IG1ldGFGaWVsZHMsIGNsYXNzSUQsIGlzUXVlcnlhYmxlIH1cbiAgfSA9IHByb21pc2VzUmVzcG9uc2VBcnJheVswXTtcbiAgbGV0IHtcbiAgICBkYXRhOiB7IHByaW1hcnlGaWVsZHMgfVxuICB9ID0gcHJvbWlzZXNSZXNwb25zZUFycmF5WzBdO1xuICAvLyBXaGVuIGxpc3QgaXMgY29uZmlndXJlZCB3aXRoIEluY2x1ZGUgYWxsIGNsYXNzIGZpZWxkcyBjb25maWd1cmF0aW9uLCBwcm92aWRlIHN1cHBvcnQgZm9yIFByaW1hcnkgZmllbGRzIGNvbHVtblxuICBpZiAoc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgICBjb25zdCBzb3VyY2VNZXRhZGF0YSA9IFBDb3JlLmdldE1ldGFkYXRhVXRpbHMoKS5nZXREYXRhUGFnZU1ldGFkYXRhKHJlZmVyZW5jZUxpc3QpO1xuICAgIGlmIChzb3VyY2VNZXRhZGF0YT8ucHJpbWFyeUZpZWxkcykge1xuICAgICAgcHJpbWFyeUZpZWxkcyA9IHNvdXJjZU1ldGFkYXRhLnByaW1hcnlGaWVsZHM7XG4gICAgfVxuICAgIC8vIHVwZGF0aW5nIG1ldGFEYXRhIGZpZWxkSUQgdG8gbm9ybWFsIHByb3BlcnR5IGlmIGl0IGhhcyBmaWVsZElEIHN0YXJ0cyB3aXRoICFQISBvciAhUEwhXG4gICAgdXBkYXRlTWV0YUVtYmVkZGVkRmllbGRJRChtZXRhRmllbGRzKTtcbiAgfVxuICB1cGRhdGVGaWVsZFR5cGUobWV0YUZpZWxkcyk7XG5cbiAgaWYgKGlzRGF0YU9iamVjdCkge1xuICAgIGNvbnN0IGNvbXBvc2l0ZUtleXM6IGFueVtdID0gW107XG4gICAgY29uc3QgZGF0YVZpZXdOYW1lID0gUENvcmUuZ2V0RGF0YVR5cGVVdGlscygpLmdldFNhdmFibGVEYXRhUGFnZShjbGFzc0lEKTtcbiAgICBjb25zdCBkYXRhUGFnZUtleXMgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0RGF0YVBhZ2VLZXlzKGRhdGFWaWV3TmFtZSk7XG4gICAgZGF0YVBhZ2VLZXlzPy5mb3JFYWNoKGl0ZW0gPT4gKGl0ZW0uaXNBbHRlcm5hdGVLZXlTdG9yYWdlID8gY29tcG9zaXRlS2V5cy5wdXNoKGl0ZW0ubGlua2VkRmllbGQpIDogY29tcG9zaXRlS2V5cy5wdXNoKGl0ZW0ua2V5TmFtZSkpKTtcbiAgICBpZiAoY29tcG9zaXRlS2V5cy5sZW5ndGggJiYgb3RoZXJDb250ZXh0KSB7XG4gICAgICBvdGhlckNvbnRleHQuc2V0Q29tcG9zaXRlS2V5cyhjb21wb3NpdGVLZXlzKTtcbiAgICB9XG4gICAgaWYgKG90aGVyQ29udGV4dCkge1xuICAgICAgb3RoZXJDb250ZXh0LmZldGNoUm93QWN0aW9uRGV0YWlscyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJlc2V0QXJyYXkgPSBbXTtcbiAgY29uc3QgcmF3TWV0YWRhdGEgPSBwQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKS5jb25maWc7XG4gIGNvbnN0IHJhd1ByZXNldHMgPSByYXdNZXRhZGF0YS5wcmVzZXRzO1xuICBjb25zdCBpc01ldGFXaXRoUHJlc2V0cyA9IHJhd1ByZXNldHMgJiYgcmF3UHJlc2V0cy5sZW5ndGggIT09IDA7XG4gIGNvbnN0IGNoaWxkcmVuSXRlcmF0b3IgPSBpc01ldGFXaXRoUHJlc2V0cyA/IHJhd1ByZXNldHMgOiBjaGlsZHJlbjtcbiAgY29uc3QgcmVzb2x2ZWRQcmVzZXRzID0gcENvbm4kLmdldENvbmZpZ1Byb3BzKCkucHJlc2V0cztcbiAgbGV0IGZpZWxkcztcbiAgbGV0IHRhYmxlQ29uZmlnO1xuICBjaGlsZHJlbkl0ZXJhdG9yPy5mb3JFYWNoKChwcmVzZXRNZXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlnRmllbGRzIH0gPSBnZXRUYWJsZUNvbmZpZ0Zyb21QcmVzZXRNZXRhKFxuICAgICAgeyAuLi5wcmVzZXRNZXRhLCBsYWJlbDogcmVzb2x2ZWRQcmVzZXRzW2luZGV4XS5sYWJlbCB9LFxuICAgICAgaXNNZXRhV2l0aFByZXNldHMsXG4gICAgICBwQ29ubiQsXG4gICAgICBjbGFzc0lELFxuICAgICAgcHJpbWFyeUZpZWxkcyxcbiAgICAgIG1ldGFGaWVsZHNcbiAgICApO1xuICAgIGNvbnN0IHB1c2hUb0NvbXBvbmVudHNMaXN0ID0gZmllbGRUeXBlID0+IHtcbiAgICAgIGxpc3RPZkNvbXBvbmVudHMucHVzaChmaWVsZFR5cGUpO1xuICAgIH07XG4gICAgLy8gcmVhZCByZXBvcnQgY29sdW1ucyByZXNwb25zZSAtIGluIGNhc2Ugb2Ygbm9ucXVlcnlhYmxlIGlnbm9yZSB0aGUgcmVzcG9uc2UgYW5kIHJlbHkgb25seSBvbiB0aGUgZmllbGRzIGNvbmZpZ3VyZWQgYXQgYXV0aG9pbmcgdGltZSBpbiBwcmVzZXRzXG4gICAgY29uc3QgcmVwb3J0Q29sdW1uc1NldCA9IGlzUXVlcnlhYmxlID8gZ2V0UmVwb3J0Q29sdW1ucyhwcm9taXNlc1Jlc3BvbnNlQXJyYXlbMV0pIDogbmV3IFNldCgpO1xuXG4gICAgY29uc3QgY29uZmlnRmllbGRTZXQgPSBwcmVwYXJlQ29uZmlnRmllbGRzKGNvbmZpZ0ZpZWxkcywgcHVzaFRvQ29tcG9uZW50c0xpc3QpO1xuXG4gICAgLy8gRklYTUUgI0VtYmVkZGVkUHJvcGVydHlQYXRjaFxuICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG1lcmdlIGxvZ2ljIHdoZW4gdGhlIG1ldGFkYXRhIHJlc3BvbnNlIGluY2x1ZGVzIGFsbCBvcHRpbWl6ZWQgZW1iZWRkZWQgcGFnZSBhbmQgcGFnZWxpc3RzXG4gICAgLy8gbWVyZ2luZyBjb25maWd1cmVkIGVtYmVkZGVkIHByb3BlcnRpZXMgd2l0aCBtZXRhZGF0YSBzbyB0aGF0IHdoaWxlIHByZXBhcmluZyBleHRyYSBmaWVsZHMsIGNvbmZpZyBmaWVsZHMgY2FuIGdldCBvdGhlciBwcm9wZXJ0aWVzIGZyb20gbWV0YShlZzogY2F0ZWdvcnksIGRpc3BsYXlBc0xpbmspXG4gICAgLy8gZ2V0IGNvbmZpZ3VyZWQgZW1iZWRkZWQgcHJvcGVydGllcyBtZXRhZGF0YSBhbmQgZ2V0IG5ldyBtZXJnZWRNZXRhRmllbGRzXG4gICAgY29uc3QgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhID0gZ2V0Q29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhKGNvbmZpZ0ZpZWxkU2V0LCBjbGFzc0lEKTtcbiAgICBjb25zdCBtZXJnZWRNZXRhRmllbGRzID0gbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLCBtZXRhRmllbGRzKTtcblxuICAgIGNvbnN0IGV4dHJhRmllbGRzID0gcHJlcGFyZUV4dHJhRmllbGRzKFxuICAgICAgbWVyZ2VkTWV0YUZpZWxkcywgLy8gcGFzc2luZyBuZXcgbWVyZ2VkIG1ldGEgZmllbGRzIHdoaWNoIGhhcyBtZXRhIG9mIGNvbmZpZ3VyZWQgZW1iZWRkZWQgZmllbGRzIG9mIGN1cnJlbnQgcHJlc2V0XG4gICAgICBjb25maWdGaWVsZHMsXG4gICAgICBjb25maWdGaWVsZFNldCxcbiAgICAgIHJlcG9ydENvbHVtbnNTZXQsXG4gICAgICBjbGFzc0lELFxuICAgICAgc2hvd0R5bmFtaWNGaWVsZHNcbiAgICApO1xuXG4gICAgaWYgKGlzUXVlcnlhYmxlKSB7XG4gICAgICB1cGRhdGVQYWdlRmllbGRzQ29uZmlnKGNvbmZpZ0ZpZWxkcywgY2xhc3NJRCk7XG4gICAgICBwcmVwYXJlUHJvcGVydHlNYXBzKFsuLi5jb25maWdGaWVsZHMsIC4uLmV4dHJhRmllbGRzXSwgY2xhc3NJRCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnZXRNYXBwZWRQcm9wZXJ0eSB9ID0gY29udGV4dDtcblxuICAgIGZpZWxkcyA9IGluaXRpYWxpemVDb2x1bW5zKFsuLi5jb25maWdGaWVsZHMsIC4uLmV4dHJhRmllbGRzXSwgZ2V0TWFwcGVkUHJvcGVydHkpO1xuICAgIGNvbnN0IHBhdGNoUXVlcnlGaWVsZHMgPSBwcmVwYXJlUGF0Y2hRdWVyeUZpZWxkcyhmaWVsZHMsIGlzRGF0YU9iamVjdCwgY2xhc3NJRCk7XG4gICAgY29uc3QgaXRlbUtleSA9IGdldEl0ZW1LZXkoZmllbGRzKTtcbiAgICB0YWJsZUNvbmZpZyA9IHsgZmllbGREZWZzOiBmaWVsZHMsIHBhdGNoUXVlcnlGaWVsZHMsIGl0ZW1LZXksIGlzUXVlcnlhYmxlIH07XG4gIH0pO1xuICBjb25zdCBtZXRhID0gdGFibGVDb25maWc7XG4gIHBhcmFtcy5saXN0Q29udGV4dCA9IHsgbWV0YSwgcHJlc2V0czogcHJlc2V0QXJyYXksIGFwaUNvbnRleHQ6IHsgLi4uYXBpQ29udGV4dCB9IH07XG4gIHJldHVybiBwYXJhbXMubGlzdENvbnRleHQ7XG59O1xuIl19
|