@kaspernj/api-maker 1.0.2160 → 1.0.2161
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/build/api.d.ts +46 -34
- package/build/api.d.ts.map +1 -1
- package/build/api.js +32 -25
- package/build/attribute-not-loaded-error.d.ts.map +1 -1
- package/build/attribute-not-loaded-error.js +2 -1
- package/build/base-error.d.ts +49 -60
- package/build/base-error.d.ts.map +1 -1
- package/build/base-error.js +3 -2
- package/build/base-model/column.d.ts +2 -2
- package/build/base-model/column.d.ts.map +1 -1
- package/build/base-model/column.js +3 -2
- package/build/base-model/reflection.d.ts +8 -3
- package/build/base-model/reflection.d.ts.map +1 -1
- package/build/base-model/reflection.js +8 -3
- package/build/base-model/scope.d.ts +1 -1
- package/build/base-model/scope.d.ts.map +1 -1
- package/build/base-model/scope.js +3 -2
- package/build/base-model.d.ts +3801 -117
- package/build/base-model.d.ts.map +1 -1
- package/build/base-model.js +271 -143
- package/build/bootstrap/attribute-row.d.ts +12 -0
- package/build/bootstrap/attribute-row.d.ts.map +1 -1
- package/build/bootstrap/attribute-row.js +23 -5
- package/build/bootstrap/attribute-rows.d.ts +8 -0
- package/build/bootstrap/attribute-rows.d.ts.map +1 -1
- package/build/bootstrap/attribute-rows.js +14 -5
- package/build/bootstrap/card.d.ts +17 -0
- package/build/bootstrap/card.d.ts.map +1 -1
- package/build/bootstrap/card.js +30 -10
- package/build/bootstrap/checkbox.d.ts +16 -0
- package/build/bootstrap/checkbox.d.ts.map +1 -1
- package/build/bootstrap/checkbox.js +20 -2
- package/build/bootstrap/checkboxes.d.ts +31 -0
- package/build/bootstrap/checkboxes.d.ts.map +1 -1
- package/build/bootstrap/checkboxes.js +35 -3
- package/build/bootstrap/index.js +2 -1
- package/build/bootstrap/input.d.ts +24 -0
- package/build/bootstrap/input.d.ts.map +1 -1
- package/build/bootstrap/input.js +27 -2
- package/build/bootstrap/invalid-feedback.d.ts.map +1 -1
- package/build/bootstrap/invalid-feedback.js +2 -1
- package/build/bootstrap/paginate.d.ts +5 -0
- package/build/bootstrap/paginate.d.ts.map +1 -1
- package/build/bootstrap/paginate.js +9 -4
- package/build/bootstrap/radio-buttons.js +2 -1
- package/build/bootstrap/select.js +2 -1
- package/build/bootstrap/sort-link.d.ts +10 -0
- package/build/bootstrap/sort-link.d.ts.map +1 -1
- package/build/bootstrap/sort-link.js +15 -4
- package/build/cable-connection-pool.d.ts +201 -24
- package/build/cable-connection-pool.d.ts.map +1 -1
- package/build/cable-connection-pool.js +76 -16
- package/build/cable-subscription-pool.d.ts +186 -20
- package/build/cable-subscription-pool.d.ts.map +1 -1
- package/build/cable-subscription-pool.js +61 -22
- package/build/cable-subscription.d.ts.map +1 -1
- package/build/cable-subscription.js +3 -2
- package/build/cache-key-generator.d.ts +194 -20
- package/build/cache-key-generator.d.ts.map +1 -1
- package/build/cache-key-generator.js +63 -12
- package/build/can-can.d.ts +146 -29
- package/build/can-can.d.ts.map +1 -1
- package/build/can-can.js +105 -19
- package/build/channels-consumer.d.ts +23 -1
- package/build/channels-consumer.d.ts.map +1 -1
- package/build/channels-consumer.js +26 -8
- package/build/collection-loader.js +2 -1
- package/build/collection.d.ts +361 -370
- package/build/collection.d.ts.map +1 -1
- package/build/collection.js +59 -19
- package/build/command-execution.d.ts +50 -26
- package/build/command-execution.d.ts.map +1 -1
- package/build/command-execution.js +31 -13
- package/build/command-submit-data.d.ts +50 -37
- package/build/command-submit-data.d.ts.map +1 -1
- package/build/command-submit-data.js +35 -22
- package/build/commands-pool.d.ts +65 -27
- package/build/commands-pool.d.ts.map +1 -1
- package/build/commands-pool.js +67 -20
- package/build/compose.d.ts +8 -2
- package/build/compose.d.ts.map +1 -1
- package/build/compose.js +9 -2
- package/build/config.d.ts +31 -15
- package/build/config.d.ts.map +1 -1
- package/build/config.js +60 -23
- package/build/custom-error.d.ts.map +1 -1
- package/build/custom-error.js +2 -1
- package/build/data-set-to-attributes.d.ts +14 -2
- package/build/data-set-to-attributes.d.ts.map +1 -1
- package/build/data-set-to-attributes.js +12 -3
- package/build/deserializer.d.ts +116 -2
- package/build/deserializer.d.ts.map +1 -1
- package/build/deserializer.js +13 -2
- package/build/destroy-error.d.ts.map +1 -1
- package/build/destroy-error.js +2 -1
- package/build/devise.d.ts +638 -39
- package/build/devise.d.ts.map +1 -1
- package/build/devise.js +97 -28
- package/build/draggable-sort/controller.d.ts +126 -35
- package/build/draggable-sort/controller.d.ts.map +1 -1
- package/build/draggable-sort/controller.js +100 -28
- package/build/draggable-sort/index.d.ts +55 -0
- package/build/draggable-sort/index.d.ts.map +1 -1
- package/build/draggable-sort/index.js +71 -3
- package/build/draggable-sort/item.d.ts +54 -0
- package/build/draggable-sort/item.d.ts.map +1 -1
- package/build/draggable-sort/item.js +94 -6
- package/build/error-logger.d.ts +30 -14
- package/build/error-logger.d.ts.map +1 -1
- package/build/error-logger.js +22 -11
- package/build/event-connection.d.ts.map +1 -1
- package/build/event-connection.js +3 -2
- package/build/event-emitter-listener.d.ts.map +1 -1
- package/build/event-emitter-listener.js +2 -1
- package/build/event-model-class.d.ts.map +1 -1
- package/build/event-model-class.js +2 -1
- package/build/events.d.ts.map +1 -1
- package/build/events.js +2 -1
- package/build/form.d.ts +23 -0
- package/build/form.d.ts.map +1 -1
- package/build/form.js +16 -4
- package/build/history-expo.d.ts +6 -2
- package/build/history-expo.d.ts.map +1 -1
- package/build/history-expo.js +5 -2
- package/build/history-react-native.d.ts +6 -2
- package/build/history-react-native.d.ts.map +1 -1
- package/build/history-react-native.js +5 -2
- package/build/history.js +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/inputs/attachment.d.ts +11 -0
- package/build/inputs/attachment.d.ts.map +1 -1
- package/build/inputs/attachment.js +17 -4
- package/build/inputs/auto-submit.d.ts +41 -13
- package/build/inputs/auto-submit.d.ts.map +1 -1
- package/build/inputs/auto-submit.js +16 -4
- package/build/inputs/checkbox.d.ts +15 -0
- package/build/inputs/checkbox.d.ts.map +1 -1
- package/build/inputs/checkbox.js +22 -6
- package/build/inputs/checkboxes.d.ts +16 -0
- package/build/inputs/checkboxes.d.ts.map +1 -1
- package/build/inputs/checkboxes.js +20 -4
- package/build/inputs/id-for-component.d.ts +21 -2
- package/build/inputs/id-for-component.d.ts.map +1 -1
- package/build/inputs/id-for-component.js +9 -2
- package/build/inputs/input-wrapper.d.ts.map +1 -1
- package/build/inputs/input-wrapper.js +2 -1
- package/build/inputs/input.d.ts +36 -0
- package/build/inputs/input.d.ts.map +1 -1
- package/build/inputs/input.js +26 -7
- package/build/inputs/money.d.ts +2 -0
- package/build/inputs/money.d.ts.map +1 -1
- package/build/inputs/money.js +6 -3
- package/build/inputs/name-for-component.d.ts +21 -2
- package/build/inputs/name-for-component.d.ts.map +1 -1
- package/build/inputs/name-for-component.js +9 -2
- package/build/inputs/select.d.ts +33 -0
- package/build/inputs/select.d.ts.map +1 -1
- package/build/inputs/select.js +21 -4
- package/build/instance-of-class-name.d.ts +7 -2
- package/build/instance-of-class-name.d.ts.map +1 -1
- package/build/instance-of-class-name.js +8 -4
- package/build/is-expo.d.ts.map +1 -1
- package/build/is-expo.js +2 -1
- package/build/key-value-store.d.ts +24 -14
- package/build/key-value-store.d.ts.map +1 -1
- package/build/key-value-store.js +22 -12
- package/build/link.d.ts +30 -0
- package/build/link.d.ts.map +1 -1
- package/build/link.js +76 -30
- package/build/logger.d.ts +10 -6
- package/build/logger.d.ts.map +1 -1
- package/build/logger.js +7 -4
- package/build/merge-styles.d.ts +10 -2
- package/build/merge-styles.d.ts.map +1 -1
- package/build/merge-styles.js +10 -3
- package/build/modal.d.ts +2 -0
- package/build/modal.d.ts.map +1 -1
- package/build/modal.js +6 -4
- package/build/model-class-require.d.ts +4 -2
- package/build/model-class-require.d.ts.map +1 -1
- package/build/model-class-require.js +4 -2
- package/build/model-events.d.ts +139 -346
- package/build/model-events.d.ts.map +1 -1
- package/build/model-events.js +21 -9
- package/build/model-name.d.ts +21 -7
- package/build/model-name.d.ts.map +1 -1
- package/build/model-name.js +12 -2
- package/build/model-prop-type.d.ts +533 -26
- package/build/model-prop-type.d.ts.map +1 -1
- package/build/model-prop-type.js +69 -11
- package/build/model-recipes-loader.d.ts +7 -3
- package/build/model-recipes-loader.d.ts.map +1 -1
- package/build/model-recipes-loader.js +4 -2
- package/build/model-recipes-model-loader.d.ts +189 -1493
- package/build/model-recipes-model-loader.d.ts.map +1 -1
- package/build/model-recipes-model-loader.js +119 -17
- package/build/models-response-reader.d.ts +600 -195
- package/build/models-response-reader.d.ts.map +1 -1
- package/build/models-response-reader.js +12 -4
- package/build/models.d.ts +438 -1
- package/build/models.d.ts.map +1 -1
- package/build/models.js +2 -1
- package/build/money-formatter.d.ts +25 -31
- package/build/money-formatter.d.ts.map +1 -1
- package/build/money-formatter.js +11 -8
- package/build/not-loaded-error.d.ts.map +1 -1
- package/build/not-loaded-error.js +2 -1
- package/build/params.d.ts +25 -17
- package/build/params.d.ts.map +1 -1
- package/build/params.js +19 -15
- package/build/preloaded.d.ts +61 -64
- package/build/preloaded.d.ts.map +1 -1
- package/build/preloaded.js +10 -4
- package/build/reset-realtime-runtime-state.d.ts.map +1 -1
- package/build/reset-realtime-runtime-state.js +2 -1
- package/build/resize-observer.d.ts.map +1 -1
- package/build/resize-observer.js +2 -1
- package/build/rest-props-validator.d.ts +2 -2
- package/build/rest-props-validator.d.ts.map +1 -1
- package/build/rest-props-validator.js +3 -2
- package/build/result.d.ts +142 -175
- package/build/result.d.ts.map +1 -1
- package/build/result.js +3 -2
- package/build/router/route.d.ts +50 -0
- package/build/router/route.d.ts.map +1 -1
- package/build/router/route.js +39 -10
- package/build/router/switch.d.ts +37 -1
- package/build/router/switch.d.ts.map +1 -1
- package/build/router/switch.js +29 -7
- package/build/router.d.ts +20 -0
- package/build/router.d.ts.map +1 -1
- package/build/router.js +15 -4
- package/build/routes-native.d.ts +13 -13
- package/build/routes-native.d.ts.map +1 -1
- package/build/routes-native.js +23 -11
- package/build/routes.d.ts +17 -9
- package/build/routes.d.ts.map +1 -1
- package/build/routes.js +7 -2
- package/build/run-last.d.ts.map +1 -1
- package/build/run-last.js +2 -1
- package/build/serializer.d.ts +44 -12
- package/build/serializer.d.ts.map +1 -1
- package/build/serializer.js +36 -7
- package/build/services.d.ts +29 -4
- package/build/services.d.ts.map +1 -1
- package/build/services.js +16 -4
- package/build/session-status-updater.d.ts +73 -25
- package/build/session-status-updater.d.ts.map +1 -1
- package/build/session-status-updater.js +52 -14
- package/build/source-maps-loader.d.ts +88 -33
- package/build/source-maps-loader.d.ts.map +1 -1
- package/build/source-maps-loader.js +74 -18
- package/build/super-admin/config-reader.d.ts.map +1 -1
- package/build/super-admin/config-reader.js +11 -16
- package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts +10 -0
- package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts.map +1 -1
- package/build/super-admin/edit-page/edit-attribute-checkbox.js +16 -4
- package/build/super-admin/edit-page/edit-attribute-content.d.ts +9 -0
- package/build/super-admin/edit-page/edit-attribute-content.d.ts.map +1 -1
- package/build/super-admin/edit-page/edit-attribute-content.js +15 -4
- package/build/super-admin/edit-page/edit-attribute-input.d.ts +8 -0
- package/build/super-admin/edit-page/edit-attribute-input.d.ts.map +1 -1
- package/build/super-admin/edit-page/edit-attribute-input.js +13 -4
- package/build/super-admin/edit-page/edit-attribute.d.ts +6 -0
- package/build/super-admin/edit-page/edit-attribute.d.ts.map +1 -1
- package/build/super-admin/edit-page/edit-attribute.js +11 -4
- package/build/super-admin/edit-page.d.ts +5 -0
- package/build/super-admin/edit-page.d.ts.map +1 -1
- package/build/super-admin/edit-page.js +11 -5
- package/build/super-admin/has-edit-config.d.ts.map +1 -1
- package/build/super-admin/has-edit-config.js +2 -1
- package/build/super-admin/index-page.d.ts +4 -0
- package/build/super-admin/index-page.d.ts.map +1 -1
- package/build/super-admin/index-page.js +9 -4
- package/build/super-admin/index.d.ts +4 -0
- package/build/super-admin/index.d.ts.map +1 -1
- package/build/super-admin/index.js +12 -6
- package/build/super-admin/layout/header/index.d.ts +4 -0
- package/build/super-admin/layout/header/index.d.ts.map +1 -1
- package/build/super-admin/layout/header/index.js +13 -8
- package/build/super-admin/layout/index.d.ts +24 -0
- package/build/super-admin/layout/index.d.ts.map +1 -1
- package/build/super-admin/layout/index.js +33 -5
- package/build/super-admin/layout/menu/index.d.ts +2 -0
- package/build/super-admin/layout/menu/index.d.ts.map +1 -1
- package/build/super-admin/layout/menu/index.js +8 -6
- package/build/super-admin/layout/menu/menu-content.d.ts +2 -0
- package/build/super-admin/layout/menu/menu-content.d.ts.map +1 -1
- package/build/super-admin/layout/menu/menu-content.js +6 -4
- package/build/super-admin/layout/menu/menu-item.d.ts +9 -0
- package/build/super-admin/layout/menu/menu-item.d.ts.map +1 -1
- package/build/super-admin/layout/menu/menu-item.js +15 -4
- package/build/super-admin/layout/no-access.d.ts +2 -0
- package/build/super-admin/layout/no-access.d.ts.map +1 -1
- package/build/super-admin/layout/no-access.js +7 -5
- package/build/super-admin/model-class-table.d.ts +4 -0
- package/build/super-admin/model-class-table.d.ts.map +1 -1
- package/build/super-admin/model-class-table.js +9 -4
- package/build/super-admin/models.d.ts.map +1 -1
- package/build/super-admin/models.js +2 -1
- package/build/super-admin/show-nav.d.ts +2 -0
- package/build/super-admin/show-nav.d.ts.map +1 -1
- package/build/super-admin/show-nav.js +6 -4
- package/build/super-admin/show-page/belongs-to-attribute-row.d.ts +17 -1
- package/build/super-admin/show-page/belongs-to-attribute-row.d.ts.map +1 -1
- package/build/super-admin/show-page/belongs-to-attribute-row.js +14 -5
- package/build/super-admin/show-page/index.d.ts +4 -0
- package/build/super-admin/show-page/index.d.ts.map +1 -1
- package/build/super-admin/show-page/index.js +9 -4
- package/build/super-admin/show-reflection-actions.d.ts +6 -0
- package/build/super-admin/show-reflection-actions.d.ts.map +1 -1
- package/build/super-admin/show-reflection-actions.js +11 -4
- package/build/super-admin/show-reflection-link.d.ts +4 -0
- package/build/super-admin/show-reflection-link.d.ts.map +1 -1
- package/build/super-admin/show-reflection-link.js +9 -4
- package/build/super-admin/show-reflection-page.d.ts +5 -0
- package/build/super-admin/show-reflection-page.d.ts.map +1 -1
- package/build/super-admin/show-reflection-page.js +10 -4
- package/build/table/column-content.d.ts +155 -19
- package/build/table/column-content.d.ts.map +1 -1
- package/build/table/column-content.js +55 -12
- package/build/table/column-identifier.d.ts +11 -2
- package/build/table/column-identifier.d.ts.map +1 -1
- package/build/table/column-identifier.js +7 -2
- package/build/table/column-visible.d.ts +11 -2
- package/build/table/column-visible.d.ts.map +1 -1
- package/build/table/column-visible.js +8 -2
- package/build/table/components/column.d.ts +2 -0
- package/build/table/components/column.d.ts.map +1 -1
- package/build/table/components/column.js +6 -4
- package/build/table/components/flat-list.d.ts +2 -0
- package/build/table/components/flat-list.d.ts.map +1 -1
- package/build/table/components/flat-list.js +6 -4
- package/build/table/components/header.d.ts +2 -0
- package/build/table/components/header.d.ts.map +1 -1
- package/build/table/components/header.js +6 -4
- package/build/table/components/row.d.ts +2 -0
- package/build/table/components/row.d.ts.map +1 -1
- package/build/table/components/row.js +6 -4
- package/build/table/filters/attribute-element.d.ts +2 -0
- package/build/table/filters/attribute-element.d.ts.map +1 -1
- package/build/table/filters/attribute-element.js +7 -7
- package/build/table/filters/filter-form.d.ts +58 -0
- package/build/table/filters/filter-form.d.ts.map +1 -1
- package/build/table/filters/filter-form.js +72 -9
- package/build/table/filters/filter.d.ts +2 -0
- package/build/table/filters/filter.d.ts.map +1 -1
- package/build/table/filters/filter.js +6 -4
- package/build/table/filters/index.d.ts +127 -0
- package/build/table/filters/index.d.ts.map +1 -1
- package/build/table/filters/index.js +21 -4
- package/build/table/filters/load-search-modal.d.ts +130 -0
- package/build/table/filters/load-search-modal.d.ts.map +1 -1
- package/build/table/filters/load-search-modal.js +28 -6
- package/build/table/filters/reflection-element.d.ts +2 -0
- package/build/table/filters/reflection-element.d.ts.map +1 -1
- package/build/table/filters/reflection-element.js +6 -4
- package/build/table/filters/save-search-modal.d.ts +134 -0
- package/build/table/filters/save-search-modal.d.ts.map +1 -1
- package/build/table/filters/save-search-modal.js +36 -5
- package/build/table/filters/scope-element.d.ts +6 -0
- package/build/table/filters/scope-element.d.ts.map +1 -1
- package/build/table/filters/scope-element.js +13 -8
- package/build/table/header-column-content.d.ts +7 -0
- package/build/table/header-column-content.d.ts.map +1 -1
- package/build/table/header-column-content.js +12 -4
- package/build/table/header-column.d.ts +50 -0
- package/build/table/header-column.d.ts.map +1 -1
- package/build/table/header-column.js +32 -5
- package/build/table/header-select.d.ts +18 -0
- package/build/table/header-select.d.ts.map +1 -1
- package/build/table/header-select.js +19 -4
- package/build/table/model-callback-args.d.ts +116 -3
- package/build/table/model-callback-args.d.ts.map +1 -1
- package/build/table/model-callback-args.js +10 -3
- package/build/table/model-column.d.ts +136 -0
- package/build/table/model-column.d.ts.map +1 -1
- package/build/table/model-column.js +27 -4
- package/build/table/model-row.d.ts +19 -0
- package/build/table/model-row.d.ts.map +1 -1
- package/build/table/model-row.js +24 -4
- package/build/table/select-calculator.d.ts +37 -2
- package/build/table/select-calculator.d.ts.map +1 -1
- package/build/table/select-calculator.js +29 -6
- package/build/table/settings/column-row.d.ts +6 -0
- package/build/table/settings/column-row.d.ts.map +1 -1
- package/build/table/settings/column-row.js +13 -12
- package/build/table/settings/download-action.d.ts +5 -0
- package/build/table/settings/download-action.d.ts.map +1 -1
- package/build/table/settings/download-action.js +10 -4
- package/build/table/settings/index.d.ts +5 -0
- package/build/table/settings/index.d.ts.map +1 -1
- package/build/table/settings/index.js +10 -4
- package/build/table/should-render-loading-content.d.ts +2 -2
- package/build/table/should-render-loading-content.d.ts.map +1 -1
- package/build/table/should-render-loading-content.js +3 -2
- package/build/table/table-settings.d.ts +236 -43
- package/build/table/table-settings.d.ts.map +1 -1
- package/build/table/table-settings.js +104 -20
- package/build/table/table.d.ts +271 -0
- package/build/table/table.d.ts.map +1 -1
- package/build/table/table.js +167 -16
- package/build/table/use-sorting.d.ts +10 -8
- package/build/table/use-sorting.d.ts.map +1 -1
- package/build/table/use-sorting.js +16 -8
- package/build/table/widths.d.ts +55 -8
- package/build/table/widths.d.ts.map +1 -1
- package/build/table/widths.js +25 -2
- package/build/table/worker-plugins-check-all-checkbox.d.ts +18 -0
- package/build/table/worker-plugins-check-all-checkbox.d.ts.map +1 -1
- package/build/table/worker-plugins-check-all-checkbox.js +25 -5
- package/build/table/worker-plugins-checkbox.d.ts +5 -0
- package/build/table/worker-plugins-checkbox.d.ts.map +1 -1
- package/build/table/worker-plugins-checkbox.js +10 -4
- package/build/translated-attributes.d.ts +7 -2
- package/build/translated-attributes.d.ts.map +1 -1
- package/build/translated-attributes.js +8 -2
- package/build/translated-collections.d.ts +11 -2
- package/build/translated-collections.d.ts.map +1 -1
- package/build/translated-collections.js +9 -3
- package/build/updated-attribute.d.ts.map +1 -1
- package/build/updated-attribute.js +2 -1
- package/build/url-encode.d.ts.map +1 -1
- package/build/url-encode.js +2 -1
- package/build/use-can-can.d.ts +2 -2
- package/build/use-can-can.d.ts.map +1 -1
- package/build/use-can-can.js +27 -12
- package/build/use-collection.d.ts +167 -121
- package/build/use-collection.d.ts.map +1 -1
- package/build/use-collection.js +113 -44
- package/build/use-created-event.d.ts +120 -11
- package/build/use-created-event.d.ts.map +1 -1
- package/build/use-created-event.js +10 -7
- package/build/use-current-user-context.d.ts +2 -2
- package/build/use-current-user-context.d.ts.map +1 -1
- package/build/use-current-user-context.js +3 -2
- package/build/use-current-user.d.ts +86 -70
- package/build/use-current-user.d.ts.map +1 -1
- package/build/use-current-user.js +36 -8
- package/build/use-destroyed-event.d.ts +117 -8
- package/build/use-destroyed-event.d.ts.map +1 -1
- package/build/use-destroyed-event.js +29 -22
- package/build/use-input.d.ts +74 -12
- package/build/use-input.d.ts.map +1 -1
- package/build/use-input.js +33 -5
- package/build/use-model-class-event.d.ts +124 -10
- package/build/use-model-class-event.d.ts.map +1 -1
- package/build/use-model-class-event.js +26 -16
- package/build/use-model-event.d.ts +121 -8
- package/build/use-model-event.d.ts.map +1 -1
- package/build/use-model-event.js +24 -19
- package/build/use-model.d.ts +162 -244
- package/build/use-model.d.ts.map +1 -1
- package/build/use-model.js +85 -32
- package/build/use-resize-observer.d.ts.map +1 -1
- package/build/use-resize-observer.js +2 -1
- package/build/use-router.d.ts.map +1 -1
- package/build/use-router.js +2 -1
- package/build/use-screen-layout.d.ts +7 -2
- package/build/use-screen-layout.d.ts.map +1 -1
- package/build/use-screen-layout.js +8 -5
- package/build/use-shape.js +2 -1
- package/build/use-styles.d.ts +11 -5
- package/build/use-styles.d.ts.map +1 -1
- package/build/use-styles.js +16 -9
- package/build/use-updated-event.d.ts +66 -182
- package/build/use-updated-event.d.ts.map +1 -1
- package/build/use-updated-event.js +22 -18
- package/build/use-validation-errors.d.ts.map +1 -1
- package/build/use-validation-errors.js +2 -1
- package/build/utils/button.d.ts +14 -0
- package/build/utils/button.d.ts.map +1 -1
- package/build/utils/button.js +24 -7
- package/build/utils/card.d.ts +9 -0
- package/build/utils/card.d.ts.map +1 -1
- package/build/utils/card.js +13 -2
- package/build/utils/checkbox.d.ts +12 -0
- package/build/utils/checkbox.d.ts.map +1 -1
- package/build/utils/checkbox.js +18 -4
- package/build/utils/checkboxes.d.ts +25 -0
- package/build/utils/checkboxes.d.ts.map +1 -1
- package/build/utils/checkboxes.js +29 -3
- package/build/utils/default-style.d.ts +10 -4
- package/build/utils/default-style.d.ts.map +1 -1
- package/build/utils/default-style.js +12 -4
- package/build/utils/header.d.ts +6 -1
- package/build/utils/header.d.ts.map +1 -1
- package/build/utils/header.js +4 -2
- package/build/utils/icon.d.ts +7 -6
- package/build/utils/icon.d.ts.map +1 -1
- package/build/utils/icon.js +12 -11
- package/build/utils/invalid-feedback.d.ts +4 -0
- package/build/utils/invalid-feedback.d.ts.map +1 -1
- package/build/utils/invalid-feedback.js +8 -2
- package/build/utils/modal.d.ts +2 -0
- package/build/utils/modal.d.ts.map +1 -1
- package/build/utils/modal.js +9 -7
- package/build/utils/text.d.ts +8 -1
- package/build/utils/text.d.ts.map +1 -1
- package/build/utils/text.js +9 -2
- package/build/validation-error.d.ts +5 -2
- package/build/validation-error.d.ts.map +1 -1
- package/build/validation-error.js +5 -2
- package/build/validation-errors.d.ts +57 -15
- package/build/validation-errors.d.ts.map +1 -1
- package/build/validation-errors.js +37 -8
- package/build/websocket-request-client.d.ts +61 -15
- package/build/websocket-request-client.d.ts.map +1 -1
- package/build/websocket-request-client.js +35 -9
- package/build/with-api-maker.d.ts.map +1 -1
- package/build/with-api-maker.js +2 -1
- package/build/with-collection.d.ts.map +1 -1
- package/build/with-collection.js +2 -1
- package/build/with-current-user.d.ts.map +1 -1
- package/build/with-current-user.js +2 -1
- package/build/with-model.d.ts.map +1 -1
- package/build/with-model.js +2 -1
- package/build/with-router.d.ts.map +1 -1
- package/build/with-router.js +2 -1
- package/package.json +4 -3
- package/build/base-component.d.ts +0 -5
- package/build/base-component.d.ts.map +0 -1
- package/build/base-component.js +0 -4
package/build/base-model.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
import * as inflection from "inflection";
|
|
2
3
|
import { ValidationErrors } from "./validation-errors.js";
|
|
3
4
|
import { digg } from "diggerize";
|
|
@@ -16,6 +17,33 @@ import Scope from "./base-model/scope.js";
|
|
|
16
17
|
import Services from "./services.js";
|
|
17
18
|
import ValidationError from "./validation-error.js";
|
|
18
19
|
import objectToFormData from "object-to-formdata";
|
|
20
|
+
/** @typedef {string | number} ModelIdentifier */
|
|
21
|
+
/** @typedef {string | number | boolean | null | undefined | Date | File | Blob} ModelScalarValue */
|
|
22
|
+
/** @typedef {{[key: string]: ModelValue}} ModelValueMap */
|
|
23
|
+
/** @typedef {Array<ModelValue>} ModelValueArray */
|
|
24
|
+
/** @typedef {ModelScalarValue | ModelValueMap | ModelValueArray} ModelValue */
|
|
25
|
+
/** @typedef {Record<string, ModelValue>} ModelDataMap */
|
|
26
|
+
/** @typedef {Record<string, boolean>} ModelAbilityMap */
|
|
27
|
+
/** @typedef {ModelIdentifier | ModelIdentifier[] | null} PreloadedRelationshipValue */
|
|
28
|
+
/** @typedef {Record<string, PreloadedRelationshipValue>} PreloadedRelationshipMap */
|
|
29
|
+
/** @typedef {BaseModel | BaseModel[] | null} LoadedRelationshipValue */
|
|
30
|
+
/** @typedef {Record<string, LoadedRelationshipValue>} LoadedRelationshipMap */
|
|
31
|
+
/** @typedef {import("./base-model/reflection.js").ReflectionMacro} ReflectionMacro */
|
|
32
|
+
/** @typedef {FormData | HTMLFormElement | ModelDataMap} RawDataInput */
|
|
33
|
+
/** @typedef {Record<string, string | string[] | undefined>} ValidationResponseErrors */
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {object} RelationshipDataType
|
|
36
|
+
* @property {string} collectionName
|
|
37
|
+
* @property {string} [foreignKey]
|
|
38
|
+
* @property {ReflectionMacro} macro
|
|
39
|
+
* @property {string} name
|
|
40
|
+
* @property {string} resource_name
|
|
41
|
+
* @property {string} [through]
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* @typedef {object} ScopeDataType
|
|
45
|
+
* @property {string} name
|
|
46
|
+
*/
|
|
19
47
|
/**
|
|
20
48
|
* @typedef {object} ModelClassDataType
|
|
21
49
|
* @property {Record<string, import("./base-model/attribute.js").AttributeArgType>} attributes
|
|
@@ -29,19 +57,96 @@ import objectToFormData from "object-to-formdata";
|
|
|
29
57
|
* @property {string} paramKey
|
|
30
58
|
* @property {string} pluralName
|
|
31
59
|
* @property {string} primaryKey
|
|
32
|
-
* @property {
|
|
60
|
+
* @property {RelationshipDataType[]} ransackable_associations
|
|
33
61
|
* @property {import("./base-model/attribute.js").AttributeArgType[]} ransackable_attributes
|
|
34
|
-
* @property {
|
|
35
|
-
* @property {
|
|
62
|
+
* @property {ScopeDataType[]} ransackable_scopes
|
|
63
|
+
* @property {RelationshipDataType[]} relationships
|
|
36
64
|
*/
|
|
37
65
|
/**
|
|
38
66
|
* @typedef {object} ParseValidationErrorsOptions
|
|
39
|
-
* @property {
|
|
67
|
+
* @property {HTMLFormElement} [form]
|
|
40
68
|
* @property {boolean} [throwValidationError]
|
|
41
69
|
*/
|
|
42
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* @typedef {object} LoadedModelDataType
|
|
72
|
+
* @property {ModelDataMap} [a]
|
|
73
|
+
* @property {ModelAbilityMap} [b]
|
|
74
|
+
* @property {PreloadedRelationshipMap} [r]
|
|
75
|
+
*/
|
|
76
|
+
/**
|
|
77
|
+
* @typedef {object} BaseModelArgsObject
|
|
78
|
+
* @property {ModelDataMap} [a]
|
|
79
|
+
* @property {ModelAbilityMap} [b]
|
|
80
|
+
* @property {import("./collection.js").default} [collection]
|
|
81
|
+
* @property {LoadedModelDataType} [data]
|
|
82
|
+
* @property {boolean} [isNewRecord]
|
|
83
|
+
*/
|
|
84
|
+
/** @typedef {BaseModelArgsObject | ModelDataMap} BaseModelArgs */
|
|
85
|
+
/**
|
|
86
|
+
* @typedef {object} BaseModelStaticMethods
|
|
87
|
+
* @property {string} apiMakerType
|
|
88
|
+
* @property {() => import("./collection.js").default} all
|
|
89
|
+
* @property {() => Attribute[]} attributes
|
|
90
|
+
* @property {(id: ModelIdentifier) => Promise<BaseModel>} find
|
|
91
|
+
* @property {(findOrCreateByArgs: ModelDataMap, args?: {additionalData?: ModelDataMap}) => Promise<BaseModel>} findOrCreateBy
|
|
92
|
+
* @property {(args: ModelDataMap) => import("./command-execution.js").default} [createLink]
|
|
93
|
+
* @property {(args: ModelDataMap) => import("./command-execution.js").default} [destroyLinks]
|
|
94
|
+
* @property {(attributeName: string) => boolean} hasAttribute
|
|
95
|
+
* @property {(attributeName: string) => string} humanAttributeName
|
|
96
|
+
* @property {(args: ModelDataMap) => Promise<{link?: BaseModel | null}>} [linkFor]
|
|
97
|
+
* @property {() => ModelClassDataType} modelClassData
|
|
98
|
+
* @property {() => ModelName} modelName
|
|
99
|
+
* @property {() => string} primaryKey
|
|
100
|
+
* @property {() => Promise<{current?: BaseModel[]}>} [current]
|
|
101
|
+
* @property {(query?: import("./collection.js").CollectionRansackParams) => import("./collection.js").default} ransack
|
|
102
|
+
* @property {() => {name?: string}} [resourceData]
|
|
103
|
+
* @property {() => Reflection[]} reflections
|
|
104
|
+
* @property {(name: string) => Reflection} reflection
|
|
105
|
+
* @property {() => Reflection[]} ransackableAssociations
|
|
106
|
+
* @property {() => Attribute[]} ransackableAttributes
|
|
107
|
+
* @property {() => Scope[]} ransackableScopes
|
|
108
|
+
* @property {(select?: Record<string, string[]>) => import("./collection.js").default} select
|
|
109
|
+
* @property {(attributeName: string) => string} snakeCase
|
|
110
|
+
*/
|
|
111
|
+
/** @typedef {typeof import("./base-model.js").default & BaseModelStaticMethods} BaseModelClassType */
|
|
112
|
+
/**
|
|
113
|
+
* @typedef {object} ModelCommandDescriptor
|
|
114
|
+
* @property {ModelDataMap | FormData | HTMLFormElement} [args]
|
|
115
|
+
* @property {string} collectionName
|
|
116
|
+
* @property {string} command
|
|
117
|
+
* @property {ModelIdentifier} [primaryKey]
|
|
118
|
+
* @property {string} type
|
|
119
|
+
*/
|
|
120
|
+
/**
|
|
121
|
+
* @typedef {object} ModelCommandOptions
|
|
122
|
+
* @property {boolean} [cacheResponse]
|
|
123
|
+
* @property {boolean} [forceHttp]
|
|
124
|
+
* @property {HTMLFormElement} [form]
|
|
125
|
+
* @property {boolean} [instant]
|
|
126
|
+
*/
|
|
127
|
+
/**
|
|
128
|
+
* @typedef {object} ModelCommandResponse
|
|
129
|
+
* @property {ValidationResponseErrors} [errors]
|
|
130
|
+
* @property {BaseModel | BaseModel[]} [model]
|
|
131
|
+
* @property {boolean} [success]
|
|
132
|
+
* @property {boolean} [valid]
|
|
133
|
+
*/
|
|
134
|
+
/**
|
|
135
|
+
* @typedef {object} ValidationErrorWithResponse
|
|
136
|
+
* @property {{response?: {validation_errors?: import("./validation-errors.js").ValidationErrorEntryArgs[]}}} [args]
|
|
137
|
+
*/
|
|
138
|
+
/**
|
|
139
|
+
* @typedef {object} RelationshipLoadArgs
|
|
140
|
+
* @property {BaseModel} [model]
|
|
141
|
+
* @property {typeof import("./base-model.js").default} [modelClass]
|
|
142
|
+
* @property {string} reflectionName
|
|
143
|
+
*/
|
|
144
|
+
/**
|
|
145
|
+
* @param {ModelDataMap} object
|
|
146
|
+
* @returns {ModelDataMap}
|
|
147
|
+
*/
|
|
43
148
|
const objectToUnderscore = (object) => {
|
|
44
|
-
const newObject = {};
|
|
149
|
+
const newObject = /** @type {ModelDataMap} */ ({});
|
|
45
150
|
for (const key in object) {
|
|
46
151
|
const underscoreKey = inflection.underscore(key);
|
|
47
152
|
newObject[underscoreKey] = object[key];
|
|
@@ -49,7 +154,6 @@ const objectToUnderscore = (object) => {
|
|
|
49
154
|
return newObject;
|
|
50
155
|
};
|
|
51
156
|
/** BaseModel. */
|
|
52
|
-
/** @type {BaseModelClassType} */
|
|
53
157
|
const BaseModel = class BaseModel {
|
|
54
158
|
static apiMakerType = "BaseModel";
|
|
55
159
|
/** @returns {Attribute[]} */
|
|
@@ -63,7 +167,10 @@ const BaseModel = class BaseModel {
|
|
|
63
167
|
}
|
|
64
168
|
return result;
|
|
65
169
|
}
|
|
66
|
-
/**
|
|
170
|
+
/**
|
|
171
|
+
* @param {string} attributeName
|
|
172
|
+
* @returns {boolean}
|
|
173
|
+
*/
|
|
67
174
|
static hasAttribute(attributeName) {
|
|
68
175
|
const attributes = digg(this.modelClassData(), "attributes");
|
|
69
176
|
const lowerCaseAttributeName = inflection.underscore(attributeName);
|
|
@@ -99,10 +206,10 @@ const BaseModel = class BaseModel {
|
|
|
99
206
|
}
|
|
100
207
|
/**
|
|
101
208
|
* @param {number | string} id
|
|
102
|
-
* @returns {Promise<
|
|
209
|
+
* @returns {Promise<BaseModel>}
|
|
103
210
|
*/
|
|
104
211
|
static async find(id) {
|
|
105
|
-
const query = /** @type {
|
|
212
|
+
const query = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
|
|
106
213
|
query[`${this.primaryKey()}_eq`] = id;
|
|
107
214
|
const model = await this.ransack(query).first();
|
|
108
215
|
if (model) {
|
|
@@ -113,10 +220,10 @@ const BaseModel = class BaseModel {
|
|
|
113
220
|
}
|
|
114
221
|
}
|
|
115
222
|
/**
|
|
116
|
-
* @param {
|
|
223
|
+
* @param {ModelDataMap} findOrCreateByArgs
|
|
117
224
|
* @param {object} [args]
|
|
118
|
-
* @param {
|
|
119
|
-
* @returns {Promise<
|
|
225
|
+
* @param {ModelDataMap} [args.additionalData]
|
|
226
|
+
* @returns {Promise<BaseModel>}
|
|
120
227
|
*/
|
|
121
228
|
static async findOrCreateBy(findOrCreateByArgs, args = {}) {
|
|
122
229
|
const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
|
|
@@ -136,15 +243,15 @@ const BaseModel = class BaseModel {
|
|
|
136
243
|
return digg(this.modelClassData(), "primaryKey");
|
|
137
244
|
}
|
|
138
245
|
/**
|
|
139
|
-
* @param {
|
|
140
|
-
* @returns {import("./collection.js").default
|
|
246
|
+
* @param {import("./collection.js").CollectionRansackParams} [query]
|
|
247
|
+
* @returns {import("./collection.js").default}
|
|
141
248
|
*/
|
|
142
249
|
static ransack(query = {}) {
|
|
143
250
|
return new Collection({ modelClass: this }, { ransack: query });
|
|
144
251
|
}
|
|
145
252
|
/**
|
|
146
|
-
* @param {Record<string,
|
|
147
|
-
* @returns {import("./collection.js").default
|
|
253
|
+
* @param {Record<string, string[]>} [select]
|
|
254
|
+
* @returns {import("./collection.js").default}
|
|
148
255
|
*/
|
|
149
256
|
static select(select) {
|
|
150
257
|
return this.ransack().select(select);
|
|
@@ -187,7 +294,10 @@ const BaseModel = class BaseModel {
|
|
|
187
294
|
}
|
|
188
295
|
return reflections;
|
|
189
296
|
}
|
|
190
|
-
/**
|
|
297
|
+
/**
|
|
298
|
+
* @param {string} name
|
|
299
|
+
* @returns {Reflection}
|
|
300
|
+
*/
|
|
191
301
|
static reflection(name) {
|
|
192
302
|
const foundReflection = this.reflections().find((reflection) => reflection.name() == name);
|
|
193
303
|
if (!foundReflection) {
|
|
@@ -198,44 +308,47 @@ const BaseModel = class BaseModel {
|
|
|
198
308
|
}
|
|
199
309
|
return foundReflection;
|
|
200
310
|
}
|
|
201
|
-
/** @returns {string} */
|
|
311
|
+
/** @returns {string | undefined} */
|
|
202
312
|
static _token() {
|
|
203
313
|
const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
|
|
204
314
|
if (csrfTokenElement) {
|
|
205
315
|
return csrfTokenElement.getAttribute("content");
|
|
206
316
|
}
|
|
317
|
+
return undefined;
|
|
207
318
|
}
|
|
208
|
-
/**
|
|
209
|
-
* @param {object} [args]
|
|
210
|
-
* @param {boolean} [args.isNewRecord]
|
|
211
|
-
* @param {object} [args.data]
|
|
212
|
-
* @param {Record<string, any>} [args.a]
|
|
213
|
-
* @param {Record<string, any>} [args.b]
|
|
214
|
-
* @param {Collection<any>} [args.collection]
|
|
215
|
-
*/
|
|
319
|
+
/** @param {BaseModelArgs} [args] */
|
|
216
320
|
constructor(args = {}) {
|
|
217
|
-
|
|
218
|
-
this.
|
|
219
|
-
this.
|
|
220
|
-
this.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
321
|
+
const argsObject = /** @type {BaseModelArgsObject} */ (args);
|
|
322
|
+
this.abilities = /** @type {ModelAbilityMap} */ ({});
|
|
323
|
+
this.changes = /** @type {ModelDataMap} */ ({});
|
|
324
|
+
this.collection = undefined;
|
|
325
|
+
this._identifierKey = undefined;
|
|
326
|
+
this._markedForDestruction = undefined;
|
|
327
|
+
this.modelData = /** @type {ModelDataMap} */ ({});
|
|
328
|
+
this.newRecord = argsObject.isNewRecord;
|
|
329
|
+
this.previousModelData = undefined;
|
|
330
|
+
this.preloadedRelationships = undefined;
|
|
331
|
+
this.relationshipsCache = /** @type {LoadedRelationshipMap} */ ({});
|
|
332
|
+
this.relationships = /** @type {LoadedRelationshipMap} */ ({});
|
|
333
|
+
this.uniqueKeyValue = undefined;
|
|
334
|
+
if (argsObject && argsObject.data && argsObject.data.a) {
|
|
335
|
+
this._readModelDataFromArgs(argsObject);
|
|
336
|
+
}
|
|
337
|
+
else if (argsObject.a) {
|
|
338
|
+
this.abilities = argsObject.b || {};
|
|
339
|
+
this.modelData = objectToUnderscore(argsObject.a);
|
|
227
340
|
}
|
|
228
341
|
else if (args) {
|
|
229
342
|
this.abilities = {};
|
|
230
|
-
this.modelData = objectToUnderscore(args);
|
|
343
|
+
this.modelData = objectToUnderscore(/** @type {ModelDataMap} */ (args));
|
|
231
344
|
}
|
|
232
345
|
else {
|
|
233
346
|
this.abilities = {};
|
|
234
|
-
this.modelData = {};
|
|
347
|
+
this.modelData = /** @type {ModelDataMap} */ ({});
|
|
235
348
|
}
|
|
236
349
|
}
|
|
237
350
|
/**
|
|
238
|
-
* @param {
|
|
351
|
+
* @param {ModelDataMap} newAttributes
|
|
239
352
|
* @returns {void}
|
|
240
353
|
*/
|
|
241
354
|
assignAttributes(newAttributes) {
|
|
@@ -263,9 +376,9 @@ const BaseModel = class BaseModel {
|
|
|
263
376
|
}
|
|
264
377
|
}
|
|
265
378
|
}
|
|
266
|
-
/** @returns {
|
|
379
|
+
/** @returns {ModelDataMap} */
|
|
267
380
|
attributes() {
|
|
268
|
-
const result = {};
|
|
381
|
+
const result = /** @type {ModelDataMap} */ ({});
|
|
269
382
|
for (const key in this.modelData) {
|
|
270
383
|
result[key] = this.modelData[key];
|
|
271
384
|
}
|
|
@@ -287,7 +400,7 @@ const BaseModel = class BaseModel {
|
|
|
287
400
|
}
|
|
288
401
|
/** @returns {BaseModel} */
|
|
289
402
|
clone() {
|
|
290
|
-
const ModelClass =
|
|
403
|
+
const ModelClass = this.modelClass();
|
|
291
404
|
const clone = new ModelClass();
|
|
292
405
|
clone.abilities = { ...this.abilities };
|
|
293
406
|
clone.modelData = { ...this.modelData };
|
|
@@ -330,16 +443,16 @@ const BaseModel = class BaseModel {
|
|
|
330
443
|
const cacheKeyGenerator = new CacheKeyGenerator(this);
|
|
331
444
|
return cacheKeyGenerator.cacheKey();
|
|
332
445
|
}
|
|
333
|
-
/** @returns {import("./collection.js").default
|
|
446
|
+
/** @returns {import("./collection.js").default} */
|
|
334
447
|
static all() {
|
|
335
448
|
return this.ransack();
|
|
336
449
|
}
|
|
337
450
|
/**
|
|
338
|
-
* @param {
|
|
339
|
-
* @param {
|
|
451
|
+
* @param {ModelDataMap} [attributes]
|
|
452
|
+
* @param {ParseValidationErrorsOptions} [options]
|
|
340
453
|
* @returns {Promise<{
|
|
341
454
|
* model: BaseModel,
|
|
342
|
-
* response:
|
|
455
|
+
* response: ModelCommandResponse
|
|
343
456
|
* }>}
|
|
344
457
|
*/
|
|
345
458
|
async create(attributes, options) {
|
|
@@ -351,7 +464,7 @@ const BaseModel = class BaseModel {
|
|
|
351
464
|
dataToUse[paramKey] = modelData;
|
|
352
465
|
let response;
|
|
353
466
|
try {
|
|
354
|
-
response = await CommandsPool.addCommand({
|
|
467
|
+
response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
|
|
355
468
|
args: {
|
|
356
469
|
save: dataToUse
|
|
357
470
|
},
|
|
@@ -359,7 +472,7 @@ const BaseModel = class BaseModel {
|
|
|
359
472
|
collectionName: this.modelClassData().collectionName,
|
|
360
473
|
primaryKey: this.primaryKey(),
|
|
361
474
|
type: "create"
|
|
362
|
-
}, {});
|
|
475
|
+
}, {}));
|
|
363
476
|
}
|
|
364
477
|
catch (error) {
|
|
365
478
|
BaseModel.parseValidationErrors({ error, model: this, options });
|
|
@@ -372,11 +485,13 @@ const BaseModel = class BaseModel {
|
|
|
372
485
|
return { model: this, response };
|
|
373
486
|
}
|
|
374
487
|
/**
|
|
375
|
-
* @param {
|
|
376
|
-
* @param {
|
|
488
|
+
* @param {RawDataInput} rawData
|
|
489
|
+
* @param {ParseValidationErrorsOptions} [options]
|
|
490
|
+
* @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>}
|
|
377
491
|
*/
|
|
378
492
|
async createRaw(rawData, options = {}) {
|
|
379
493
|
const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
|
|
494
|
+
/** @type {ModelCommandResponse} */
|
|
380
495
|
let response;
|
|
381
496
|
try {
|
|
382
497
|
response = await CommandsPool.addCommand({
|
|
@@ -399,7 +514,7 @@ const BaseModel = class BaseModel {
|
|
|
399
514
|
}
|
|
400
515
|
return { model: this, response };
|
|
401
516
|
}
|
|
402
|
-
/** @returns {Promise<{model: BaseModel, response:
|
|
517
|
+
/** @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>} */
|
|
403
518
|
async destroy() {
|
|
404
519
|
const response = await CommandsPool.addCommand({
|
|
405
520
|
args: { query_params: this.collection && this.collection.params() },
|
|
@@ -424,17 +539,15 @@ const BaseModel = class BaseModel {
|
|
|
424
539
|
* @returns {Promise<void>}
|
|
425
540
|
*/
|
|
426
541
|
async ensureAbilities(listOfAbilities) {
|
|
427
|
-
// Populate an array with a list of abilities currently not loaded
|
|
428
542
|
const abilitiesToLoad = [];
|
|
429
543
|
for (const abilityInList of listOfAbilities) {
|
|
430
544
|
if (!(abilityInList in this.abilities)) {
|
|
431
545
|
abilitiesToLoad.push(abilityInList);
|
|
432
546
|
}
|
|
433
547
|
}
|
|
434
|
-
// Load the missing abilities if any
|
|
435
548
|
if (abilitiesToLoad.length > 0) {
|
|
436
549
|
const primaryKeyName = this.modelClass().primaryKey();
|
|
437
|
-
const ransackParams = {};
|
|
550
|
+
const ransackParams = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
|
|
438
551
|
ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
|
|
439
552
|
const abilitiesParams = /** @type {Record<string, string[]>} */ ({});
|
|
440
553
|
abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
|
|
@@ -451,18 +564,19 @@ const BaseModel = class BaseModel {
|
|
|
451
564
|
}
|
|
452
565
|
}
|
|
453
566
|
}
|
|
454
|
-
/** @returns {
|
|
567
|
+
/** @returns {ModelDataMap} */
|
|
455
568
|
getAttributes() {
|
|
456
569
|
return Object.assign(this.modelData, this.changes);
|
|
457
570
|
}
|
|
458
571
|
/**
|
|
459
|
-
* @param {
|
|
572
|
+
* @param {ModelCommandResponse} response
|
|
460
573
|
* @returns {never}
|
|
461
574
|
*/
|
|
462
575
|
handleResponseError(response) {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
576
|
+
throw new CustomError("Response wasn't successful", {
|
|
577
|
+
model: this,
|
|
578
|
+
response: /** @type {object} */ (response)
|
|
579
|
+
});
|
|
466
580
|
}
|
|
467
581
|
/** @returns {number | string} */
|
|
468
582
|
identifierKey() {
|
|
@@ -497,14 +611,14 @@ const BaseModel = class BaseModel {
|
|
|
497
611
|
}
|
|
498
612
|
/**
|
|
499
613
|
* @param {string} associationName
|
|
500
|
-
* @returns {Promise<
|
|
614
|
+
* @returns {Promise<LoadedRelationshipValue>}
|
|
501
615
|
*/
|
|
502
616
|
async ensureAssociationLoaded(associationName) {
|
|
503
617
|
return this.ensureAssociationLoadedUnderscore(inflection.underscore(associationName));
|
|
504
618
|
}
|
|
505
619
|
/**
|
|
506
620
|
* @param {string} associationNameUnderscore
|
|
507
|
-
* @returns {Promise<
|
|
621
|
+
* @returns {Promise<LoadedRelationshipValue>}
|
|
508
622
|
*/
|
|
509
623
|
async ensureAssociationLoadedUnderscore(associationNameUnderscore) {
|
|
510
624
|
const reflection = this.modelClassData().relationships.find((relationship) => relationship.name == associationNameUnderscore);
|
|
@@ -519,28 +633,28 @@ const BaseModel = class BaseModel {
|
|
|
519
633
|
if (!(loadMethodName in this))
|
|
520
634
|
throw new Error(`No such association load method on ${this.modelClassData().name}: ${loadMethodName}`);
|
|
521
635
|
if (this.isAssociationLoadedUnderscore(associationNameUnderscore)) {
|
|
522
|
-
const loadedAssociation = this[methodName]();
|
|
636
|
+
const loadedAssociation = /** @type {LoadedRelationshipValue | {loaded(): BaseModel[]}} */ (this[methodName]());
|
|
523
637
|
if (reflection.macro == "has_many") {
|
|
524
|
-
return loadedAssociation.loaded();
|
|
638
|
+
return /** @type {{loaded(): BaseModel[]}} */ (loadedAssociation).loaded();
|
|
525
639
|
}
|
|
526
|
-
return loadedAssociation;
|
|
640
|
+
return /** @type {LoadedRelationshipValue} */ (loadedAssociation);
|
|
527
641
|
}
|
|
528
642
|
return this[loadMethodName]();
|
|
529
643
|
}
|
|
530
644
|
/**
|
|
531
645
|
* @param {object} args
|
|
532
|
-
* @param {
|
|
646
|
+
* @param {ValidationError | Error | ValidationErrorWithResponse} args.error
|
|
533
647
|
* @param {BaseModel} [args.model]
|
|
534
|
-
* @param {ParseValidationErrorsOptions} args.options
|
|
648
|
+
* @param {ParseValidationErrorsOptions} [args.options]
|
|
535
649
|
*/
|
|
536
650
|
static parseValidationErrors({ error, model, options }) {
|
|
537
651
|
if (!(error instanceof ValidationError))
|
|
538
652
|
return;
|
|
539
|
-
if (!error.args
|
|
653
|
+
if (!error.args?.response?.validation_errors)
|
|
540
654
|
return;
|
|
541
655
|
const validationErrors = new ValidationErrors({
|
|
542
656
|
model,
|
|
543
|
-
validationErrors: digg(error, "args", "response", "validation_errors")
|
|
657
|
+
validationErrors: /** @type {import("./validation-errors.js").ValidationErrorEntryArgs[]} */ (digg(error, "args", "response", "validation_errors"))
|
|
544
658
|
});
|
|
545
659
|
BaseModel.sendValidationErrorsEvent(validationErrors, options);
|
|
546
660
|
if (!options || options.throwValidationError != false) {
|
|
@@ -643,7 +757,7 @@ const BaseModel = class BaseModel {
|
|
|
643
757
|
this.relationships[relationshipName] = model.relationships[relationshipName];
|
|
644
758
|
}
|
|
645
759
|
for (const relationshipCacheName in model.relationshipsCache) {
|
|
646
|
-
this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[
|
|
760
|
+
this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[relationshipCacheName];
|
|
647
761
|
}
|
|
648
762
|
}
|
|
649
763
|
/**
|
|
@@ -659,26 +773,26 @@ const BaseModel = class BaseModel {
|
|
|
659
773
|
}
|
|
660
774
|
}
|
|
661
775
|
/**
|
|
662
|
-
* @param {
|
|
663
|
-
* @param {
|
|
776
|
+
* @param {ModelValue | null | undefined} oldValue
|
|
777
|
+
* @param {ModelValue | null | undefined} newValue
|
|
664
778
|
* @returns {boolean | void}
|
|
665
779
|
*/
|
|
666
780
|
_isDateChanged(oldValue, newValue) {
|
|
667
|
-
if (Date.parse(oldValue) != Date.parse(newValue))
|
|
781
|
+
if (Date.parse(String(oldValue)) != Date.parse(String(newValue)))
|
|
668
782
|
return true;
|
|
669
783
|
}
|
|
670
784
|
/**
|
|
671
|
-
* @param {
|
|
672
|
-
* @param {
|
|
785
|
+
* @param {ModelValue | null | undefined} oldValue
|
|
786
|
+
* @param {ModelValue | null | undefined} newValue
|
|
673
787
|
* @returns {boolean | void}
|
|
674
788
|
*/
|
|
675
789
|
_isIntegerChanged(oldValue, newValue) {
|
|
676
|
-
if (parseInt(oldValue, 10) != parseInt(newValue, 10))
|
|
790
|
+
if (parseInt(String(oldValue), 10) != parseInt(String(newValue), 10))
|
|
677
791
|
return true;
|
|
678
792
|
}
|
|
679
793
|
/**
|
|
680
|
-
* @param {
|
|
681
|
-
* @param {
|
|
794
|
+
* @param {ModelValue | null | undefined} oldValue
|
|
795
|
+
* @param {ModelValue | null | undefined} newValue
|
|
682
796
|
* @returns {boolean | void}
|
|
683
797
|
*/
|
|
684
798
|
_isStringChanged(oldValue, newValue) {
|
|
@@ -692,18 +806,18 @@ const BaseModel = class BaseModel {
|
|
|
692
806
|
/** @returns {Promise<void>} */
|
|
693
807
|
async reload() {
|
|
694
808
|
const params = this.collection && this.collection.params();
|
|
695
|
-
const ransackParams = {};
|
|
809
|
+
const ransackParams = /** @type {import("./collection.js").CollectionRansackParams} */ ({});
|
|
696
810
|
ransackParams[`${this.modelClass().primaryKey()}_eq`] = this.primaryKey();
|
|
697
811
|
let query = this.modelClass().ransack(ransackParams);
|
|
698
812
|
if (params) {
|
|
699
813
|
if (params.preload) {
|
|
700
|
-
query.queryArgs.preload = params.preload;
|
|
814
|
+
query.queryArgs.preload = /** @type {import("./collection.js").PreloadValue} */ (params.preload);
|
|
701
815
|
}
|
|
702
816
|
if (params.select) {
|
|
703
|
-
query.queryArgs.select = params.select;
|
|
817
|
+
query.queryArgs.select = /** @type {Record<string, string[]>} */ (params.select);
|
|
704
818
|
}
|
|
705
819
|
if (params.select_columns) {
|
|
706
|
-
query.queryArgs.selectColumns = params.select_columns;
|
|
820
|
+
query.queryArgs.selectColumns = /** @type {Record<string, string[]>} */ (params.select_columns);
|
|
707
821
|
}
|
|
708
822
|
}
|
|
709
823
|
const model = await query.first();
|
|
@@ -719,7 +833,11 @@ const BaseModel = class BaseModel {
|
|
|
719
833
|
return this.update();
|
|
720
834
|
}
|
|
721
835
|
}
|
|
722
|
-
/**
|
|
836
|
+
/**
|
|
837
|
+
* @param {RawDataInput} rawData
|
|
838
|
+
* @param {ParseValidationErrorsOptions & {simpleModelErrors?: boolean}} [options]
|
|
839
|
+
* @returns {Promise<{model: BaseModel, response: ModelCommandResponse}>}
|
|
840
|
+
*/
|
|
723
841
|
saveRaw(rawData, options = {}) {
|
|
724
842
|
if (this.isNewRecord()) {
|
|
725
843
|
return this.createRaw(rawData, options);
|
|
@@ -729,7 +847,7 @@ const BaseModel = class BaseModel {
|
|
|
729
847
|
}
|
|
730
848
|
}
|
|
731
849
|
/**
|
|
732
|
-
* @param {
|
|
850
|
+
* @param {ModelDataMap} [newAttributes]
|
|
733
851
|
* @param {ParseValidationErrorsOptions} [options]
|
|
734
852
|
* @returns {Promise<{
|
|
735
853
|
* model: BaseModel,
|
|
@@ -749,7 +867,7 @@ const BaseModel = class BaseModel {
|
|
|
749
867
|
dataToUse[paramKey] = modelData;
|
|
750
868
|
let response;
|
|
751
869
|
try {
|
|
752
|
-
response = await CommandsPool.addCommand({
|
|
870
|
+
response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
|
|
753
871
|
args: {
|
|
754
872
|
query_params: this.collection && this.collection.params(),
|
|
755
873
|
save: dataToUse
|
|
@@ -758,7 +876,7 @@ const BaseModel = class BaseModel {
|
|
|
758
876
|
collectionName: this.modelClassData().collectionName,
|
|
759
877
|
primaryKey: this.primaryKey(),
|
|
760
878
|
type: "update"
|
|
761
|
-
}, {});
|
|
879
|
+
}, {}));
|
|
762
880
|
}
|
|
763
881
|
catch (error) {
|
|
764
882
|
BaseModel.parseValidationErrors({ error, model: this, options });
|
|
@@ -776,7 +894,7 @@ const BaseModel = class BaseModel {
|
|
|
776
894
|
}
|
|
777
895
|
}
|
|
778
896
|
/**
|
|
779
|
-
* @param {
|
|
897
|
+
* @param {ModelCommandResponse} response
|
|
780
898
|
* @returns {void}
|
|
781
899
|
*/
|
|
782
900
|
_refreshModelFromResponse(response) {
|
|
@@ -786,7 +904,7 @@ const BaseModel = class BaseModel {
|
|
|
786
904
|
this.setNewModel(newModel);
|
|
787
905
|
}
|
|
788
906
|
/**
|
|
789
|
-
* @param {
|
|
907
|
+
* @param {ModelCommandResponse} response
|
|
790
908
|
* @returns {void}
|
|
791
909
|
*/
|
|
792
910
|
_refreshModelDataFromResponse(response) {
|
|
@@ -796,27 +914,34 @@ const BaseModel = class BaseModel {
|
|
|
796
914
|
this.setNewModelData(newModel);
|
|
797
915
|
}
|
|
798
916
|
/**
|
|
799
|
-
* @param {
|
|
917
|
+
* @param {RawDataInput} rawData
|
|
800
918
|
* @param {object} options
|
|
801
|
-
* @returns {
|
|
919
|
+
* @returns {ModelDataMap}
|
|
802
920
|
*/
|
|
803
921
|
static _objectDataFromGivenRawData(rawData, options) {
|
|
804
|
-
if (rawData instanceof FormData || rawData
|
|
922
|
+
if (rawData instanceof FormData || BaseModel._isFormElement(rawData)) {
|
|
805
923
|
const formData = FormDataObjectizer.formDataFromObject(rawData, options);
|
|
806
|
-
return FormDataObjectizer.toObject(formData);
|
|
924
|
+
return /** @type {ModelDataMap} */ (FormDataObjectizer.toObject(formData));
|
|
807
925
|
}
|
|
808
926
|
return rawData;
|
|
809
927
|
}
|
|
810
928
|
/**
|
|
811
|
-
* @param {
|
|
929
|
+
* @param {RawDataInput | ModelValue} value
|
|
930
|
+
* @returns {value is HTMLFormElement}
|
|
931
|
+
*/
|
|
932
|
+
static _isFormElement(value) {
|
|
933
|
+
return typeof HTMLFormElement != "undefined" && value instanceof HTMLFormElement;
|
|
934
|
+
}
|
|
935
|
+
/**
|
|
936
|
+
* @param {RawDataInput} rawData
|
|
812
937
|
* @param {ParseValidationErrorsOptions & {simpleModelErrors?: boolean}} [options]
|
|
813
|
-
* @returns {Promise<{response:
|
|
938
|
+
* @returns {Promise<{response: ModelCommandResponse, model: BaseModel}>}
|
|
814
939
|
*/
|
|
815
940
|
async updateRaw(rawData, options = {}) {
|
|
816
941
|
const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
|
|
817
942
|
let response;
|
|
818
943
|
try {
|
|
819
|
-
response = await CommandsPool.addCommand({
|
|
944
|
+
response = /** @type {ModelCommandResponse} */ (await CommandsPool.addCommand({
|
|
820
945
|
args: {
|
|
821
946
|
query_params: this.collection && this.collection.params(),
|
|
822
947
|
save: objectData,
|
|
@@ -826,7 +951,7 @@ const BaseModel = class BaseModel {
|
|
|
826
951
|
collectionName: this.modelClassData().collectionName,
|
|
827
952
|
primaryKey: this.primaryKey(),
|
|
828
953
|
type: "update"
|
|
829
|
-
}, {});
|
|
954
|
+
}, {}));
|
|
830
955
|
}
|
|
831
956
|
catch (error) {
|
|
832
957
|
BaseModel.parseValidationErrors({ error, model: this, options });
|
|
@@ -842,7 +967,7 @@ const BaseModel = class BaseModel {
|
|
|
842
967
|
isValid() {
|
|
843
968
|
throw new Error("Not implemented yet");
|
|
844
969
|
}
|
|
845
|
-
/** @returns {Promise<{valid: boolean, errors:
|
|
970
|
+
/** @returns {Promise<{valid: boolean, errors: ValidationResponseErrors}>} */
|
|
846
971
|
async isValidOnServer() {
|
|
847
972
|
const modelData = this.getAttributes();
|
|
848
973
|
const paramKey = this.modelClassData().paramKey;
|
|
@@ -859,9 +984,9 @@ const BaseModel = class BaseModel {
|
|
|
859
984
|
}, {});
|
|
860
985
|
return { valid: response.valid, errors: response.errors };
|
|
861
986
|
}
|
|
862
|
-
/** @returns {
|
|
987
|
+
/** @returns {BaseModelClassType} */
|
|
863
988
|
modelClass() {
|
|
864
|
-
return /** @type {
|
|
989
|
+
return /** @type {BaseModelClassType} */ (this.constructor);
|
|
865
990
|
}
|
|
866
991
|
/**
|
|
867
992
|
* @param {string} relationshipName
|
|
@@ -889,9 +1014,9 @@ const BaseModel = class BaseModel {
|
|
|
889
1014
|
return this.uniqueKeyValue;
|
|
890
1015
|
}
|
|
891
1016
|
/**
|
|
892
|
-
* @param {
|
|
893
|
-
* @param {
|
|
894
|
-
* @returns {Promise<
|
|
1017
|
+
* @param {ModelCommandDescriptor} args
|
|
1018
|
+
* @param {ModelCommandOptions} commandArgs
|
|
1019
|
+
* @returns {Promise<ModelCommandResponse>}
|
|
895
1020
|
*/
|
|
896
1021
|
static async _callCollectionCommand(args, commandArgs) {
|
|
897
1022
|
const formOrDataObject = args.args;
|
|
@@ -903,7 +1028,7 @@ const BaseModel = class BaseModel {
|
|
|
903
1028
|
if (commandArgs.form) {
|
|
904
1029
|
form = commandArgs.form;
|
|
905
1030
|
}
|
|
906
|
-
else if (formOrDataObject
|
|
1031
|
+
else if (formOrDataObject && BaseModel._isFormElement(formOrDataObject)) {
|
|
907
1032
|
form = formOrDataObject;
|
|
908
1033
|
}
|
|
909
1034
|
if (form)
|
|
@@ -912,15 +1037,15 @@ const BaseModel = class BaseModel {
|
|
|
912
1037
|
}
|
|
913
1038
|
}
|
|
914
1039
|
/**
|
|
915
|
-
* @param {
|
|
916
|
-
* @param {
|
|
917
|
-
* @returns {
|
|
1040
|
+
* @param {ModelCommandDescriptor} args
|
|
1041
|
+
* @param {ModelCommandOptions} commandArgs
|
|
1042
|
+
* @returns {import("./command-execution.js").default}
|
|
918
1043
|
*/
|
|
919
1044
|
_callMemberCommand(args, commandArgs) {
|
|
920
1045
|
return CommandsPool.addCommand(args, commandArgs);
|
|
921
1046
|
}
|
|
922
1047
|
/**
|
|
923
|
-
* @param {FormData |
|
|
1048
|
+
* @param {FormData | ModelDataMap} [args]
|
|
924
1049
|
* @returns {FormData}
|
|
925
1050
|
*/
|
|
926
1051
|
static _postDataFromArgs(args) {
|
|
@@ -940,7 +1065,7 @@ const BaseModel = class BaseModel {
|
|
|
940
1065
|
}
|
|
941
1066
|
/**
|
|
942
1067
|
* @param {string} attributeName
|
|
943
|
-
* @returns {
|
|
1068
|
+
* @returns {ModelValue | null | undefined}
|
|
944
1069
|
*/
|
|
945
1070
|
readAttribute(attributeName) {
|
|
946
1071
|
const attributeNameUnderscore = inflection.underscore(attributeName);
|
|
@@ -948,7 +1073,7 @@ const BaseModel = class BaseModel {
|
|
|
948
1073
|
}
|
|
949
1074
|
/**
|
|
950
1075
|
* @param {string} attributeName
|
|
951
|
-
* @returns {
|
|
1076
|
+
* @returns {ModelValue | null | undefined}
|
|
952
1077
|
*/
|
|
953
1078
|
readAttributeUnderscore(attributeName) {
|
|
954
1079
|
if (attributeName in this.changes) {
|
|
@@ -967,7 +1092,10 @@ const BaseModel = class BaseModel {
|
|
|
967
1092
|
throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
|
|
968
1093
|
}
|
|
969
1094
|
}
|
|
970
|
-
/**
|
|
1095
|
+
/**
|
|
1096
|
+
* @param {string} attributeName
|
|
1097
|
+
* @returns {boolean}
|
|
1098
|
+
*/
|
|
971
1099
|
isAttributeLoaded(attributeName) {
|
|
972
1100
|
const attributeNameUnderscore = inflection.underscore(attributeName);
|
|
973
1101
|
if (attributeNameUnderscore in this.changes)
|
|
@@ -977,7 +1105,7 @@ const BaseModel = class BaseModel {
|
|
|
977
1105
|
return false;
|
|
978
1106
|
}
|
|
979
1107
|
/**
|
|
980
|
-
* @param {
|
|
1108
|
+
* @param {ModelValue | null | undefined} value
|
|
981
1109
|
* @returns {boolean}
|
|
982
1110
|
*/
|
|
983
1111
|
_isPresent(value) {
|
|
@@ -991,19 +1119,20 @@ const BaseModel = class BaseModel {
|
|
|
991
1119
|
}
|
|
992
1120
|
/**
|
|
993
1121
|
*
|
|
994
|
-
* @param {
|
|
1122
|
+
* @param {RelationshipLoadArgs} args
|
|
995
1123
|
* @param {import("./collection.js").QueryArgsType} queryArgs
|
|
996
|
-
* @returns {Promise<
|
|
1124
|
+
* @returns {Promise<BaseModel | null>}
|
|
997
1125
|
*/
|
|
998
1126
|
async _loadBelongsToReflection(args, queryArgs = {}) {
|
|
999
1127
|
if (args.reflectionName in this.relationships) {
|
|
1000
|
-
return this.relationships[args.reflectionName];
|
|
1128
|
+
return /** @type {BaseModel | null} */ (this.relationships[args.reflectionName]);
|
|
1001
1129
|
}
|
|
1002
1130
|
else if (args.reflectionName in this.relationshipsCache) {
|
|
1003
|
-
return this.relationshipsCache[args.reflectionName];
|
|
1131
|
+
return /** @type {BaseModel | null} */ (this.relationshipsCache[args.reflectionName]);
|
|
1004
1132
|
}
|
|
1005
1133
|
else {
|
|
1006
|
-
const collection = new Collection(
|
|
1134
|
+
const collection = new Collection(
|
|
1135
|
+
/** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
|
|
1007
1136
|
const model = await collection.first();
|
|
1008
1137
|
this.relationshipsCache[args.reflectionName] = model;
|
|
1009
1138
|
return model;
|
|
@@ -1011,15 +1140,15 @@ const BaseModel = class BaseModel {
|
|
|
1011
1140
|
}
|
|
1012
1141
|
/**
|
|
1013
1142
|
*
|
|
1014
|
-
* @param {
|
|
1015
|
-
* @returns {
|
|
1143
|
+
* @param {RelationshipLoadArgs} args
|
|
1144
|
+
* @returns {BaseModel | null}
|
|
1016
1145
|
*/
|
|
1017
1146
|
_readBelongsToReflection({ reflectionName }) {
|
|
1018
1147
|
if (reflectionName in this.relationships) {
|
|
1019
|
-
return this.relationships[reflectionName];
|
|
1148
|
+
return /** @type {BaseModel | null} */ (this.relationships[reflectionName]);
|
|
1020
1149
|
}
|
|
1021
1150
|
else if (reflectionName in this.relationshipsCache) {
|
|
1022
|
-
return this.relationshipsCache[reflectionName];
|
|
1151
|
+
return /** @type {BaseModel | null} */ (this.relationshipsCache[reflectionName]);
|
|
1023
1152
|
}
|
|
1024
1153
|
if (this.isNewRecord())
|
|
1025
1154
|
return null;
|
|
@@ -1029,37 +1158,39 @@ const BaseModel = class BaseModel {
|
|
|
1029
1158
|
}
|
|
1030
1159
|
/**
|
|
1031
1160
|
*
|
|
1032
|
-
* @param {
|
|
1161
|
+
* @param {RelationshipLoadArgs} args
|
|
1033
1162
|
* @param {import("./collection.js").QueryArgsType} queryArgs
|
|
1034
|
-
* @returns {Promise<
|
|
1163
|
+
* @returns {Promise<BaseModel[]>}
|
|
1035
1164
|
*/
|
|
1036
1165
|
async _loadHasManyReflection(args, queryArgs = {}) {
|
|
1037
1166
|
if (args.reflectionName in this.relationships) {
|
|
1038
|
-
return this.relationships[args.reflectionName];
|
|
1167
|
+
return /** @type {BaseModel[]} */ (this.relationships[args.reflectionName]);
|
|
1039
1168
|
}
|
|
1040
1169
|
else if (args.reflectionName in this.relationshipsCache) {
|
|
1041
|
-
return this.relationshipsCache[args.reflectionName];
|
|
1170
|
+
return /** @type {BaseModel[]} */ (this.relationshipsCache[args.reflectionName]);
|
|
1042
1171
|
}
|
|
1043
|
-
const collection = new Collection(
|
|
1172
|
+
const collection = new Collection(
|
|
1173
|
+
/** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
|
|
1044
1174
|
const models = await collection.toArray();
|
|
1045
1175
|
this.relationshipsCache[args.reflectionName] = models;
|
|
1046
1176
|
return models;
|
|
1047
1177
|
}
|
|
1048
1178
|
/**
|
|
1049
1179
|
*
|
|
1050
|
-
* @param {
|
|
1180
|
+
* @param {RelationshipLoadArgs} args
|
|
1051
1181
|
* @param {import("./collection.js").QueryArgsType} queryArgs
|
|
1052
|
-
* @returns {Promise<
|
|
1182
|
+
* @returns {Promise<BaseModel | null>}
|
|
1053
1183
|
*/
|
|
1054
1184
|
async _loadHasOneReflection(args, queryArgs = {}) {
|
|
1055
1185
|
if (args.reflectionName in this.relationships) {
|
|
1056
|
-
return this.relationships[args.reflectionName];
|
|
1186
|
+
return /** @type {BaseModel | null} */ (this.relationships[args.reflectionName]);
|
|
1057
1187
|
}
|
|
1058
1188
|
else if (args.reflectionName in this.relationshipsCache) {
|
|
1059
|
-
return this.relationshipsCache[args.reflectionName];
|
|
1189
|
+
return /** @type {BaseModel | null} */ (this.relationshipsCache[args.reflectionName]);
|
|
1060
1190
|
}
|
|
1061
1191
|
else {
|
|
1062
|
-
const collection = new Collection(
|
|
1192
|
+
const collection = new Collection(
|
|
1193
|
+
/** @type {import("./collection.js").CollectionArgsType<typeof BaseModel>} */ (args), queryArgs);
|
|
1063
1194
|
const model = await collection.first();
|
|
1064
1195
|
this.relationshipsCache[args.reflectionName] = model;
|
|
1065
1196
|
return model;
|
|
@@ -1067,15 +1198,15 @@ const BaseModel = class BaseModel {
|
|
|
1067
1198
|
}
|
|
1068
1199
|
/**
|
|
1069
1200
|
*
|
|
1070
|
-
* @param {
|
|
1071
|
-
* @returns {
|
|
1201
|
+
* @param {RelationshipLoadArgs} args
|
|
1202
|
+
* @returns {BaseModel | null}
|
|
1072
1203
|
*/
|
|
1073
1204
|
_readHasOneReflection({ reflectionName }) {
|
|
1074
1205
|
if (reflectionName in this.relationships) {
|
|
1075
|
-
return this.relationships[reflectionName];
|
|
1206
|
+
return /** @type {BaseModel | null} */ (this.relationships[reflectionName]);
|
|
1076
1207
|
}
|
|
1077
1208
|
else if (reflectionName in this.relationshipsCache) {
|
|
1078
|
-
return this.relationshipsCache[reflectionName];
|
|
1209
|
+
return /** @type {BaseModel | null} */ (this.relationshipsCache[reflectionName]);
|
|
1079
1210
|
}
|
|
1080
1211
|
if (this.isNewRecord()) {
|
|
1081
1212
|
return null;
|
|
@@ -1085,12 +1216,7 @@ const BaseModel = class BaseModel {
|
|
|
1085
1216
|
throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
|
|
1086
1217
|
}
|
|
1087
1218
|
/**
|
|
1088
|
-
* @param {
|
|
1089
|
-
* @param {object} [args.data]
|
|
1090
|
-
* @param {Record<string, any>} [args.data.b]
|
|
1091
|
-
* @param {Record<string, any>} [args.data.a]
|
|
1092
|
-
* @param {any} [args.data.r]
|
|
1093
|
-
* @param {Collection<any>} [args.collection]
|
|
1219
|
+
* @param {BaseModelArgsObject} [args]
|
|
1094
1220
|
* @returns {void}
|
|
1095
1221
|
*/
|
|
1096
1222
|
_readModelDataFromArgs(args) {
|
|
@@ -1143,8 +1269,10 @@ const BaseModel = class BaseModel {
|
|
|
1143
1269
|
}
|
|
1144
1270
|
}
|
|
1145
1271
|
}
|
|
1146
|
-
/** @returns {number|string} */
|
|
1147
|
-
primaryKey() {
|
|
1272
|
+
/** @returns {number | string} */
|
|
1273
|
+
primaryKey() {
|
|
1274
|
+
return /** @type {number | string} */ (this.readAttributeUnderscore(this.modelClass().primaryKey()));
|
|
1275
|
+
}
|
|
1148
1276
|
};
|
|
1149
1277
|
export default BaseModel;
|
|
1150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sU0FBUyxNQUFNLDJCQUEyQixDQUFBLENBQUMsbUNBQW1DO0FBQ3JGLE9BQU8sdUJBQXVCLE1BQU0saUNBQWlDLENBQUE7QUFDckUsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLFlBQVksTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLFNBQVMsTUFBTSxpQkFBaUIsQ0FBQTtBQUN2QyxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLFVBQVUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuRCxPQUFPLEtBQUssTUFBTSx1QkFBdUIsQ0FBQTtBQUN6QyxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUE7QUFDcEMsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxnQkFBZ0IsTUFBTSxvQkFBb0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQkU7QUFFRjs7OztHQUlHO0FBRUgsdUhBQXVIO0FBRXZILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVB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QUFnQixDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUV6QyxLQUFLLE1BQU0sY0FBYyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQzlDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUE7b0JBRWxFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDbEQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUE7Z0JBRXBFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQTtnQkFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUM5QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQztDQUNyRixDQUFBO0FBRUQsZUFBZSxTQUFTLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvcnMuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBBdHRyaWJ1dGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yIGZyb20gXCIuL2F0dHJpYnV0ZS1ub3QtbG9hZGVkLWVycm9yLmpzXCJcbmltcG9ydCBDYWNoZUtleUdlbmVyYXRvciBmcm9tIFwiLi9jYWNoZS1rZXktZ2VuZXJhdG9yLmpzXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb24uanNcIlxuaW1wb3J0IENvbW1hbmRzUG9vbCBmcm9tIFwiLi9jb21tYW5kcy1wb29sLmpzXCJcbmltcG9ydCBDb25maWcgZnJvbSBcIi4vY29uZmlnLmpzXCJcbmltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIlxuaW1wb3J0IE1vZGVsTmFtZSBmcm9tIFwiLi9tb2RlbC1uYW1lLmpzXCJcbmltcG9ydCBOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9ub3QtbG9hZGVkLWVycm9yLmpzXCJcbmltcG9ydCBSZWZsZWN0aW9uIGZyb20gXCIuL2Jhc2UtbW9kZWwvcmVmbGVjdGlvbi5qc1wiXG5pbXBvcnQgU2NvcGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9zY29wZS5qc1wiXG5pbXBvcnQgU2VydmljZXMgZnJvbSBcIi4vc2VydmljZXMuanNcIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9yLmpzXCJcbmltcG9ydCBvYmplY3RUb0Zvcm1EYXRhIGZyb20gXCJvYmplY3QtdG8tZm9ybWRhdGFcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGU+fSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FtZWxpemVkTG93ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpMThuS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVEYXNoZXJpemVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVyYWxOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gcmFuc2Fja2FibGVfYXNzb2NpYXRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIikuQXR0cmlidXRlQXJnVHlwZVtdfSByYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSByYW5zYWNrYWJsZV9zY29wZXNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IHJlbGF0aW9uc2hpcHNcbiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc1xuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JtXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7bmV3ICguLi5hcmdzOiBBcnJheTxhbnk+KTogQmFzZU1vZGVsLCBhcGlNYWtlclR5cGU6IHN0cmluZ30gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBCYXNlTW9kZWxDbGFzc1R5cGUgKi9cblxuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuLyoqIEJhc2VNb2RlbC4gKi9cbi8qKiBAdHlwZSB7QmFzZU1vZGVsQ2xhc3NUeXBlfSAqL1xuY29uc3QgQmFzZU1vZGVsID0gY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICAvKiogQHJldHVybnMge0F0dHJpYnV0ZVtdfSAqL1xuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVLZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlS2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChhdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9XG4gICAqL1xuICBzdGF0aWMgbW9kZWxDbGFzc0RhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzc0RhdGEgc2hvdWxkIGJlIG92ZXJyaWRlbiBieSBjaGlsZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQodmFsaWRhdGlvbkVycm9ycykge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuZm9ybV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAgICovXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoe30pXG5cbiAgICBxdWVyeVtgJHt0aGlzLnByaW1hcnlLZXkoKX1fZXFgXSA9IGlkXG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmFuc2FjayhxdWVyeSkuZmlyc3QoKVxuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEN1c3RvbUVycm9yKFwiUmVjb3JkIG5vdCBmb3VuZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGZpbmRPckNyZWF0ZUJ5QXJnc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuYWRkaXRpb25hbERhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZE9yQ3JlYXRlQnkoZmluZE9yQ3JlYXRlQnlBcmdzLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTZXJ2aWNlcy5jdXJyZW50KCkuc2VuZFJlcXVlc3QoXCJNb2RlbHM6OkZpbmRPckNyZWF0ZUJ5XCIsIHtcbiAgICAgIGFkZGl0aW9uYWxfZGF0YTogYXJncy5hZGRpdGlvbmFsRGF0YSxcbiAgICAgIGZpbmRfb3JfY3JlYXRlX2J5X2FyZ3M6IGZpbmRPckNyZWF0ZUJ5QXJncyxcbiAgICAgIHJlc291cmNlX25hbWU6IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICB9KVxuICAgIGNvbnN0IG1vZGVsID0gZGlnZyhyZXN1bHQsIFwibW9kZWxcIilcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbE5hbWV9ICovXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJwcmltYXJ5S2V5XCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcXVlcnldXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdDxhbnk+fVxuICAgKi9cbiAgc3RhdGljIHJhbnNhY2socXVlcnkgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih7bW9kZWxDbGFzczogdGhpc30sIHtyYW5zYWNrOiBxdWVyeX0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VsZWN0XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8YW55Pn1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpLnNlbGVjdChzZWxlY3QpXG4gIH1cblxuICAvKiogQHJldHVybnMge1JlZmxlY3Rpb25bXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgcmVmbGVjdGlvbnMucHVzaChuZXcgUmVmbGVjdGlvbihyZWxhdGlvbnNoaXBEYXRhKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXR0cmlidXRlW119ICovXG4gIHN0YXRpYyByYW5zYWNrYWJsZUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U2NvcGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlU2NvcGVzKCkge1xuICAgIGNvbnN0IHJhbnNhY2thYmxlU2NvcGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfc2NvcGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3Qgc2NvcGVEYXRhIG9mIHJhbnNhY2thYmxlU2NvcGVzKSB7XG4gICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZShzY29wZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHNjb3BlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbn0gKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlZmxlY3Rpb25OYW1lcyA9IHRoaXMucmVmbGVjdGlvbnMoKVxuICAgICAgICAubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3JlZmxlY3Rpb25OYW1lc31gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pc05ld1JlY29yZF1cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzLmRhdGFdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuYV1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5iXVxuICAgKiBAcGFyYW0ge0NvbGxlY3Rpb248YW55Pn0gW2FyZ3MuY29sbGVjdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgdGhpcy5uZXdSZWNvcmQgPSBhcmdzLmlzTmV3UmVjb3JkXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7fVxuICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9XG5cbiAgICBpZiAoYXJncyAmJiBhcmdzLmRhdGEgJiYgYXJncy5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKVxuICAgIH0gZWxzZSBpZiAoYXJncy5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3MuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncy5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0F0dHJpYnV0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld0F0dHJpYnV0ZXNba2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICAgIGxldCBhcHBseUNoYW5nZSA9IHRydWVcbiAgICAgIGxldCBkZWxldGVDaGFuZ2UgPSBmYWxzZVxuXG4gICAgICBpZiAodGhpcy5pc0F0dHJpYnV0ZUxvYWRlZChrZXkpKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5yZWFkQXR0cmlidXRlKGtleSlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgICAgZGVsZXRlQ2hhbmdlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHBseUNoYW5nZSkge1xuICAgICAgICB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV0gPSBuZXdWYWx1ZVxuICAgICAgfSBlbHNlIGlmIChkZWxldGVDaGFuZ2UpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5tb2RlbERhdGFba2V5XVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNoYW5nZXNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ2l2ZW5BYmlsaXR5TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbihnaXZlbkFiaWxpdHlOYW1lKSB7XG4gICAgY29uc3QgYWJpbGl0eU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZ2l2ZW5BYmlsaXR5TmFtZSlcblxuICAgIGlmICghKGFiaWxpdHlOYW1lIGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYmlsaXR5ICR7YWJpbGl0eU5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCBmb3IgJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWJpbGl0aWVzW2FiaWxpdHlOYW1lXVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtCYXNlTW9kZWx9ICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge25ldyAoLi4uYXJnczogYW55W10pID0+IEJhc2VNb2RlbH0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTW9kZWxDbGFzcygpXG5cbiAgICBjbG9uZS5hYmlsaXRpZXMgPSB7Li4udGhpcy5hYmlsaXRpZXN9XG4gICAgY2xvbmUubW9kZWxEYXRhID0gey4uLnRoaXMubW9kZWxEYXRhfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHMgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHNDYWNoZX1cblxuICAgIHJldHVybiBjbG9uZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9ICovXG4gIGNhY2hlS2V5KCkge1xuICAgIGlmICh0aGlzLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGNvbnN0IGtleVBhcnRzID0gW1xuICAgICAgICB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXksXG4gICAgICAgIHRoaXMucHJpbWFyeUtleSgpXG4gICAgICBdXG5cbiAgICAgIGlmIChcInVwZGF0ZWRfYXRcIiBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0KClcblxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRBdCAhPSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgd2Fzbid0IGFuIG9iamVjdDogJHt0eXBlb2YgdXBkYXRlZEF0fWApXG4gICAgICAgIH0gZWxzZSBpZiAoIShcImdldFRpbWVcIiBpbiB1cGRhdGVkQXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgZGlkbid0IHN1cHBvcnQgZ2V0VGltZSB3aXRoIGNsYXNzOiAke3VwZGF0ZWRBdC5jb25zdHJ1Y3RvciAmJiB1cGRhdGVkQXQuY29uc3RydWN0b3IubmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbG9jYWxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmxvY2FsKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmdWxsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5jYWNoZUtleSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0PGFueT59ICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXR0cmlidXRlcykgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fSAqL1xuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtxdWVyeV9wYXJhbXM6IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKCl9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWRlc3Ryb3lgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJkZXN0cm95XCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbGlzdE9mQWJpbGl0aWVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQWJpbGl0aWVzKGxpc3RPZkFiaWxpdGllcykge1xuICAgIC8vIFBvcHVsYXRlIGFuIGFycmF5IHdpdGggYSBsaXN0IG9mIGFiaWxpdGllcyBjdXJyZW50bHkgbm90IGxvYWRlZFxuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGFiaWxpdHlJbkxpc3Qgb2YgbGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgICBpZiAoIShhYmlsaXR5SW5MaXN0IGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgICBhYmlsaXRpZXNUb0xvYWQucHVzaChhYmlsaXR5SW5MaXN0KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1pc3NpbmcgYWJpbGl0aWVzIGlmIGFueVxuICAgIGlmIChhYmlsaXRpZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleU5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqLyAoe30pXG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzKClcbiAgICAgICAgLnJhbnNhY2socmFuc2Fja1BhcmFtcylcbiAgICAgICAgLmFiaWxpdGllcyhhYmlsaXRpZXNQYXJhbXMpXG4gICAgICAgIC5maXJzdCgpXG5cbiAgICAgIGlmICghYW5vdGhlck1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvb2sgdXAgdGhlIHNhbWUgbW9kZWwgJHt0aGlzLnByaW1hcnlLZXkoKX0gd2l0aCBhYmlsaXRpZXM6ICR7YWJpbGl0aWVzVG9Mb2FkLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdBYmlsaXRpZXMgPSBhbm90aGVyTW9kZWwuYWJpbGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IG5ld0FiaWxpdHkgaW4gbmV3QWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzW25ld0FiaWxpdHldID0gbmV3QWJpbGl0aWVzW25ld0FiaWxpdHldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMubW9kZWxEYXRhLCB0aGlzLmNoYW5nZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHtuZXZlcn1cbiAgICovXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBpZGVudGlmaWVyS2V5KCkge1xuICAgIGlmICghdGhpcy5faWRlbnRpZmllcktleSkgdGhpcy5faWRlbnRpZmllcktleSA9IHRoaXMuaXNQZXJzaXN0ZWQoKSA/IHRoaXMucHJpbWFyeUtleSgpIDogdGhpcy51bmlxdWVLZXkoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXJLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXNzb2NpYXRpb25OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZChhc3NvY2lhdGlvbk5hbWUpIHsgcmV0dXJuIHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFzc29jaWF0aW9uTmFtZSkpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZSAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkge1xuICAgIGlmIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBlbnN1cmVBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkge1xuICAgIGNvbnN0IHJlZmxlY3Rpb24gPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucmVsYXRpb25zaGlwcy5maW5kKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lID09IGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpXG5cbiAgICBpZiAoIXJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZWxhdGlvbiAke2Fzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmV9IG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke3JlbGF0aW9uc2hpcE5hbWVzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUsIHRydWUpXG4gICAgY29uc3QgbG9hZE1ldGhvZE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGBsb2FkXyR7YXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZX1gLCB0cnVlKVxuXG4gICAgaWYgKCEobWV0aG9kTmFtZSBpbiB0aGlzKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGFzc29jaWF0aW9uIG1ldGhvZCBvbiAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHttZXRob2ROYW1lfWApXG4gICAgaWYgKCEobG9hZE1ldGhvZE5hbWUgaW4gdGhpcykpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBhc3NvY2lhdGlvbiBsb2FkIG1ldGhvZCBvbiAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5uYW1lfTogJHtsb2FkTWV0aG9kTmFtZX1gKVxuXG4gICAgaWYgKHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSkpIHtcbiAgICAgIGNvbnN0IGxvYWRlZEFzc29jaWF0aW9uID0gdGhpc1ttZXRob2ROYW1lXSgpXG5cbiAgICAgIGlmIChyZWZsZWN0aW9uLm1hY3JvID09IFwiaGFzX21hbnlcIikge1xuICAgICAgICByZXR1cm4gbG9hZGVkQXNzb2NpYXRpb24ubG9hZGVkKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlZEFzc29jaWF0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbbG9hZE1ldGhvZE5hbWVdKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2FueX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gYXJncy5vcHRpb25zXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgaHVtYW5BdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBrZXlOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiaTE4bktleVwiKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGNvbnN0IGkxOG4gPSBDb25maWcuZ2V0STE4bigpXG5cbiAgICBpZiAoaTE4bikgcmV0dXJuIGkxOG4udChgYWN0aXZlcmVjb3JkLmF0dHJpYnV0ZXMuJHtrZXlOYW1lfS4ke0Jhc2VNb2RlbC5zbmFrZUNhc2UoYXR0cmlidXRlTmFtZSl9YCwge2RlZmF1bHRWYWx1ZTogYXR0cmlidXRlTmFtZX0pXG5cbiAgICByZXR1cm4gaW5mbGVjdGlvbi5odW1hbml6ZShhdHRyaWJ1dGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBdHRyaWJ1dGVDaGFuZ2VkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc0NoYW5nZWQoKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcylcblxuICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNOZXdSZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMubmV3UmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld1JlY29yZFxuICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHRoaXMubW9kZWxEYXRhICYmIHRoaXMubW9kZWxEYXRhLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzUGVyc2lzdGVkKCkgeyByZXR1cm4gIXRoaXMuaXNOZXdSZWNvcmQoKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzbmFrZUNhc2Uoc3RyaW5nKSB7IHJldHVybiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLnByZXZpb3VzTW9kZWxEYXRhKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUgPT0gYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG5cbiAgICBpZiAoIWF0dHJpYnV0ZURhdGEpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWwobW9kZWwpIHtcbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShtb2RlbClcblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgcmVsYXRpb25zaGlwQ2FjaGVOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwQ2FjaGVOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZVtuYW1lXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbERhdGEobW9kZWwpIHtcbiAgICBpZiAoIShcIm1vZGVsRGF0YVwiIGluIG1vZGVsKSkgdGhyb3cgbmV3IEVycm9yKGBObyBtb2RlbERhdGEgaW4gbW9kZWw6ICR7SlNPTi5zdHJpbmdpZnkobW9kZWwpfWApXG5cbiAgICB0aGlzLnByZXZpb3VzTW9kZWxEYXRhID0gey4uLmRpZ2codGhpcywgXCJtb2RlbERhdGFcIil9XG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb2xkVmFsdWVcbiAgICogQHBhcmFtIHthbnl9IG5ld1ZhbHVlXG4gICAqIEByZXR1cm5zIHtib29sZWFuIHwgdm9pZH1cbiAgICovXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgIGxldCBxdWVyeSA9IHRoaXMubW9kZWxDbGFzcygpLnJhbnNhY2socmFuc2Fja1BhcmFtcylcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMucHJlbG9hZCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3MucHJlbG9hZCA9IHBhcmFtcy5wcmVsb2FkXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuc2VsZWN0KSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3QgPSBwYXJhbXMuc2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuc2VsZWN0X2NvbHVtbnMpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnNlbGVjdENvbHVtbnMgPSBwYXJhbXMuc2VsZWN0X2NvbHVtbnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHF1ZXJ5LmZpcnN0KClcbiAgICB0aGlzLnNldE5ld01vZGVsKG1vZGVsKVxuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlPzogb2JqZWN0fT59ICovXG4gIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn0gKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAgICogICBtb2RlbDogQmFzZU1vZGVsLFxuICAgKiAgIHJlc3BvbnNlPzogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG5ld0F0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAobmV3QXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcykubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXN9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmNoYW5nZXNcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShuZXdNb2RlbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICovXG4gIHN0YXRpYyBfb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChyYXdEYXRhIGluc3RhbmNlb2YgRm9ybURhdGEgfHwgcmF3RGF0YS5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBGb3JtRGF0YU9iamVjdGl6ZXIuZm9ybURhdGFGcm9tT2JqZWN0KHJhd0RhdGEsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZm9ybURhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnMgJiB7c2ltcGxlTW9kZWxFcnJvcnM/OiBib29sZWFufX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtyZXNwb25zZTogb2JqZWN0LCBtb2RlbDogQmFzZU1vZGVsfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogb2JqZWN0RGF0YSxcbiAgICAgICAgICAgIHNpbXBsZV9tb2RlbF9lcnJvcnM6IG9wdGlvbnM/LnNpbXBsZU1vZGVsRXJyb3JzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bmV2ZXJ9ICovXG4gIGlzVmFsaWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIHlldFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHt2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fT59ICovXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gIG1vZGVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICogQHBhcmFtIHtCYXNlTW9kZWwgfCBCYXNlTW9kZWxbXSB8IG51bGx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJlbG9hZFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXBOYW1lLCBtb2RlbCkge1xuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBtYXJrRm9yRGVzdHJ1Y3Rpb24oKSB7XG4gICAgdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gPSB0cnVlXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIG1hcmtlZEZvckRlc3RydWN0aW9uKCkgeyByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gfHwgZmFsc2UgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDFcbiAgICAgIHRoaXMudW5pcXVlS2V5VmFsdWUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByYW5nZSkgKyBtaW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2FyZ3M6IGFueX19IGFyZ3NcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb21tYW5kQXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJnc1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBfY2FsbE1lbWJlckNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICByZXR1cm4gQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IFJlY29yZDxzdHJpbmcsIGFueT59IFthcmdzXVxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gICAqL1xuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICByZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPGFueT59IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuUXVlcnlBcmdzVHlwZX0gcXVlcnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueSB8IG51bGw+fVxuICAgKi9cbiAgYXN5bmMgX2xvYWRCZWxvbmdzVG9SZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHt7bW9kZWxDbGFzczogYW55LCByZWZsZWN0aW9uTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7YW55IHwgbnVsbH1cbiAgICovXG4gIF9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxhbnk+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxhbnk+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzTWFueVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPGFueT59IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuUXVlcnlBcmdzVHlwZX0gcXVlcnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc09uZVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcblxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHt7bW9kZWxDbGFzczogYW55LCByZWZsZWN0aW9uTmFtZTogc3RyaW5nfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7YW55IHwgbnVsbH1cbiAgICovXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJncy5kYXRhXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLmRhdGEuYl1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5kYXRhLmFdXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5kYXRhLnJdXG4gICAqIEBwYXJhbSB7Q29sbGVjdGlvbjxhbnk+fSBbYXJncy5jb2xsZWN0aW9uXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5kYXRhLmIgfHwge31cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBhcmdzLmNvbGxlY3Rpb25cbiAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmRhdGEuYSlcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBhcmdzLmRhdGEuclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2dldE1vZGVsOiAocmVsYXRpb25zaGlwVHlwZTogc3RyaW5nLCByZWxhdGlvbnNoaXBJZDogbnVtYmVyIHwgc3RyaW5nKSA9PiBCYXNlTW9kZWx9fSBwcmVsb2FkZWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcnxzdHJpbmd9ICovXG4gIHByaW1hcnlLZXkoKSB7IHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKSkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlTW9kZWxcbiJdfQ==
|
|
1278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFNBQVMsTUFBTSwyQkFBMkIsQ0FBQSxDQUFDLG1DQUFtQztBQUNyRixPQUFPLHVCQUF1QixNQUFNLGlDQUFpQyxDQUFBO0FBQ3JFLE9BQU8saUJBQWlCLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxVQUFVLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxVQUFVLE1BQU0sNEJBQTRCLENBQUE7QUFDbkQsT0FBTyxLQUFLLE1BQU0sdUJBQXVCLENBQUE7QUFDekMsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUE7QUFFakQsaURBQWlEO0FBQ2pELG9HQUFvRztBQUNwRywyREFBMkQ7QUFDM0QsbURBQW1EO0FBQ25ELCtFQUErRTtBQUMvRSx5REFBeUQ7QUFDekQseURBQXlEO0FBQ3pELHVGQUF1RjtBQUN2RixxRkFBcUY7QUFDckYsd0VBQXdFO0FBQ3hFLCtFQUErRTtBQUMvRSxz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LENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUVwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDOUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLFVBQVU7UUFDUixPQUFPLDhCQUE4QixDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztDQUNGLENBQUE7QUFFRCxlQUFlLFNBQVMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgQXR0cmlidXRlIGZyb20gXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSBzb3J0LWltcG9ydHNcbmltcG9ydCBBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9hdHRyaWJ1dGUtbm90LWxvYWRlZC1lcnJvci5qc1wiXG5pbXBvcnQgQ2FjaGVLZXlHZW5lcmF0b3IgZnJvbSBcIi4vY2FjaGUta2V5LWdlbmVyYXRvci5qc1wiXG5pbXBvcnQgQ29sbGVjdGlvbiBmcm9tIFwiLi9jb2xsZWN0aW9uLmpzXCJcbmltcG9ydCBDb21tYW5kc1Bvb2wgZnJvbSBcIi4vY29tbWFuZHMtcG9vbC5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCBGb3JtRGF0YU9iamVjdGl6ZXIgZnJvbSBcImZvcm0tZGF0YS1vYmplY3RpemVyXCJcbmltcG9ydCBNb2RlbE5hbWUgZnJvbSBcIi4vbW9kZWwtbmFtZS5qc1wiXG5pbXBvcnQgTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vbm90LWxvYWRlZC1lcnJvci5qc1wiXG5pbXBvcnQgUmVmbGVjdGlvbiBmcm9tIFwiLi9iYXNlLW1vZGVsL3JlZmxlY3Rpb24uanNcIlxuaW1wb3J0IFNjb3BlIGZyb20gXCIuL2Jhc2UtbW9kZWwvc2NvcGUuanNcIlxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL3NlcnZpY2VzLmpzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvci5qc1wiXG5pbXBvcnQgb2JqZWN0VG9Gb3JtRGF0YSBmcm9tIFwib2JqZWN0LXRvLWZvcm1kYXRhXCJcblxuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXJ9IE1vZGVsSWRlbnRpZmllciAqL1xuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IERhdGUgfCBGaWxlIHwgQmxvYn0gTW9kZWxTY2FsYXJWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogTW9kZWxWYWx1ZX19IE1vZGVsVmFsdWVNYXAgKi9cbi8qKiBAdHlwZWRlZiB7QXJyYXk8TW9kZWxWYWx1ZT59IE1vZGVsVmFsdWVBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtNb2RlbFNjYWxhclZhbHVlIHwgTW9kZWxWYWx1ZU1hcCB8IE1vZGVsVmFsdWVBcnJheX0gTW9kZWxWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFZhbHVlPn0gTW9kZWxEYXRhTWFwICovXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSBNb2RlbEFiaWxpdHlNYXAgKi9cbi8qKiBAdHlwZWRlZiB7TW9kZWxJZGVudGlmaWVyIHwgTW9kZWxJZGVudGlmaWVyW10gfCBudWxsfSBQcmVsb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBQcmVsb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZT59IFByZWxvYWRlZFJlbGF0aW9uc2hpcE1hcCAqL1xuLyoqIEB0eXBlZGVmIHtCYXNlTW9kZWwgfCBCYXNlTW9kZWxbXSB8IG51bGx9IExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlICovXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlPn0gTG9hZGVkUmVsYXRpb25zaGlwTWFwICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9yZWZsZWN0aW9uLmpzXCIpLlJlZmxlY3Rpb25NYWNyb30gUmVmbGVjdGlvbk1hY3JvICovXG4vKiogQHR5cGVkZWYge0Zvcm1EYXRhIHwgSFRNTEZvcm1FbGVtZW50IHwgTW9kZWxEYXRhTWFwfSBSYXdEYXRhSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+fSBWYWxpZGF0aW9uUmVzcG9uc2VFcnJvcnMgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVsYXRpb25zaGlwRGF0YVR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmb3JlaWduS2V5XVxuICogQHByb3BlcnR5IHtSZWZsZWN0aW9uTWFjcm99IG1hY3JvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlX25hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyb3VnaF1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY29wZURhdGFUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGU+fSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FtZWxpemVkTG93ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2xsZWN0aW9uS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpMThuS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVEYXNoZXJpemVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbHVyYWxOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtSZWxhdGlvbnNoaXBEYXRhVHlwZVtdfSByYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYXNlLW1vZGVsL2F0dHJpYnV0ZS5qc1wiKS5BdHRyaWJ1dGVBcmdUeXBlW119IHJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAqIEBwcm9wZXJ0eSB7U2NvcGVEYXRhVHlwZVtdfSByYW5zYWNrYWJsZV9zY29wZXNcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpb25zaGlwRGF0YVR5cGVbXX0gcmVsYXRpb25zaGlwc1xuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zXG4gKiBAcHJvcGVydHkge0hUTUxGb3JtRWxlbWVudH0gW2Zvcm1dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2FkZWRNb2RlbERhdGFUeXBlXG4gKiBAcHJvcGVydHkge01vZGVsRGF0YU1hcH0gW2FdXG4gKiBAcHJvcGVydHkge01vZGVsQWJpbGl0eU1hcH0gW2JdXG4gKiBAcHJvcGVydHkge1ByZWxvYWRlZFJlbGF0aW9uc2hpcE1hcH0gW3JdXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU1vZGVsQXJnc09iamVjdFxuICogQHByb3BlcnR5IHtNb2RlbERhdGFNYXB9IFthXVxuICogQHByb3BlcnR5IHtNb2RlbEFiaWxpdHlNYXB9IFtiXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gW2NvbGxlY3Rpb25dXG4gKiBAcHJvcGVydHkge0xvYWRlZE1vZGVsRGF0YVR5cGV9IFtkYXRhXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNOZXdSZWNvcmRdXG4gKi9cbi8qKiBAdHlwZWRlZiB7QmFzZU1vZGVsQXJnc09iamVjdCB8IE1vZGVsRGF0YU1hcH0gQmFzZU1vZGVsQXJncyAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYXNlTW9kZWxTdGF0aWNNZXRob2RzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWFrZXJUeXBlXG4gKiBAcHJvcGVydHkgeygpID0+IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBhbGxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXR0cmlidXRlW119IGF0dHJpYnV0ZXNcbiAqIEBwcm9wZXJ0eSB7KGlkOiBNb2RlbElkZW50aWZpZXIpID0+IFByb21pc2U8QmFzZU1vZGVsPn0gZmluZFxuICogQHByb3BlcnR5IHsoZmluZE9yQ3JlYXRlQnlBcmdzOiBNb2RlbERhdGFNYXAsIGFyZ3M/OiB7YWRkaXRpb25hbERhdGE/OiBNb2RlbERhdGFNYXB9KSA9PiBQcm9taXNlPEJhc2VNb2RlbD59IGZpbmRPckNyZWF0ZUJ5XG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IGltcG9ydChcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIikuZGVmYXVsdH0gW2NyZWF0ZUxpbmtdXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IGltcG9ydChcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIikuZGVmYXVsdH0gW2Rlc3Ryb3lMaW5rc11cbiAqIEBwcm9wZXJ0eSB7KGF0dHJpYnV0ZU5hbWU6IHN0cmluZykgPT4gYm9vbGVhbn0gaGFzQXR0cmlidXRlXG4gKiBAcHJvcGVydHkgeyhhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gaHVtYW5BdHRyaWJ1dGVOYW1lXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBNb2RlbERhdGFNYXApID0+IFByb21pc2U8e2xpbms/OiBCYXNlTW9kZWwgfCBudWxsfT59IFtsaW5rRm9yXVxuICogQHByb3BlcnR5IHsoKSA9PiBNb2RlbENsYXNzRGF0YVR5cGV9IG1vZGVsQ2xhc3NEYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IE1vZGVsTmFtZX0gbW9kZWxOYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHtjdXJyZW50PzogQmFzZU1vZGVsW119Pn0gW2N1cnJlbnRdXG4gKiBAcHJvcGVydHkgeyhxdWVyeT86IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtcykgPT4gaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHJhbnNhY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4ge25hbWU/OiBzdHJpbmd9fSBbcmVzb3VyY2VEYXRhXVxuICogQHByb3BlcnR5IHsoKSA9PiBSZWZsZWN0aW9uW119IHJlZmxlY3Rpb25zXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFJlZmxlY3Rpb259IHJlZmxlY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVmbGVjdGlvbltdfSByYW5zYWNrYWJsZUFzc29jaWF0aW9uc1xuICogQHByb3BlcnR5IHsoKSA9PiBBdHRyaWJ1dGVbXX0gcmFuc2Fja2FibGVBdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgeygpID0+IFNjb3BlW119IHJhbnNhY2thYmxlU2NvcGVzXG4gKiBAcHJvcGVydHkgeyhzZWxlY3Q/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4pID0+IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7KGF0dHJpYnV0ZU5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBzbmFrZUNhc2VcbiAqL1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHQgJiBCYXNlTW9kZWxTdGF0aWNNZXRob2RzfSBCYXNlTW9kZWxDbGFzc1R5cGUgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTW9kZWxDb21tYW5kRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtNb2RlbERhdGFNYXAgfCBGb3JtRGF0YSB8IEhUTUxGb3JtRWxlbWVudH0gW2FyZ3NdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcHJvcGVydHkge01vZGVsSWRlbnRpZmllcn0gW3ByaW1hcnlLZXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhY2hlUmVzcG9uc2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb3JjZUh0dHBdXG4gKiBAcHJvcGVydHkge0hUTUxGb3JtRWxlbWVudH0gW2Zvcm1dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbnN0YW50XVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ29tbWFuZFJlc3BvbnNlXG4gKiBAcHJvcGVydHkge1ZhbGlkYXRpb25SZXNwb25zZUVycm9yc30gW2Vycm9yc11cbiAqIEBwcm9wZXJ0eSB7QmFzZU1vZGVsIHwgQmFzZU1vZGVsW119IFttb2RlbF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt2YWxpZF1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWYWxpZGF0aW9uRXJyb3JXaXRoUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7e3Jlc3BvbnNlPzoge3ZhbGlkYXRpb25fZXJyb3JzPzogaW1wb3J0KFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiKS5WYWxpZGF0aW9uRXJyb3JFbnRyeUFyZ3NbXX19fSBbYXJnc11cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWxhdGlvbnNoaXBMb2FkQXJnc1xuICogQHByb3BlcnR5IHtCYXNlTW9kZWx9IFttb2RlbF1cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBbbW9kZWxDbGFzc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWZsZWN0aW9uTmFtZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IG9iamVjdFxuICogQHJldHVybnMge01vZGVsRGF0YU1hcH1cbiAqL1xuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuLyoqIEJhc2VNb2RlbC4gKi9cbmNvbnN0IEJhc2VNb2RlbCA9IGNsYXNzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyBhcGlNYWtlclR5cGUgPSBcIkJhc2VNb2RlbFwiXG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlS2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZUtleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goYXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBoYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG4gICAgY29uc3QgbG93ZXJDYXNlQXR0cmlidXRlTmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHJldHVybnMge01vZGVsQ2xhc3NEYXRhVHlwZX1cbiAgICovXG4gIHN0YXRpYyBtb2RlbENsYXNzRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2RlbENsYXNzRGF0YSBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IGNoaWxkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3JzfSB2YWxpZGF0aW9uRXJyb3JzXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIHN0YXRpYyBuZXdDdXN0b21FdmVudCh2YWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChcInZhbGlkYXRpb24tZXJyb3JzXCIsIHtkZXRhaWw6IHZhbGlkYXRpb25FcnJvcnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5mb3JtXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRocm93VmFsaWRhdGlvbkVycm9yXVxuICAgKi9cbiAgc3RhdGljIHNlbmRWYWxpZGF0aW9uRXJyb3JzRXZlbnQodmFsaWRhdGlvbkVycm9ycywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9ybSkge1xuICAgICAgY29uc3QgZXZlbnQgPSBCYXNlTW9kZWwubmV3Q3VzdG9tRXZlbnQodmFsaWRhdGlvbkVycm9ycylcbiAgICAgIG9wdGlvbnMuZm9ybS5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgY29uc3QgcXVlcnkgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gKi8gKHt9KVxuXG4gICAgcXVlcnlbYCR7dGhpcy5wcmltYXJ5S2V5KCl9X2VxYF0gPSBpZFxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJhbnNhY2socXVlcnkpLmZpcnN0KClcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBDdXN0b21FcnJvcihcIlJlY29yZCBub3QgZm91bmRcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IGZpbmRPckNyZWF0ZUJ5QXJnc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7TW9kZWxEYXRhTWFwfSBbYXJncy5hZGRpdGlvbmFsRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JDcmVhdGVCeShmaW5kT3JDcmVhdGVCeUFyZ3MsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNlcnZpY2VzLmN1cnJlbnQoKS5zZW5kUmVxdWVzdChcIk1vZGVsczo6RmluZE9yQ3JlYXRlQnlcIiwge1xuICAgICAgYWRkaXRpb25hbF9kYXRhOiBhcmdzLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgZmluZF9vcl9jcmVhdGVfYnlfYXJnczogZmluZE9yQ3JlYXRlQnlBcmdzLFxuICAgICAgcmVzb3VyY2VfbmFtZTogZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgIH0pXG4gICAgY29uc3QgbW9kZWwgPSBkaWdnKHJlc3VsdCwgXCJtb2RlbFwiKVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsTmFtZX0gKi9cbiAgc3RhdGljIG1vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsTmFtZSh7bW9kZWxDbGFzc0RhdGE6IHRoaXMubW9kZWxDbGFzc0RhdGEoKX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gW3F1ZXJ5XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9XG4gICAqL1xuICBzdGF0aWMgcmFuc2FjayhxdWVyeSA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHttb2RlbENsYXNzOiB0aGlzfSwge3JhbnNhY2s6IHF1ZXJ5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gW3NlbGVjdF1cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVBc3NvY2lhdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX2Fzc29jaWF0aW9uc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZWZsZWN0aW9ucy5wdXNoKG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEYXRhIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTY29wZVtdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVTY29wZXMoKSB7XG4gICAgY29uc3QgcmFuc2Fja2FibGVTY29wZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9zY29wZXNcIilcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzY29wZURhdGEgb2YgcmFuc2Fja2FibGVTY29wZXMpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHNjb3BlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9uW119ICovXG4gIHN0YXRpYyByZWZsZWN0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWZsZWN0aW9uID0gbmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgcmVmbGVjdGlvbnMucHVzaChyZWZsZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtSZWZsZWN0aW9ufVxuICAgKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJlZmxlY3Rpb25OYW1lcyA9IHRoaXMucmVmbGVjdGlvbnMoKVxuICAgICAgICAubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3JlZmxlY3Rpb25OYW1lc31gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqIEBwYXJhbSB7QmFzZU1vZGVsQXJnc30gW2FyZ3NdICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGFyZ3NPYmplY3QgPSAvKiogQHR5cGUge0Jhc2VNb2RlbEFyZ3NPYmplY3R9ICovIChhcmdzKVxuXG4gICAgdGhpcy5hYmlsaXRpZXMgPSAvKiogQHR5cGUge01vZGVsQWJpbGl0eU1hcH0gKi8gKHt9KVxuICAgIHRoaXMuY2hhbmdlcyA9IC8qKiBAdHlwZSB7TW9kZWxEYXRhTWFwfSAqLyAoe30pXG4gICAgdGhpcy5jb2xsZWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faWRlbnRpZmllcktleSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5tb2RlbERhdGEgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuICAgIHRoaXMubmV3UmVjb3JkID0gYXJnc09iamVjdC5pc05ld1JlY29yZFxuICAgIHRoaXMucHJldmlvdXNNb2RlbERhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSB1bmRlZmluZWRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IC8qKiBAdHlwZSB7TG9hZGVkUmVsYXRpb25zaGlwTWFwfSAqLyAoe30pXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0gLyoqIEB0eXBlIHtMb2FkZWRSZWxhdGlvbnNoaXBNYXB9ICovICh7fSlcbiAgICB0aGlzLnVuaXF1ZUtleVZhbHVlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAoYXJnc09iamVjdCAmJiBhcmdzT2JqZWN0LmRhdGEgJiYgYXJnc09iamVjdC5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzT2JqZWN0KVxuICAgIH0gZWxzZSBpZiAoYXJnc09iamVjdC5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3NPYmplY3QuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJnc09iamVjdC5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoLyoqIEB0eXBlIHtNb2RlbERhdGFNYXB9ICovIChhcmdzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKHt9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsRGF0YU1hcH0gbmV3QXR0cmlidXRlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3QXR0cmlidXRlc1trZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgICAgbGV0IGFwcGx5Q2hhbmdlID0gdHJ1ZVxuICAgICAgbGV0IGRlbGV0ZUNoYW5nZSA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLmlzQXR0cmlidXRlTG9hZGVkKGtleSkpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoa2V5KVxuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlVW5kZXJzY29yZV1cblxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgICBkZWxldGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXSA9IG5ld1ZhbHVlXG4gICAgICB9IGVsc2UgaWYgKGRlbGV0ZUNoYW5nZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbERhdGFNYXB9ICovXG4gIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtNb2RlbERhdGFNYXB9ICovICh7fSlcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubW9kZWxEYXRhKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMubW9kZWxEYXRhW2tleV1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jaGFuZ2VzW2tleV1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGdpdmVuQWJpbGl0eU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBjYW4oZ2l2ZW5BYmlsaXR5TmFtZSkge1xuICAgIGNvbnN0IGFiaWxpdHlOYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGdpdmVuQWJpbGl0eU5hbWUpXG5cbiAgICBpZiAoIShhYmlsaXR5TmFtZSBpbiB0aGlzLmFiaWxpdGllcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJpbGl0eSAke2FiaWxpdHlOYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgZm9yICR7ZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFiaWxpdGllc1thYmlsaXR5TmFtZV1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QmFzZU1vZGVsfSAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gdGhpcy5tb2RlbENsYXNzKClcbiAgICBjb25zdCBjbG9uZSA9IG5ldyBNb2RlbENsYXNzKClcblxuICAgIGNsb25lLmFiaWxpdGllcyA9IHsuLi50aGlzLmFiaWxpdGllc31cbiAgICBjbG9uZS5tb2RlbERhdGEgPSB7Li4udGhpcy5tb2RlbERhdGF9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwcyA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHN9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwc0NhY2hlID0gey4uLnRoaXMucmVsYXRpb25zaGlwc0NhY2hlfVxuXG4gICAgcmV0dXJuIGNsb25lXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IHN0cmluZ30gKi9cbiAgY2FjaGVLZXkoKSB7XG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgY29uc3Qga2V5UGFydHMgPSBbXG4gICAgICAgIHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleSxcbiAgICAgICAgdGhpcy5wcmltYXJ5S2V5KClcbiAgICAgIF1cblxuICAgICAgaWYgKFwidXBkYXRlZF9hdFwiIGluIHRoaXMubW9kZWxEYXRhKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY29uc3QgdXBkYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEF0ICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCB3YXNuJ3QgYW4gb2JqZWN0OiAke3R5cGVvZiB1cGRhdGVkQXR9YClcbiAgICAgICAgfSBlbHNlIGlmICghKFwiZ2V0VGltZVwiIGluIHVwZGF0ZWRBdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCBkaWRuJ3Qgc3VwcG9ydCBnZXRUaW1lIHdpdGggY2xhc3M6ICR7dXBkYXRlZEF0LmNvbnN0cnVjdG9yICYmIHVwZGF0ZWRBdC5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGtleVBhcnRzLnB1c2goYHVwZGF0ZWRBdC0ke3RoaXMudXBkYXRlZEF0KCkuZ2V0VGltZSgpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXlQYXJ0cy5qb2luKFwiLVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51bmlxdWVLZXkoKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBsb2NhbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IubG9jYWwoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGZ1bGxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmNhY2hlS2V5KClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9ICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbERhdGFNYXB9IFthdHRyaWJ1dGVzXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogTW9kZWxDb21tYW5kUmVzcG9uc2VcbiAgICogfT59XG4gICAqL1xuICBhc3luYyBjcmVhdGUoYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIGlmIChhdHRyaWJ1dGVzKSB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoYXR0cmlidXRlcylcbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuZ2V0QXR0cmlidXRlcygpXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSAvKiogQHR5cGUge01vZGVsQ29tbWFuZFJlc3BvbnNlfSAqLyAoYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Jhd0RhdGFJbnB1dH0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlfT59XG4gICAqL1xuICBhc3luYyBjcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcblxuICAgIC8qKiBAdHlwZSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9ICovXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlfT59ICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge3F1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKX0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tZGVzdHJveWAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcImRlc3Ryb3lcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsaXN0T2ZBYmlsaXRpZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBlbnN1cmVBYmlsaXRpZXMobGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgY29uc3QgYWJpbGl0aWVzVG9Mb2FkID0gW11cblxuICAgIGZvciAoY29uc3QgYWJpbGl0eUluTGlzdCBvZiBsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAgIGlmICghKGFiaWxpdHlJbkxpc3QgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICAgIGFiaWxpdGllc1RvTG9hZC5wdXNoKGFiaWxpdHlJbkxpc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFiaWxpdGllc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcmltYXJ5S2V5TmFtZSA9IHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25SYW5zYWNrUGFyYW1zfSAqLyAoe30pXG4gICAgICByYW5zYWNrUGFyYW1zW2Ake3ByaW1hcnlLZXlOYW1lfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgICAgY29uc3QgYWJpbGl0aWVzUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovICh7fSlcbiAgICAgIGFiaWxpdGllc1BhcmFtc1tkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXSA9IGFiaWxpdGllc1RvTG9hZFxuXG4gICAgICBjb25zdCBhbm90aGVyTW9kZWwgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MoKVxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsRGF0YU1hcH0gKi9cbiAgZ2V0QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHtuZXZlcn1cbiAgICovXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICBcIlJlc3BvbnNlIHdhc24ndCBzdWNjZXNzZnVsXCIsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICByZXNwb25zZTogLyoqIEB0eXBlIHtvYmplY3R9ICovIChyZXNwb25zZSlcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlciB8IHN0cmluZ30gKi9cbiAgaWRlbnRpZmllcktleSgpIHtcbiAgICBpZiAoIXRoaXMuX2lkZW50aWZpZXJLZXkpIHRoaXMuX2lkZW50aWZpZXJLZXkgPSB0aGlzLmlzUGVyc2lzdGVkKCkgPyB0aGlzLnByaW1hcnlLZXkoKSA6IHRoaXMudW5pcXVlS2V5KClcblxuICAgIHJldHVybiB0aGlzLl9pZGVudGlmaWVyS2V5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzc29jaWF0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7IHJldHVybiB0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpIHtcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXNzb2NpYXRpb25OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvblByZXNlbnQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgaWYgKHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZChhc3NvY2lhdGlvbk5hbWUpKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhc3NvY2lhdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9hZGVkUmVsYXRpb25zaGlwVmFsdWU+fVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvYWRlZFJlbGF0aW9uc2hpcFZhbHVlPn1cbiAgICovXG4gIGFzeW5jIGVuc3VyZUFzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgY29uc3QgcmVmbGVjdGlvbiA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUgPT0gYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghcmVmbGVjdGlvbikge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7YXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZX0gb24gJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZX06ICR7cmVsYXRpb25zaGlwTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSwgdHJ1ZSlcbiAgICBjb25zdCBsb2FkTWV0aG9kTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYGxvYWRfJHthc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlfWAsIHRydWUpXG5cbiAgICBpZiAoIShtZXRob2ROYW1lIGluIHRoaXMpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggYXNzb2NpYXRpb24gbWV0aG9kIG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke21ldGhvZE5hbWV9YClcbiAgICBpZiAoIShsb2FkTWV0aG9kTmFtZSBpbiB0aGlzKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGFzc29jaWF0aW9uIGxvYWQgbWV0aG9kIG9uICR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLm5hbWV9OiAke2xvYWRNZXRob2ROYW1lfWApXG5cbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSkge1xuICAgICAgY29uc3QgbG9hZGVkQXNzb2NpYXRpb24gPSAvKiogQHR5cGUge0xvYWRlZFJlbGF0aW9uc2hpcFZhbHVlIHwge2xvYWRlZCgpOiBCYXNlTW9kZWxbXX19ICovICh0aGlzW21ldGhvZE5hbWVdKCkpXG5cbiAgICAgIGlmIChyZWZsZWN0aW9uLm1hY3JvID09IFwiaGFzX21hbnlcIikge1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHt7bG9hZGVkKCk6IEJhc2VNb2RlbFtdfX0gKi8gKGxvYWRlZEFzc29jaWF0aW9uKS5sb2FkZWQoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtMb2FkZWRSZWxhdGlvbnNoaXBWYWx1ZX0gKi8gKGxvYWRlZEFzc29jaWF0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2xvYWRNZXRob2ROYW1lXSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3IgfCBFcnJvciB8IFZhbGlkYXRpb25FcnJvcldpdGhSZXNwb25zZX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW2FyZ3Mub3B0aW9uc11cbiAgICovXG4gIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbCwgb3B0aW9uc30pIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikpIHJldHVyblxuICAgIGlmICghZXJyb3IuYXJncz8ucmVzcG9uc2U/LnZhbGlkYXRpb25fZXJyb3JzKSByZXR1cm5cblxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBuZXcgVmFsaWRhdGlvbkVycm9ycyh7XG4gICAgICBtb2RlbCxcbiAgICAgIHZhbGlkYXRpb25FcnJvcnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiKS5WYWxpZGF0aW9uRXJyb3JFbnRyeUFyZ3NbXX0gKi8gKGRpZ2coZXJyb3IsIFwiYXJnc1wiLCBcInJlc3BvbnNlXCIsIFwidmFsaWRhdGlvbl9lcnJvcnNcIikpXG4gICAgfSlcblxuICAgIEJhc2VNb2RlbC5zZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpXG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvciAhPSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBodW1hbkF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGtleU5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJpMThuS2V5XCIpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgaTE4biA9IENvbmZpZy5nZXRJMThuKClcblxuICAgIGlmIChpMThuKSByZXR1cm4gaTE4bi50KGBhY3RpdmVyZWNvcmQuYXR0cmlidXRlcy4ke2tleU5hbWV9LiR7QmFzZU1vZGVsLnNuYWtlQ2FzZShhdHRyaWJ1dGVOYW1lKX1gLCB7ZGVmYXVsdFZhbHVlOiBhdHRyaWJ1dGVOYW1lfSlcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmh1bWFuaXplKGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0F0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IGRpZ2coYXR0cmlidXRlLCBcIm5hbWVcIikpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLmNoYW5nZXMpKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2BfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlLCB0cnVlKX1DaGFuZ2VkYF1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNQZXJzaXN0ZWQoKSB7IHJldHVybiAhdGhpcy5pc05ld1JlY29yZCgpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNuYWtlQ2FzZShzdHJpbmcpIHsgcmV0dXJuIGluZmxlY3Rpb24udW5kZXJzY29yZShzdHJpbmcpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzYXZlZENoYW5nZVRvQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoIXRoaXMucHJldmlvdXNNb2RlbERhdGEpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLnByZXZpb3VzTW9kZWxEYXRhKSlcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucHJldmlvdXNNb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kTmFtZSA9IGBfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlKX1DaGFuZ2VkYFxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2NoYW5nZWRNZXRob2ROYW1lXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcENhY2hlTmFtZV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IHsuLi5kaWdnKHRoaXMsIFwibW9kZWxEYXRhXCIpfVxuXG4gICAgZm9yKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwubW9kZWxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXSA9IG1vZGVsLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBuZXdWYWx1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHZvaWR9XG4gICAqL1xuICBfaXNEYXRlQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAoRGF0ZS5wYXJzZShTdHJpbmcob2xkVmFsdWUpKSAhPSBEYXRlLnBhcnNlKFN0cmluZyhuZXdWYWx1ZSkpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBvbGRWYWx1ZVxuICAgKiBAcGFyYW0ge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfSBuZXdWYWx1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHZvaWR9XG4gICAqL1xuICBfaXNJbnRlZ2VyQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAocGFyc2VJbnQoU3RyaW5nKG9sZFZhbHVlKSwgMTApICE9IHBhcnNlSW50KFN0cmluZyhuZXdWYWx1ZSksIDEwKSlcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gb2xkVmFsdWVcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gbmV3VmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCB2b2lkfVxuICAgKi9cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5Db2xsZWN0aW9uUmFuc2Fja1BhcmFtc30gKi8gKHt9KVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgIGxldCBxdWVyeSA9IHRoaXMubW9kZWxDbGFzcygpLnJhbnNhY2socmFuc2Fja1BhcmFtcylcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMucHJlbG9hZCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3MucHJlbG9hZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlByZWxvYWRWYWx1ZX0gKi8gKHBhcmFtcy5wcmVsb2FkKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovIChwYXJhbXMuc2VsZWN0KVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovIChwYXJhbXMuc2VsZWN0X2NvbHVtbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHttb2RlbDogQmFzZU1vZGVsLCByZXNwb25zZT86IG9iamVjdH0+fSAqL1xuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmF3RGF0YUlucHV0fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9ucyAmIHtzaW1wbGVNb2RlbEVycm9ycz86IGJvb2xlYW59fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBNb2RlbENvbW1hbmRSZXNwb25zZX0+fVxuICAgKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxEYXRhTWFwfSBbbmV3QXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zfSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e1xuICAgKiAgIG1vZGVsOiBCYXNlTW9kZWwsXG4gICAqICAgcmVzcG9uc2U/OiBvYmplY3RcbiAgICogfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGUobmV3QXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIGlmIChuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcylcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHttb2RlbDogdGhpc31cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuY2hhbmdlc1xuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gLyoqIEB0eXBlIHtNb2RlbENvbW1hbmRSZXNwb25zZX0gKi8gKGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbENvbW1hbmRSZXNwb25zZX0gcmVzcG9uc2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9IHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmF3RGF0YUlucHV0fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtNb2RlbERhdGFNYXB9XG4gICAqL1xuICBzdGF0aWMgX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAocmF3RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8IEJhc2VNb2RlbC5faXNGb3JtRWxlbWVudChyYXdEYXRhKSkge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBGb3JtRGF0YU9iamVjdGl6ZXIuZm9ybURhdGFGcm9tT2JqZWN0KHJhd0RhdGEsIG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge01vZGVsRGF0YU1hcH0gKi8gKEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Jhd0RhdGFJbnB1dCB8IE1vZGVsVmFsdWV9IHZhbHVlXG4gICAqIEByZXR1cm5zIHt2YWx1ZSBpcyBIVE1MRm9ybUVsZW1lbnR9XG4gICAqL1xuICBzdGF0aWMgX2lzRm9ybUVsZW1lbnQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIEhUTUxGb3JtRWxlbWVudCAhPSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSYXdEYXRhSW5wdXR9IHJhd0RhdGFcbiAgICogQHBhcmFtIHtQYXJzZVZhbGlkYXRpb25FcnJvcnNPcHRpb25zICYge3NpbXBsZU1vZGVsRXJyb3JzPzogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7cmVzcG9uc2U6IE1vZGVsQ29tbWFuZFJlc3BvbnNlLCBtb2RlbDogQmFzZU1vZGVsfT59XG4gICAqL1xuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IC8qKiBAdHlwZSB7TW9kZWxDb21tYW5kUmVzcG9uc2V9ICovIChhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7cmVzcG9uc2UsIG1vZGVsOiB0aGlzfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtuZXZlcn0gKi9cbiAgaXNWYWxpZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgeWV0XCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e3ZhbGlkOiBib29sZWFuLCBlcnJvcnM6IFZhbGlkYXRpb25SZXNwb25zZUVycm9yc30+fSAqL1xuICBhc3luYyBpc1ZhbGlkT25TZXJ2ZXIoKSB7XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBwYXJhbUtleSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5wYXJhbUtleVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICB9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXZhbGlkYCxcbiAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgIHR5cGU6IFwidmFsaWRcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgcmV0dXJuIHt2YWxpZDogcmVzcG9uc2UudmFsaWQsIGVycm9yczogcmVzcG9uc2UuZXJyb3JzfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtCYXNlTW9kZWxDbGFzc1R5cGV9ICovXG4gIG1vZGVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsQ2xhc3NUeXBlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZVxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbCB8IEJhc2VNb2RlbFtdIHwgbnVsbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcmVsb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUsIG1vZGVsKSB7XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwc1tCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG1hcmtGb3JEZXN0cnVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiA9IHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgbWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSB7IHJldHVybiB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiB8fCBmYWxzZSB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIHVuaXF1ZUtleSgpIHtcbiAgICBpZiAoIXRoaXMudW5pcXVlS2V5VmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbiA9IDUwMDAwMDAwMDAwMDAwMDBcbiAgICAgIGNvbnN0IG1heCA9IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluICsgMVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJhbmdlKSArIG1pblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbENvbW1hbmREZXNjcmlwdG9yfSBhcmdzXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kT3B0aW9uc30gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxDb21tYW5kUmVzcG9uc2U+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0ICYmIEJhc2VNb2RlbC5faXNGb3JtRWxlbWVudChmb3JtT3JEYXRhT2JqZWN0KSkge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TW9kZWxDb21tYW5kRGVzY3JpcHRvcn0gYXJnc1xuICAgKiBAcGFyYW0ge01vZGVsQ29tbWFuZE9wdGlvbnN9IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbW1hbmQtZXhlY3V0aW9uLmpzXCIpLmRlZmF1bHR9XG4gICAqL1xuICBfY2FsbE1lbWJlckNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICByZXR1cm4gQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IE1vZGVsRGF0YU1hcH0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAgICovXG4gIHN0YXRpYyBfcG9zdERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgbGV0IHBvc3REYXRhXG5cbiAgICBpZiAoYXJncykge1xuICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICBwb3N0RGF0YSA9IGFyZ3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3REYXRhID0gb2JqZWN0VG9Gb3JtRGF0YS5zZXJpYWxpemUoYXJncywge30sIG51bGwsIFwiYXJnc1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3REYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge01vZGVsVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlTG9hZGVkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykgcmV0dXJuIHRydWVcbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5tb2RlbERhdGEpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNb2RlbFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsIHwgbnVsbD59XG4gICAqL1xuICBhc3luYyBfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbCB8IG51bGx9ICovICh0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICAgIHF1ZXJ5QXJnc1xuICAgICAgKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbGF0aW9uc2hpcExvYWRBcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtCYXNlTW9kZWwgfCBudWxsfVxuICAgKi9cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXSlcbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbGF0aW9uc2hpcExvYWRBcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYXNlTW9kZWxbXT59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWxbXX0gKi8gKHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXSlcbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbFtdfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICBxdWVyeUFyZ3NcbiAgICApXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZU1vZGVsIHwgbnVsbD59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc09uZVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Jhc2VNb2RlbCB8IG51bGx9ICovICh0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtCYXNlTW9kZWwgfCBudWxsfSAqLyAodGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPHR5cGVvZiBCYXNlTW9kZWw+fSAqLyAoYXJncyksXG4gICAgICAgIHF1ZXJ5QXJnc1xuICAgICAgKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcblxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuXG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBMb2FkQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7QmFzZU1vZGVsIHwgbnVsbH1cbiAgICovXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsIHwgbnVsbH0gKi8gKHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV0pXG4gICAgfSBlbHNlIGlmIChyZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7QmFzZU1vZGVsIHwgbnVsbH0gKi8gKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlZmxlY3Rpb25OYW1lXSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmFzZU1vZGVsQXJnc09iamVjdH0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7Z2V0TW9kZWw6IChyZWxhdGlvbnNoaXBUeXBlOiBzdHJpbmcsIHJlbGF0aW9uc2hpcElkOiBudW1iZXIgfCBzdHJpbmcpID0+IEJhc2VNb2RlbH19IHByZWxvYWRlZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWFkUHJlbG9hZGVkUmVsYXRpb25zaGlwcyhwcmVsb2FkZWQpIHtcbiAgICBpZiAoIXRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgPSB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcENsYXNzRGF0YSA9IHJlbGF0aW9uc2hpcHMuZmluZCgocmVsYXRpb25zaGlwKSA9PiBkaWdnKHJlbGF0aW9uc2hpcCwgXCJuYW1lXCIpID09IHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwQ2xhc3NEYXRhKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwc0xpc3QgPSByZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwKSA9PiByZWxhdGlvbnNoaXAubmFtZSkuam9pbihcIiwgXCIpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgcmVsYXRpb24gJHtyZWxhdGlvbnNoaXBOYW1lfSBvbiB0aGUgJHttb2RlbE5hbWV9IG1vZGVsOiAke3JlbGF0aW9uc2hpcHNMaXN0fWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSBkaWdnKHJlbGF0aW9uc2hpcENsYXNzRGF0YSwgXCJjb2xsZWN0aW9uTmFtZVwiKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVsYXRpb25zaGlwTmFtZX0gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbGF0aW9uc2hpcCBvbiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IGJ5IHRoYXQgbmFtZTogJHtyZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwRGF0YSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uc2hpcERhdGEpKSB7XG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gW11cbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcElkIG9mIHJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBJZClcblxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdLnB1c2gobW9kZWwpXG4gICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdLnB1c2gobW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcHJlbG9hZGVkLmdldE1vZGVsKHJlbGF0aW9uc2hpcFR5cGUsIHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBtb2RlbFxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBtb2RlbFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge251bWJlciB8IHN0cmluZ30gKi8gKHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUodGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlTW9kZWxcbiJdfQ==
|