@talrace/ngx-noder 0.0.18 → 0.0.19
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/talrace-ngx-noder.mjs +181 -181
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +1 -1
- package/lib/editor/components/external-element/external.component.d.ts +1 -1
- package/lib/editor/components/shared/abstract/base.component.d.ts +1 -1
- package/lib/editor/components/shared/abstract/destroy.component.d.ts +1 -1
- package/package.json +1 -3
- package/src/lib/apart-components/add-link-dialog/_add-link-dialog.theme.scss +3 -6
- package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +4 -7
- package/src/lib/apart-components/confirm-dialog/_theme.scss +6 -9
- package/src/lib/apart-components/editor-title/_editor-title.theme.scss +6 -9
- package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +9 -12
- package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +5 -8
- package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +1 -3
- package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +1 -3
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +2 -5
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +3 -6
- package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +3 -6
- package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +15 -18
- package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +2 -4
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +5 -8
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +6 -9
- package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +3 -6
- package/src/lib/apart-components/insert-table/_insert-table.theme.scss +6 -9
- package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +12 -15
- package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +22 -25
- package/src/lib/editor/components/_editor.theme.scss +25 -28
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +0 -73
- package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +0 -7
- package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +0 -49
- package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +0 -34
- package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +0 -75
- package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +0 -95
- package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +0 -24
- package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +0 -117
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +0 -37
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +0 -49
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +0 -90
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +0 -81
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +0 -28
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +0 -53
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +0 -18
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +0 -27
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +0 -71
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +0 -107
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +0 -25
- package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +0 -65
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +0 -86
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +0 -90
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +0 -122
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +0 -8
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.mjs +0 -1148
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +0 -157
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +0 -8
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +0 -11
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-template-type.enum.mjs +0 -16
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +0 -6
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +0 -34
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +0 -26
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +0 -60
- package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +0 -48
- package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +0 -54
- package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +0 -86
- package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +0 -134
- package/esm2022/lib/editor/components/edges/edge-element.model.mjs +0 -38
- package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +0 -6
- package/esm2022/lib/editor/components/edges/edge.component.mjs +0 -141
- package/esm2022/lib/editor/components/edges/edges.mjs +0 -120
- package/esm2022/lib/editor/components/edges/page-type.enum.mjs +0 -7
- package/esm2022/lib/editor/components/editor.component.mjs +0 -112
- package/esm2022/lib/editor/components/external-element/external-element.service.mjs +0 -6
- package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +0 -4
- package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +0 -2
- package/esm2022/lib/editor/components/external-element/external.component.mjs +0 -41
- package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +0 -9
- package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +0 -11
- package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +0 -15
- package/esm2022/lib/editor/components/image/components/image.component.mjs +0 -88
- package/esm2022/lib/editor/components/image/image-api.service.mjs +0 -36
- package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +0 -46
- package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +0 -2
- package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +0 -19
- package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +0 -12
- package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +0 -106
- package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +0 -2
- package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +0 -52
- package/esm2022/lib/editor/components/image/size.mjs +0 -2
- package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +0 -60
- package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +0 -18
- package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +0 -43
- package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +0 -2
- package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +0 -3
- package/esm2022/lib/editor/components/shared/custom-content.mjs +0 -2
- package/esm2022/lib/editor/components/shared/services/component.service.mjs +0 -52
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +0 -123
- package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +0 -55
- package/esm2022/lib/editor/components/tab/tab.component.mjs +0 -44
- package/esm2022/lib/editor/components/tab/tab.helper.mjs +0 -6
- package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +0 -118
- package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +0 -99
- package/esm2022/lib/editor/components/table/components/table.component.mjs +0 -412
- package/esm2022/lib/editor/components/table/enums/hrule.enum.mjs +0 -7
- package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +0 -8
- package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +0 -6
- package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +0 -17
- package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +0 -9
- package/esm2022/lib/editor/components/table/models/row-data.model.mjs +0 -8
- package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +0 -7
- package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +0 -84
- package/esm2022/lib/editor/components/table/selection/table-selection.mjs +0 -383
- package/esm2022/lib/editor/content/constants/display-values.const.mjs +0 -8
- package/esm2022/lib/editor/content/constants/document-info.const.mjs +0 -13
- package/esm2022/lib/editor/content/constants/editor.const.mjs +0 -70
- package/esm2022/lib/editor/content/contents.interface.mjs +0 -2
- package/esm2022/lib/editor/content/display-data/display-data.mjs +0 -839
- package/esm2022/lib/editor/content/display-data/display-token.model.mjs +0 -12
- package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +0 -10
- package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +0 -11
- package/esm2022/lib/editor/content/display-data/indent.model.mjs +0 -9
- package/esm2022/lib/editor/content/display-data/line-info.model.mjs +0 -9
- package/esm2022/lib/editor/content/display-data/lines.mjs +0 -96
- package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +0 -8
- package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +0 -2
- package/esm2022/lib/editor/content/display-data/paragraph.mjs +0 -56
- package/esm2022/lib/editor/content/display-data/text-line-info.mjs +0 -35
- package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +0 -2
- package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +0 -78
- package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +0 -62
- package/esm2022/lib/editor/content/helpers/format.helper.mjs +0 -23
- package/esm2022/lib/editor/content/helpers/indexed-element.helper.mjs +0 -6
- package/esm2022/lib/editor/content/helpers/link.helper.mjs +0 -42
- package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +0 -9
- package/esm2022/lib/editor/content/margin.model.mjs +0 -16
- package/esm2022/lib/editor/content/page-vertical-data.model.mjs +0 -9
- package/esm2022/lib/editor/content/vertical-alignment.enum.mjs +0 -11
- package/esm2022/lib/editor/core/event-emitting.mjs +0 -56
- package/esm2022/lib/editor/display/cell.interface.mjs +0 -2
- package/esm2022/lib/editor/display/event.helper.mjs +0 -18
- package/esm2022/lib/editor/display/layers/cursor.layer.mjs +0 -102
- package/esm2022/lib/editor/display/layers/layer.config.mjs +0 -2
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +0 -109
- package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +0 -7
- package/esm2022/lib/editor/display/layers/print.text.layer.mjs +0 -7
- package/esm2022/lib/editor/display/layers/selection.layer.mjs +0 -119
- package/esm2022/lib/editor/display/layers/text.layer.mjs +0 -226
- package/esm2022/lib/editor/display/print/print.helper.mjs +0 -40
- package/esm2022/lib/editor/display/print/print.renderer.mjs +0 -67
- package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +0 -7
- package/esm2022/lib/editor/display/render-changes.interface.mjs +0 -2
- package/esm2022/lib/editor/display/render-changes.model.mjs +0 -25
- package/esm2022/lib/editor/display/renderer.mjs +0 -204
- package/esm2022/lib/editor/display/rendering.helper.mjs +0 -185
- package/esm2022/lib/editor/display/renderloop.mjs +0 -26
- package/esm2022/lib/editor/display/virtual.renderer.mjs +0 -284
- package/esm2022/lib/editor/display/visible-range.interface.mjs +0 -2
- package/esm2022/lib/editor/editor.module.mjs +0 -91
- package/esm2022/lib/editor/execution/distance.model.mjs +0 -10
- package/esm2022/lib/editor/execution/edit.session.mjs +0 -602
- package/esm2022/lib/editor/execution/editor.mjs +0 -1368
- package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +0 -42
- package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +0 -73
- package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +0 -12
- package/esm2022/lib/editor/execution/helpers/page.helper.mjs +0 -12
- package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +0 -41
- package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +0 -177
- package/esm2022/lib/editor/execution/regulator.service.mjs +0 -212
- package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +0 -18
- package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +0 -14
- package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +0 -8
- package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +0 -3
- package/esm2022/lib/editor/execution/targeting/session.model.mjs +0 -10
- package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +0 -2
- package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +0 -88
- package/esm2022/lib/editor/gadgets/history/operation-history.mjs +0 -208
- package/esm2022/lib/editor/gadgets/history/operation.type.mjs +0 -2
- package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +0 -7
- package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +0 -9
- package/esm2022/lib/editor/gadgets/numbering/numbering-marker-type.enum.mjs +0 -12
- package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +0 -13
- package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +0 -149
- package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +0 -7
- package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +0 -18
- package/esm2022/lib/editor/gadgets/scrollbar.mjs +0 -86
- package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +0 -2
- package/esm2022/lib/editor/gadgets/search/search.mjs +0 -231
- package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +0 -5
- package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +0 -20
- package/esm2022/lib/editor/interaction/base.handler.mjs +0 -19
- package/esm2022/lib/editor/interaction/document.handler.mjs +0 -27
- package/esm2022/lib/editor/interaction/editor.service.mjs +0 -386
- package/esm2022/lib/editor/interaction/input.handler.mjs +0 -152
- package/esm2022/lib/editor/interaction/mode.enum.mjs +0 -7
- package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +0 -7
- package/esm2022/lib/editor/interaction/mouse.handler.mjs +0 -50
- package/esm2022/lib/editor/interaction/text-input.mjs +0 -53
- package/esm2022/lib/editor/operations/commands.service.mjs +0 -20
- package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +0 -32
- package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +0 -7
- package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +0 -9
- package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +0 -15
- package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +0 -85
- package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +0 -19
- package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
- package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +0 -136
- package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
- package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +0 -114
- package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +0 -16
- package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +0 -374
- package/esm2022/lib/editor/operations/operations-helper.helper.mjs +0 -438
- package/esm2022/lib/editor/operations/save-commands.helper.mjs +0 -128
- package/esm2022/lib/editor/operations/target-operations.helper.mjs +0 -23
- package/esm2022/lib/editor/positioning/alignments.const.mjs +0 -8
- package/esm2022/lib/editor/positioning/content.helper.mjs +0 -45
- package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +0 -13
- package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +0 -2
- package/esm2022/lib/editor/positioning/insert-index.interface.mjs +0 -2
- package/esm2022/lib/editor/positioning/line-width.helper.mjs +0 -13
- package/esm2022/lib/editor/positioning/position.helper.mjs +0 -210
- package/esm2022/lib/editor/positioning/range.mjs +0 -94
- package/esm2022/lib/editor/positioning/selection.mjs +0 -351
- package/esm2022/lib/editor/revision.helper.mjs +0 -94
- package/esm2022/lib/models/generated/add-numbering.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-element-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-image-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/apply-paragraph-style.model.mjs +0 -12
- package/esm2022/lib/models/generated/apply-text-style.model.mjs +0 -12
- package/esm2022/lib/models/generated/borders-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/break.model.mjs +0 -8
- package/esm2022/lib/models/generated/cell.model.mjs +0 -12
- package/esm2022/lib/models/generated/column-section.model.mjs +0 -8
- package/esm2022/lib/models/generated/column.model.mjs +0 -8
- package/esm2022/lib/models/generated/command.model.mjs +0 -120
- package/esm2022/lib/models/generated/delete.model.mjs +0 -8
- package/esm2022/lib/models/generated/document-name.model.mjs +0 -8
- package/esm2022/lib/models/generated/document.model.mjs +0 -8
- package/esm2022/lib/models/generated/docx.model.mjs +0 -12
- package/esm2022/lib/models/generated/edge-target.model.mjs +0 -8
- package/esm2022/lib/models/generated/edge.model.mjs +0 -8
- package/esm2022/lib/models/generated/element.model.mjs +0 -8
- package/esm2022/lib/models/generated/file-source.model.mjs +0 -8
- package/esm2022/lib/models/generated/format.model.mjs +0 -12
- package/esm2022/lib/models/generated/heading.model.mjs +0 -16
- package/esm2022/lib/models/generated/image-data.model.mjs +0 -8
- package/esm2022/lib/models/generated/image.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-break.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-element.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-image.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-link.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-paragraph.model.mjs +0 -20
- package/esm2022/lib/models/generated/insert-styled-text.model.mjs +0 -12
- package/esm2022/lib/models/generated/insert-tab.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table-rows.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-table.model.mjs +0 -8
- package/esm2022/lib/models/generated/insert-text.model.mjs +0 -8
- package/esm2022/lib/models/generated/last-document-revision.model.mjs +0 -12
- package/esm2022/lib/models/generated/link-data.model.mjs +0 -8
- package/esm2022/lib/models/generated/link.model.mjs +0 -8
- package/esm2022/lib/models/generated/margins.model.mjs +0 -8
- package/esm2022/lib/models/generated/numbering-level.model.mjs +0 -12
- package/esm2022/lib/models/generated/numbering.model.mjs +0 -8
- package/esm2022/lib/models/generated/operation.model.mjs +0 -12
- package/esm2022/lib/models/generated/page-numbers.model.mjs +0 -8
- package/esm2022/lib/models/generated/paragraph-style.model.mjs +0 -8
- package/esm2022/lib/models/generated/paragraph.model.mjs +0 -12
- package/esm2022/lib/models/generated/remove-numberings.model.mjs +0 -8
- package/esm2022/lib/models/generated/remove-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/remove-table-rows.model.mjs +0 -8
- package/esm2022/lib/models/generated/replace-by-text.model.mjs +0 -8
- package/esm2022/lib/models/generated/replace.model.mjs +0 -44
- package/esm2022/lib/models/generated/resize-table-columns.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-numberings.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-paragraph-styles.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore-table.model.mjs +0 -12
- package/esm2022/lib/models/generated/restore-text-styles.model.mjs +0 -8
- package/esm2022/lib/models/generated/restore.model.mjs +0 -8
- package/esm2022/lib/models/generated/revision.model.mjs +0 -12
- package/esm2022/lib/models/generated/row.model.mjs +0 -8
- package/esm2022/lib/models/generated/tab.model.mjs +0 -8
- package/esm2022/lib/models/generated/table-cell.model.mjs +0 -8
- package/esm2022/lib/models/generated/table.model.mjs +0 -12
- package/esm2022/lib/models/generated/target.model.mjs +0 -16
- package/esm2022/lib/models/generated/text-style.model.mjs +0 -8
- package/esm2022/lib/translate/noder-translate.loader.mjs +0 -22
- package/esm2022/public-api.mjs +0 -54
- package/esm2022/talrace-ngx-noder.mjs +0 -5
|
@@ -1,839 +0,0 @@
|
|
|
1
|
-
import { BreakHelper } from '../../gadgets/page-break/break.helper';
|
|
2
|
-
import { BreakTypes } from '../../gadgets/page-break/break-types.enum';
|
|
3
|
-
import { ContentStyleHelper } from '../helpers/content-style.helper';
|
|
4
|
-
import { CursorParagraph } from '../../positioning/cursor-paragraph';
|
|
5
|
-
import { DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, NEW_LINE_MARKUP } from '../constants/editor.const';
|
|
6
|
-
import { DisplayToken } from './display-token.model';
|
|
7
|
-
import { DisplayTokenHelper } from '../helpers/display-token.helper';
|
|
8
|
-
import { DisplayValue } from '../constants/display-values.const';
|
|
9
|
-
import { EdgeType } from '../../components/edges/edge-type.enum';
|
|
10
|
-
import { EventEmitting } from '../../core/event-emitting';
|
|
11
|
-
import { FontMetrics } from '../../gadgets/font-metrics/font-metrics.helper';
|
|
12
|
-
import { FormatStyleHelper } from '../../execution/helpers/format-style.helper';
|
|
13
|
-
import { IndentModel } from './indent.model';
|
|
14
|
-
import { LineInfoModel } from './line-info.model';
|
|
15
|
-
import { NoderTableComponent } from '../../components/table/components/table.component';
|
|
16
|
-
import { NumberingHelper } from '../../gadgets/numbering/numbering.helper';
|
|
17
|
-
import { PageHelper } from '../../execution/helpers/page.helper';
|
|
18
|
-
import { PageType } from '../../components/edges/page-type.enum';
|
|
19
|
-
import { PageVerticalDataModel } from '../page-vertical-data.model';
|
|
20
|
-
import { Paragraph } from './paragraph';
|
|
21
|
-
import { ParagraphHelper } from '../../execution/helpers/paragraph.helper';
|
|
22
|
-
import { ParagraphInfoModel } from './models/paragraph-info.model';
|
|
23
|
-
import { ParagraphStyleHelper } from '../../execution/helpers/paragraph-style.helper';
|
|
24
|
-
import { Range } from '../../positioning/range';
|
|
25
|
-
import { TabHelper } from '../../components/tab/tab.helper';
|
|
26
|
-
export class DisplayData extends EventEmitting {
|
|
27
|
-
get defaultVerticalData() {
|
|
28
|
-
return this.pagesVerticalData.find(x => x.pageType === PageType.Default);
|
|
29
|
-
}
|
|
30
|
-
constructor(model, generalProperties, sessionId, pageMargin, pagesSpace, pageWidth, pageHeight, customComponents, customContentService, editorService) {
|
|
31
|
-
super();
|
|
32
|
-
this.model = model;
|
|
33
|
-
this.generalProperties = generalProperties;
|
|
34
|
-
this.sessionId = sessionId;
|
|
35
|
-
this.pageMargin = pageMargin;
|
|
36
|
-
this.pagesSpace = pagesSpace;
|
|
37
|
-
this.pageWidth = pageWidth;
|
|
38
|
-
this.pageHeight = pageHeight;
|
|
39
|
-
this.customComponents = customComponents;
|
|
40
|
-
this.customContentService = customContentService;
|
|
41
|
-
this.editorService = editorService;
|
|
42
|
-
this.paragraphs = [];
|
|
43
|
-
this.allPagesHeight = 0;
|
|
44
|
-
this.minHeight = 0;
|
|
45
|
-
this.tabTokens = [];
|
|
46
|
-
this.paragraphs = this.splitByParagraphs(this.model.content).map(x => new ParagraphInfoModel({ content: x }));
|
|
47
|
-
this.minHeight = this.pageHeight + 2 * this.pagesSpace;
|
|
48
|
-
this.contentWidth = this.pageWidth - this.pageMargin.left - this.pageMargin.right;
|
|
49
|
-
this.initPagesVerticalData();
|
|
50
|
-
this.processTextLinesProperties = !this.pageHeight
|
|
51
|
-
? ParagraphHelper.processTextLinesPropertiesForSinglePage
|
|
52
|
-
: ParagraphHelper.processTextLinesProperties;
|
|
53
|
-
}
|
|
54
|
-
insertText(position, text) {
|
|
55
|
-
const endPoint = this.insertTextAndReturnEndCursorPosition(text, position);
|
|
56
|
-
return endPoint;
|
|
57
|
-
}
|
|
58
|
-
removeRange(range) {
|
|
59
|
-
const paragraphText = this.paragraphs[range.start.row].content.slice(0, range.start.column) +
|
|
60
|
-
this.paragraphs[range.end.row].content.slice(range.end.column);
|
|
61
|
-
const paragraphSettings = this.getParagraphSettings(range.start.row);
|
|
62
|
-
this.paragraphs.splice(range.start.row, range.end.row - range.start.row + 1, new ParagraphInfoModel({ content: paragraphText }));
|
|
63
|
-
this.paragraphs[range.start.row].paragraphSettings = paragraphSettings;
|
|
64
|
-
}
|
|
65
|
-
getParagraphContent(index) {
|
|
66
|
-
return this.paragraphs[index]?.content || '';
|
|
67
|
-
}
|
|
68
|
-
getAllParagraphsContent() {
|
|
69
|
-
return this.paragraphs.map(x => x.content);
|
|
70
|
-
}
|
|
71
|
-
getParagraphSettings(index) {
|
|
72
|
-
return this.paragraphs[index]?.paragraphSettings || null;
|
|
73
|
-
}
|
|
74
|
-
getParagraphsContentForRange(range) {
|
|
75
|
-
if (range.isSingleLine) {
|
|
76
|
-
const line = this.getParagraphContent(range.start.row);
|
|
77
|
-
const linePartInRange = line.slice(range.start.column, range.end.column);
|
|
78
|
-
return [linePartInRange];
|
|
79
|
-
}
|
|
80
|
-
const paragraphsContent = this.paragraphs.slice(range.start.row, range.end.row + 1).map(x => x.content);
|
|
81
|
-
paragraphsContent[0] = (paragraphsContent[0] || '').slice(range.start.column);
|
|
82
|
-
const lastIndex = paragraphsContent.length - 1;
|
|
83
|
-
paragraphsContent[lastIndex] = paragraphsContent[lastIndex].slice(0, range.end.column);
|
|
84
|
-
return paragraphsContent;
|
|
85
|
-
}
|
|
86
|
-
getTextRange(range) {
|
|
87
|
-
return this.getParagraphsContentForRange(range).join(NEW_LINE_MARKUP);
|
|
88
|
-
}
|
|
89
|
-
positionToIndex(position, startRow = 0) {
|
|
90
|
-
let index = 0;
|
|
91
|
-
const endRow = Math.min(position.row, this.paragraphs.length);
|
|
92
|
-
for (let i = startRow || 0; i < endRow; i++) {
|
|
93
|
-
index += this.paragraphs[i].content.length + 1;
|
|
94
|
-
}
|
|
95
|
-
return index + position.column;
|
|
96
|
-
}
|
|
97
|
-
indexToPosition(positionIndex, startRow) {
|
|
98
|
-
const newlineLength = NEW_LINE_MARKUP.length;
|
|
99
|
-
for (let lineIndex = startRow || 0; lineIndex < this.paragraphs.length; lineIndex++) {
|
|
100
|
-
positionIndex -= this.paragraphs[lineIndex].content.length + newlineLength;
|
|
101
|
-
if (positionIndex < 0) {
|
|
102
|
-
const column = positionIndex + this.paragraphs[lineIndex].content.length + newlineLength;
|
|
103
|
-
return new CursorParagraph(lineIndex, column);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
const column = positionIndex + this.paragraphs[this.paragraphs.length - 1].content.length + newlineLength;
|
|
107
|
-
return new CursorParagraph(this.paragraphs.length - 1, column);
|
|
108
|
-
}
|
|
109
|
-
indexesToRange(startIndex, endIndex) {
|
|
110
|
-
const startPoint = this.indexToPosition(startIndex, 0);
|
|
111
|
-
const endPoint = this.indexToPosition(endIndex, 0);
|
|
112
|
-
return new Range(startPoint, endPoint);
|
|
113
|
-
}
|
|
114
|
-
isNewLineSymbol(index) {
|
|
115
|
-
const text = this.paragraphs.map(x => x.content).join(NEW_LINE_MARKUP);
|
|
116
|
-
return !text || !text[index] || text[index] === NEW_LINE_MARKUP;
|
|
117
|
-
}
|
|
118
|
-
getSelectedParagraphsByRange(range) {
|
|
119
|
-
const newlineLength = NEW_LINE_MARKUP.length;
|
|
120
|
-
let start = 0;
|
|
121
|
-
let end = 0;
|
|
122
|
-
let i;
|
|
123
|
-
const row = Math.min(range.end.row, this.paragraphs.length - 1);
|
|
124
|
-
for (i = 0; i < row; i++) {
|
|
125
|
-
if (i < range.start.row) {
|
|
126
|
-
start += this.paragraphs[i].content.length + newlineLength;
|
|
127
|
-
}
|
|
128
|
-
end += this.paragraphs[i].content.length + newlineLength;
|
|
129
|
-
}
|
|
130
|
-
if (i < this.paragraphs.length) {
|
|
131
|
-
end += this.paragraphs[i].content.length;
|
|
132
|
-
}
|
|
133
|
-
return { start, end };
|
|
134
|
-
}
|
|
135
|
-
getPositionAfterBreak(position, breakType) {
|
|
136
|
-
if (breakType === BreakTypes.TextWrapping) {
|
|
137
|
-
return position;
|
|
138
|
-
}
|
|
139
|
-
const isLastColumn = position.column === this.paragraphs[position.row].content.length;
|
|
140
|
-
const isLastParagraph = position.row === this.paragraphs.length - 1;
|
|
141
|
-
return isLastColumn && !isLastParagraph ? new CursorParagraph(position.row + 1, 0) : position;
|
|
142
|
-
}
|
|
143
|
-
getDistanceFromTop(index) {
|
|
144
|
-
return this.paragraphs[index]?.paragraphSettings ? this.paragraphs[index].paragraphSettings.distanceFromTop : 0;
|
|
145
|
-
}
|
|
146
|
-
getDistanceFromTopForPrint(index) {
|
|
147
|
-
if (!this.paragraphs[index]?.paragraphSettings) {
|
|
148
|
-
return 0;
|
|
149
|
-
}
|
|
150
|
-
const paragraph = this.paragraphs[index].paragraphSettings;
|
|
151
|
-
const pageNumber = paragraph.pageNumbers[0];
|
|
152
|
-
let pageBreakHeight = 0;
|
|
153
|
-
paragraph.textLinesInfo.forEach(linesInfo => {
|
|
154
|
-
if (linesInfo.isAfterPageBreak) {
|
|
155
|
-
pageBreakHeight = linesInfo.height;
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
return paragraph.distanceFromTop - pageNumber * this.pagesSpace - pageBreakHeight;
|
|
159
|
-
}
|
|
160
|
-
setParagraphSettings(row, lineInfos, numberingData) {
|
|
161
|
-
if (!this.paragraphs[row].paragraphSettings) {
|
|
162
|
-
this.paragraphs[row].paragraphSettings = new Paragraph(numberingData, lineInfos[0].offsetBefore, this.processTextLinesProperties);
|
|
163
|
-
}
|
|
164
|
-
this.paragraphs[row].paragraphSettings.numberingData = numberingData;
|
|
165
|
-
this.paragraphs[row].paragraphSettings.width = this.contentWidth;
|
|
166
|
-
this.paragraphs[row].paragraphSettings.setTextLinesInfo(lineInfos);
|
|
167
|
-
}
|
|
168
|
-
getParagraphHeight(index) {
|
|
169
|
-
return this.paragraphs[index]?.paragraphSettings ? this.paragraphs[index].paragraphSettings.height : 0;
|
|
170
|
-
}
|
|
171
|
-
getVisibleRange(offsetTop, scrollerHeight) {
|
|
172
|
-
let start = this.paragraphs.findIndex(x => offsetTop <= x.paragraphSettings?.distanceFromTop + x.paragraphSettings?.height);
|
|
173
|
-
if (start < 0) {
|
|
174
|
-
start = 0;
|
|
175
|
-
}
|
|
176
|
-
let startLineInfo = null;
|
|
177
|
-
const startParagraph = this.paragraphs[start];
|
|
178
|
-
if (startParagraph) {
|
|
179
|
-
const startParagraphOffsetTop = offsetTop - startParagraph.paragraphSettings.distanceFromTop;
|
|
180
|
-
startLineInfo = ParagraphHelper.getVisibleLineInfo(startParagraph?.paragraphSettings.textLinesInfo, startParagraphOffsetTop, 1);
|
|
181
|
-
}
|
|
182
|
-
if (!startLineInfo) {
|
|
183
|
-
return {
|
|
184
|
-
startParagraph: 0,
|
|
185
|
-
startLine: 0,
|
|
186
|
-
startScreenLine: 0,
|
|
187
|
-
startScreenFullLine: 0,
|
|
188
|
-
endParagraph: 0,
|
|
189
|
-
endLine: 0,
|
|
190
|
-
endScreenLine: 0,
|
|
191
|
-
endScreenFullLine: 0,
|
|
192
|
-
pages: [1]
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
let end = this.paragraphs.findIndex(x => offsetTop + scrollerHeight <= x.paragraphSettings.distanceFromTop + x.paragraphSettings.height);
|
|
196
|
-
if (end < 0) {
|
|
197
|
-
end = this.paragraphs.length - 1;
|
|
198
|
-
}
|
|
199
|
-
let endLineInfo = null;
|
|
200
|
-
const endParagraph = this.paragraphs[end];
|
|
201
|
-
if (endParagraph) {
|
|
202
|
-
const endParagraphOffsetTop = offsetTop + scrollerHeight - endParagraph.paragraphSettings.distanceFromTop;
|
|
203
|
-
endLineInfo = ParagraphHelper.getVisibleLineInfo(endParagraph.paragraphSettings?.textLinesInfo, endParagraphOffsetTop, -1);
|
|
204
|
-
}
|
|
205
|
-
const visiblePages = this.getVisiblePages(offsetTop, scrollerHeight);
|
|
206
|
-
return {
|
|
207
|
-
startParagraph: start,
|
|
208
|
-
startLine: startLineInfo.index,
|
|
209
|
-
startScreenLine: startLineInfo.screenIndex,
|
|
210
|
-
startScreenFullLine: startLineInfo.visibleScreenIndex,
|
|
211
|
-
endParagraph: end,
|
|
212
|
-
endLine: endLineInfo.index,
|
|
213
|
-
endScreenLine: endLineInfo.screenIndex,
|
|
214
|
-
endScreenFullLine: endLineInfo.visibleScreenIndex,
|
|
215
|
-
pages: visiblePages
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
processParagraphsProperties(startParagraphIndex) {
|
|
219
|
-
this.setParagraphIndexes();
|
|
220
|
-
const pagesInfo = { pagesVerticalData: this.pagesVerticalData, pagesSpace: this.pagesSpace };
|
|
221
|
-
let currentPage = startParagraphIndex === 0 ? 1 : this.paragraphs[startParagraphIndex - 1].paragraphSettings.lastPageNumber;
|
|
222
|
-
let pageVerticalData = PageHelper.getVerticalData(currentPage, this.pagesVerticalData);
|
|
223
|
-
for (let i = startParagraphIndex; i < this.paragraphs.length; i++) {
|
|
224
|
-
const prevParagraphInfo = this.getPreviousParagraphInfo(i);
|
|
225
|
-
const paragraphSettings = this.paragraphs[i].paragraphSettings;
|
|
226
|
-
paragraphSettings.processParagraphProperties(prevParagraphInfo, pagesInfo, this.customComponents.tables);
|
|
227
|
-
if (paragraphSettings.firstPageNumber !== currentPage) {
|
|
228
|
-
currentPage = paragraphSettings.firstPageNumber;
|
|
229
|
-
pageVerticalData = PageHelper.getVerticalData(paragraphSettings.firstPageNumber, this.pagesVerticalData);
|
|
230
|
-
}
|
|
231
|
-
paragraphSettings.calculateDistanceFromTop(this.pageHeight, this.pagesSpace, pageVerticalData.marginTop);
|
|
232
|
-
}
|
|
233
|
-
let pageHeight = this.pageHeight;
|
|
234
|
-
if (!pageHeight) {
|
|
235
|
-
pageHeight = this.getAllParagraphsHeight() + this.pageMargin.top + this.pageMargin.bottom;
|
|
236
|
-
this.minHeight = pageHeight + 2 * this.pagesSpace;
|
|
237
|
-
this.defaultVerticalData.contentHeight = pageHeight;
|
|
238
|
-
}
|
|
239
|
-
const lastPageNumber = this.paragraphs[this.paragraphs.length - 1].paragraphSettings.lastPageNumber;
|
|
240
|
-
this.allPagesHeight = lastPageNumber * (pageHeight + this.pagesSpace) + this.pagesSpace;
|
|
241
|
-
this.emit('pagesCountChanged', { pagesCount: lastPageNumber, pageHeight: pageHeight + 2 * this.pagesSpace });
|
|
242
|
-
}
|
|
243
|
-
getAllParagraphsHeight() {
|
|
244
|
-
return this.paragraphs.reduce((sum, x) => sum + x.paragraphSettings.height, 0);
|
|
245
|
-
}
|
|
246
|
-
destroy() {
|
|
247
|
-
this.removeAllListeners('pagesCountChanged');
|
|
248
|
-
}
|
|
249
|
-
updatePageVerticalData(edgeType, pageType) {
|
|
250
|
-
const pageVerticalData = this.pagesVerticalData.find(x => x.pageType === pageType);
|
|
251
|
-
const componentHeight = this.customComponents.edges.getComponentHeightByType(pageType, edgeType);
|
|
252
|
-
if (edgeType === EdgeType.Header) {
|
|
253
|
-
pageVerticalData.marginTop = componentHeight > this.pageMargin.top ? componentHeight : this.pageMargin.top;
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
pageVerticalData.marginBottom = componentHeight > this.pageMargin.bottom ? componentHeight : this.pageMargin.bottom;
|
|
257
|
-
}
|
|
258
|
-
const newContentHeight = this.pageHeight - pageVerticalData.marginTop - pageVerticalData.marginBottom;
|
|
259
|
-
if (newContentHeight === pageVerticalData.contentHeight) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
pageVerticalData.contentHeight = newContentHeight;
|
|
263
|
-
this.processParagraphsProperties(0);
|
|
264
|
-
}
|
|
265
|
-
updateParagraphLineNumber(first) {
|
|
266
|
-
const count = this.paragraphs.length;
|
|
267
|
-
if (first === 0) {
|
|
268
|
-
this.paragraphs[first].lineNumber = 0;
|
|
269
|
-
first++;
|
|
270
|
-
}
|
|
271
|
-
for (let i = first; i < count; i++) {
|
|
272
|
-
this.paragraphs[i].lineNumber = this.paragraphs[i - 1].lineNumber + this.paragraphs[i - 1].nextLineIndexes.length + 1;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
updateParagraphStartIndex(first) {
|
|
276
|
-
if (first === 0) {
|
|
277
|
-
this.paragraphs[first].startIndex = 0;
|
|
278
|
-
first++;
|
|
279
|
-
}
|
|
280
|
-
for (let i = first; i < this.paragraphs.length; i++) {
|
|
281
|
-
this.paragraphs[i].startIndex = this.paragraphs[i - 1].startIndex + this.getParagraphContent(i - 1).length + 1;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
updateParagraphSettingsNumberingData(index) {
|
|
285
|
-
const paragraphSettings = this.getParagraphSettings(index);
|
|
286
|
-
if (paragraphSettings.numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
|
|
287
|
-
paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, index, this.generalProperties.numberingInfo);
|
|
288
|
-
}
|
|
289
|
-
if (paragraphSettings.numberingData.numberingId !== null) {
|
|
290
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
|
|
291
|
-
NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
updateNextLineIndexes(firstParagraph, lastParagraph) {
|
|
295
|
-
this.updateParagraphStartIndex(firstParagraph);
|
|
296
|
-
let indexOfParagraphAfterPageBreak = this.getParagraphSettings(firstParagraph - 1)?.isEndedByPageBreak ? firstParagraph : -1;
|
|
297
|
-
let firstUsedTabIndex = this.model.tabs.findIndex(x => x.insertIndex >= this.paragraphs[firstParagraph].startIndex);
|
|
298
|
-
for (let i = firstParagraph; i <= lastParagraph; i++) {
|
|
299
|
-
if (!this.paragraphs[i]) {
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
this.tabTokens = [];
|
|
303
|
-
NumberingHelper.calculateNumberingInfo(this.model.paragraphs[i].paragraphStyle.numberingId, this.model.paragraphs[i].paragraphStyle.numberingLevel, this.getParagraphSettings(i)?.numberingData.marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
|
|
304
|
-
const numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
|
|
305
|
-
const { splits, rowInfos } = this.getSplits(this.model, i);
|
|
306
|
-
this.paragraphs[i].nextLineIndexes = splits;
|
|
307
|
-
if (indexOfParagraphAfterPageBreak === i) {
|
|
308
|
-
rowInfos[0].isAfterPageBreak = true;
|
|
309
|
-
}
|
|
310
|
-
indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
|
|
311
|
-
this.setParagraphSettings(i, rowInfos, numberingData);
|
|
312
|
-
this.updateParagraphSettingsNumberingData(i);
|
|
313
|
-
firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i);
|
|
314
|
-
}
|
|
315
|
-
this.getParagraphSettings(lastParagraph + 1)?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
|
|
316
|
-
this.updateParagraphLineNumber(firstParagraph);
|
|
317
|
-
this.processParagraphsProperties(firstParagraph);
|
|
318
|
-
}
|
|
319
|
-
updateNumberingsDataOnChange(index) {
|
|
320
|
-
for (let i = index; i < this.paragraphs.length; i++) {
|
|
321
|
-
const paragraphStyle = this.model.paragraphs[i].paragraphStyle;
|
|
322
|
-
const paragraphSettings = this.getParagraphSettings(i);
|
|
323
|
-
if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
|
|
324
|
-
NumberingHelper.calculateNumberingInfo(paragraphStyle.numberingId, paragraphStyle.numberingLevel, paragraphSettings.numberingData.marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
|
|
325
|
-
paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
|
|
326
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
|
|
327
|
-
NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, paragraphStyle);
|
|
328
|
-
}
|
|
329
|
-
const table = this.customContentService.findComponent(this.customComponents.tables, paragraphSettings.startInsertIndex);
|
|
330
|
-
if (table) {
|
|
331
|
-
table.instance.updateCells();
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
if ('pageType' in this.model) {
|
|
335
|
-
this.editorService.updateEdges(this.sessionId);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
resetAllNumberingInfo(paragraphIndex) {
|
|
339
|
-
for (let i = paragraphIndex; i < this.model.paragraphs.length; i++) {
|
|
340
|
-
const { numberingId, numberingLevel } = this.model.paragraphs[i].paragraphStyle;
|
|
341
|
-
if (numberingId !== null &&
|
|
342
|
-
this.generalProperties.numberingInfo[numberingId] &&
|
|
343
|
-
this.generalProperties.numberingInfo[numberingId][numberingLevel]) {
|
|
344
|
-
this.generalProperties.numberingInfo[numberingId][numberingLevel].visited = false;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
resetNumberingInfoByTableCell(table) {
|
|
349
|
-
for (let i = 0; i < table.instance.rowMatrix.length; i++) {
|
|
350
|
-
for (let cell of table.instance.rowMatrix[i].cells) {
|
|
351
|
-
const { marker, numberingId } = cell.componentRef.instance.session.displayData.paragraphs[0].paragraphSettings.numberingData;
|
|
352
|
-
if (marker && numberingId) {
|
|
353
|
-
NumberingHelper.updateNumberingInfo(this.generalProperties.numberingInfo, marker, numberingId);
|
|
354
|
-
this.resetAllNumberingInfo(0);
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
updateParagraphTabs(tabIndex, paragraphIndex) {
|
|
361
|
-
const paragraphContentLength = this.getParagraphContent(paragraphIndex).length;
|
|
362
|
-
const paragraphLastIndex = this.paragraphs[paragraphIndex].startIndex + paragraphContentLength;
|
|
363
|
-
if (tabIndex === -1 ||
|
|
364
|
-
tabIndex >= this.customComponents.tabs.length ||
|
|
365
|
-
this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
|
|
366
|
-
return tabIndex;
|
|
367
|
-
}
|
|
368
|
-
const startIndex = tabIndex;
|
|
369
|
-
while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
|
|
370
|
-
this.customComponents.tabs[tabIndex].instance.width = this.tabTokens[tabIndex - startIndex].width;
|
|
371
|
-
this.customComponents.tabs[tabIndex].instance.height = this.tabTokens[tabIndex - startIndex].font;
|
|
372
|
-
tabIndex++;
|
|
373
|
-
}
|
|
374
|
-
return tabIndex;
|
|
375
|
-
}
|
|
376
|
-
getSplits(model, paragraphIndex) {
|
|
377
|
-
const paragraphContent = this.getParagraphContent(paragraphIndex);
|
|
378
|
-
const strTokens = this.getDisplayTokens(model, paragraphContent, this.paragraphs[paragraphIndex].startIndex);
|
|
379
|
-
if (!strTokens.length) {
|
|
380
|
-
const defaultRowInfo = new LineInfoModel({
|
|
381
|
-
height: (DEFAULT_FONT_SIZE * 4) / 3,
|
|
382
|
-
width: 0,
|
|
383
|
-
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
384
|
-
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
385
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
386
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
387
|
-
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
|
|
388
|
-
isAfterPageBreak: false,
|
|
389
|
-
isEndedByPageBreak: false,
|
|
390
|
-
backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
|
|
391
|
-
});
|
|
392
|
-
return { splits: [], rowInfos: [defaultRowInfo] };
|
|
393
|
-
}
|
|
394
|
-
const splits = [];
|
|
395
|
-
const rowInfos = [];
|
|
396
|
-
let prevToken;
|
|
397
|
-
let index = -1;
|
|
398
|
-
let initial = paragraphContent;
|
|
399
|
-
while (index) {
|
|
400
|
-
initial = initial.slice(index > 0 ? index : 0);
|
|
401
|
-
const tokens = strTokens.slice(paragraphContent.length - initial.length);
|
|
402
|
-
if (!tokens.length) {
|
|
403
|
-
tokens.push(...this.getEmptyDisplayTokens(model, this.paragraphs[paragraphIndex].startIndex + index));
|
|
404
|
-
}
|
|
405
|
-
let wrapLimit = this.computeWrapIndex(tokens, this.contentWidth, this.generalProperties.defaultTabWidth);
|
|
406
|
-
if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && this.paragraphs.length > paragraphIndex + 1) {
|
|
407
|
-
wrapLimit = 0;
|
|
408
|
-
}
|
|
409
|
-
const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
|
|
410
|
-
const wrapTokens = tokens.slice(0, wrapSplit || undefined);
|
|
411
|
-
if (wrapTokens.length) {
|
|
412
|
-
prevToken = wrapTokens[wrapTokens.length - 1];
|
|
413
|
-
}
|
|
414
|
-
const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
|
|
415
|
-
const lineInfo = DisplayTokenHelper.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
|
|
416
|
-
lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
|
|
417
|
-
rowInfos.push(lineInfo);
|
|
418
|
-
if (!wrapLimit) {
|
|
419
|
-
break;
|
|
420
|
-
}
|
|
421
|
-
index = wrapSplit;
|
|
422
|
-
const splitsLength = splits.length;
|
|
423
|
-
const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
|
|
424
|
-
splits.push(splitIndex);
|
|
425
|
-
}
|
|
426
|
-
this.tabTokens.push(...strTokens.filter(x => x.isTab));
|
|
427
|
-
ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
|
|
428
|
-
return { splits, rowInfos };
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Given a string, returns an array of the display characters, including tabs and spaces and custom components.
|
|
432
|
-
*/
|
|
433
|
-
getDisplayTokens(model, str, startIndex) {
|
|
434
|
-
if (!str.length) {
|
|
435
|
-
return this.getEmptyDisplayTokens(model, startIndex);
|
|
436
|
-
}
|
|
437
|
-
return this.fillLineTokens(startIndex, str, model);
|
|
438
|
-
}
|
|
439
|
-
fillLineTokens(startIndex, line, model) {
|
|
440
|
-
const lineInfo = this.getLineInfoByBreakModifier(model, startIndex + line.length);
|
|
441
|
-
const tokens = [];
|
|
442
|
-
let characters = [];
|
|
443
|
-
let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
444
|
-
let prevFormat = null;
|
|
445
|
-
let prevCharCode = null;
|
|
446
|
-
let prevFontString = null;
|
|
447
|
-
let prevChar = null;
|
|
448
|
-
let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
449
|
-
let symbolChange = false;
|
|
450
|
-
for (let i = 0; i < line.length; i++) {
|
|
451
|
-
const char = line[i];
|
|
452
|
-
const size = FontMetrics.measureCharSize(char, fontString);
|
|
453
|
-
const customComponent = this.getOrGenerateComponent(startIndex, char);
|
|
454
|
-
const breakType = BreakHelper.getBreakType(model, char, startIndex);
|
|
455
|
-
if (customComponent && !breakType) {
|
|
456
|
-
const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
|
|
457
|
-
tokens.push(token);
|
|
458
|
-
prevCharCode = -1;
|
|
459
|
-
prevChar = '';
|
|
460
|
-
characters = [];
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
const charCode = char.charCodeAt(0);
|
|
464
|
-
const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
|
|
465
|
-
const isFirstCharacter = i === 0;
|
|
466
|
-
const token = new DisplayToken({
|
|
467
|
-
...size,
|
|
468
|
-
displayValue,
|
|
469
|
-
align: lineInfo.align,
|
|
470
|
-
indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
|
|
471
|
-
indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
|
|
472
|
-
indentLeft: lineInfo.indent.left,
|
|
473
|
-
indentRight: lineInfo.indent.right,
|
|
474
|
-
indentBefore: lineInfo.offsetBefore,
|
|
475
|
-
indentAfter: lineInfo.offsetAfter,
|
|
476
|
-
lineSpacing: lineInfo.lineSpacing,
|
|
477
|
-
isPageBreak: breakType === BreakTypes.Page,
|
|
478
|
-
isLineBreak: breakType === BreakTypes.TextWrapping,
|
|
479
|
-
isTab: false
|
|
480
|
-
});
|
|
481
|
-
tokens.push(token);
|
|
482
|
-
if (charCode !== prevCharCode ||
|
|
483
|
-
!prevFormat ||
|
|
484
|
-
!ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
|
|
485
|
-
symbolChange = true;
|
|
486
|
-
}
|
|
487
|
-
else if (i === line.length - 1) {
|
|
488
|
-
characters.push(token);
|
|
489
|
-
symbolChange = true;
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
characters.push(token);
|
|
493
|
-
}
|
|
494
|
-
if (characters.length > 1 && symbolChange) {
|
|
495
|
-
this.processCharSizes(prevChar, prevFontString, characters);
|
|
496
|
-
characters = [token];
|
|
497
|
-
symbolChange = false;
|
|
498
|
-
}
|
|
499
|
-
else if (symbolChange) {
|
|
500
|
-
characters = [token];
|
|
501
|
-
}
|
|
502
|
-
prevCharCode = charCode;
|
|
503
|
-
prevChar = char;
|
|
504
|
-
}
|
|
505
|
-
prevFormat = format;
|
|
506
|
-
prevFontString = fontString;
|
|
507
|
-
startIndex++;
|
|
508
|
-
if (startIndex > format?.endIndex) {
|
|
509
|
-
format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
510
|
-
fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
return tokens;
|
|
514
|
-
}
|
|
515
|
-
getOrGenerateComponent(charIndex, char) {
|
|
516
|
-
if (!this.customContentService.isSpecialMarker(char)) {
|
|
517
|
-
return null;
|
|
518
|
-
}
|
|
519
|
-
const existingComponent = this.customContentService.getComponent(this.customComponents, char, charIndex);
|
|
520
|
-
if (existingComponent) {
|
|
521
|
-
if (existingComponent.instance instanceof NoderTableComponent) {
|
|
522
|
-
existingComponent.instance.updateCells();
|
|
523
|
-
}
|
|
524
|
-
return existingComponent;
|
|
525
|
-
}
|
|
526
|
-
return this.customContentService.generateComponent(this.model, this.customComponents, this.sessionId, this.generalProperties, this.contentWidth, charIndex);
|
|
527
|
-
}
|
|
528
|
-
processCharSizes(prevChar, prevFontString, characters) {
|
|
529
|
-
const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
|
|
530
|
-
for (let item of characters) {
|
|
531
|
-
Object.assign(item, newSize);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
getLineTokens(model, line, startIndex) {
|
|
535
|
-
const lineInfo = this.getLineInfoFromTextLine(startIndex + line.length);
|
|
536
|
-
if (!line.length) {
|
|
537
|
-
return this.getEmptyLineTokens(model, startIndex, lineInfo);
|
|
538
|
-
}
|
|
539
|
-
const tokens = [];
|
|
540
|
-
let characters = [];
|
|
541
|
-
let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
542
|
-
let prevFormat = null;
|
|
543
|
-
let prevCharCode = null;
|
|
544
|
-
let prevFontString = null;
|
|
545
|
-
let prevChar = null;
|
|
546
|
-
let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
547
|
-
let symbolChange = false;
|
|
548
|
-
for (let i = 0; i < line.length; i++) {
|
|
549
|
-
const char = line[i];
|
|
550
|
-
const size = FontMetrics.measureCharSize(char, fontString);
|
|
551
|
-
const customComponent = this.customContentService.getComponent(this.customComponents, char, startIndex);
|
|
552
|
-
const breakType = BreakHelper.getBreakType(model, char, startIndex);
|
|
553
|
-
if (customComponent && !breakType) {
|
|
554
|
-
const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
|
|
555
|
-
tokens.push(token);
|
|
556
|
-
prevCharCode = -1;
|
|
557
|
-
prevChar = '';
|
|
558
|
-
characters = [];
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
const charCode = char.charCodeAt(0);
|
|
562
|
-
const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
|
|
563
|
-
const isFirstCharacter = i === 0;
|
|
564
|
-
const token = new DisplayToken({
|
|
565
|
-
...size,
|
|
566
|
-
displayValue,
|
|
567
|
-
align: lineInfo.align,
|
|
568
|
-
indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
|
|
569
|
-
indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
|
|
570
|
-
indentLeft: lineInfo.indent.left,
|
|
571
|
-
indentRight: lineInfo.indent.right,
|
|
572
|
-
indentBefore: lineInfo.offsetBefore,
|
|
573
|
-
indentAfter: lineInfo.offsetAfter,
|
|
574
|
-
lineSpacing: lineInfo.lineSpacing,
|
|
575
|
-
isPageBreak: breakType === BreakTypes.Page,
|
|
576
|
-
isLineBreak: breakType === BreakTypes.TextWrapping,
|
|
577
|
-
isTab: false
|
|
578
|
-
});
|
|
579
|
-
tokens.push(token);
|
|
580
|
-
if (charCode !== prevCharCode ||
|
|
581
|
-
!prevFormat ||
|
|
582
|
-
!ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
|
|
583
|
-
symbolChange = true;
|
|
584
|
-
}
|
|
585
|
-
else if (i === line.length - 1) {
|
|
586
|
-
characters.push(token);
|
|
587
|
-
symbolChange = true;
|
|
588
|
-
}
|
|
589
|
-
else {
|
|
590
|
-
characters.push(token);
|
|
591
|
-
}
|
|
592
|
-
if (characters.length > 1 && symbolChange) {
|
|
593
|
-
this.processCharSizes(prevChar, prevFontString, characters);
|
|
594
|
-
characters = [token];
|
|
595
|
-
symbolChange = false;
|
|
596
|
-
}
|
|
597
|
-
else if (symbolChange) {
|
|
598
|
-
characters = [token];
|
|
599
|
-
}
|
|
600
|
-
prevCharCode = charCode;
|
|
601
|
-
prevChar = char;
|
|
602
|
-
}
|
|
603
|
-
prevFormat = format;
|
|
604
|
-
prevFontString = fontString;
|
|
605
|
-
startIndex++;
|
|
606
|
-
if (startIndex > format?.endIndex) {
|
|
607
|
-
format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
608
|
-
fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
return tokens;
|
|
612
|
-
}
|
|
613
|
-
getEmptyDisplayTokens(model, startIndex) {
|
|
614
|
-
const lineInfo = this.getLineInfoByBreakModifier(model, startIndex);
|
|
615
|
-
return this.getEmptyLineTokens(model, startIndex, lineInfo);
|
|
616
|
-
}
|
|
617
|
-
getEmptyLineTokens(model, startIndex, lineInfo) {
|
|
618
|
-
const storedFormat = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
619
|
-
if (!storedFormat) {
|
|
620
|
-
return [];
|
|
621
|
-
}
|
|
622
|
-
const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
|
|
623
|
-
size.width = 3;
|
|
624
|
-
return [
|
|
625
|
-
new DisplayToken({
|
|
626
|
-
...size,
|
|
627
|
-
displayValue: DisplayValue.emptyLine,
|
|
628
|
-
align: lineInfo.align,
|
|
629
|
-
indentFirstLine: lineInfo.indent.firstLine,
|
|
630
|
-
indentHanging: lineInfo.indent.hanging,
|
|
631
|
-
indentLeft: lineInfo.indent.left,
|
|
632
|
-
indentRight: lineInfo.indent.right,
|
|
633
|
-
indentBefore: lineInfo.offsetBefore,
|
|
634
|
-
indentAfter: lineInfo.offsetAfter,
|
|
635
|
-
isPageBreak: false,
|
|
636
|
-
isLineBreak: false,
|
|
637
|
-
isTab: false,
|
|
638
|
-
lineSpacing: lineInfo.lineSpacing
|
|
639
|
-
})
|
|
640
|
-
];
|
|
641
|
-
}
|
|
642
|
-
getLineInfoByBreakModifier(model, index) {
|
|
643
|
-
const paragraph = ParagraphStyleHelper.getParagraphAtIndex(model.paragraphs, index);
|
|
644
|
-
if (!paragraph) {
|
|
645
|
-
return new LineInfoModel({
|
|
646
|
-
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
647
|
-
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
648
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
649
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
650
|
-
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
const indentLeft = this.getParagraphIndentLeft(model, paragraph);
|
|
654
|
-
return this.getLineInfoModel(paragraph, indentLeft);
|
|
655
|
-
}
|
|
656
|
-
getParagraphIndentLeft(model, paragraph) {
|
|
657
|
-
const numberingId = paragraph.paragraphStyle.numberingId;
|
|
658
|
-
if (numberingId === null) {
|
|
659
|
-
return paragraph.paragraphStyle.indentLeft;
|
|
660
|
-
}
|
|
661
|
-
const level = paragraph.paragraphStyle.numberingLevel;
|
|
662
|
-
const paragraphIndex = model.paragraphs.indexOf(paragraph);
|
|
663
|
-
const levelModel = NumberingHelper.find(this.generalProperties.numberings, numberingId, level);
|
|
664
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(model.formats, paragraph.insertIndex);
|
|
665
|
-
const markerTextStyle = ContentStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
|
|
666
|
-
const paragraphSettings = this.getParagraphSettings(paragraphIndex);
|
|
667
|
-
let markerWidth = paragraphSettings?.numberingData?.width;
|
|
668
|
-
const marker = NumberingHelper.getMarker(levelModel, numberingId, model.paragraphs, paragraphIndex, this.generalProperties.numberingInfo);
|
|
669
|
-
const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
|
|
670
|
-
markerWidth = markerSizes.width;
|
|
671
|
-
const hangingIndent = paragraph.paragraphStyle.indentHanging ? paragraph.paragraphStyle.indentHanging : levelModel.indentHanging;
|
|
672
|
-
let paragraphIndent = levelModel.indentLeft;
|
|
673
|
-
if (markerWidth >= hangingIndent) {
|
|
674
|
-
const markerOverflow = markerWidth - hangingIndent;
|
|
675
|
-
const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.generalProperties.defaultTabWidth);
|
|
676
|
-
paragraphIndent += markerOverflow + additionalMarkerIndent;
|
|
677
|
-
}
|
|
678
|
-
return paragraphIndent;
|
|
679
|
-
}
|
|
680
|
-
getLineInfoFromTextLine(index) {
|
|
681
|
-
const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
|
|
682
|
-
const indentLeft = this.getIndentLeftFromTextLine(index);
|
|
683
|
-
return this.getLineInfoModel(paragraph, indentLeft);
|
|
684
|
-
}
|
|
685
|
-
getLineInfoModel(paragraph, indentLeft) {
|
|
686
|
-
const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
|
|
687
|
-
return new LineInfoModel({
|
|
688
|
-
align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
689
|
-
indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
690
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
691
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
692
|
-
lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
getIndentLeftFromTextLine(insertIndex) {
|
|
696
|
-
let startIndex = 0;
|
|
697
|
-
let endIndex = this.paragraphs.length - 1;
|
|
698
|
-
while (startIndex <= endIndex) {
|
|
699
|
-
const middleIndex = Math.round((startIndex + endIndex) / 2);
|
|
700
|
-
const paragraphInfo = this.paragraphs[middleIndex];
|
|
701
|
-
if (paragraphInfo.startIndex > insertIndex) {
|
|
702
|
-
startIndex = middleIndex + 1;
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
endIndex = middleIndex - 1;
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
const textLinesInfo = this.paragraphs[startIndex]?.paragraphSettings.textLinesInfo;
|
|
709
|
-
return textLinesInfo ? Math.max(...textLinesInfo.map(x => x.indentLeft)) : null;
|
|
710
|
-
}
|
|
711
|
-
computeWrapSplit(tokens, wrapLimit) {
|
|
712
|
-
if (!tokens.length || tokens.length <= wrapLimit) {
|
|
713
|
-
return null;
|
|
714
|
-
}
|
|
715
|
-
// If there is a space or tab at this split position, then making
|
|
716
|
-
// a split is simple.
|
|
717
|
-
if (wrapLimit === 0 ||
|
|
718
|
-
tokens[wrapLimit].displayValue === DisplayValue.customContent ||
|
|
719
|
-
(this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
|
|
720
|
-
return wrapLimit;
|
|
721
|
-
}
|
|
722
|
-
return this.calculateSplit(wrapLimit, tokens);
|
|
723
|
-
}
|
|
724
|
-
calculateSplit(index, tokens) {
|
|
725
|
-
for (let i = index; i >= 0; i--) {
|
|
726
|
-
if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
|
|
727
|
-
return i + 1;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
return index;
|
|
731
|
-
}
|
|
732
|
-
isWhiteSpace(token) {
|
|
733
|
-
return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Computes wrap index based on max row width
|
|
737
|
-
*/
|
|
738
|
-
computeWrapIndex(displayTokens, contentWidth, defaultTabWidth) {
|
|
739
|
-
if (!displayTokens[0]) {
|
|
740
|
-
return 0;
|
|
741
|
-
}
|
|
742
|
-
if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
|
|
743
|
-
return 1;
|
|
744
|
-
}
|
|
745
|
-
const indent = displayTokens[0].indentLeft +
|
|
746
|
-
displayTokens[0].indentRight +
|
|
747
|
-
displayTokens[0].indentFirstLine -
|
|
748
|
-
displayTokens[0].indentHanging || 0;
|
|
749
|
-
const maxRowWidth = contentWidth - indent;
|
|
750
|
-
let sum = 0;
|
|
751
|
-
for (let i = 0; i < displayTokens.length; i++) {
|
|
752
|
-
if (displayTokens[i].isTab) {
|
|
753
|
-
displayTokens[i].width = TabHelper.calculateTabWidth(sum, defaultTabWidth);
|
|
754
|
-
}
|
|
755
|
-
sum += displayTokens[i].width;
|
|
756
|
-
if ((i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) || displayTokens[i].isTable) {
|
|
757
|
-
return i;
|
|
758
|
-
}
|
|
759
|
-
if (displayTokens[i].isLineBreak || (i === displayTokens.length - 1 && displayTokens[i].isPageBreak)) {
|
|
760
|
-
return i + 1;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
return 0;
|
|
764
|
-
}
|
|
765
|
-
getPreviousParagraphInfo(row) {
|
|
766
|
-
if (!row || !this.paragraphs.length) {
|
|
767
|
-
return { lastPage: 1, paragraphHeight: 0, paragraphLastLine: -1 };
|
|
768
|
-
}
|
|
769
|
-
const prevParagraph = this.paragraphs[row - 1].paragraphSettings;
|
|
770
|
-
return prevParagraph.getParagraphData();
|
|
771
|
-
}
|
|
772
|
-
getVisiblePages(offsetTop, containerHeight) {
|
|
773
|
-
const visiblePages = [];
|
|
774
|
-
let firstVisiblePage = offsetTop / (this.pageHeight + this.pagesSpace);
|
|
775
|
-
if (firstVisiblePage % 1 === 0) {
|
|
776
|
-
firstVisiblePage++;
|
|
777
|
-
}
|
|
778
|
-
let visiblePagesCount = containerHeight / (this.pageHeight + this.pagesSpace);
|
|
779
|
-
const partialPageOnScreenPercent = Math.trunc(((visiblePagesCount % 1) + (firstVisiblePage % 1)) * 100);
|
|
780
|
-
const pageSpaceHeightPercent = Math.trunc((this.pagesSpace / containerHeight) * 100);
|
|
781
|
-
if (partialPageOnScreenPercent - pageSpaceHeightPercent > 100) {
|
|
782
|
-
visiblePagesCount++;
|
|
783
|
-
}
|
|
784
|
-
visiblePagesCount = Math.ceil(visiblePagesCount);
|
|
785
|
-
firstVisiblePage = Math.ceil(firstVisiblePage);
|
|
786
|
-
const documentPagesCount = this.paragraphs[this.paragraphs.length - 1].paragraphSettings.lastPageNumber;
|
|
787
|
-
if (firstVisiblePage + visiblePagesCount - 1 > documentPagesCount) {
|
|
788
|
-
visiblePagesCount = documentPagesCount - firstVisiblePage + 1;
|
|
789
|
-
}
|
|
790
|
-
for (let i = 0; i < visiblePagesCount; i++) {
|
|
791
|
-
visiblePages.push(firstVisiblePage + i);
|
|
792
|
-
}
|
|
793
|
-
return visiblePages;
|
|
794
|
-
}
|
|
795
|
-
insertTextAndReturnEndCursorPosition(text, position) {
|
|
796
|
-
const left = this.paragraphs[position.row].content.slice(0, position.column);
|
|
797
|
-
const right = this.paragraphs[position.row].content.slice(position.column);
|
|
798
|
-
const insertParagraphs = this.splitByParagraphs(`${left}${text}${right}`).map(x => new ParagraphInfoModel({ content: x, nextLineIndexes: [] }));
|
|
799
|
-
insertParagraphs[0].paragraphSettings = this.getParagraphSettings(position.row);
|
|
800
|
-
this.paragraphs.splice(position.row, 1, ...insertParagraphs);
|
|
801
|
-
return new CursorParagraph(position.row + insertParagraphs.length - 1, insertParagraphs[insertParagraphs.length - 1].content.length - right.length);
|
|
802
|
-
}
|
|
803
|
-
splitByParagraphs(text) {
|
|
804
|
-
return text.split(/\r\n|\r|\n/);
|
|
805
|
-
}
|
|
806
|
-
setParagraphIndexes() {
|
|
807
|
-
for (let paragraph of this.paragraphs) {
|
|
808
|
-
paragraph.paragraphSettings.startInsertIndex = paragraph.startIndex;
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
initPagesVerticalData() {
|
|
812
|
-
if (!this.customComponents.edges ||
|
|
813
|
-
(!this.customComponents.edges.headersComponents.length && !this.customComponents.edges.footersComponents.length)) {
|
|
814
|
-
this.pagesVerticalData = [
|
|
815
|
-
new PageVerticalDataModel({
|
|
816
|
-
marginTop: this.pageMargin.top,
|
|
817
|
-
marginBottom: this.pageMargin.bottom,
|
|
818
|
-
contentHeight: this.pageHeight - this.pageMargin.top - this.pageMargin.bottom,
|
|
819
|
-
pageType: PageType.Default
|
|
820
|
-
})
|
|
821
|
-
];
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
const pageTypes = this.customComponents.edges.getUniquePageTypes();
|
|
825
|
-
this.pagesVerticalData = pageTypes.map(pageType => {
|
|
826
|
-
const headerHeight = this.customComponents.edges.getComponentHeightByPageType(pageType, EdgeType.Header);
|
|
827
|
-
const footerHeight = this.customComponents.edges.getComponentHeightByPageType(pageType, EdgeType.Footer);
|
|
828
|
-
const marginTop = Math.max(headerHeight, this.pageMargin.top);
|
|
829
|
-
const marginBottom = Math.max(footerHeight, this.pageMargin.bottom);
|
|
830
|
-
return new PageVerticalDataModel({
|
|
831
|
-
marginTop,
|
|
832
|
-
marginBottom,
|
|
833
|
-
contentHeight: this.pageHeight - marginTop - marginBottom,
|
|
834
|
-
pageType
|
|
835
|
-
});
|
|
836
|
-
});
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2NvbnRlbnQvZGlzcGxheS1kYXRhL2Rpc3BsYXktZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUdoRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FB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QUFNLENBQUMsQ0FBQztZQUVwRSxPQUFPLElBQUkscUJBQXFCLENBQUM7Z0JBQzdCLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEdBQUcsWUFBWTtnQkFDekQsUUFBUTthQUNYLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2VOb2RlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2hhcmVkL2Fic3RyYWN0L2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJyZWFrSGVscGVyIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLmhlbHBlcic7XG5pbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udGVudFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb250ZW50LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBDdXJzb3JQYXJhZ3JhcGggfSBmcm9tICcuLi8uLi9wb3NpdGlvbmluZy9jdXJzb3ItcGFyYWdyYXBoJztcbmltcG9ydCB7IEN1c3RvbUNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY3VzdG9tLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUsIE5FV19MSU5FX01BUktVUCB9IGZyb20gJy4uL2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi9kaXNwbGF5LXRva2VuLm1vZGVsJztcbmltcG9ydCB7IERpc3BsYXlUb2tlbkhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvZGlzcGxheS10b2tlbi5oZWxwZXInO1xuaW1wb3J0IHsgRGlzcGxheVZhbHVlIH0gZnJvbSAnLi4vY29uc3RhbnRzL2Rpc3BsYXktdmFsdWVzLmNvbnN0JztcbmltcG9ydCB7IEVkZ2VUeXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9lZGdlcy9lZGdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGluZyB9IGZyb20gJy4uLy4uL2NvcmUvZXZlbnQtZW1pdHRpbmcnO1xuaW1wb3J0IHsgRm9udE1ldHJpY3MgfSBmcm9tICcuLi8uLi9nYWRnZXRzL2ZvbnQtbWV0cmljcy9mb250LW1ldHJpY3MuaGVscGVyJztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybWF0U3R5bGVIZWxwZXIgfSBmcm9tICcuLi8uLi9leGVjdXRpb24vaGVscGVycy9mb3JtYXQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwgfSBmcm9tICcuL2dlbmVyYWwtcHJvcGVydGllcy5tb2RlbCc7XG5pbXBvcnQgeyBJQ3VzdG9tQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbmRlbnRNb2RlbCB9IGZyb20gJy4vaW5kZW50Lm1vZGVsJztcbmltcG9ydCB7IExpbmVJbmZvTW9kZWwgfSBmcm9tICcuL2xpbmUtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBNYXJnaW5Nb2RlbCB9IGZyb20gJy4uL21hcmdpbi5tb2RlbCc7XG5pbXBvcnQgeyBOb2RlclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdEYXRhTW9kZWwgfSBmcm9tICcuLy4uLy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgUGFnZUhlbHBlciB9IGZyb20gJy4uLy4uL2V4ZWN1dGlvbi9oZWxwZXJzL3BhZ2UuaGVscGVyJztcbmltcG9ydCB7IFBhZ2VUeXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9lZGdlcy9wYWdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQYWdlVmVydGljYWxEYXRhTW9kZWwgfSBmcm9tICcuLi9wYWdlLXZlcnRpY2FsLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSAnLi9wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgUGFyYWdyYXBoSGVscGVyIH0gZnJvbSAnLi4vLi4vZXhlY3V0aW9uL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhJbmZvTW9kZWwgfSBmcm9tICcuL21vZGVscy9wYXJhZ3JhcGgtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vLi4vZXhlY3V0aW9uL2hlbHBlcnMvcGFyYWdyYXBoLXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uLy4uL3Bvc2l0aW9uaW5nL3JhbmdlJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFiL3RhYi5oZWxwZXInO1xuaW1wb3J0IHsgVmlzaWJsZVJhbmdlIH0gZnJvbSAnLi4vLi4vZGlzcGxheS92aXNpYmxlLXJhbmdlLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwbGF5RGF0YSBleHRlbmRzIEV2ZW50RW1pdHRpbmcge1xuICAgIHBhcmFncmFwaHM6IFBhcmFncmFwaEluZm9Nb2RlbFtdID0gW107XG5cbiAgICBjb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIGFsbFBhZ2VzSGVpZ2h0ID0gMDtcblxuICAgIG1pbkhlaWdodCA9IDA7XG5cbiAgICB0YWJUb2tlbnM6IERpc3BsYXlUb2tlbltdID0gW107XG5cbiAgICBwYWdlc1ZlcnRpY2FsRGF0YTogUGFnZVZlcnRpY2FsRGF0YU1vZGVsW107XG5cbiAgICBnZXQgZGVmYXVsdFZlcnRpY2FsRGF0YSgpOiBQYWdlVmVydGljYWxEYXRhTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YS5maW5kKHggPT4geC5wYWdlVHlwZSA9PT0gUGFnZVR5cGUuRGVmYXVsdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVGV4dExpbmVzUHJvcGVydGllczogKFxuICAgICAgICBjdXJyZW50UGFyYWdyYXBoOiBQYXJhZ3JhcGgsXG4gICAgICAgIHByZXZQYXJhZ3JhcGhJbmZvOiB7IGxhc3RQYWdlOiBudW1iZXI7IHBhcmFncmFwaEhlaWdodDogbnVtYmVyOyBwYXJhZ3JhcGhMYXN0TGluZTogbnVtYmVyIH0sXG4gICAgICAgIHBhZ2VzSW5mbzogeyBwYWdlc1ZlcnRpY2FsRGF0YTogUGFnZVZlcnRpY2FsRGF0YU1vZGVsW107IHBhZ2VzU3BhY2U6IG51bWJlciB9LFxuICAgICAgICB0YWJsZXM6IENvbXBvbmVudFJlZjxOb2RlclRhYmxlQ29tcG9uZW50PltdXG4gICAgKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLFxuICAgICAgICBwcml2YXRlIGdlbmVyYWxQcm9wZXJ0aWVzOiBHZW5lcmFsUHJvcGVydGllc01vZGVsLFxuICAgICAgICBwcml2YXRlIHNlc3Npb25JZDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcGFnZU1hcmdpbjogTWFyZ2luTW9kZWwsXG4gICAgICAgIHB1YmxpYyBwYWdlc1NwYWNlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBwYWdlV2lkdGg6IG51bWJlcixcbiAgICAgICAgcHVibGljIHBhZ2VIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzLFxuICAgICAgICBwdWJsaWMgY3VzdG9tQ29udGVudFNlcnZpY2U6IEN1c3RvbUNvbnRlbnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHMgPSB0aGlzLnNwbGl0QnlQYXJhZ3JhcGhzKHRoaXMubW9kZWwuY29udGVudCkubWFwKHggPT4gbmV3IFBhcmFncmFwaEluZm9Nb2RlbCh7IGNvbnRlbnQ6IHggfSkpO1xuICAgICAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMucGFnZUhlaWdodCArIDIgKiB0aGlzLnBhZ2VzU3BhY2U7XG4gICAgICAgIHRoaXMuY29udGVudFdpZHRoID0gdGhpcy5wYWdlV2lkdGggLSB0aGlzLnBhZ2VNYXJnaW4ubGVmdCAtIHRoaXMucGFnZU1hcmdpbi5yaWdodDtcbiAgICAgICAgdGhpcy5pbml0UGFnZXNWZXJ0aWNhbERhdGEoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzVGV4dExpbmVzUHJvcGVydGllcyA9ICF0aGlzLnBhZ2VIZWlnaHRcbiAgICAgICAgICAgID8gUGFyYWdyYXBoSGVscGVyLnByb2Nlc3NUZXh0TGluZXNQcm9wZXJ0aWVzRm9yU2luZ2xlUGFnZVxuICAgICAgICAgICAgOiBQYXJhZ3JhcGhIZWxwZXIucHJvY2Vzc1RleHRMaW5lc1Byb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGV4dChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0ZXh0OiBzdHJpbmcpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEFuZFJldHVybkVuZEN1cnNvclBvc2l0aW9uKHRleHQsIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIHJlbW92ZVJhbmdlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhUZXh0ID1cbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tyYW5nZS5zdGFydC5yb3ddLmNvbnRlbnQuc2xpY2UoMCwgcmFuZ2Uuc3RhcnQuY29sdW1uKSArXG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbcmFuZ2UuZW5kLnJvd10uY29udGVudC5zbGljZShyYW5nZS5lbmQuY29sdW1uKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKHJhbmdlLnN0YXJ0LnJvdyk7XG4gICAgICAgIHRoaXMucGFyYWdyYXBocy5zcGxpY2UocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93ICsgMSwgbmV3IFBhcmFncmFwaEluZm9Nb2RlbCh7IGNvbnRlbnQ6IHBhcmFncmFwaFRleHQgfSkpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcmFuZ2Uuc3RhcnQucm93XS5wYXJhZ3JhcGhTZXR0aW5ncyA9IHBhcmFncmFwaFNldHRpbmdzO1xuICAgIH1cblxuICAgIGdldFBhcmFncmFwaENvbnRlbnQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHNbaW5kZXhdPy5jb250ZW50IHx8ICcnO1xuICAgIH1cblxuICAgIGdldEFsbFBhcmFncmFwaHNDb250ZW50KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBocy5tYXAoeCA9PiB4LmNvbnRlbnQpO1xuICAgIH1cblxuICAgIGdldFBhcmFncmFwaFNldHRpbmdzKGluZGV4OiBudW1iZXIpOiBQYXJhZ3JhcGggfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoc1tpbmRleF0/LnBhcmFncmFwaFNldHRpbmdzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0UGFyYWdyYXBoc0NvbnRlbnRGb3JSYW5nZShyYW5nZTogUmFuZ2UpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChyYW5nZS5pc1NpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldFBhcmFncmFwaENvbnRlbnQocmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQYXJ0SW5SYW5nZSA9IGxpbmUuc2xpY2UocmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICAgICAgcmV0dXJuIFtsaW5lUGFydEluUmFuZ2VdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHNDb250ZW50ID0gdGhpcy5wYXJhZ3JhcGhzLnNsaWNlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyArIDEpLm1hcCh4ID0+IHguY29udGVudCk7XG4gICAgICAgIHBhcmFncmFwaHNDb250ZW50WzBdID0gKHBhcmFncmFwaHNDb250ZW50WzBdIHx8ICcnKS5zbGljZShyYW5nZS5zdGFydC5jb2x1bW4pO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBwYXJhZ3JhcGhzQ29udGVudC5sZW5ndGggLSAxO1xuICAgICAgICBwYXJhZ3JhcGhzQ29udGVudFtsYXN0SW5kZXhdID0gcGFyYWdyYXBoc0NvbnRlbnRbbGFzdEluZGV4XS5zbGljZSgwLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICByZXR1cm4gcGFyYWdyYXBoc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgZ2V0VGV4dFJhbmdlKHJhbmdlOiBSYW5nZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFncmFwaHNDb250ZW50Rm9yUmFuZ2UocmFuZ2UpLmpvaW4oTkVXX0xJTkVfTUFSS1VQKTtcbiAgICB9XG5cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgc3RhcnRSb3cgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4ocG9zaXRpb24ucm93LCB0aGlzLnBhcmFncmFwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0Um93IHx8IDA7IGkgPCBlbmRSb3c7IGkrKykge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5wYXJhZ3JhcGhzW2ldLmNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmRleCArIHBvc2l0aW9uLmNvbHVtbjtcbiAgICB9XG5cbiAgICBpbmRleFRvUG9zaXRpb24ocG9zaXRpb25JbmRleDogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGxpbmVJbmRleCA9IHN0YXJ0Um93IHx8IDA7IGxpbmVJbmRleCA8IHRoaXMucGFyYWdyYXBocy5sZW5ndGg7IGxpbmVJbmRleCsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbkluZGV4IC09IHRoaXMucGFyYWdyYXBoc1tsaW5lSW5kZXhdLmNvbnRlbnQubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvc2l0aW9uSW5kZXggKyB0aGlzLnBhcmFncmFwaHNbbGluZUluZGV4XS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvclBhcmFncmFwaChsaW5lSW5kZXgsIGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5wYXJhZ3JhcGhzW3RoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxXS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3JQYXJhZ3JhcGgodGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgaW5kZXhlc1RvUmFuZ2Uoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogUmFuZ2Uge1xuICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gdGhpcy5pbmRleFRvUG9zaXRpb24oc3RhcnRJbmRleCwgMCk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5pbmRleFRvUG9zaXRpb24oZW5kSW5kZXgsIDApO1xuXG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIH1cblxuICAgIGlzTmV3TGluZVN5bWJvbChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcmFncmFwaHMubWFwKHggPT4geC5jb250ZW50KS5qb2luKE5FV19MSU5FX01BUktVUCk7XG5cbiAgICAgICAgcmV0dXJuICF0ZXh0IHx8ICF0ZXh0W2luZGV4XSB8fCB0ZXh0W2luZGV4XSA9PT0gTkVXX0xJTkVfTUFSS1VQO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkUGFyYWdyYXBoc0J5UmFuZ2UocmFuZ2U6IFJhbmdlKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5taW4ocmFuZ2UuZW5kLnJvdywgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgcmFuZ2Uuc3RhcnQucm93KSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5wYXJhZ3JhcGhzW2ldLmNvbnRlbnQubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5kICs9IHRoaXMucGFyYWdyYXBoc1tpXS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA8IHRoaXMucGFyYWdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCArPSB0aGlzLnBhcmFncmFwaHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25BZnRlckJyZWFrKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGJyZWFrVHlwZTogQnJlYWtUeXBlcyk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGlmIChicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuVGV4dFdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBwb3NpdGlvbi5jb2x1bW4gPT09IHRoaXMucGFyYWdyYXBoc1twb3NpdGlvbi5yb3ddLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICBjb25zdCBpc0xhc3RQYXJhZ3JhcGggPSBwb3NpdGlvbi5yb3cgPT09IHRoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gaXNMYXN0Q29sdW1uICYmICFpc0xhc3RQYXJhZ3JhcGggPyBuZXcgQ3Vyc29yUGFyYWdyYXBoKHBvc2l0aW9uLnJvdyArIDEsIDApIDogcG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VGcm9tVG9wKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MgPyB0aGlzLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcCA6IDA7XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VGcm9tVG9wRm9yUHJpbnQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tpbmRleF0ucGFyYWdyYXBoU2V0dGluZ3M7XG4gICAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBwYXJhZ3JhcGgucGFnZU51bWJlcnNbMF07XG4gICAgICAgIGxldCBwYWdlQnJlYWtIZWlnaHQgPSAwO1xuICAgICAgICBwYXJhZ3JhcGgudGV4dExpbmVzSW5mby5mb3JFYWNoKGxpbmVzSW5mbyA9PiB7XG4gICAgICAgICAgICBpZiAobGluZXNJbmZvLmlzQWZ0ZXJQYWdlQnJlYWspIHtcbiAgICAgICAgICAgICAgICBwYWdlQnJlYWtIZWlnaHQgPSBsaW5lc0luZm8uaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcmFncmFwaC5kaXN0YW5jZUZyb21Ub3AgLSBwYWdlTnVtYmVyICogdGhpcy5wYWdlc1NwYWNlIC0gcGFnZUJyZWFrSGVpZ2h0O1xuICAgIH1cblxuICAgIHNldFBhcmFncmFwaFNldHRpbmdzKHJvdzogbnVtYmVyLCBsaW5lSW5mb3M6IExpbmVJbmZvTW9kZWxbXSwgbnVtYmVyaW5nRGF0YTogTnVtYmVyaW5nRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wYXJhZ3JhcGhzW3Jvd10ucGFyYWdyYXBoU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tyb3ddLnBhcmFncmFwaFNldHRpbmdzID0gbmV3IFBhcmFncmFwaChcbiAgICAgICAgICAgICAgICBudW1iZXJpbmdEYXRhLFxuICAgICAgICAgICAgICAgIGxpbmVJbmZvc1swXS5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVGV4dExpbmVzUHJvcGVydGllc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYWdyYXBoc1tyb3ddLnBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBudW1iZXJpbmdEYXRhO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcm93XS5wYXJhZ3JhcGhTZXR0aW5ncy53aWR0aCA9IHRoaXMuY29udGVudFdpZHRoO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcm93XS5wYXJhZ3JhcGhTZXR0aW5ncy5zZXRUZXh0TGluZXNJbmZvKGxpbmVJbmZvcyk7XG4gICAgfVxuXG4gICAgZ2V0UGFyYWdyYXBoSGVpZ2h0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MgPyB0aGlzLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFNldHRpbmdzLmhlaWdodCA6IDA7XG4gICAgfVxuXG4gICAgZ2V0VmlzaWJsZVJhbmdlKG9mZnNldFRvcDogbnVtYmVyLCBzY3JvbGxlckhlaWdodDogbnVtYmVyKTogVmlzaWJsZVJhbmdlIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wYXJhZ3JhcGhzLmZpbmRJbmRleCh4ID0+IG9mZnNldFRvcCA8PSB4LnBhcmFncmFwaFNldHRpbmdzPy5kaXN0YW5jZUZyb21Ub3AgKyB4LnBhcmFncmFwaFNldHRpbmdzPy5oZWlnaHQpO1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnRMaW5lSW5mbyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gdGhpcy5wYXJhZ3JhcGhzW3N0YXJ0XTtcbiAgICAgICAgaWYgKHN0YXJ0UGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaE9mZnNldFRvcCA9IG9mZnNldFRvcCAtIHN0YXJ0UGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcDtcbiAgICAgICAgICAgIHN0YXJ0TGluZUluZm8gPSBQYXJhZ3JhcGhIZWxwZXIuZ2V0VmlzaWJsZUxpbmVJbmZvKHN0YXJ0UGFyYWdyYXBoPy5wYXJhZ3JhcGhTZXR0aW5ncy50ZXh0TGluZXNJbmZvLCBzdGFydFBhcmFncmFwaE9mZnNldFRvcCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXJ0TGluZUluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnRQYXJhZ3JhcGg6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICAgIHN0YXJ0U2NyZWVuTGluZTogMCxcbiAgICAgICAgICAgICAgICBzdGFydFNjcmVlbkZ1bGxMaW5lOiAwLFxuICAgICAgICAgICAgICAgIGVuZFBhcmFncmFwaDogMCxcbiAgICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICAgIGVuZFNjcmVlbkxpbmU6IDAsXG4gICAgICAgICAgICAgICAgZW5kU2NyZWVuRnVsbExpbmU6IDAsXG4gICAgICAgICAgICAgICAgcGFnZXM6IFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmQgPSB0aGlzLnBhcmFncmFwaHMuZmluZEluZGV4KFxuICAgICAgICAgICAgeCA9PiBvZmZzZXRUb3AgKyBzY3JvbGxlckhlaWdodCA8PSB4LnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcCArIHgucGFyYWdyYXBoU2V0dGluZ3MuaGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLnBhcmFncmFwaHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmRMaW5lSW5mbyA9IG51bGw7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tlbmRdO1xuICAgICAgICBpZiAoZW5kUGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGhPZmZzZXRUb3AgPSBvZmZzZXRUb3AgKyBzY3JvbGxlckhlaWdodCAtIGVuZFBhcmFncmFwaC5wYXJhZ3JhcGhTZXR0aW5ncy5kaXN0YW5jZUZyb21Ub3A7XG4gICAgICAgICAgICBlbmRMaW5lSW5mbyA9IFBhcmFncmFwaEhlbHBlci5nZXRWaXNpYmxlTGluZUluZm8oZW5kUGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzPy50ZXh0TGluZXNJbmZvLCBlbmRQYXJhZ3JhcGhPZmZzZXRUb3AsIC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc2libGVQYWdlcyA9IHRoaXMuZ2V0VmlzaWJsZVBhZ2VzKG9mZnNldFRvcCwgc2Nyb2xsZXJIZWlnaHQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydFBhcmFncmFwaDogc3RhcnQsXG4gICAgICAgICAgICBzdGFydExpbmU6IHN0YXJ0TGluZUluZm8uaW5kZXgsXG4gICAgICAgICAgICBzdGFydFNjcmVlbkxpbmU6IHN0YXJ0TGluZUluZm8uc2NyZWVuSW5kZXgsXG4gICAgICAgICAgICBzdGFydFNjcmVlbkZ1bGxMaW5lOiBzdGFydExpbmVJbmZvLnZpc2libGVTY3JlZW5JbmRleCxcbiAgICAgICAgICAgIGVuZFBhcmFncmFwaDogZW5kLFxuICAgICAgICAgICAgZW5kTGluZTogZW5kTGluZUluZm8uaW5kZXgsXG4gICAgICAgICAgICBlbmRTY3JlZW5MaW5lOiBlbmRMaW5lSW5mby5zY3JlZW5JbmRleCxcbiAgICAgICAgICAgIGVuZFNjcmVlbkZ1bGxMaW5lOiBlbmRMaW5lSW5mby52aXNpYmxlU2NyZWVuSW5kZXgsXG4gICAgICAgICAgICBwYWdlczogdmlzaWJsZVBhZ2VzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKHN0YXJ0UGFyYWdyYXBoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFBhcmFncmFwaEluZGV4ZXMoKTtcbiAgICAgICAgY29uc3QgcGFnZXNJbmZvID0geyBwYWdlc1ZlcnRpY2FsRGF0YTogdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSwgcGFnZXNTcGFjZTogdGhpcy5wYWdlc1NwYWNlIH07XG4gICAgICAgIGxldCBjdXJyZW50UGFnZSA9IHN0YXJ0UGFyYWdyYXBoSW5kZXggPT09IDAgPyAxIDogdGhpcy5wYXJhZ3JhcGhzW3N0YXJ0UGFyYWdyYXBoSW5kZXggLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncy5sYXN0UGFnZU51bWJlcjtcbiAgICAgICAgbGV0IHBhZ2VWZXJ0aWNhbERhdGEgPSBQYWdlSGVscGVyLmdldFZlcnRpY2FsRGF0YShjdXJyZW50UGFnZSwgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBhcmFncmFwaEluZGV4OyBpIDwgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UGFyYWdyYXBoSW5mbyA9IHRoaXMuZ2V0UHJldmlvdXNQYXJhZ3JhcGhJbmZvKGkpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU2V0dGluZ3M7XG4gICAgICAgICAgICBwYXJhZ3JhcGhTZXR0aW5ncy5wcm9jZXNzUGFyYWdyYXBoUHJvcGVydGllcyhwcmV2UGFyYWdyYXBoSW5mbywgcGFnZXNJbmZvLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzKTtcbiAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhTZXR0aW5ncy5maXJzdFBhZ2VOdW1iZXIgIT09IGN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSBwYXJhZ3JhcGhTZXR0aW5ncy5maXJzdFBhZ2VOdW1iZXI7XG4gICAgICAgICAgICAgICAgcGFnZVZlcnRpY2FsRGF0YSA9IFBhZ2VIZWxwZXIuZ2V0VmVydGljYWxEYXRhKHBhcmFncmFwaFNldHRpbmdzLmZpcnN0UGFnZU51bWJlciwgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLmNhbGN1bGF0ZURpc3RhbmNlRnJvbVRvcCh0aGlzLnBhZ2VIZWlnaHQsIHRoaXMucGFnZXNTcGFjZSwgcGFnZVZlcnRpY2FsRGF0YS5tYXJnaW5Ub3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhZ2VIZWlnaHQgPSB0aGlzLnBhZ2VIZWlnaHQ7XG4gICAgICAgIGlmICghcGFnZUhlaWdodCkge1xuICAgICAgICAgICAgcGFnZUhlaWdodCA9IHRoaXMuZ2V0QWxsUGFyYWdyYXBoc0hlaWdodCgpICsgdGhpcy5wYWdlTWFyZ2luLnRvcCArIHRoaXMucGFnZU1hcmdpbi5ib3R0b207XG4gICAgICAgICAgICB0aGlzLm1pbkhlaWdodCA9IHBhZ2VIZWlnaHQgKyAyICogdGhpcy5wYWdlc1NwYWNlO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmVydGljYWxEYXRhLmNvbnRlbnRIZWlnaHQgPSBwYWdlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VOdW1iZXIgPSB0aGlzLnBhcmFncmFwaHNbdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLnBhcmFncmFwaFNldHRpbmdzLmxhc3RQYWdlTnVtYmVyO1xuICAgICAgICB0aGlzLmFsbFBhZ2VzSGVpZ2h0ID0gbGFzdFBhZ2VOdW1iZXIgKiAocGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSkgKyB0aGlzLnBhZ2VzU3BhY2U7XG4gICAgICAgIHRoaXMuZW1pdCgncGFnZXNDb3VudENoYW5nZWQnLCB7IHBhZ2VzQ291bnQ6IGxhc3RQYWdlTnVtYmVyLCBwYWdlSGVpZ2h0OiBwYWdlSGVpZ2h0ICsgMiAqIHRoaXMucGFnZXNTcGFjZSB9KTtcbiAgICB9XG5cbiAgICBnZXRBbGxQYXJhZ3JhcGhzSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHgucGFyYWdyYXBoU2V0dGluZ3MuaGVpZ2h0LCAwKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncGFnZXNDb3VudENoYW5nZWQnKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYWdlVmVydGljYWxEYXRhKGVkZ2VUeXBlOiBFZGdlVHlwZSwgcGFnZVR5cGU6IFBhZ2VUeXBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhZ2VWZXJ0aWNhbERhdGEgPSB0aGlzLnBhZ2VzVmVydGljYWxEYXRhLmZpbmQoeCA9PiB4LnBhZ2VUeXBlID09PSBwYWdlVHlwZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEhlaWdodCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5nZXRDb21wb25lbnRIZWlnaHRCeVR5cGUocGFnZVR5cGUsIGVkZ2VUeXBlKTtcbiAgICAgICAgaWYgKGVkZ2VUeXBlID09PSBFZGdlVHlwZS5IZWFkZXIpIHtcbiAgICAgICAgICAgIHBhZ2VWZXJ0aWNhbERhdGEubWFyZ2luVG9wID0gY29tcG9uZW50SGVpZ2h0ID4gdGhpcy5wYWdlTWFyZ2luLnRvcCA/IGNvbXBvbmVudEhlaWdodCA6IHRoaXMucGFnZU1hcmdpbi50b3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWdlVmVydGljYWxEYXRhLm1hcmdpbkJvdHRvbSA9IGNvbXBvbmVudEhlaWdodCA+IHRoaXMucGFnZU1hcmdpbi5ib3R0b20gPyBjb21wb25lbnRIZWlnaHQgOiB0aGlzLnBhZ2VNYXJnaW4uYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudEhlaWdodCA9IHRoaXMucGFnZUhlaWdodCAtIHBhZ2VWZXJ0aWNhbERhdGEubWFyZ2luVG9wIC0gcGFnZVZlcnRpY2FsRGF0YS5tYXJnaW5Cb3R0b207XG4gICAgICAgIGlmIChuZXdDb250ZW50SGVpZ2h0ID09PSBwYWdlVmVydGljYWxEYXRhLmNvbnRlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VWZXJ0aWNhbERhdGEuY29udGVudEhlaWdodCA9IG5ld0NvbnRlbnRIZWlnaHQ7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKDApO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhcmFncmFwaExpbmVOdW1iZXIoZmlyc3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMucGFyYWdyYXBocy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wYXJhZ3JhcGhzW2ZpcnN0XS5saW5lTnVtYmVyID0gMDtcbiAgICAgICAgICAgIGZpcnN0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbaV0ubGluZU51bWJlciA9IHRoaXMucGFyYWdyYXBoc1tpIC0gMV0ubGluZU51bWJlciArIHRoaXMucGFyYWdyYXBoc1tpIC0gMV0ubmV4dExpbmVJbmRleGVzLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYXJhZ3JhcGhTdGFydEluZGV4KGZpcnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbZmlyc3RdLnN0YXJ0SW5kZXggPSAwO1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCB0aGlzLnBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tpXS5zdGFydEluZGV4ID0gdGhpcy5wYXJhZ3JhcGhzW2kgLSAxXS5zdGFydEluZGV4ICsgdGhpcy5nZXRQYXJhZ3JhcGhDb250ZW50KGkgLSAxKS5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFyYWdyYXBoU2V0dGluZ3NOdW1iZXJpbmdEYXRhKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGluZGV4KTtcbiAgICAgICAgaWYgKHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IHRoaXMubW9kZWwucGFyYWdyYXBoc1tpbmRleF0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpIHtcbiAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncyxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoU2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTmV4dExpbmVJbmRleGVzKGZpcnN0UGFyYWdyYXBoOiBudW1iZXIsIGxhc3RQYXJhZ3JhcGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhcmFncmFwaFN0YXJ0SW5kZXgoZmlyc3RQYXJhZ3JhcGgpO1xuICAgICAgICBsZXQgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhmaXJzdFBhcmFncmFwaCAtIDEpPy5pc0VuZGVkQnlQYWdlQnJlYWsgPyBmaXJzdFBhcmFncmFwaCA6IC0xO1xuICAgICAgICBsZXQgZmlyc3RVc2VkVGFiSW5kZXggPSB0aGlzLm1vZGVsLnRhYnMuZmluZEluZGV4KHggPT4geC5pbnNlcnRJbmRleCA+PSB0aGlzLnBhcmFncmFwaHNbZmlyc3RQYXJhZ3JhcGhdLnN0YXJ0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3RQYXJhZ3JhcGg7IGkgPD0gbGFzdFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyYWdyYXBoc1tpXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYlRva2VucyA9IFtdO1xuICAgICAgICAgICAgTnVtYmVyaW5nSGVscGVyLmNhbGN1bGF0ZU51bWJlcmluZ0luZm8oXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkLFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGkpPy5udW1iZXJpbmdEYXRhLm1hcmtlcixcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm8sXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyaW5nRGF0YSA9IE51bWJlcmluZ0hlbHBlci5jcmVhdGVEYXRhTW9kZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3BsaXRzLCByb3dJbmZvcyB9ID0gdGhpcy5nZXRTcGxpdHModGhpcy5tb2RlbCwgaSk7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbaV0ubmV4dExpbmVJbmRleGVzID0gc3BsaXRzO1xuICAgICAgICAgICAgaWYgKGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9PT0gaSkge1xuICAgICAgICAgICAgICAgIHJvd0luZm9zWzBdLmlzQWZ0ZXJQYWdlQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gcm93SW5mb3Nbcm93SW5mb3MubGVuZ3RoIC0gMV0uaXNFbmRlZEJ5UGFnZUJyZWFrID8gaSArIDEgOiAtMTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYWdyYXBoU2V0dGluZ3MoaSwgcm93SW5mb3MsIG51bWJlcmluZ0RhdGEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJhZ3JhcGhTZXR0aW5nc051bWJlcmluZ0RhdGEoaSk7XG4gICAgICAgICAgICBmaXJzdFVzZWRUYWJJbmRleCA9IHRoaXMudXBkYXRlUGFyYWdyYXBoVGFicyhmaXJzdFVzZWRUYWJJbmRleCwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGxhc3RQYXJhZ3JhcGggKyAxKT8uc2V0SXNBZnRlclBhZ2VCcmVhayhpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPiAtMSk7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoTGluZU51bWJlcihmaXJzdFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKGZpcnN0UGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZSA9IHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIuY2FsY3VsYXRlTnVtYmVyaW5nSW5mbyhcbiAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0xldmVsLFxuICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGhTZXR0aW5ncy5udW1iZXJpbmdEYXRhLm1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KHRoaXMubW9kZWwuZm9ybWF0cywgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIudXBkYXRlTWFya2VyRGF0YSh0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLCBwYXJhZ3JhcGhTZXR0aW5ncywgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBwYXJhZ3JhcGhTZXR0aW5ncy5zdGFydEluc2VydEluZGV4KTtcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZUNlbGxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3BhZ2VUeXBlJyBpbiB0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UudXBkYXRlRWRnZXModGhpcy5zZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBhcmFncmFwaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhcmFncmFwaEluZGV4OyBpIDwgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IG51bWJlcmluZ0lkLCBudW1iZXJpbmdMZXZlbCB9ID0gdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLnBhcmFncmFwaFN0eWxlO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlcmluZ0lkICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvW251bWJlcmluZ0lkXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1tudW1iZXJpbmdJZF1bbnVtYmVyaW5nTGV2ZWxdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm9bbnVtYmVyaW5nSWRdW251bWJlcmluZ0xldmVsXS52aXNpdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZTogQ29tcG9uZW50UmVmPE5vZGVyVGFibGVDb21wb25lbnQ+KTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUuaW5zdGFuY2Uucm93TWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIHRhYmxlLmluc3RhbmNlLnJvd01hdHJpeFtpXS5jZWxscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWFya2VyLCBudW1iZXJpbmdJZCB9ID1cbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGE7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlciAmJiBudW1iZXJpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIudXBkYXRlTnVtYmVyaW5nSW5mbyh0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm8sIG1hcmtlciwgbnVtYmVyaW5nSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0QWxsTnVtYmVyaW5nSW5mbygwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGVudExlbmd0aCA9IHRoaXMuZ2V0UGFyYWdyYXBoQ29udGVudChwYXJhZ3JhcGhJbmRleCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhMYXN0SW5kZXggPSB0aGlzLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnN0YXJ0SW5kZXggKyBwYXJhZ3JhcGhDb250ZW50TGVuZ3RoO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWJJbmRleCA9PT0gLTEgfHxcbiAgICAgICAgICAgIHRhYkluZGV4ID49IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnNbdGFiSW5kZXhdLmluc3RhbmNlLmluc2VydEluZGV4ID4gcGFyYWdyYXBoTGFzdEluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYkluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRhYkluZGV4O1xuICAgICAgICB3aGlsZSAodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnNbdGFiSW5kZXhdICYmIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA8PSBwYXJhZ3JhcGhMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS53aWR0aCA9IHRoaXMudGFiVG9rZW5zW3RhYkluZGV4IC0gc3RhcnRJbmRleF0ud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaGVpZ2h0ID0gdGhpcy50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNwbGl0cyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHBhcmFncmFwaEluZGV4OiBudW1iZXIpOiB7IHNwbGl0czogbnVtYmVyW107IHJvd0luZm9zOiBMaW5lSW5mb01vZGVsW10gfSB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRlbnQgPSB0aGlzLmdldFBhcmFncmFwaENvbnRlbnQocGFyYWdyYXBoSW5kZXgpO1xuICAgICAgICBjb25zdCBzdHJUb2tlbnMgPSB0aGlzLmdldERpc3BsYXlUb2tlbnMobW9kZWwsIHBhcmFncmFwaENvbnRlbnQsIHRoaXMucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0uc3RhcnRJbmRleCk7XG4gICAgICAgIGlmICghc3RyVG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFJvd0luZm8gPSBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAoREVGQVVMVF9GT05UX1NJWkUgKiA0KSAvIDMsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgYWxpZ246IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRIYW5naW5nLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb2Zmc2V0QWZ0ZXI6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgaXNBZnRlclBhZ2VCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNFbmRlZEJ5UGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHNwbGl0czogW10sIHJvd0luZm9zOiBbZGVmYXVsdFJvd0luZm9dIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdHM6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHJvd0luZm9zOiBMaW5lSW5mb01vZGVsW10gPSBbXTtcblxuICAgICAgICBsZXQgcHJldlRva2VuOiBEaXNwbGF5VG9rZW47XG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICBsZXQgaW5pdGlhbCA9IHBhcmFncmFwaENvbnRlbnQ7XG4gICAgICAgIHdoaWxlIChpbmRleCkge1xuICAgICAgICAgICAgaW5pdGlhbCA9IGluaXRpYWwuc2xpY2UoaW5kZXggPiAwID8gaW5kZXggOiAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IHN0clRva2Vucy5zbGljZShwYXJhZ3JhcGhDb250ZW50Lmxlbmd0aCAtIGluaXRpYWwubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKC4uLnRoaXMuZ2V0RW1wdHlEaXNwbGF5VG9rZW5zKG1vZGVsLCB0aGlzLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnN0YXJ0SW5kZXggKyBpbmRleCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgd3JhcExpbWl0ID0gdGhpcy5jb21wdXRlV3JhcEluZGV4KHRva2VucywgdGhpcy5jb250ZW50V2lkdGgsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZGVmYXVsdFRhYldpZHRoKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiB0aGlzLnBhcmFncmFwaHMubGVuZ3RoID4gcGFyYWdyYXBoSW5kZXggKyAxKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IERpc3BsYXlUb2tlbkhlbHBlci5nZXRMaW5lSW5mb0Zyb21Ub2tlbihwcmV2VG9rZW4sIHdyYXBUb2tlbnNbMF0sIHdyYXBUb2tlbnMsIGlzQWZ0ZXJQYWdlQnJlYWspO1xuICAgICAgICAgICAgbGluZUluZm8uYmFja2dyb3VuZENvbG9yID0gbW9kZWwucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ucGFyYWdyYXBoU3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgcm93SW5mb3MucHVzaChsaW5lSW5mbyk7XG5cbiAgICAgICAgICAgIGlmICghd3JhcExpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4ID0gd3JhcFNwbGl0O1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRzTGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0SW5kZXggPSBzcGxpdHNMZW5ndGggPyBpbmRleCArIHNwbGl0c1tzcGxpdHNMZW5ndGggLSAxXSA6IGluZGV4O1xuICAgICAgICAgICAgc3BsaXRzLnB1c2goc3BsaXRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhYlRva2Vucy5wdXNoKC4uLnN0clRva2Vucy5maWx0ZXIoeCA9PiB4LmlzVGFiKSk7XG5cbiAgICAgICAgUGFyYWdyYXBoSGVscGVyLmFwcGx5UGFyYWdyYXBoSW5kZW50c1RvTGluZXMocm93SW5mb3MsIHBhcmFncmFwaEluZGV4LCBtb2RlbC5wYXJhZ3JhcGhzKTtcbiAgICAgICAgcmV0dXJuIHsgc3BsaXRzLCByb3dJbmZvcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBkaXNwbGF5IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0YWJzIGFuZCBzcGFjZXMgYW5kIGN1c3RvbSBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdHI6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVtcHR5RGlzcGxheVRva2Vucyhtb2RlbCwgc3RhcnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5maWxsTGluZVRva2VucyhzdGFydEluZGV4LCBzdHIsIG1vZGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGxMaW5lVG9rZW5zKHN0YXJ0SW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nLCBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihtb2RlbCwgc3RhcnRJbmRleCArIGxpbmUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBEaXNwbGF5VG9rZW5bXSA9IFtdO1xuICAgICAgICBsZXQgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgIGxldCBwcmV2Rm9ybWF0OiBGb3JtYXRNb2RlbCA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhckNvZGU6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Rm9udFN0cmluZzogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IHByZXZDaGFyOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBsZXQgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBsaW5lW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShjaGFyLCBmb250U3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IHRoaXMuZ2V0T3JHZW5lcmF0ZUNvbXBvbmVudChzdGFydEluZGV4LCBjaGFyKTtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrVHlwZSA9IEJyZWFrSGVscGVyLmdldEJyZWFrVHlwZShtb2RlbCwgY2hhciwgc3RhcnRJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21Db21wb25lbnQgJiYgIWJyZWFrVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5nZXRUb2tlbkZyb21Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgbGluZUluZm8sXG4gICAgICAgICAgICAgICAgICAgIERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50LFxuICAgICAgICAgICAgICAgICAgICBpID09PSAwLFxuICAgICAgICAgICAgICAgICAgICBzaXplXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSAtMTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gRGlzcGxheVRva2VuSGVscGVyLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoZm9ybWF0Py50ZXh0U3R5bGUsIHByZXZGb3JtYXQ/LnRleHRTdHlsZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID4gMSAmJiBzeW1ib2xDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyLCBwcmV2Rm9udFN0cmluZywgY2hhcmFjdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzID0gW3Rva2VuXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBjaGFyQ29kZTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9IGNoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXZGb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICBwcmV2Rm9udFN0cmluZyA9IGZvbnRTdHJpbmc7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID4gZm9ybWF0Py5lbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPckdlbmVyYXRlQ29tcG9uZW50KGNoYXJJbmRleDogbnVtYmVyLCBjaGFyOiBzdHJpbmcpOiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PiB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuaXNTcGVjaWFsTWFya2VyKGNoYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5nZXRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLCBjaGFyLCBjaGFySW5kZXgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudC5pbnN0YW5jZSBpbnN0YW5jZW9mIE5vZGVyVGFibGVDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0NvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVDZWxscygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29tcG9uZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZ2VuZXJhdGVDb21wb25lbnQoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50V2lkdGgsXG4gICAgICAgICAgICBjaGFySW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXI6IHN0cmluZywgcHJldkZvbnRTdHJpbmc6IHN0cmluZywgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShwcmV2Q2hhciwgcHJldkZvbnRTdHJpbmcpO1xuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXJhY3RlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgbmV3U2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMaW5lVG9rZW5zKG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSwgbGluZTogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0Zyb21UZXh0TGluZShzdGFydEluZGV4ICsgbGluZS5sZW5ndGgpO1xuICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMobW9kZWwsIHN0YXJ0SW5kZXgsIGxpbmVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdID0gW107XG4gICAgICAgIGxldCBmb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBsZXQgcHJldkZvcm1hdDogRm9ybWF0TW9kZWwgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkNoYXJDb2RlOiBudW1iZXIgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkZvbnRTdHJpbmc6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhcjogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IGZvbnRTdHJpbmcgPSBDb250ZW50U3R5bGVIZWxwZXIuZ2V0Rm9udFN0eWxlc1N0cmluZyhmb3JtYXQ/LnRleHRTdHlsZSk7XG4gICAgICAgIGxldCBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gbGluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUoY2hhciwgZm9udFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtUeXBlID0gQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKG1vZGVsLCBjaGFyLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudCAmJiAhYnJlYWtUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBEaXNwbGF5VG9rZW5IZWxwZXIuZ2V0RGlzcGxheVZhbHVlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZpcnN0Q2hhcmFjdGVyID0gaSA9PT0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IG5ldyBEaXNwbGF5VG9rZW4oe1xuICAgICAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiBsaW5lSW5mby5hbGlnbixcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBpc0ZpcnN0Q2hhcmFjdGVyID8gbGluZUluZm8uaW5kZW50LmZpcnN0TGluZSA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEZpcnN0TGluZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50SGFuZ2luZzogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5oYW5naW5nIDogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50TGVmdDogbGluZUluZm8uaW5kZW50LmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEJlZm9yZTogbGluZUluZm8ub2Zmc2V0QmVmb3JlLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRBZnRlcjogbGluZUluZm8ub2Zmc2V0QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICAgICAgaXNQYWdlQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5QYWdlLFxuICAgICAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLlRleHRXcmFwcGluZyxcbiAgICAgICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlICE9PSBwcmV2Q2hhckNvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgIXByZXZGb3JtYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgIUNvbnRlbnRTdHlsZUhlbHBlci5hcmVTYW1lVGV4dFN0eWxlcyhmb3JtYXQ/LnRleHRTdHlsZSwgcHJldkZvcm1hdD8udGV4dFN0eWxlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycy5sZW5ndGggPiAxICYmIHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXIsIHByZXZGb250U3RyaW5nLCBjaGFyYWN0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFt0b2tlbl07XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gY2hhcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldkZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIHByZXZGb250U3RyaW5nID0gZm9udFN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcblxuICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBmb3JtYXQ/LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb250U3RyaW5nID0gQ29udGVudFN0eWxlSGVscGVyLmdldEZvbnRTdHlsZXNTdHJpbmcoZm9ybWF0Py50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5RGlzcGxheVRva2Vucyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHN0YXJ0SW5kZXg6IG51bWJlcik6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgY29uc3QgbGluZUluZm8gPSB0aGlzLmdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKG1vZGVsLCBzdGFydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW1wdHlMaW5lVG9rZW5zKG1vZGVsLCBzdGFydEluZGV4LCBsaW5lSW5mbyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbXB0eUxpbmVUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdGFydEluZGV4OiBudW1iZXIsIGxpbmVJbmZvOiBMaW5lSW5mb01vZGVsKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBjb25zdCBzdG9yZWRGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAoIXN0b3JlZEZvcm1hdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSwgaW5kZXg6IG51bWJlcik6IExpbmVJbmZvTW9kZWwge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhBdEluZGV4KG1vZGVsLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgaWYgKCFwYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICAgICAgYWxpZ246IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRIYW5naW5nLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZW50TGVmdCA9IHRoaXMuZ2V0UGFyYWdyYXBoSW5kZW50TGVmdChtb2RlbCwgcGFyYWdyYXBoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZUluZm9Nb2RlbChwYXJhZ3JhcGgsIGluZGVudExlZnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyYWdyYXBoSW5kZW50TGVmdChtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHBhcmFncmFwaDogUGFyYWdyYXBoTW9kZWwpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBudW1iZXJpbmdJZCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZDtcbiAgICAgICAgaWYgKG51bWJlcmluZ0lkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudExlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZXZlbCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbDtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoSW5kZXggPSBtb2RlbC5wYXJhZ3JhcGhzLmluZGV4T2YocGFyYWdyYXBoKTtcbiAgICAgICAgY29uc3QgbGV2ZWxNb2RlbCA9IE51bWJlcmluZ0hlbHBlci5maW5kKHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgbnVtYmVyaW5nSWQsIGxldmVsKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBwYXJhZ3JhcGguaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBtYXJrZXJUZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobGV2ZWxNb2RlbC5tYXJrZXJTdHlsZSwgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhwYXJhZ3JhcGhJbmRleCk7XG4gICAgICAgIGxldCBtYXJrZXJXaWR0aCA9IHBhcmFncmFwaFNldHRpbmdzPy5udW1iZXJpbmdEYXRhPy53aWR0aDtcbiAgICAgICAgY29uc3QgbWFya2VyID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlcihcbiAgICAgICAgICAgIGxldmVsTW9kZWwsXG4gICAgICAgICAgICBudW1iZXJpbmdJZCxcbiAgICAgICAgICAgIG1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBtYXJrZXJTaXplcyA9IE51bWJlcmluZ0hlbHBlci5nZXRNYXJrZXJTaXplcyhtYXJrZXIsIG1hcmtlclRleHRTdHlsZSk7XG4gICAgICAgIG1hcmtlcldpZHRoID0gbWFya2VyU2l6ZXMud2lkdGg7XG5cbiAgICAgICAgY29uc3QgaGFuZ2luZ0luZGVudCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nID8gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmcgOiBsZXZlbE1vZGVsLmluZGVudEhhbmdpbmc7XG4gICAgICAgIGxldCBwYXJhZ3JhcGhJbmRlbnQgPSBsZXZlbE1vZGVsLmluZGVudExlZnQ7XG4gICAgICAgIGlmIChtYXJrZXJXaWR0aCA+PSBoYW5naW5nSW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJPdmVyZmxvdyA9IG1hcmtlcldpZHRoIC0gaGFuZ2luZ0luZGVudDtcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQgPSBUYWJIZWxwZXIuY2FsY3VsYXRlVGFiV2lkdGgoXG4gICAgICAgICAgICAgICAgbGV2ZWxNb2RlbC5pbmRlbnRMZWZ0ICsgbWFya2VyT3ZlcmZsb3csXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5kZWZhdWx0VGFiV2lkdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgKz0gbWFya2VyT3ZlcmZsb3cgKyBhZGRpdGlvbmFsTWFya2VySW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFncmFwaEluZGVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvRnJvbVRleHRMaW5lKGluZGV4OiBudW1iZXIpOiBMaW5lSW5mb01vZGVsIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoQXRJbmRleCh0aGlzLm1vZGVsLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgY29uc3QgaW5kZW50TGVmdCA9IHRoaXMuZ2V0SW5kZW50TGVmdEZyb21UZXh0TGluZShpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVJbmZvTW9kZWwocGFyYWdyYXBoLCBpbmRlbnRMZWZ0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvTW9kZWwocGFyYWdyYXBoOiBQYXJhZ3JhcGhNb2RlbCwgaW5kZW50TGVmdDogbnVtYmVyKTogTGluZUluZm9Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGVudEhhbmdpbmcgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgPT09IG51bGwgPyBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZyA6IDA7XG4gICAgICAgIHJldHVybiBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICBhbGlnbjogcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmFsaWdubWVudCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5hbGlnbm1lbnQsXG4gICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50Rmlyc3RMaW5lID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEZpcnN0TGluZSxcbiAgICAgICAgICAgICAgICBpbmRlbnRIYW5naW5nID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgaW5kZW50TGVmdCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRSaWdodCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9mZnNldEJlZm9yZTogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VCZWZvcmUsXG4gICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubGluZVNwYWNpbmcgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbmRlbnRMZWZ0RnJvbVRleHRMaW5lKGluc2VydEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICBsZXQgZW5kSW5kZXggPSB0aGlzLnBhcmFncmFwaHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPD0gZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gTWF0aC5yb3VuZCgoc3RhcnRJbmRleCArIGVuZEluZGV4KSAvIDIpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoSW5mbyA9IHRoaXMucGFyYWdyYXBoc1ttaWRkbGVJbmRleF07XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoSW5mby5zdGFydEluZGV4ID4gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG1pZGRsZUluZGV4IC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRMaW5lc0luZm8gPSB0aGlzLnBhcmFncmFwaHNbc3RhcnRJbmRleF0/LnBhcmFncmFwaFNldHRpbmdzLnRleHRMaW5lc0luZm87XG4gICAgICAgIHJldHVybiB0ZXh0TGluZXNJbmZvID8gTWF0aC5tYXgoLi4udGV4dExpbmVzSW5mby5tYXAoeCA9PiB4LmluZGVudExlZnQpKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlV3JhcFNwbGl0KHRva2VuczogRGlzcGxheVRva2VuW10sIHdyYXBMaW1pdDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCB8fCB0b2tlbnMubGVuZ3RoIDw9IHdyYXBMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZ1xuICAgICAgICAvLyBhIHNwbGl0IGlzIHNpbXBsZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgd3JhcExpbWl0ID09PSAwIHx8XG4gICAgICAgICAgICB0b2tlbnNbd3JhcExpbWl0XS5kaXNwbGF5VmFsdWUgPT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50IHx8XG4gICAgICAgICAgICAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW3dyYXBMaW1pdCAtIDFdKSAmJiB0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBMaW1pdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVNwbGl0KHdyYXBMaW1pdCwgdG9rZW5zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNwbGl0KGluZGV4OiBudW1iZXIsIHRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0uZGlzcGxheVZhbHVlID09PSBEaXNwbGF5VmFsdWUuY3VzdG9tQ29udGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlU3BhY2UodG9rZW46IERpc3BsYXlUb2tlbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0Rpc3BsYXlWYWx1ZS5zcGFjZSwgRGlzcGxheVZhbHVlLmVtcHR5TGluZV0uaW5jbHVkZXModG9rZW4uZGlzcGxheVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10sIGNvbnRlbnRXaWR0aDogbnVtYmVyLCBkZWZhdWx0VGFiV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghZGlzcGxheVRva2Vuc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheVRva2Vuc1swXS5pc1RhYmxlIHx8IChkaXNwbGF5VG9rZW5zWzBdLmJyZWFrc0xpbmUgJiYgZGlzcGxheVRva2Vucy5sZW5ndGggPT09IDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGVudCA9XG4gICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudExlZnQgK1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb2tlbnNbMF0uaW5kZW50UmlnaHQgK1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb2tlbnNbMF0uaW5kZW50Rmlyc3RMaW5lIC1cbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEhhbmdpbmcgfHwgMDtcbiAgICAgICAgY29uc3QgbWF4Um93V2lkdGggPSBjb250ZW50V2lkdGggLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIGRlZmF1bHRUYWJXaWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bSArPSBkaXNwbGF5VG9rZW5zW2ldLndpZHRoO1xuICAgICAgICAgICAgaWYgKChpID4gMCAmJiAoc3VtID49IG1heFJvd1dpZHRoIHx8IGRpc3BsYXlUb2tlbnNbaSAtIDFdLmJyZWFrc0xpbmUpKSB8fCBkaXNwbGF5VG9rZW5zW2ldLmlzVGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbaV0uaXNMaW5lQnJlYWsgfHwgKGkgPT09IGRpc3BsYXlUb2tlbnMubGVuZ3RoIC0gMSAmJiBkaXNwbGF5VG9rZW5zW2ldLmlzUGFnZUJyZWFrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJldmlvdXNQYXJhZ3JhcGhJbmZvKHJvdzogbnVtYmVyKTogeyBsYXN0UGFnZTogbnVtYmVyOyBwYXJhZ3JhcGhIZWlnaHQ6IG51bWJlcjsgcGFyYWdyYXBoTGFzdExpbmU6IG51bWJlciB9IHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXRoaXMucGFyYWdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGxhc3RQYWdlOiAxLCBwYXJhZ3JhcGhIZWlnaHQ6IDAsIHBhcmFncmFwaExhc3RMaW5lOiAtMSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldlBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tyb3cgLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncztcbiAgICAgICAgcmV0dXJuIHByZXZQYXJhZ3JhcGguZ2V0UGFyYWdyYXBoRGF0YSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmlzaWJsZVBhZ2VzKG9mZnNldFRvcDogbnVtYmVyLCBjb250YWluZXJIZWlnaHQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZVBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGxldCBmaXJzdFZpc2libGVQYWdlID0gb2Zmc2V0VG9wIC8gKHRoaXMucGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSk7XG4gICAgICAgIGlmIChmaXJzdFZpc2libGVQYWdlICUgMSA9PT0gMCkge1xuICAgICAgICAgICAgZmlyc3RWaXNpYmxlUGFnZSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpc2libGVQYWdlc0NvdW50ID0gY29udGFpbmVySGVpZ2h0IC8gKHRoaXMucGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSk7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxQYWdlT25TY3JlZW5QZXJjZW50ID0gTWF0aC50cnVuYygoKHZpc2libGVQYWdlc0NvdW50ICUgMSkgKyAoZmlyc3RWaXNpYmxlUGFnZSAlIDEpKSAqIDEwMCk7XG4gICAgICAgIGNvbnN0IHBhZ2VTcGFjZUhlaWdodFBlcmNlbnQgPSBNYXRoLnRydW5jKCh0aGlzLnBhZ2VzU3BhY2UgLyBjb250YWluZXJIZWlnaHQpICogMTAwKTtcbiAgICAgICAgaWYgKHBhcnRpYWxQYWdlT25TY3JlZW5QZXJjZW50IC0gcGFnZVNwYWNlSGVpZ2h0UGVyY2VudCA+IDEwMCkge1xuICAgICAgICAgICAgdmlzaWJsZVBhZ2VzQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHZpc2libGVQYWdlc0NvdW50ID0gTWF0aC5jZWlsKHZpc2libGVQYWdlc0NvdW50KTtcbiAgICAgICAgZmlyc3RWaXNpYmxlUGFnZSA9IE1hdGguY2VpbChmaXJzdFZpc2libGVQYWdlKTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRQYWdlc0NvdW50ID0gdGhpcy5wYXJhZ3JhcGhzW3RoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncy5sYXN0UGFnZU51bWJlcjtcbiAgICAgICAgaWYgKGZpcnN0VmlzaWJsZVBhZ2UgKyB2aXNpYmxlUGFnZXNDb3VudCAtIDEgPiBkb2N1bWVudFBhZ2VzQ291bnQpIHtcbiAgICAgICAgICAgIHZpc2libGVQYWdlc0NvdW50ID0gZG9jdW1lbnRQYWdlc0NvdW50IC0gZmlyc3RWaXNpYmxlUGFnZSArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVQYWdlc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHZpc2libGVQYWdlcy5wdXNoKGZpcnN0VmlzaWJsZVBhZ2UgKyBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2aXNpYmxlUGFnZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnNlcnRUZXh0QW5kUmV0dXJuRW5kQ3Vyc29yUG9zaXRpb24odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgbGVmdCA9IHRoaXMucGFyYWdyYXBoc1twb3NpdGlvbi5yb3ddLmNvbnRlbnQuc2xpY2UoMCwgcG9zaXRpb24uY29sdW1uKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnBhcmFncmFwaHNbcG9zaXRpb24ucm93XS5jb250ZW50LnNsaWNlKHBvc2l0aW9uLmNvbHVtbik7XG4gICAgICAgIGNvbnN0IGluc2VydFBhcmFncmFwaHMgPSB0aGlzLnNwbGl0QnlQYXJhZ3JhcGhzKGAke2xlZnR9JHt0ZXh0fSR7cmlnaHR9YCkubWFwKFxuICAgICAgICAgICAgeCA9PiBuZXcgUGFyYWdyYXBoSW5mb01vZGVsKHsgY29udGVudDogeCwgbmV4dExpbmVJbmRleGVzOiBbXSB9KVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHMuc3BsaWNlKHBvc2l0aW9uLnJvdywgMSwgLi4uaW5zZXJ0UGFyYWdyYXBocyk7XG4gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yUGFyYWdyYXBoKFxuICAgICAgICAgICAgcG9zaXRpb24ucm93ICsgaW5zZXJ0UGFyYWdyYXBocy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgaW5zZXJ0UGFyYWdyYXBoc1tpbnNlcnRQYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmNvbnRlbnQubGVuZ3RoIC0gcmlnaHQubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGxpdEJ5UGFyYWdyYXBocyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UGFyYWdyYXBoSW5kZXhlcygpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgcGFyYWdyYXBoIG9mIHRoaXMucGFyYWdyYXBocykge1xuICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzLnN0YXJ0SW5zZXJ0SW5kZXggPSBwYXJhZ3JhcGguc3RhcnRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBhZ2VzVmVydGljYWxEYXRhKCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXN0b21Db21wb25lbnRzLmVkZ2VzIHx8XG4gICAgICAgICAgICAoIXRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5oZWFkZXJzQ29tcG9uZW50cy5sZW5ndGggJiYgIXRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5mb290ZXJzQ29tcG9uZW50cy5sZW5ndGgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUGFnZVZlcnRpY2FsRGF0YU1vZGVsKHtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiB0aGlzLnBhZ2VNYXJnaW4udG9wLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IHRoaXMucGFnZU1hcmdpbi5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IHRoaXMucGFnZUhlaWdodCAtIHRoaXMucGFnZU1hcmdpbi50b3AgLSB0aGlzLnBhZ2VNYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogUGFnZVR5cGUuRGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZVR5cGVzID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmdldFVuaXF1ZVBhZ2VUeXBlcygpO1xuICAgICAgICB0aGlzLnBhZ2VzVmVydGljYWxEYXRhID0gcGFnZVR5cGVzLm1hcChwYWdlVHlwZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuZ2V0Q29tcG9uZW50SGVpZ2h0QnlQYWdlVHlwZShwYWdlVHlwZSwgRWRnZVR5cGUuSGVhZGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5nZXRDb21wb25lbnRIZWlnaHRCeVBhZ2VUeXBlKHBhZ2VUeXBlLCBFZGdlVHlwZS5Gb290ZXIpO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luVG9wID0gTWF0aC5tYXgoaGVhZGVySGVpZ2h0LCB0aGlzLnBhZ2VNYXJnaW4udG9wKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IE1hdGgubWF4KGZvb3RlckhlaWdodCwgdGhpcy5wYWdlTWFyZ2luLmJvdHRvbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVZlcnRpY2FsRGF0YU1vZGVsKHtcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3AsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IHRoaXMucGFnZUhlaWdodCAtIG1hcmdpblRvcCAtIG1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
|