@netgrif/components-core 6.3.0-beta.3 → 6.3.0-beta.4
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/esm2020/assets/i18n/de.json +4 -1
- package/esm2020/assets/i18n/en.json +4 -1
- package/esm2020/assets/i18n/sk.json +4 -1
- package/esm2020/lib/admin/role-assignment/abstract-role-assignment.component.mjs +3 -3
- package/esm2020/lib/admin/role-assignment/services/role-assignment.service.mjs +3 -3
- package/esm2020/lib/admin/role-assignment-ldap-group/abstract-ldap-group-role-assignment.component.mjs +3 -3
- package/esm2020/lib/admin/role-assignment-ldap-group/services/role-assignment-ldap-group.service.mjs +3 -3
- package/esm2020/lib/admin/user-invite/abstract-user-invite.component.mjs +3 -3
- package/esm2020/lib/admin/user-invite/services/organization-list.service.mjs +3 -3
- package/esm2020/lib/admin/user-invite/services/user-invite.service.mjs +3 -3
- package/esm2020/lib/allowed-nets/services/allowed-nets.service.mjs +3 -3
- package/esm2020/lib/allowed-nets/services/base-allowed-nets.service.mjs +3 -3
- package/esm2020/lib/allowed-nets/services/factory/allowed-nets-service-factory.mjs +3 -3
- package/esm2020/lib/authentication/anonymous/anonymous.service.mjs +3 -3
- package/esm2020/lib/authentication/authentication.module.mjs +4 -4
- package/esm2020/lib/authentication/components/abstract-authentication-overlay.mjs +3 -3
- package/esm2020/lib/authentication/models/user.transformer.mjs +3 -3
- package/esm2020/lib/authentication/services/anonymous-authentication-interceptor.mjs +3 -3
- package/esm2020/lib/authentication/services/authentication/authentication.service.mjs +3 -3
- package/esm2020/lib/authentication/services/authentication-interceptor.mjs +3 -3
- package/esm2020/lib/authentication/services/guard/authentication-guard.service.mjs +3 -3
- package/esm2020/lib/authentication/services/methods/basic-authentication/basic-authentication.service.mjs +3 -3
- package/esm2020/lib/authentication/services/methods/null-authentication/null-authentication.service.mjs +3 -3
- package/esm2020/lib/authentication/session/services/session.service.mjs +3 -3
- package/esm2020/lib/authentication/sign-up/services/sign-up.service.mjs +3 -3
- package/esm2020/lib/authentication/sign-up/sign-up.module.mjs +4 -4
- package/esm2020/lib/authorization/authority/authority-guard.service.mjs +3 -3
- package/esm2020/lib/authorization/group/group-guard.service.mjs +3 -3
- package/esm2020/lib/authorization/permission/access.service.mjs +3 -3
- package/esm2020/lib/authorization/permission/permission.service.mjs +3 -3
- package/esm2020/lib/authorization/role/role-guard.service.mjs +3 -3
- package/esm2020/lib/changed-fields/services/changed-fields.service.mjs +3 -3
- package/esm2020/lib/covalent/covalent.module.mjs +4 -4
- package/esm2020/lib/currency/currency.module.mjs +4 -4
- package/esm2020/lib/dashboard/cards/count-card/abstract-count-card.mjs +3 -3
- package/esm2020/lib/dashboard/cards/custom-card/abstract-custom-card.mjs +3 -3
- package/esm2020/lib/dashboard/cards/iframe-card/abstract-iframe-card.mjs +3 -3
- package/esm2020/lib/dashboard/dashboard-content/abstract-dashboard-content.mjs +3 -3
- package/esm2020/lib/data-fields/boolean-field/abstract-boolean-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/button-field/abstract-button-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/data-field-template/abstract-data-field-template.component.mjs +3 -3
- package/esm2020/lib/data-fields/data-fields.module.mjs +4 -4
- package/esm2020/lib/data-fields/date-field/abstract-date-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/date-field/models/custom-date-adapter.mjs +3 -3
- package/esm2020/lib/data-fields/date-time-field/abstract-date-time-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/abstract-enumeration-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/enumeration-autocomplete-dynamic-field/abstract-enumeration-autocomplete-dynamic-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/enumeration-autocomplete-select-field/abstract-enumeration-autocomplete-select-field.component.mjs +10 -25
- package/esm2020/lib/data-fields/enumeration-field/enumeration-icon-field/abstract-enumeration-icon-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/enumeration-list-field/abstract-enumeration-list-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/enumeration-select-field/abstract-enumeration-select-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/enumeration-stepper-field/abstract-enumeration-stepper-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/enumeration-field/models/enumeration-field.mjs +6 -1
- package/esm2020/lib/data-fields/file-field/abstract-file-field.component.mjs +6 -4
- package/esm2020/lib/data-fields/file-list-field/abstract-file-list-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field-content.component.mjs +3 -3
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.mjs +3 -3
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.mjs +3 -3
- package/esm2020/lib/data-fields/filter-field/abstract-filter-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/i18n-field/abstract-i18n-errors.component.mjs +3 -3
- package/esm2020/lib/data-fields/i18n-field/abstract-i18n-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/i18n-field/i18n-divider-field/abstract-i18n-divider-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/i18n-field/i18n-text-field/abstract-i18n-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/i18n-field/language-icons.service.mjs +3 -3
- package/esm2020/lib/data-fields/models/abstract-data-field-component.mjs +3 -3
- package/esm2020/lib/data-fields/multichoice-field/abstract-multichoice-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.mjs +10 -7
- package/esm2020/lib/data-fields/multichoice-field/multichoice-list-field/abstract-multichoice-list-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/multichoice-field/multichoice-select-field/abstract-multichoice-select-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/number-field/abstract-number-errors.component.mjs +3 -3
- package/esm2020/lib/data-fields/number-field/abstract-number-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/number-field/currency-number-field/abstract-currency-number-field.component.mjs +5 -5
- package/esm2020/lib/data-fields/number-field/number-default-field/abstract-default-number-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/task-ref-field/abstract-task-ref-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/task-ref-field/task-ref-dashboard-field/task-ref-dashboard-tile/abstract-task-ref-dashboard-tile.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/abstract-dashboard-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/abstract-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/html-textarea-field/abstract-html-textarea-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/password-text-field/abstract-password-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/rich-textarea-field/abstract-rich-textarea-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/simple-text-field/abstract-simple-text-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/text-field/textarea-field/abstract-textarea-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/time-instance-abstract-field/abstract-time-instance-field.component.mjs +10 -4
- package/esm2020/lib/data-fields/user-field/abstract-user-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/user-list-field/abstract-user-list-field.component.mjs +3 -3
- package/esm2020/lib/data-fields/user-list-field/models/user-list-field.mjs +37 -1
- package/esm2020/lib/dialog/components/alert-dialog/alert-dialog.component.mjs +3 -3
- package/esm2020/lib/dialog/components/alert-dialog/alert-dialog.module.mjs +4 -4
- package/esm2020/lib/dialog/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
- package/esm2020/lib/dialog/components/confirm-dialog/confirm-dialog.module.mjs +4 -4
- package/esm2020/lib/dialog/components/prompt-dialog/prompt-dialog.component.mjs +3 -3
- package/esm2020/lib/dialog/components/prompt-dialog/prompt-dialog.module.mjs +4 -4
- package/esm2020/lib/dialog/dialog.module.mjs +4 -4
- package/esm2020/lib/dialog/models/abstract-dialog.component.mjs +3 -3
- package/esm2020/lib/dialog/services/dialog.service.mjs +3 -3
- package/esm2020/lib/event/services/event.service.mjs +3 -3
- package/esm2020/lib/event-queue/services/event-queue.service.mjs +3 -3
- package/esm2020/lib/filter/filter.repository.mjs +3 -3
- package/esm2020/lib/filter/user-filters.service.mjs +3 -3
- package/esm2020/lib/forms/email-submission/abstract-email-submission-form.component.mjs +3 -3
- package/esm2020/lib/forms/forgotten-password/abstract-forgotten-password.component.mjs +3 -3
- package/esm2020/lib/forms/login/abstract-login-form.component.mjs +3 -3
- package/esm2020/lib/forms/models/abstract-registration.component.mjs +3 -3
- package/esm2020/lib/forms/registration/abstract-registration-form.component.mjs +3 -3
- package/esm2020/lib/groups/services/active-group.service.mjs +3 -3
- package/esm2020/lib/groups/services/ldap-group-list.service.mjs +3 -3
- package/esm2020/lib/groups/services/next-group.service.mjs +3 -3
- package/esm2020/lib/header/abstract-header-service.mjs +3 -3
- package/esm2020/lib/header/abstract-header.component.mjs +3 -3
- package/esm2020/lib/header/case-header/case-header.service.mjs +3 -3
- package/esm2020/lib/header/header-modes/abstract-header-mode.component.mjs +3 -3
- package/esm2020/lib/header/header-modes/edit-mode/abstract-edit-mode.component.mjs +3 -3
- package/esm2020/lib/header/header-modes/loading-mode/abstract-loading-mode.component.mjs +3 -3
- package/esm2020/lib/header/header-modes/search-mode/abstract-search-mode.component.mjs +3 -3
- package/esm2020/lib/header/header-modes/sort-mode/abstract-sort-mode.component.mjs +3 -3
- package/esm2020/lib/header/services/overflow.service.mjs +3 -3
- package/esm2020/lib/header/task-header/task-header.service.mjs +3 -3
- package/esm2020/lib/header/workflow-header/workflow-header.service.mjs +3 -3
- package/esm2020/lib/impersonation/services/impersonation-user-list.service.mjs +3 -3
- package/esm2020/lib/impersonation/services/impersonation-user-resource.service.mjs +3 -3
- package/esm2020/lib/impersonation/services/impersonation-user-select.service.mjs +3 -3
- package/esm2020/lib/impersonation/services/impersonation.service.mjs +3 -3
- package/esm2020/lib/legal/legal-notice/abstract-legal-notice.component.mjs +3 -3
- package/esm2020/lib/logger/services/log-publisher.service.mjs +3 -3
- package/esm2020/lib/logger/services/logger.service.mjs +3 -3
- package/esm2020/lib/material/material.module.mjs +4 -4
- package/esm2020/lib/navigation/breadcrumbs/abstract-breadcrumbs.component.mjs +6 -6
- package/esm2020/lib/navigation/group-navigation-component-resolver/abstract-group-navigation-component-resolver.component.mjs +3 -3
- package/esm2020/lib/navigation/model/size-menu-injection-token.mjs +6 -0
- package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +101 -64
- package/esm2020/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.mjs +3 -3
- package/esm2020/lib/navigation/navigation-drawer/abstract-navigation-resizable-drawer.component.mjs +3 -3
- package/esm2020/lib/navigation/navigation-rail/abstract-navigation-rail.component.mjs +3 -3
- package/esm2020/lib/navigation/navigation-tree/abstract-navigation-tree.component.mjs +3 -3
- package/esm2020/lib/navigation/public-api.mjs +2 -1
- package/esm2020/lib/navigation/quick-panel/components/abstract-quick-panel.component.mjs +3 -3
- package/esm2020/lib/navigation/quick-panel/components/internal-link/abstract-internal-link.component.mjs +3 -3
- package/esm2020/lib/navigation/quick-panel/components/language-selector/abstract-language-selector.component.mjs +3 -3
- package/esm2020/lib/navigation/quick-panel/components/logout-shortcut/abstract-logout-shortcut.component.mjs +3 -3
- package/esm2020/lib/navigation/quick-panel/components/paper-view.service.mjs +3 -3
- package/esm2020/lib/navigation/service/uri-resource.service.mjs +3 -3
- package/esm2020/lib/navigation/service/uri.service.mjs +35 -15
- package/esm2020/lib/navigation/utility/filter-extraction.service.mjs +3 -3
- package/esm2020/lib/panel/abstract/panel-with-header-binding.mjs +3 -3
- package/esm2020/lib/panel/abstract/panel-with-immediate-data.mjs +3 -3
- package/esm2020/lib/panel/abstract/tabbed-virtual-scroll.component.mjs +3 -3
- package/esm2020/lib/panel/abstract-panel.component.mjs +3 -3
- package/esm2020/lib/panel/case-panel/abstract-case-panel.component.mjs +3 -3
- package/esm2020/lib/panel/immediate/abstract-immediate-filter-text-content.component.mjs +3 -3
- package/esm2020/lib/panel/immediate/abstract-immediate-filter-text.component.mjs +3 -3
- package/esm2020/lib/panel/panel-item/abstract-panel-item.component.mjs +3 -3
- package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +3 -3
- package/esm2020/lib/panel/task-panel-list/abstract-task-list.component.mjs +3 -3
- package/esm2020/lib/panel/task-panel-list/default-task-panel-list/abstract-default-task-list.component.mjs +3 -3
- package/esm2020/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.mjs +3 -3
- package/esm2020/lib/panel/task-panel-single/abstract-single-task.component.mjs +3 -3
- package/esm2020/lib/panel/workflow-panel/abstract-workflow-panel.component.mjs +3 -3
- package/esm2020/lib/process/process.service.mjs +3 -3
- package/esm2020/lib/process/public-process.service.mjs +3 -3
- package/esm2020/lib/public/services/public-url-resolver.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/case-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/dashboard-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/ldap-group-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/petri-net-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/public/public-case-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/public/public-petri-net-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/public/public-task-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/task-resource.service.mjs +3 -3
- package/esm2020/lib/resources/engine-endpoint/user-resource.service.mjs +3 -3
- package/esm2020/lib/resources/resource-provider.service.mjs +3 -3
- package/esm2020/lib/routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service.mjs +3 -3
- package/esm2020/lib/routing/redirect-service/redirect.service.mjs +3 -3
- package/esm2020/lib/routing/routing-builder/routing-builder.service.mjs +3 -3
- package/esm2020/lib/search/advanced-search-component/abstract-advanced-search.component.mjs +3 -3
- package/esm2020/lib/search/advanced-search-component-initialization-service/advanced-search-component-initialization.service.mjs +3 -3
- package/esm2020/lib/search/category-factory/category-factory.mjs +3 -3
- package/esm2020/lib/search/category-factory/category-resolver.service.mjs +3 -3
- package/esm2020/lib/search/category-factory/default-search-categories.module.mjs +4 -4
- package/esm2020/lib/search/fulltext-search-component/abstract-fulltext-search.component.mjs +3 -3
- package/esm2020/lib/search/header-search-service/header-search.service.mjs +3 -3
- package/esm2020/lib/search/operator-service/operator-resolver.service.mjs +3 -3
- package/esm2020/lib/search/operator-service/operator.service.mjs +3 -3
- package/esm2020/lib/search/search-clause-component/abstract-search-clause.component.mjs +3 -3
- package/esm2020/lib/search/search-component/abstract-search.component.mjs +3 -3
- package/esm2020/lib/search/search-configuration-input-component/abstract-search-configuration-input.component.mjs +3 -3
- package/esm2020/lib/search/search-keyword-resolver-service/search-index-resolver.service.mjs +3 -3
- package/esm2020/lib/search/search-operand-input-component/abstract-search-operand-input.component.mjs +3 -3
- package/esm2020/lib/search/search-predicate-component/abstract-search-predicate.component.mjs +3 -3
- package/esm2020/lib/search/search-service/search.service.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/filter-selector/abstract-filter-selector.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/filter-selector/filter-selector-list-item/abstract-filter-selector-list-item.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/import-net/abstract-import-net.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/load-filter/abstract-load-filter.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/new-case/abstract-new-case.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/option-selector/abstract-option-selector.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/save-filter/abstract-save-filter.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/user-assign/abstract-user-assign.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/user-assign/user-assign-list/abstract-user-assign-list.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/user-assign/user-assign-list/user-assign-item/abstract-user-assign-item.component.mjs +3 -3
- package/esm2020/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.mjs +3 -3
- package/esm2020/lib/side-menu/services/side-menu.service.mjs +3 -3
- package/esm2020/lib/side-menu/side-menu-container/abstract-side-menu-container.component.mjs +3 -3
- package/esm2020/lib/snack-bar/components/error-snack-bar/error-snack-bar.component.mjs +3 -3
- package/esm2020/lib/snack-bar/components/generic-snack-bar/generic-snack-bar.component.mjs +3 -3
- package/esm2020/lib/snack-bar/components/success-snack-bar/success-snack-bar.component.mjs +3 -3
- package/esm2020/lib/snack-bar/components/warning-snack-bar/warning-snack-bar.component.mjs +3 -3
- package/esm2020/lib/snack-bar/models/abstract-snack-bar.component.mjs +3 -3
- package/esm2020/lib/snack-bar/services/snack-bar.service.mjs +3 -3
- package/esm2020/lib/snack-bar/snack-bar.module.mjs +4 -4
- package/esm2020/lib/tabs/tab-creation-detector/abstract-tab-creation-detector.component.mjs +3 -3
- package/esm2020/lib/tabs/tab-view/abstract-tab-view.component.mjs +3 -3
- package/esm2020/lib/task/services/assign-policy.service.mjs +3 -3
- package/esm2020/lib/task/services/assign-task.service.mjs +3 -3
- package/esm2020/lib/task/services/cancel-task.service.mjs +3 -3
- package/esm2020/lib/task/services/data-focus-policy.service.mjs +3 -3
- package/esm2020/lib/task/services/delegate-task.service.mjs +3 -3
- package/esm2020/lib/task/services/finish-policy.service.mjs +3 -3
- package/esm2020/lib/task/services/finish-task.service.mjs +3 -3
- package/esm2020/lib/task/services/selected-case.service.mjs +3 -3
- package/esm2020/lib/task/services/task-data.service.mjs +17 -13
- package/esm2020/lib/task/services/task-request-state.service.mjs +3 -3
- package/esm2020/lib/task-content/field-component-resolver/abstract-field-component-resolver.component.mjs +3 -3
- package/esm2020/lib/task-content/services/field-converter.service.mjs +3 -3
- package/esm2020/lib/task-content/services/single-task-content.service.mjs +3 -3
- package/esm2020/lib/task-content/services/task-content.service.mjs +4 -4
- package/esm2020/lib/task-content/services/task-event.service.mjs +3 -3
- package/esm2020/lib/task-content/services/unlimited-task-content.service.mjs +3 -3
- package/esm2020/lib/task-content/task-content/abstract-task-content.component.mjs +5 -4
- package/esm2020/lib/toolbar/abstract-toolbar.component.mjs +3 -3
- package/esm2020/lib/translate/language.service.mjs +3 -3
- package/esm2020/lib/translate/translate-interceptor.mjs +3 -3
- package/esm2020/lib/translate/translate-lib.module.mjs +4 -4
- package/esm2020/lib/user/components/user-card/abstract-user-card.component.mjs +3 -3
- package/esm2020/lib/user/profile/abstract-profile.component.mjs +3 -3
- package/esm2020/lib/user/services/user-comparator.service.mjs +3 -3
- package/esm2020/lib/user/services/user-list.service.mjs +3 -3
- package/esm2020/lib/user/services/user-preference.service.mjs +3 -3
- package/esm2020/lib/user/services/user.service.mjs +3 -3
- package/esm2020/lib/user/services/view-id.service.mjs +3 -3
- package/esm2020/lib/utility/call-chain/call-chain.service.mjs +3 -3
- package/esm2020/lib/utility/is-empty.pipe.mjs +40 -0
- package/esm2020/lib/utility/is-non-empty.pipe.mjs +40 -0
- package/esm2020/lib/utility/public-api.mjs +4 -1
- package/esm2020/lib/utility/service/case-list-font-color.service.mjs +3 -3
- package/esm2020/lib/utility/service/spinner-overlay.service.mjs +3 -3
- package/esm2020/lib/utility/tests/mocks/mock-authentication.service.mjs +3 -3
- package/esm2020/lib/utility/tests/mocks/mock-user-preference.service.mjs +3 -3
- package/esm2020/lib/utility/tests/mocks/mock-user-resource.service.mjs +3 -3
- package/esm2020/lib/utility/tests/mocks/mock-user.service.mjs +3 -3
- package/esm2020/lib/utility/tests/test-mock-dependencies.module.mjs +4 -4
- package/esm2020/lib/utility/tests/test-view-service.mjs +3 -3
- package/esm2020/lib/utility/utility.module.mjs +31 -0
- package/esm2020/lib/view/abstract/sortable-view.mjs +3 -3
- package/esm2020/lib/view/abstract/view-with-headers.mjs +3 -3
- package/esm2020/lib/view/case-view/abstract-case-view.mjs +3 -3
- package/esm2020/lib/view/case-view/components/case-list/abstract-case-list.component.mjs +3 -3
- package/esm2020/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.mjs +3 -3
- package/esm2020/lib/view/case-view/components/default-case-list/abstract-default-case-list.component.mjs +3 -3
- package/esm2020/lib/view/case-view/service/case-view-service.mjs +3 -3
- package/esm2020/lib/view/case-view/tabbed-case-view.mjs +3 -3
- package/esm2020/lib/view/task-view/abstract-single-task-view.component.mjs +20 -13
- package/esm2020/lib/view/task-view/abstract-task-view.mjs +3 -3
- package/esm2020/lib/view/task-view/service/public-task-loading.service.mjs +3 -3
- package/esm2020/lib/view/task-view/service/task-view.service.mjs +3 -3
- package/esm2020/lib/view/task-view/tabbed-task-view.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-case-view.service.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-component/abstract-tree.component.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-component/add-child-node/abstract-add-child-node.component.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-component/case-tree.service.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-component/remove-node/abstract-remove-node.component.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-task-content/abstract-tree-task-content.component.mjs +3 -3
- package/esm2020/lib/view/tree-case-view/tree-task-content/tree-task-content.service.mjs +3 -3
- package/esm2020/lib/view/workflow-view/abstract-workflow-view.component.mjs +3 -3
- package/esm2020/lib/view/workflow-view/workflow-view.service.mjs +3 -3
- package/fesm2015/netgrif-components-core.mjs +1151 -931
- package/fesm2015/netgrif-components-core.mjs.map +1 -1
- package/fesm2020/netgrif-components-core.mjs +1149 -931
- package/fesm2020/netgrif-components-core.mjs.map +1 -1
- package/lib/data-fields/enumeration-field/enumeration-autocomplete-select-field/abstract-enumeration-autocomplete-select-field.component.d.ts +4 -8
- package/lib/data-fields/enumeration-field/models/enumeration-field.d.ts +3 -0
- package/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.d.ts +2 -1
- package/lib/data-fields/user-list-field/models/user-list-field.d.ts +4 -0
- package/lib/navigation/breadcrumbs/abstract-breadcrumbs.component.d.ts +1 -1
- package/lib/navigation/model/size-menu-injection-token.d.ts +5 -0
- package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +20 -16
- package/lib/navigation/public-api.d.ts +1 -0
- package/lib/navigation/service/uri.service.d.ts +14 -10
- package/lib/task/services/task-data.service.d.ts +9 -8
- package/lib/utility/is-empty.pipe.d.ts +19 -0
- package/lib/utility/is-non-empty.pipe.d.ts +19 -0
- package/lib/utility/public-api.d.ts +3 -0
- package/lib/utility/utility.module.d.ts +9 -0
- package/lib/view/task-view/abstract-single-task-view.component.d.ts +4 -3
- package/package.json +1 -1
- package/src/assets/i18n/de.json +4 -1
- package/src/assets/i18n/en.json +4 -1
- package/src/assets/i18n/sk.json +4 -1
|
@@ -497,6 +497,7 @@ export class AbstractTaskContentComponent {
|
|
|
497
497
|
*/
|
|
498
498
|
computeGridLayout(dataGroup, subgrid) {
|
|
499
499
|
const localGrid = [];
|
|
500
|
+
dataGroup.fields = [...dataGroup.fields].sort((f1, f2) => f1.layout.y === f2.layout.y ? f1.layout.x - f2.layout.x : f1.layout.y - f2.layout.y);
|
|
500
501
|
dataGroup.fields.forEach(dataField => {
|
|
501
502
|
if (!dataField.localLayout
|
|
502
503
|
|| dataField.localLayout.x === undefined
|
|
@@ -781,9 +782,9 @@ export class AbstractTaskContentComponent {
|
|
|
781
782
|
}
|
|
782
783
|
}
|
|
783
784
|
}
|
|
784
|
-
AbstractTaskContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
785
|
-
AbstractTaskContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.
|
|
786
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
785
|
+
AbstractTaskContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractTaskContentComponent, deps: [{ token: i1.FieldConverterService }, { token: i2.TaskContentService }, { token: i3.PaperViewService }, { token: i4.LoggerService }, { token: i5.TaskEventService, optional: true }, { token: NAE_ASYNC_RENDERING_CONFIGURATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
786
|
+
AbstractTaskContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractTaskContentComponent, selector: "ncc-abstract-task-content", inputs: { noDataText: "noDataText", noDataIcon: "noDataIcon", displayNoDataIcon: "displayNoDataIcon" }, outputs: { taskEvent: "taskEvent" }, ngImport: i0, template: '', isInline: true });
|
|
787
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractTaskContentComponent, decorators: [{
|
|
787
788
|
type: Component,
|
|
788
789
|
args: [{
|
|
789
790
|
selector: 'ncc-abstract-task-content',
|
|
@@ -805,4 +806,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
|
|
|
805
806
|
}], taskEvent: [{
|
|
806
807
|
type: Output
|
|
807
808
|
}] } });
|
|
808
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQTZCLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBRXRCLG1CQUFtQixFQUN0QixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFFQUFxRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUU3RixPQUFPLEVBQUMsT0FBTyxFQUFD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LElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRyxLQUFLLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLE9BQU8sT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pGO2dCQUNJLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNwRztJQUNMLENBQUM7OzBIQTkzQmlCLDRCQUE0QixzTUE0RUosaUNBQWlDOzhHQTVFekQsNEJBQTRCLDhNQUZwQyxFQUFFOzRGQUVNLDRCQUE0QjtrQkFKakQsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxRQUFRLEVBQUUsRUFBRTtpQkFDZjs7MEJBNEUwQixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlDQUFpQzs0Q0E1Q2xFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50fSBmcm9tICcuLi9tb2RlbC9kYXRhZmllbGQtZ3JpZC1sYXlvdXQtZWxlbWVudCc7XG5pbXBvcnQge0ZpZWxkQ29udmVydGVyU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvZmllbGQtY29udmVydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3Rhc2stY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7UGFwZXJWaWV3U2VydmljZX0gZnJvbSAnLi4vLi4vbmF2aWdhdGlvbi9xdWljay1wYW5lbC9jb21wb25lbnRzL3BhcGVyLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhR3JvdXAsIERhdGFHcm91cEFsaWdubWVudCwgUGFyZW50RGF0YUdyb3VwSW5mb3JtYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtUYXNrRWxlbWVudFR5cGV9IGZyb20gJy4uL21vZGVsL3Rhc2stY29udGVudC1lbGVtZW50LXR5cGUnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7XG4gICAgRGF0YUdyb3VwQ29tcGFjdCxcbiAgICBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLFxuICAgIERhdGFHcm91cExheW91dCxcbiAgICBEYXRhR3JvdXBMYXlvdXRUeXBlXG59IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cC1sYXlvdXQnO1xuaW1wb3J0IHtGaWVsZEFsaWdubWVudH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9maWVsZC1hbGlnbm1lbnQnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05BRV9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn0gZnJvbSAnLi4vbW9kZWwvYXN5bmMtcmVuZGVyaW5nLWNvbmZpZ3VyYXRpb24taW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7QXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9ufSBmcm9tICcuLi9tb2RlbC9hc3luYy1yZW5kZXJpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1Rhc2tSZWZEYXNoYm9hcmRDb25zdGFudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC1jb25zdGFudHMnO1xuaW1wb3J0IHtUYXNrUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWZpZWxkJztcbmltcG9ydCB7VGFza1JlZkNvbXBvbmVudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtTcGxpdERhdGFHcm91cH0gZnJvbSAnLi4vbW9kZWwvc3BsaXQtZGF0YS1ncm91cCc7XG5pbXBvcnQge1N1YmdyaWR9IGZyb20gJy4uL21vZGVsL3N1YmdyaWQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7UHJlcHJvY2Vzc2VkRGF0YUdyb3Vwc30gZnJvbSAnLi4vbW9kZWwvcHJlcHJvY2Vzc2VkLWRhdGEtZ3JvdXBzJztcbmltcG9ydCB7VGFza1JlZkRhc2hib2FyZFRpbGV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC10aWxlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtdGFzay1jb250ZW50JyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9MQVlPVVRfVFlQRSA9IERhdGFHcm91cExheW91dFR5cGUuTEVHQUNZO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfRklFTERfQUxJR05NRU5UID0gRmllbGRBbGlnbm1lbnQuQ0VOVEVSO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT046IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgYmF0Y2hTaXplOiA0LFxuICAgICAgICBiYXRjaERlbGF5OiAyMDAsXG4gICAgICAgIG51bWJlck9mUGxhY2Vob2xkZXJzOiA0LFxuICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQ6IHRydWVcbiAgICB9O1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQ09NUEFDVF9ESVJFQ1RJT04gPSBEYXRhR3JvdXBDb21wYWN0Lk5PTkU7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9ISURFX0VNUFRZX1JPV1MgPSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLkFMTDtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaXMgYmVpbmcgbG9hZGVkIGZyb20gYmFja2VuZCwgb3IgaWYgaXQgaXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGxvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGRhdGEgZmllbGQsIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC4gRW1pdHMgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzRGF0YVRvRGlzcGxheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAvKipcbiAgICAgKiBFeGlzdHMgdG8gYWxsb3cgcmVmZXJlbmNlcyB0byB0aGUgZW51bSBpbiB0aGUgSFRNTFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWVsZFR5cGVSZXNvdXJjZSA9IEZpZWxkVHlwZVJlc291cmNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zbGF0ZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IHRleHQgaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhVGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpY29uIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IGljb24gaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhSWNvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYW4gaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIG5vIGRhdGEgbWVzc2FnZSBpcyBzaG93bi5cbiAgICAgKlxuICAgICAqIEFuIGljb24gaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNwbGF5Tm9EYXRhSWNvbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogRW1pdHMgbm90aWZpY2F0aW9ucyBhYm91dCB0YXNrIGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0YXNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGZpZWxkcyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kYXRhU291cmNlJDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PFN1YmdyaWQ+PjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tDb250ZW50OiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9zdWJUYXNrRXZlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2FzeW5jUmVuZGVyaW5nQ29uZmlnOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb247XG4gICAgcHJvdGVjdGVkIF9hc3luY1JlbmRlclRpbWVvdXQ6IG51bWJlcjtcblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdEFsaWdubWVudDogRmllbGRBbGlnbm1lbnQ7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbjogRGF0YUdyb3VwQ29tcGFjdDtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRIaWRlRW1wdHlSb3dzOiBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdE51bWJlck9mQ29sczogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9zdWJncmlkSWRDb3VudGVyOiBJbmNyZW1lbnRpbmdDb3VudGVyO1xuICAgIHByb3RlY3RlZCBfZXhpc3RpbmdTdWJncmlkSWRzOiBTZXQ8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHJvdyBoZWlnaHQgb2Ygb25lIHJvdyBpbiB0YXNrIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcm93SGVpZ2h0ID0gMTA1O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZmllbGRDb252ZXJ0ZXI6IEZpZWxkQ29udmVydGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHRhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3BhcGVyVmlldzogUGFwZXJWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdGFza0V2ZW50U2VydmljZTogVGFza0V2ZW50U2VydmljZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnID0gey4uLnRoaXMuREVGQVVMVF9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn07XG4gICAgICAgIGlmIChhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcsIGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKHRydWUpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3ViZ3JpZD4+KFtdKTtcbiAgICAgICAgdGhpcy5oYXNEYXRhVG9EaXNwbGF5JCA9IHRoaXMuX2RhdGFTb3VyY2UkLnBpcGUobWFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoICE9PSAwO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5fc3ViVGFza0NvbnRlbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZURlZmF1bHRMYXlvdXRDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm9mZigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tFdmVudFNlcnZpY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+KCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJUYXNrRXZlbnQgPSBfdGFza0V2ZW50U2VydmljZS50YXNrRXZlbnROb3RpZmljYXRpb25zJC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9zdWJUYXNrQ29udGVudC51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy50YXNrRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N1YlRhc2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fc3ViVGFza0V2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQXJyYXk8U3ViZ3JpZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB0YXNrcyBsYXlvdXQgcHJvcGVydHksIG9yIDQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROdW1iZXJPZkZvcm1Db2x1bW5zKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFza1xuICAgICAgICAgICAgfHwgIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICB8fCB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5jb2xzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LmNvbHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXBlclZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXBlclZpZXcucGFwZXJWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpdGVtIGFuIG9iamVjdCBjb250YWluaW5nIGdyaWQgZWxlbWVudCBpbmZvcm1hdGlvblxuICAgICAqIEByZXR1cm5zIHRoZSBBbmd1bGFyIGZsZXggbGF5b3V0cyBhbGlnbm1lbnQgcHJvcGVydHkgZm9yIGluZGl2aWR1YWwgZGF0YSBmaWVsZHMgYmFzZWQgb25cbiAgICAgKiB0aGUgbGF5b3V0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBwcm9jZXNzXG4gICAgICovXG4gICAgcHVibGljIGdldEl0ZW1BbGlnbm1lbnQoaXRlbTogRGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5hbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkQWxpZ25tZW50ID0gaXRlbS5pdGVtPy5sb2NhbExheW91dD8uYWxpZ25tZW50ID8/IHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQ7XG5cbiAgICAgICAgbGV0IGFsaWdubWVudDtcbiAgICAgICAgc3dpdGNoIChmaWVsZEFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5UT1A6XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRmllbGRBbGlnbm1lbnQuQ0VOVEVSOlxuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5CT1RUT006XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ2VuZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmFsaWdubWVudCA9ICdzcGFjZS1iZXR3ZWVuICcgKyBhbGlnbm1lbnQ7XG4gICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBjb21wb25lbnQgaGVpZ2h0IGlmIHRoZSByb3dzIGF0dHJpYnV0ZSBvZiB0YXNrIGxheW91dCBpcyBzZXQuXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVDb250ZW50SGVpZ2h0Q3NzKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGluZ05lZWRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93cyAqIHRoaXMucm93SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnMTAwJSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmaXhlZCBudW1iZXIgb2Ygcm93cyBhbmQgaXQgbmVlZC1zIHNjcm9sbGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGxpbmdOZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrXG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3NcbiAgICAgICAgICAgICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3MgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIGRpc3BsYXllZCB0YXNrIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZmllbGRzIGluZGl2aWR1YWwgcHJvcGVydHkuXG4gICAgICogSWYgdGUgdGFzayBzcGVjaWZpZXMgbm8gZGVmYXVsdCB2YWx1ZSB0aGUgW2dsb2JhbCBkZWZhdWx0XXtAbGluayBBYnN0cmFjdFRhc2tDb250ZW50Q29tcG9uZW50I0RFRkFVTFRfRklFTERfQUxJR05NRU5UfVxuICAgICAqIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlRGVmYXVsdExheW91dENvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmZpZWxkQWxpZ25tZW50ID8/IHRoaXMuREVGQVVMVF9GSUVMRF9BTElHTk1FTlQ7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaz8ubGF5b3V0Py5jb21wYWN0RGlyZWN0aW9uID8/IHRoaXMuREVGQVVMVF9DT01QQUNUX0RJUkVDVElPTjtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEhpZGVFbXB0eVJvd3MgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmhpZGVFbXB0eVJvd3MgPz8gdGhpcy5ERUZBVUxUX0hJREVfRU1QVFlfUk9XUztcbiAgICAgICAgdGhpcy5fZGVmYXVsdE51bWJlck9mQ29scyA9IHRoaXMuZ2V0TnVtYmVyT2ZGb3JtQ29sdW1ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIHRhc2tzIGdyaWQgbGF5b3V0IGFuZCBzZXRzIHRoZSByZXN1bHQgdG8gdGhlIHB1YmxpYyBwcm9wZXJ0aWVzXG4gICAgICogb2YgdGhpcyBjbGFzcyB0aGF0IGFyZSB0aGVuIGJvdW5kIHRvIEhUTUwuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0XG4gICAgICovXG4gICAgcHVibGljIGNvbXB1dGVMYXlvdXREYXRhKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9leGlzdGluZ1N1YmdyaWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgU3ViZ3JpZD4oKTtcblxuICAgICAgICBkYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0TGF5b3V0ID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlXG4gICAgICAgICAgICA6IHRoaXMuREVGQVVMVF9MQVlPVVRfVFlQRTtcblxuICAgICAgICBkYXRhR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQgPSB7cm93czogdW5kZWZpbmVkLCBjb2xzOiB1bmRlZmluZWQsIHR5cGU6IGRlZmF1bHRMYXlvdXR9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQudHlwZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dC50eXBlID0gZGVmYXVsdExheW91dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3ViZ3JpZCA9IG5ldyBTdWJncmlkKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3ViZ3JpZElkKGdyb3VwKSxcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQuY29scyA/PyB0aGlzLl9kZWZhdWx0TnVtYmVyT2ZDb2xzLFxuICAgICAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXAudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gc3ViZ3JpZC5hZGRUaXRsZShncm91cCk7XG4gICAgICAgICAgICAgICAgc3ViZ3JpZC5hZGRSb3codGhpcy5uZXdHcmlkUm93KHN1YmdyaWQuY29scywgdGl0bGUuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGdyb3VwLmxheW91dC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkdSSUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUdyaWRMYXlvdXQoZ3JvdXAsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRmxvd0xheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5MRUdBQ1k6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUxlZ2FjeUxheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0YXNrIGxheW91dCB0eXBlICcke3RoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJncmlkLmZpbmFsaXplKCk7XG4gICAgICAgICAgICByZXN1bHQuc2V0KHN1YmdyaWQuc3ViZ3JpZElkLCBzdWJncmlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJGaWVsZHMocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVuZGVyRmllbGRzKHN1YmdyaWRzOiBNYXA8c3RyaW5nLCBTdWJncmlkPikge1xuICAgICAgICBjb25zdCBzdWJncmlkc0FycmF5ID0gQXJyYXkuZnJvbShzdWJncmlkcy52YWx1ZXMoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkc1xuICAgICAgICAgICAgJiYgISh0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZCAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS5pc0V4cGFuZGluZykpIHtcbiAgICAgICAgICAgIHN1YmdyaWRzQXJyYXkuZm9yRWFjaChzdWJncmlkID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmRpc3BsYXlBbGxGaWVsZHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHN1YmdyaWRzQXJyYXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcy50YXNrQ29udGVudFNlcnZpY2UuaXNFeHBhbmRpbmcgJiYgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcuZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQpKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlJC52YWx1ZS5mb3JFYWNoKG9sZFN1YmdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJncmlkcy5oYXMob2xkU3ViZ3JpZC5zdWJncmlkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmdyaWRzLmdldChvbGRTdWJncmlkLnN1YmdyaWRJZCkuZGV0ZXJtaW5lS2VwdEZpZWxkcyhvbGRTdWJncmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudChzdWJncmlkc0FycmF5KTtcbiAgICAgICAgdGhpcy5zcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzQXJyYXkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzOiBBcnJheTxTdWJncmlkPiwgaXRlcmF0aW9uID0gMCkge1xuICAgICAgICB0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpdGVyYXRpb24gPCBzdWJncmlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkc1tpdGVyYXRpb25dLnJlbmRlckNvbnRlbnRPdmVyVGltZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByZWFkRmllbGRSZW5kZXJpbmdPdmVyVGltZShzdWJncmlkcywgaXRlcmF0aW9uICsgMSk7XG4gICAgICAgICAgICAgICAgfSwgaXRlcmF0aW9uID09PSAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLiBGaWx0ZXJzIG91dCBoaWRkZW4gYW5kIGZvcmJpZGRlbiBmaWVsZHMuXG4gICAgICogUG9wdWxhdGVzIGRhc2hib2FyZCB0YXNrIHJlZiBmaWVsZHMgd2l0aCBkYXNoYm9hcmQgdGlsZSBkYXRhLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzXG4gICAgICogQHJldHVybnMgdGhlIHByZXByb2Nlc3NlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IHJlYXJyYW5nZVJlc3VsdCA9IHRoaXMucmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgbGV0IHVuZmlsdGVyZWREYXRhR3JvdXBzID0gcmVhcnJhbmdlUmVzdWx0LmRhdGFHcm91cHM7XG5cbiAgICAgICAgaWYgKHJlYXJyYW5nZVJlc3VsdC5jb250YWluc0Rhc2hib2FyZFRhc2tSZWYpIHtcbiAgICAgICAgICAgIHVuZmlsdGVyZWREYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGFzaGJvYXJkVGFza1JlZihyZWFycmFuZ2VSZXN1bHQuZGF0YUdyb3VwcywgZGF0YUdyb3Vwcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZUFuZEZpbHRlckhpZGRlbih1bmZpbHRlcmVkRGF0YUdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZ3JvdXBzIGNvbnRhaW4gYSBkYXNoYm9hcmQgdGFzayByZWYgZmllbGQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyB0aGUgcHJlcHJvY2Vzc2VkIGRhdGEgZ3JvdXBzIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogUHJlcHJvY2Vzc2VkRGF0YUdyb3VwcyB7XG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLmNsb25lRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzKTtcblxuICAgICAgICBsZXQgY29udGFpbnNEYXNoYm9hcmQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkYXRhR3JvdXBzW2ldO1xuICAgICAgICAgICAgaWYgKCFncm91cC5maWVsZHMuc29tZShmID0+IHRoaXMuaXNUYXNrUmVmKGYpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gdGhpcy5zcGxpdERhdGFHcm91cE9uVGFza1JlZihncm91cCk7XG4gICAgICAgICAgICBpZiAoc3BsaXQuc3RhcnRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BsaXQuc3RhcnRHcm91cCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzcGxpdC50YXNrUmVmLmNvbXBvbmVudD8ubmFtZSA9PT0gVGFza1JlZkNvbXBvbmVudHMuREFTSEJPQVJEKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVEYXNoYm9hcmRUYXNrUmVmRGF0YUdyb3VwKGdyb3VwLCBzcGxpdC50YXNrUmVmKSk7XG4gICAgICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BsaXQudGFza1JlZi52YWx1ZS5sZW5ndGggPT09IDAgfHwgc3BsaXQuZW5kR3JvdXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdC5lbmRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGkgKyAxLCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RDaGlsZCA9IGRhdGFHcm91cHNbaSArIDFdOyAvLyB0aGUgZGF0YSBncm91cCB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgSVMgQUxXQVlTIGEgZGlyZWN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgZmlyc3ROb25EZXNjZW5kYW50SW5kZXggPSBpICsgMjtcbiAgICAgICAgICAgIGZvciAoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCA8IGRhdGFHcm91cHMubGVuZ3RoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwID0gZGF0YUdyb3Vwc1tmaXJzdE5vbkRlc2NlbmRhbnRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBuZXh0R3JvdXAubmVzdGluZ0xldmVsIDwgZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgYmxvY2sgb2YgbmVzdGVkIGRhdGEgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgICYmIChuZXh0R3JvdXAucGFyZW50VGFza1JlZklkICE9PSBzcGxpdC50YXNrUmVmLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3BsaXQudGFza1JlZi52YWx1ZS5zb21lKHJlZmZlZFRhc2tJZCA9PiByZWZmZWRUYXNrSWQgPT09IG5leHRHcm91cC5wYXJlbnRUYXNrSWQpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4LCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YUdyb3VwczogcmVzdWx0LFxuICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmRUYXNrUmVmOiBjb250YWluc0Rhc2hib2FyZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIHByb3ZpZGVkIGRhdGEgZ3JvdXAgYXJyYXkuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBkYXRhIGdyb3VwcyBhcmUgY2xvbmVkLCB0aGUgZmllbGRzIGFyZSBvbmx5IGNvcGllZCBhcyByZWZlcmVuY2VzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBjbG9uZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZHVwbGljYXRlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjbG9uZURhdGFHcm91cHMoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICByZXR1cm4gZGF0YUdyb3Vwcy5tYXAoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IHsuLi5ncm91cH07XG4gICAgICAgICAgICBnLmZpZWxkcyA9IGcuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXNzZXMgb3ZlciBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cHMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGluaXRpYWxpemVzIHRoZWlyIGxvY2FsIGxheW91dCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGNvbnRhaW5lcnMgb2YgdGhlIGZpZWxkcyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGxvY2FsIGxheW91dCBpbml0aWFsaXplZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBkYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZi5iZWhhdmlvci5oaWRkZW4gfHwgZi5iZWhhdmlvci5mb3JiaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGYucmVzZXRMb2NhbExheW91dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cCBhcnJheSBhbmQgZmlsdGVycyBhd2F5IGFueSBmaWVsZHMgYW5kIGRhdGEgZ3JvdXBzIHRoYXQgYXJlIG1hcmtlZCBhcyBoaWRkZW4uXG4gICAgICogQmVjYXVzZSBvZiB0aGUgZHVwbGljYXRpb24gdGhlIGZpbHRlcmluZyBkb2Vzbid0IGFmZmVjdCB0aGUgb3JpZ2luYWwgaW5zdGFuY2VzIGFuZCB0aGV5IHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkXG4gICAgICogQHJldHVybnMgdGhlIGZpbHRlcmVkIGR1cGxpY2F0ZWQgZGF0YSBncm91cHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2xvbmVBbmRGaWx0ZXJIaWRkZW4oZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhR3JvdXBzLm1hcChncm91cCA9PiB7XG4gICAgICAgICAgICBjb25zdCBnID0gey4uLmdyb3VwfTtcbiAgICAgICAgICAgIGcuZmllbGRzID0gZy5maWVsZHMuZmlsdGVyKGZpZWxkID0+ICFmaWVsZC5iZWhhdmlvci5oaWRkZW4gJiYgIWZpZWxkLmJlaGF2aW9yLmZvcmJpZGRlbikubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICBmaWVsZC5yZXNldExvY2FsTGF5b3V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1Rhc2tSZWYoZmllbGQ6IERhdGFGaWVsZDx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmllbGQgaW5zdGFuY2VvZiBUYXNrUmVmRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIGlucHV0IGRhdGEgZ3JvdXAgYmFzZWQgb24gdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmllbGRzIGFuZCBzcGxpdHMgaXQgaW50byBwYXJ0cyBvbiB0aGUgZmlyc3QgdGFzayByZWYuXG4gICAgICogSWYgc29tZSBmaWVsZHMgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdGFzayByZWYgdGhleSBhcmUgZXh0cmFjdGVkIGludG8gYSBuZXcgW3N0YXJ0R3JvdXBde0BsaW5rIFNwbGl0RGF0YUdyb3VwI3N0YXJ0R3JvdXB9LlxuICAgICAqIElmIHNvbWUgZmllbGRzIGFwcGVhciBhZnRlciB0aGUgZmlyc3QgdGFzayByZWYgdGhleSBhcmUgZXh0cmFjdGVkIGludG8gYSBuZXcgW2VuZEdyb3VwXXtAbGluayBTcGxpdERhdGFHcm91cCNlbmRHcm91cH0uXG4gICAgICogQHBhcmFtIGRhdGFHcm91cFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3BsaXREYXRhR3JvdXBPblRhc2tSZWYoZGF0YUdyb3VwOiBEYXRhR3JvdXApOiBTcGxpdERhdGFHcm91cCB7XG4gICAgICAgIGRhdGFHcm91cC5maWVsZHMuc29ydCgoYSwgYikgPT4gYS5sb2NhbExheW91dC55IC0gYi5sb2NhbExheW91dC55KTtcbiAgICAgICAgY29uc3QgdGFza1JlZlBvc2l0aW9uID0gZGF0YUdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiB0aGlzLmlzVGFza1JlZihmKSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogU3BsaXREYXRhR3JvdXAgPSB7XG4gICAgICAgICAgICB0YXNrUmVmOiBkYXRhR3JvdXAuZmllbGRzW3Rhc2tSZWZQb3NpdGlvbl0gYXMgVGFza1JlZkZpZWxkXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRhc2tSZWZQb3NpdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0R3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRhdGFHcm91cC50aXRsZSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGRhdGFHcm91cC5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgbGF5b3V0OiBkYXRhR3JvdXAubGF5b3V0LFxuICAgICAgICAgICAgICAgIHN0cmV0Y2g6IGRhdGFHcm91cC5zdHJldGNoLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZGF0YUdyb3VwLmZpZWxkcy5zbGljZSgwLCB0YXNrUmVmUG9zaXRpb24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXNrUmVmUG9zaXRpb24gIT09IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBkYXRhR3JvdXAuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGxheW91dDogZGF0YUdyb3VwLmxheW91dCxcbiAgICAgICAgICAgICAgICBzdHJldGNoOiBkYXRhR3JvdXAuc3RyZXRjaCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGRhdGFHcm91cC5maWVsZHMuc2xpY2UodGFza1JlZlBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGYubG9jYWxMYXlvdXQueSA9IGYubG9jYWxMYXlvdXQueSAtIHJlc3VsdC50YXNrUmVmLmxvY2FsTGF5b3V0LnkgLSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZGF0YSBncm91cCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHBhc3NlZCB0YXNrIHJlZi5cbiAgICAgKiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgbmVzdGluZyBhbmQgcGFyZW50IHRhc2svY2FzZSBhcmUgcHJlc2VydmVkIGZyb20gdGhlIHBhc3NlZCBvcmlnaW5hbCBkYXRhIGdyb3VwLlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbERhdGFHcm91cCBzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHBhcmVudCB0YXNrL2Nhc2VcbiAgICAgKiBAcGFyYW0gdGFza1JlZiB0aGUgdGFzayByZWYgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBuZXcgZGF0YSBncm91cFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRGFzaGJvYXJkVGFza1JlZkRhdGFHcm91cChvcmlnaW5hbERhdGFHcm91cDogRGF0YUdyb3VwLCB0YXNrUmVmOiBUYXNrUmVmRmllbGQpOiBEYXRhR3JvdXAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRzOiBbdGFza1JlZl0sXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0cmV0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBhcmVudFRhc2tJZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50VGFza0lkLFxuICAgICAgICAgICAgcGFyZW50VHJhbnNpdGlvbklkOiBvcmlnaW5hbERhdGFHcm91cC5wYXJlbnRUcmFuc2l0aW9uSWQsXG4gICAgICAgICAgICBwYXJlbnRDYXNlSWQ6IG9yaWdpbmFsRGF0YUdyb3VwLnBhcmVudENhc2VJZCxcbiAgICAgICAgICAgIHBhcmVudFRhc2tSZWZJZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50VGFza1JlZklkLFxuICAgICAgICAgICAgbmVzdGluZ0xldmVsOiBvcmlnaW5hbERhdGFHcm91cC5uZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICBsYXlvdXQ6IG9yaWdpbmFsRGF0YUdyb3VwLmxheW91dFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcyBkYXRhIGdyb3VwcyB0aGF0IHJlcHJlc2VudCBkYXNoYm9hcmQgdGlsZXMsXG4gICAgICogcmVtb3ZlcyB0aGVtIGZyb20gdGhlIGRhdGEgZ3JvdXAgYXJyYXkgYW5kIHBhc3NlcyB0aGVtIG9udG8gdGhlIHRhc2sgcmVmIGZpZWxkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBwcmVwcm9jZXNzZWREYXRhR3JvdXBzXG4gICAgICogQHBhcmFtIHJhd0RhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIGdyb3VwIG9iamVjdHMgdGhhdCBkb2VzIG5vdCBjb250YWluIGRhc2hib2FyZCB0aWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBkYXNoYm9hcmQgdGFzayByZWZcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByZXByb2Nlc3NEYXNoYm9hcmRUYXNrUmVmKHByZXByb2Nlc3NlZERhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sIHJhd0RhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBBcnJheTxEYXRhR3JvdXA+IHtcbiAgICAgICAgLy8gVE9ETyBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgZGFzaGJvYXJkIHRhc2sgcmVmIGluIGEgdGFza1xuICAgICAgICBsZXQgZGFzaGJvYXJkVGFza1JlZkZpZWxkOiBUYXNrUmVmRmllbGQ7XG4gICAgICAgIGxldCBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbjogUGFyZW50RGF0YUdyb3VwSW5mb3JtYXRpb247XG4gICAgICAgIGZvciAoY29uc3QgZGcgb2YgcHJlcHJvY2Vzc2VkRGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBkZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Rhc2tSZWYoZmllbGQpICYmIGZpZWxkLmNvbXBvbmVudD8ubmFtZSA9PT0gVGFza1JlZkNvbXBvbmVudHMuREFTSEJPQVJEKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZCA9IGZpZWxkIGFzIFRhc2tSZWZGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYXNrSWQ6IGRnLnBhcmVudFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFRyYW5zaXRpb25JZDogZGcucGFyZW50VHJhbnNpdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2FzZUlkOiBkZy5wYXJlbnRDYXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYXNrUmVmSWQ6IGRnLnBhcmVudFRhc2tSZWZJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdMZXZlbDogZGcubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhc2hib2FyZFRhc2tSZWZGaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhc2hib2FyZFRhc2tSZWZGaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ3ByZXByb2Nlc3NEYXNoYm9hcmRUYXNrUmVmIG1ldGhvZCB3YXMgY2FsbGVkIG9uIHRhc2sgY29udGVudCB3aXRob3V0IGRhc2hib2FyZCB0YXNrIHJlZnMhJyk7XG4gICAgICAgICAgICByZXR1cm4gcHJlcHJvY2Vzc2VkRGF0YUdyb3VwcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFRhc2tSZWZEYXNoYm9hcmRUaWxlPigpO1xuXG4gICAgICAgIC8vIFRPRE8gcmVzb2x2ZSB0cmFuc2l0aXZlIHRpbGUgY29udGVudFxuICAgICAgICBjb25zdCBub25EYXNoYm9hcmREYXRhR3JvdXBzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGcgb2YgcHJlcHJvY2Vzc2VkRGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgaWYgKGRnLnBhcmVudFRhc2tSZWZJZCAhPT0gZGFzaGJvYXJkVGFza1JlZkZpZWxkLnN0cmluZ0lkKSB7XG4gICAgICAgICAgICAgICAgbm9uRGFzaGJvYXJkRGF0YUdyb3Vwcy5wdXNoKGRnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWxlcy5oYXMoZGcucGFyZW50VGFza0lkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlcy5nZXQoZGcucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgICAgICB0aWxlLmRhdGFHcm91cHMucHVzaChkZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbGVzLnNldChkZy5wYXJlbnRUYXNrSWQsIHtkYXRhR3JvdXBzOiBbZGddfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJkZyBvZiByYXdEYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAocmRnLnBhcmVudFRhc2tJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VGFza0lkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudFRyYW5zaXRpb25JZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VHJhbnNpdGlvbklkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudENhc2VJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50Q2FzZUlkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudFRhc2tSZWZJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VGFza1JlZklkXG4gICAgICAgICAgICAgICAgJiYgcmRnLm5lc3RpbmdMZXZlbCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlZCBvZiByZGcuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlZC5zdHJpbmdJZCA9PT0gVGFza1JlZkRhc2hib2FyZENvbnN0YW50cy5EQVNIQk9BUkRfQ09MUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkLmRhc2hib2FyZENvbHMgPSBmaWxlZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlZC5zdHJpbmdJZCA9PT0gVGFza1JlZkRhc2hib2FyZENvbnN0YW50cy5EQVNIQk9BUkRfUk9XUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkLmRhc2hib2FyZFJvd3MgPSBmaWxlZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZC5kYXNoYm9hcmRUaWxlcyA9IEFycmF5LmZyb20odGlsZXMudmFsdWVzKCkpO1xuICAgICAgICByZXR1cm4gbm9uRGFzaGJvYXJkRGF0YUdyb3VwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbGF5b3V0IGRhdGEgZm9yIGEgc2luZ2xlIGRhdGEgZ3JvdXAgd2l0aCBncmlkIGxheW91dC4gVGhlIHJlc3VsdGluZyBsYXlvdXQgaXMgc2F2ZWQgaW50byB0aGUgaW5wdXQgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlR3JpZExheW91dChkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBsb2NhbEdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XG5cbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFGaWVsZC5sb2NhbExheW91dFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC54ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgJ2dyaWQnIGxheW91dCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBmaWVsZHMgKGZpZWxkIElEOiAke2RhdGFGaWVsZC5zdHJpbmdJZH0pYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChsb2NhbEdyaWQubGVuZ3RoIDwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnkgKyBkYXRhRmllbGQubG9jYWxMYXlvdXQucm93cykge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRFbGVtZW50ID0gc3ViZ3JpZC5hZGRGaWVsZChkYXRhRmllbGQsIHRoaXMuX2ZpZWxkQ29udmVydGVyLnJlc29sdmVUeXBlKGRhdGFGaWVsZCkpO1xuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC55LCBkYXRhRmllbGQubG9jYWxMYXlvdXQueCxcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQubG9jYWxMYXlvdXQuY29scywgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGxvY2FsR3JpZCwgZGF0YUdyb3VwLmxheW91dCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gobG9jYWxHcmlkUm93ID0+IHN1YmdyaWQuYWRkUm93KGxvY2FsR3JpZFJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGVtcHR5IHJvdyByZW1vdmFsIGFuZCBmaWVsZCBjb21wYWN0aW5nIHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXlvdXQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBsYXlvdXQgY29uZmlndXJhdGlvbiBvZiB0aGUgYXBwbGllZCBjb21wYWN0aW5nIHJ1bGVzXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBsYXlvdXQ6IERhdGFHcm91cExheW91dCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBoaWRlUm93cyA9IGxheW91dC5oaWRlRW1wdHlSb3dzID8/IHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzO1xuXG4gICAgICAgIGlmIChoaWRlUm93cyA9PT0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEwpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlSb3dzKGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsYXlvdXQuY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBDb21wYWN0LlVQOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdEZpZWxkc1VwKGdyaWQsIGhpZGVSb3dzLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGFueSBlbGVtZW50IGFzIGZhciBVUCBhcyBpdCBjYW4gZ28uIEVsZW1lbnRzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZSBzYW1lIHJvdyBtaWdodCBlbmQgdXAgaW4gZGlmZmVyZW50IHJvd3MuXG4gICAgICogUmVzdWx0aW5nIHRyYWlsaW5nIGVtcHR5IHJvd3MgYXJlIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0gaGlkZVJvd3MgY29uZmlndXJhdGlvbiBmb3IgZW1wdHkgcm93IHJlbW92YWwgZHVyaW5nIHRoZSBjb21wYWN0aW5nIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhY3RGaWVsZHNVcChncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgaGlkZVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3Jvd0luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHJvdy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbkluZGV4XSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZEVsZW1lbnRSb3dJbmRleCA9IHJvd0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgZm91bmRFbGVtZW50Um93SW5kZXggPCBncmlkLmxlbmd0aDsgZm91bmRFbGVtZW50Um93SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IDAgJiYgZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXggLSAxXSA9PT0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gdGhpcy5nZXRFbGVtZW50RGltZW5zaW9ucyhncmlkLCBjb2x1bW5JbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXgsIHN1YmdyaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcmVhRW1wdHkoZ3JpZCwgY29sdW1uSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZm91bmRFbGVtZW50Um93SW5kZXggLSByb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbZm91bmRFbGVtZW50Um93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCAnJywgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2UoZ3JpZCwgcm93SW5kZXgsIGNvbHVtbkluZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZWxlbWVudCwgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGVSb3dzICE9PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgdGhlIHJvd3MgcG90ZW50aWFsbHkgY2xlYXJlZCBieSBtb3ZpbmcgdGhlIGdyaWQgZWxlbWVudCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCwgZm91bmRFbGVtZW50Um93SW5kZXgsIGZvdW5kRWxlbWVudFJvd0luZGV4ICsgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBncmlkIHRoYXQgb25seSBjb250YWluIGVtcHR5IGVsZW1lbnRzIChhcmUgZW1wdHkpLiBUaGUgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBoYXZlIGl0J3MgZW1wdHkgcm93cyByZW1vdmVkXG4gICAgICogQHBhcmFtIGZpcnN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4gVXNlIDAgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBncmlkIHdpbGwgYmUgY2hlY2tlZCBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFJvdyB0aGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgcm93IHdoZXJlIHRoZSBjaGVja2luZyBzaG91bGQgZW5kLiBUaGUgcm93IHdpdGggdGhpcyBpbmRleCBpcyBub3QgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIHRoZSBgZmlyc3RSb3dgIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBgZmlyc3RSb3dgIGlzIHByb3ZpZGVkIG5vIGNoZWNrcyB3aWxsIGJlIHByZWZvcm1lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRW1wdHlSb3dzKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBmaXJzdFJvdyA9IDAsIGxhc3RSb3cgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgbGV0IGkgPSBmaXJzdFJvdztcbiAgICAgICAgd2hpbGUgKGkgPCBncmlkLmxlbmd0aCAmJiBpIDwgbGFzdFJvdykge1xuICAgICAgICAgICAgaWYgKGdyaWRbaV0uZXZlcnkoZWxlbWVudCA9PiBlbGVtZW50ID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBncmlkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZ3JpZCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIG9mIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudERpbWVuc2lvbnMoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbeV1beF07XG4gICAgICAgIGxldCB3aWR0aCA9IDE7XG4gICAgICAgIHdoaWxlICh4ICsgd2lkdGggPCBzdWJncmlkLmNvbHMgJiYgZ3JpZFt5XVt4ICsgd2lkdGhdID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWlnaHQgPSAxO1xuICAgICAgICB3aGlsZSAoeSArIGhlaWdodCA8IGdyaWQubGVuZ3RoICYmIGdyaWRbeSArIGhlaWdodF1beF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJlYSBpbiB0aGUgZ3JpZCBjb250YWlucyBubyBlbGVtZW50cywgb3Igbm90XG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdGVkIGFyZWFzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXN0ZWQgYXJlYVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0FyZWFFbXB0eShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5OyBpIDwgeSArIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geDsgaiA8IHggKyB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZmxvdyBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZCB1c2luZyB0aGUgZmxvdyBhbGdvcml0aG1cbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVGbG93TGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIHRoaXMuZmxvd0ZpZWxkcyhkYXRhR3JvdXAsIHN1YmdyaWQsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBUaGUgbGVnYWN5IGxheW91dCBmb3JjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIDQgYW5kIGxvZ3MgYSB3YXJuaW5nIGlmIHRoaXMgd2FzIG5vdCB0aGUgY2FzZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBsZWdhY3kgYWxnb3JpdGhtIHVzZWQgaW4gTkFFIHZlcnNpb25zIDwgNC4wLjBcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVMZWdhY3lMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgaWYgKHN1YmdyaWQuY29scyAhPT0gNCkge1xuICAgICAgICAgICAgc3ViZ3JpZC5jb2xzID0gNDtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKGBUYXNrIHdpdGggaWQgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZH0nIGhhcyBhIGRhdGEgZ3JvdXAgd2l0aCBsZWdhY3kgbGF5b3V0IHdpdGggYSBgXG4gICAgICAgICAgICAgICAgKyBgbm9uLWRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMuIElmIHlvdSB3YW50IHRvIHVzZSBhIGxheW91dCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucyB0aGFuIDIgdXNlIGEgZGlmZmVyZW50IGBcbiAgICAgICAgICAgICAgICArIGBsYXlvdXQgdHlwZSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF5cyBvdXQgdGhlIGZpZWxkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIGZyb20gdG9wIHRvIGJvdHRvbS4gSWYgdGhlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCB0aGUgYmxvY2sgb2YgZmxvd2VkIGZpZWxkcyBkb2Vzbid0IGZpdFxuICAgICAqIG5lYXRseSBpbnRvIHRoZSBjb2x1bW5zIChpZiB0aGUgd2lkdGggb2YgYSBzaW5nbGUgZmllbGQgaXMgbm90IGEgZGl2aXNvciBvZiBjb2x1bW4gY291bnQpLCB0aGVuIHRoZSBlbnRpcmUgYmxvY2sgb2YgZmllbGRzIGlzXG4gICAgICogbGVmdCBhbGlnbmVkLiBUaGUgbGFzdCByb3cgb2YgZmllbGRzIGlzIGFsaWduZWQgdG8gdGhlIGxlZnQsIGNlbnRlciBvciByaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBncm91cHMgcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxhc3Qgcm93IGNhbm5vdCBiZSBhbGlnbmVkIHRvIHRoZSBleGFjdCBjZW50ZXIgaXQgaXMgb2Zmc2V0IG9uZSBncmlkIHRpbGUgdG8gdGhlIGxlZnQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcGFyYW0gZmllbGRXaWR0aCB0aGUgbnVtYmVyIG9mIGdyaWQgdGlsZXMsIHRoYXQgc2hvdWxkIGJlIG9jY3VwaWVkIGJ5IGVhY2ggZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmxvd0ZpZWxkcyhkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCwgZmllbGRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1BlclJvdyA9IE1hdGguZmxvb3Ioc3ViZ3JpZC5jb2xzIC8gZmllbGRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFhQb3NpdGlvbiA9IGZpZWxkV2lkdGggKiAoZmllbGRzUGVyUm93IC0gMSk7XG5cbiAgICAgICAgbGV0IHhQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKChkYXRhRmllbGQsIGRhdGFGaWVsZENvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICBpZiAoZGF0YUdyb3VwLnN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbEdyaWQucHVzaCh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID09PSAwICYmIHRoaXMuaXNMYXN0Um93KGRhdGFGaWVsZENvdW50LCBkYXRhR3JvdXAsIGZpZWxkc1BlclJvdykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNJbkxhc3RSb3cgPSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAlIGZpZWxkc1BlclJvdztcbiAgICAgICAgICAgICAgICBjb25zdCByb3dXaWR0aCA9IG1heFhQb3NpdGlvbiArIGZpZWxkV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cC5hbGlnbm1lbnQgPT09IERhdGFHcm91cEFsaWdubWVudC5FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gcm93V2lkdGggLSBmaWVsZFdpZHRoICogZmllbGRzSW5MYXN0Um93O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkNFTlRFUikge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSBNYXRoLmZsb29yKChyb3dXaWR0aCAtIGZpZWxkc0luTGFzdFJvdyAqIGZpZWxkV2lkdGgpIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGxvY2FsR3JpZC5sZW5ndGggLSAxLCB4UG9zaXRpb24sIGZpZWxkV2lkdGgsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKTtcblxuICAgICAgICAgICAgeFBvc2l0aW9uICs9IGZpZWxkV2lkdGg7XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID4gbWF4WFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2FsR3JpZC5mb3JFYWNoKHJvdyA9PiBzdWJncmlkLmFkZFJvdyhyb3cpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJvd1xuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZpbGwgYWxsIGVsZW1lbnRzIGluIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmV3R3JpZFJvdyh3aWR0aDogbnVtYmVyLCBjb250ZW50ID0gJycpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5KHdpZHRoKS5maWxsKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFyZWEgY29udGFpbnMgdmFsdWVzIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB5IHRoZSAwIGJhc2VkIHJvdyBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB4IHRoZSAwIGJhc2VkIGNvbHVtbiBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbnRvIGV2ZXJ5IGNlbGwgb2YgdGhlIGdyaWQgaW5zaWRlIHRoZSBzcGVjaWZpZWQgYXJlYVxuICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gY2hlY2tPY2N1cGFudHMgd2hldGhlciB0aGUgZmlsbGVkIGFyZWEgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG90aGVyIGVsZW1lbnRzLlxuICAgICAqIElmIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGVsZW1lbnRzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHk6IG51bWJlciwgeDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLCBoZWlnaHQgPSAxLCBjaGVja09jY3VwYW50cyA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPY2N1cGFudHMgJiYgZ3JpZFtqXVtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGxhY2UgZWxlbWVudCAke3ZhbHVlfSBpbnRvIHRoZSBncmlkIGxheW91dCwgYmVjYXVzZSBpdCdzIHNwYWNlICh4OiAke2l9LCB5OiAke2p9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgZWxlbWVudCAoJHtncmlkW2pdW2ldfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3JpZFtqXVtpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50IHdpdGhpbiBpdHMgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGNoZWNrZWQgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBmaWVsZHNQZXJSb3cgdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBpcyByZXF1aXJlZCB0byBmaWxsIGFuIGVudGlyZSByb3dcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgd2l0aGluIHRoZSBsYXN0IHJvdyBvZiBlbGVtZW50cyBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGxhc3Qgcm93IGNvbnRhaW5zIGVub3VnaCBlbGVtZW50cyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzTGFzdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhR3JvdXA6IERhdGFHcm91cCwgZmllbGRzUGVyUm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgZmllbGRzUGVyUm93ID49IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBwcmV2aW91cyBjb250ZW50IGFuZCBwdXNoZXMgdGhlIG5ldyBjb250ZW50IGludG8gdGhlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBuZXcgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRlbnQ6IEFycmF5PFN1YmdyaWQ+ID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChzdWJncmlkID0+IHN1YmdyaWQuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlU3ViZ3JpZElkKGRhdGFHcm91cDogRGF0YUdyb3VwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGlkQmFzZTogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YUdyb3VwLnBhcmVudFRhc2tJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZEJhc2UgPSBbZGF0YUdyb3VwLnBhcmVudFRhc2tJZCwgZGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCwgZGF0YUdyb3VwLm5lc3RpbmdMZXZlbF0uam9pbignIycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRCYXNlID0gJ3Jvb3QnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGlkQmFzZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBpZCA9IGlkQmFzZSArIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5hZGQoaWQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlTdWJncmlkRm4gPSAoaW5kZXg6IG51bWJlciwgc3ViZ3JpZDogU3ViZ3JpZCkgPT4gc3ViZ3JpZC5zdWJncmlkSWQ7XG5cbiAgICBwdWJsaWMgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSA9PiB0aGlzLnRyYWNrQnlEYXRhZmllbGRzKGluZGV4LCBlbGVtZW50KTtcblxuICAgIHByb3RlY3RlZCB0cmFja0J5RGF0YWZpZWxkcyhpbmRleDogbnVtYmVyLCBlbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuQkxBTks6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5MT0FERVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctTC0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkRBVEFfR1JPVVBfVElUTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGUgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pdGVtLnN0cmluZ0lkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
809
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQTZCLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBRXRCLG1CQUFtQixFQUN0QixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFFQUFxRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUU3RixPQUFPLEVBQUMsT0FBTyxFQUFD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bnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnR9IGZyb20gJy4uL21vZGVsL2RhdGFmaWVsZC1ncmlkLWxheW91dC1lbGVtZW50JztcbmltcG9ydCB7RmllbGRDb252ZXJ0ZXJTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tDb250ZW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvdGFzay1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtQYXBlclZpZXdTZXJ2aWNlfSBmcm9tICcuLi8uLi9uYXZpZ2F0aW9uL3F1aWNrLXBhbmVsL2NvbXBvbmVudHMvcGFwZXItdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi9tb2RlbC90YXNrLWV2ZW50LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3Rhc2stZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFHcm91cCwgRGF0YUdyb3VwQWxpZ25tZW50LCBQYXJlbnREYXRhR3JvdXBJbmZvcm1hdGlvbn0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9kYXRhLWdyb3Vwcyc7XG5pbXBvcnQge1Rhc2tFbGVtZW50VHlwZX0gZnJvbSAnLi4vbW9kZWwvdGFzay1jb250ZW50LWVsZW1lbnQtdHlwZSc7XG5pbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtcbiAgICBEYXRhR3JvdXBDb21wYWN0LFxuICAgIERhdGFHcm91cEhpZGVFbXB0eVJvd3MsXG4gICAgRGF0YUdyb3VwTGF5b3V0LFxuICAgIERhdGFHcm91cExheW91dFR5cGVcbn0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9kYXRhLWdyb3VwLWxheW91dCc7XG5pbXBvcnQge0ZpZWxkQWxpZ25tZW50fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2ZpZWxkLWFsaWdubWVudCc7XG5pbXBvcnQge0ZpZWxkVHlwZVJlc291cmNlfSBmcm9tICcuLi9tb2RlbC9maWVsZC10eXBlLXJlc291cmNlJztcbmltcG9ydCB7TG9hZGluZ0VtaXR0ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvbG9hZGluZy1lbWl0dGVyJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TkFFX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OfSBmcm9tICcuLi9tb2RlbC9hc3luYy1yZW5kZXJpbmctY29uZmlndXJhdGlvbi1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL21vZGVsL2FzeW5jLXJlbmRlcmluZy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7VGFza1JlZkRhc2hib2FyZENvbnN0YW50c30gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdGFzay1yZWYtZmllbGQvbW9kZWwvdGFzay1yZWYtZGFzaGJvYXJkLWNvbnN0YW50cyc7XG5pbXBvcnQge1Rhc2tSZWZGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdGFzay1yZWYtZmllbGQvbW9kZWwvdGFzay1yZWYtZmllbGQnO1xuaW1wb3J0IHtUYXNrUmVmQ29tcG9uZW50c30gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdGFzay1yZWYtZmllbGQvbW9kZWwvdGFzay1yZWYtY29tcG9uZW50cyc7XG5pbXBvcnQge1NwbGl0RGF0YUdyb3VwfSBmcm9tICcuLi9tb2RlbC9zcGxpdC1kYXRhLWdyb3VwJztcbmltcG9ydCB7U3ViZ3JpZH0gZnJvbSAnLi4vbW9kZWwvc3ViZ3JpZCc7XG5pbXBvcnQge0luY3JlbWVudGluZ0NvdW50ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvaW5jcmVtZW50aW5nLWNvdW50ZXInO1xuaW1wb3J0IHtQcmVwcm9jZXNzZWREYXRhR3JvdXBzfSBmcm9tICcuLi9tb2RlbC9wcmVwcm9jZXNzZWQtZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtUYXNrUmVmRGFzaGJvYXJkVGlsZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdGFzay1yZWYtZmllbGQvbW9kZWwvdGFzay1yZWYtZGFzaGJvYXJkLXRpbGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC10YXNrLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhc2tDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBERUZBVUxUX0xBWU9VVF9UWVBFID0gRGF0YUdyb3VwTGF5b3V0VHlwZS5MRUdBQ1k7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9GSUVMRF9BTElHTk1FTlQgPSBGaWVsZEFsaWdubWVudC5DRU5URVI7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTjogQXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBiYXRjaFNpemU6IDQsXG4gICAgICAgIGJhdGNoRGVsYXk6IDIwMCxcbiAgICAgICAgbnVtYmVyT2ZQbGFjZWhvbGRlcnM6IDQsXG4gICAgICAgIGVuYWJsZUFzeW5jUmVuZGVyaW5nRm9yTmV3RmllbGRzOiB0cnVlLFxuICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZDogdHJ1ZVxuICAgIH07XG4gICAgcmVhZG9ubHkgREVGQVVMVF9DT01QQUNUX0RJUkVDVElPTiA9IERhdGFHcm91cENvbXBhY3QuTk9ORTtcbiAgICByZWFkb25seSBERUZBVUxUX0hJREVfRU1QVFlfUk9XUyA9IERhdGFHcm91cEhpZGVFbXB0eVJvd3MuQUxMO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGF0YSBpcyBiZWluZyBsb2FkZWQgZnJvbSBiYWNrZW5kLCBvciBpZiBpdCBpcyBiZWluZyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgbG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIEVtaXRzIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZGF0YSBmaWVsZCwgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLiBFbWl0cyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNEYXRhVG9EaXNwbGF5JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqIEV4aXN0cyB0byBhbGxvdyByZWZlcmVuY2VzIHRvIHRoZSBlbnVtIGluIHRoZSBIVE1MXG4gICAgICovXG4gICAgcHVibGljIGZpZWxkVHlwZVJlc291cmNlID0gRmllbGRUeXBlUmVzb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNsYXRlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIHRhc2sgY29udGFpbnMgbm8gZGF0YS5cbiAgICAgKlxuICAgICAqIElmIGEgZmFsc3kgdmFsdWUgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgdGV4dCBpcyBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBub0RhdGFUZXh0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGljb24gdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIHRhc2sgY29udGFpbnMgbm8gZGF0YS5cbiAgICAgKlxuICAgICAqIElmIGEgZmFsc3kgdmFsdWUgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgaWNvbiBpcyBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBub0RhdGFJY29uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBhbiBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgbm8gZGF0YSBtZXNzYWdlIGlzIHNob3duLlxuICAgICAqXG4gICAgICogQW4gaWNvbiBpcyBkaXNwbGF5ZWQgYnkgZGVmYXVsdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlOb0RhdGFJY29uID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBub3RpZmljYXRpb25zIGFib3V0IHRhc2sgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHRhc2tFdmVudDogRXZlbnRFbWl0dGVyPFRhc2tFdmVudE5vdGlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgZmllbGRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2UkOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3ViZ3JpZD4+O1xuICAgIHByb3RlY3RlZCBfc3ViVGFza0NvbnRlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tFdmVudDogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfYXN5bmNSZW5kZXJpbmdDb25maWc6IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2FzeW5jUmVuZGVyVGltZW91dDogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0QWxpZ25tZW50OiBGaWVsZEFsaWdubWVudDtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uOiBEYXRhR3JvdXBDb21wYWN0O1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEhpZGVFbXB0eVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3M7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0TnVtYmVyT2ZDb2xzOiBudW1iZXI7XG5cbiAgICBwcm90ZWN0ZWQgX3N1YmdyaWRJZENvdW50ZXI6IEluY3JlbWVudGluZ0NvdW50ZXI7XG4gICAgcHJvdGVjdGVkIF9leGlzdGluZ1N1YmdyaWRJZHM6IFNldDxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcm93IGhlaWdodCBvZiBvbmUgcm93IGluIHRhc2sgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByb3dIZWlnaHQgPSAxMDU7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9maWVsZENvbnZlcnRlcjogRmllbGRDb252ZXJ0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfcGFwZXJWaWV3OiBQYXBlclZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF90YXNrRXZlbnRTZXJ2aWNlOiBUYXNrRXZlbnRTZXJ2aWNlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT04pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb246IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcgPSB7Li4udGhpcy5ERUZBVUxUX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OfTtcbiAgICAgICAgaWYgKGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZywgYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxTdWJncmlkPj4oW10pO1xuICAgICAgICB0aGlzLmhhc0RhdGFUb0Rpc3BsYXkkID0gdGhpcy5fZGF0YVNvdXJjZSQucGlwZShtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGggIT09IDA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLl9zdWJUYXNrQ29udGVudCA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRGVmYXVsdExheW91dENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVMYXlvdXREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyQub2ZmKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5fdGFza0V2ZW50U2VydmljZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc2tFdmVudE5vdGlmaWNhdGlvbj4oKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRhc2tFdmVudCA9IF90YXNrRXZlbnRTZXJ2aWNlLnRhc2tFdmVudE5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQuZW1pdChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX3N1YlRhc2tDb250ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlmICh0aGlzLnRhc2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3ViVGFza0V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJUYXNrRXZlbnQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFza0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLnN0cmluZ0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBBcnJheTxTdWJncmlkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHRhc2tzIGxheW91dCBwcm9wZXJ0eSwgb3IgNCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldE51bWJlck9mRm9ybUNvbHVtbnMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrXG4gICAgICAgICAgICB8fCAhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXRcbiAgICAgICAgICAgIHx8IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LmNvbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQuY29scztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhcGVyVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcGVyVmlldy5wYXBlclZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGl0ZW0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZ3JpZCBlbGVtZW50IGluZm9ybWF0aW9uXG4gICAgICogQHJldHVybnMgdGhlIEFuZ3VsYXIgZmxleCBsYXlvdXRzIGFsaWdubWVudCBwcm9wZXJ0eSBmb3IgaW5kaXZpZHVhbCBkYXRhIGZpZWxkcyBiYXNlZCBvblxuICAgICAqIHRoZSBsYXlvdXQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHByb2Nlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SXRlbUFsaWdubWVudChpdGVtOiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChpdGVtLmFsaWdubWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWxpZ25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRBbGlnbm1lbnQgPSBpdGVtLml0ZW0/LmxvY2FsTGF5b3V0Py5hbGlnbm1lbnQgPz8gdGhpcy5fZGVmYXVsdEFsaWdubWVudDtcblxuICAgICAgICBsZXQgYWxpZ25tZW50O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkQWxpZ25tZW50KSB7XG4gICAgICAgICAgICBjYXNlIEZpZWxkQWxpZ25tZW50LlRPUDpcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAnc3RhcnQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5DRU5URVI6XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZpZWxkQWxpZ25tZW50LkJPVFRPTTpcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAnZW5kJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uYWxpZ25tZW50ID0gJ3NwYWNlLWJldHdlZW4gJyArIGFsaWdubWVudDtcbiAgICAgICAgcmV0dXJuIGl0ZW0uYWxpZ25tZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGNvbXBvbmVudCBoZWlnaHQgaWYgdGhlIHJvd3MgYXR0cmlidXRlIG9mIHRhc2sgbGF5b3V0IGlzIHNldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUNvbnRlbnRIZWlnaHRDc3MoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsaW5nTmVlZGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5yb3dzICogdGhpcy5yb3dIZWlnaHQgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcxMDAlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY2lkZXMgd2hldGhlciB0aGVyZSBpcyBhIGZpeGVkIG51bWJlciBvZiByb3dzIGFuZCBpdCBuZWVkLXMgc2Nyb2xsaW5nXG4gICAgICovXG4gICAgcHVibGljIHNjcm9sbGluZ05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tcbiAgICAgICAgICAgICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXRcbiAgICAgICAgICAgICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93c1xuICAgICAgICAgICAgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93cyA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0aGUgZGlzcGxheWVkIHRhc2sgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBmaWVsZHMgaW5kaXZpZHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJZiB0ZSB0YXNrIHNwZWNpZmllcyBubyBkZWZhdWx0IHZhbHVlIHRoZSBbZ2xvYmFsIGRlZmF1bHRde0BsaW5rIEFic3RyYWN0VGFza0NvbnRlbnRDb21wb25lbnQjREVGQVVMVF9GSUVMRF9BTElHTk1FTlR9XG4gICAgICogdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVEZWZhdWx0TGF5b3V0Q29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEFsaWdubWVudCA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2s/LmxheW91dD8uZmllbGRBbGlnbm1lbnQgPz8gdGhpcy5ERUZBVUxUX0ZJRUxEX0FMSUdOTUVOVDtcbiAgICAgICAgdGhpcy5fZGVmYXVsdENvbXBhY3REaXJlY3Rpb24gPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmNvbXBhY3REaXJlY3Rpb24gPz8gdGhpcy5ERUZBVUxUX0NPTVBBQ1RfRElSRUNUSU9OO1xuICAgICAgICB0aGlzLl9kZWZhdWx0SGlkZUVtcHR5Um93cyA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2s/LmxheW91dD8uaGlkZUVtcHR5Um93cyA/PyB0aGlzLkRFRkFVTFRfSElERV9FTVBUWV9ST1dTO1xuICAgICAgICB0aGlzLl9kZWZhdWx0TnVtYmVyT2ZDb2xzID0gdGhpcy5nZXROdW1iZXJPZkZvcm1Db2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgdGFza3MgZ3JpZCBsYXlvdXQgYW5kIHNldHMgdGhlIHJlc3VsdCB0byB0aGUgcHVibGljIHByb3BlcnRpZXNcbiAgICAgKiBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIHRoZW4gYm91bmQgdG8gSFRNTC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgZGF0YSBncm91cHMgdGhhdCBzaG91bGQgYmUgbGFpZCBvdXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcHV0ZUxheW91dERhdGEoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPikge1xuICAgICAgICBpZiAoIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2spIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3ViZ3JpZElkQ291bnRlciA9IG5ldyBJbmNyZW1lbnRpbmdDb3VudGVyKCk7XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBTdWJncmlkPigpO1xuXG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLnByZXByb2Nlc3NEYXRhR3JvdXBzKGRhdGFHcm91cHMpO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYXlvdXQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dCAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlXG4gICAgICAgICAgICA/IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGVcbiAgICAgICAgICAgIDogdGhpcy5ERUZBVUxUX0xBWU9VVF9UWVBFO1xuXG4gICAgICAgIGRhdGFHcm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxheW91dCkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dCA9IHtyb3dzOiB1bmRlZmluZWQsIGNvbHM6IHVuZGVmaW5lZCwgdHlwZTogZGVmYXVsdExheW91dH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxheW91dC50eXBlKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAubGF5b3V0LnR5cGUgPSBkZWZhdWx0TGF5b3V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJncmlkID0gbmV3IFN1YmdyaWQoXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdWJncmlkSWQoZ3JvdXApLFxuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dC5jb2xzID8/IHRoaXMuX2RlZmF1bHROdW1iZXJPZkNvbHMsXG4gICAgICAgICAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChncm91cC50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBzdWJncmlkLmFkZFRpdGxlKGdyb3VwKTtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCB0aXRsZS5ncmlkQXJlYUlkKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXAubGF5b3V0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlR3JpZExheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5GTE9XOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVGbG93TGF5b3V0KGdyb3VwLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkxFR0FDWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlTGVnYWN5TGF5b3V0KGdyb3VwLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRhc2sgbGF5b3V0IHR5cGUgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZX0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YmdyaWQuZmluYWxpemUoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQoc3ViZ3JpZC5zdWJncmlkSWQsIHN1YmdyaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbmRlckZpZWxkcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW5kZXJGaWVsZHMoc3ViZ3JpZHM6IE1hcDxzdHJpbmcsIFN1YmdyaWQ+KSB7XG4gICAgICAgIGNvbnN0IHN1YmdyaWRzQXJyYXkgPSBBcnJheS5mcm9tKHN1YmdyaWRzLnZhbHVlcygpKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLmVuYWJsZUFzeW5jUmVuZGVyaW5nRm9yTmV3RmllbGRzXG4gICAgICAgICAgICAmJiAhKHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLmVuYWJsZUFzeW5jUmVuZGVyaW5nT25UYXNrRXhwYW5kICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLmlzRXhwYW5kaW5nKSkge1xuICAgICAgICAgICAgc3ViZ3JpZHNBcnJheS5mb3JFYWNoKHN1YmdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIHN1YmdyaWQuZGlzcGxheUFsbEZpZWxkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoc3ViZ3JpZHNBcnJheSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzLnRhc2tDb250ZW50U2VydmljZS5pc0V4cGFuZGluZyAmJiB0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkLnZhbHVlLmZvckVhY2gob2xkU3ViZ3JpZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyaWRzLmhhcyhvbGRTdWJncmlkLnN1YmdyaWRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViZ3JpZHMuZ2V0KG9sZFN1YmdyaWQuc3ViZ3JpZElkKS5kZXRlcm1pbmVLZXB0RmllbGRzKG9sZFN1YmdyaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHN1YmdyaWRzQXJyYXkpO1xuICAgICAgICB0aGlzLnNwcmVhZEZpZWxkUmVuZGVyaW5nT3ZlclRpbWUoc3ViZ3JpZHNBcnJheSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNwcmVhZEZpZWxkUmVuZGVyaW5nT3ZlclRpbWUoc3ViZ3JpZHM6IEFycmF5PFN1YmdyaWQ+LCBpdGVyYXRpb24gPSAwKSB7XG4gICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbiA8IHN1YmdyaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1YmdyaWRzW2l0ZXJhdGlvbl0ucmVuZGVyQ29udGVudE92ZXJUaW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzLCBpdGVyYXRpb24gKyAxKTtcbiAgICAgICAgICAgICAgICB9LCBpdGVyYXRpb24gPT09IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEgZ3JvdXBzIHRvIHByZXZlbnQgdW5pbnRlbnRpb25hbCBtZW1vcnkgYWNjZXNzZXMgdG8gc291cmNlIGRhdGEuXG4gICAgICogUmVhcnJhbmdlcyB0aGUgZGF0YSBncm91cHMgdG8gYWNjb21tb2RhdGUgdGFza3JlZnMuIEZpbHRlcnMgb3V0IGhpZGRlbiBhbmQgZm9yYmlkZGVuIGZpZWxkcy5cbiAgICAgKiBQb3B1bGF0ZXMgZGFzaGJvYXJkIHRhc2sgcmVmIGZpZWxkcyB3aXRoIGRhc2hib2FyZCB0aWxlIGRhdGEuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyB0aGUgcHJlcHJvY2Vzc2VkIGRhdGEgZ3JvdXBzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByZXByb2Nlc3NEYXRhR3JvdXBzKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBBcnJheTxEYXRhR3JvdXA+IHtcbiAgICAgICAgY29uc3QgcmVhcnJhbmdlUmVzdWx0ID0gdGhpcy5yZWFycmFuZ2VEYXRhR3JvdXBzKGRhdGFHcm91cHMpO1xuICAgICAgICBsZXQgdW5maWx0ZXJlZERhdGFHcm91cHMgPSByZWFycmFuZ2VSZXN1bHQuZGF0YUdyb3VwcztcblxuICAgICAgICBpZiAocmVhcnJhbmdlUmVzdWx0LmNvbnRhaW5zRGFzaGJvYXJkVGFza1JlZikge1xuICAgICAgICAgICAgdW5maWx0ZXJlZERhdGFHcm91cHMgPSB0aGlzLnByZXByb2Nlc3NEYXNoYm9hcmRUYXNrUmVmKHJlYXJyYW5nZVJlc3VsdC5kYXRhR3JvdXBzLCBkYXRhR3JvdXBzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lQW5kRmlsdGVySGlkZGVuKHVuZmlsdGVyZWREYXRhR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEgZ3JvdXBzIHRvIHByZXZlbnQgdW5pbnRlbnRpb25hbCBtZW1vcnkgYWNjZXNzZXMgdG8gc291cmNlIGRhdGEuXG4gICAgICogUmVhcnJhbmdlcyB0aGUgZGF0YSBncm91cHMgdG8gYWNjb21tb2RhdGUgdGFza3JlZnMuXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBncm91cHMgY29udGFpbiBhIGRhc2hib2FyZCB0YXNrIHJlZiBmaWVsZC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3Vwc1xuICAgICAqIEByZXR1cm5zIHRoZSBwcmVwcm9jZXNzZWQgZGF0YSBncm91cHMgd2l0aCBtZXRhZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFycmFuZ2VEYXRhR3JvdXBzKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBQcmVwcm9jZXNzZWREYXRhR3JvdXBzIHtcbiAgICAgICAgZGF0YUdyb3VwcyA9IHRoaXMuY2xvbmVEYXRhR3JvdXBzKGRhdGFHcm91cHMpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVMb2NhbEZpZWxkTGF5b3V0KGRhdGFHcm91cHMpO1xuXG4gICAgICAgIGxldCBjb250YWluc0Rhc2hib2FyZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGRhdGFHcm91cHNbaV07XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmZpZWxkcy5zb21lKGYgPT4gdGhpcy5pc1Rhc2tSZWYoZikpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSB0aGlzLnNwbGl0RGF0YUdyb3VwT25UYXNrUmVmKGdyb3VwKTtcbiAgICAgICAgICAgIGlmIChzcGxpdC5zdGFydEdyb3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGxpdC5zdGFydEdyb3VwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNwbGl0LnRhc2tSZWYuY29tcG9uZW50Py5uYW1lID09PSBUYXNrUmVmQ29tcG9uZW50cy5EQVNIQk9BUkQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZURhc2hib2FyZFRhc2tSZWZEYXRhR3JvdXAoZ3JvdXAsIHNwbGl0LnRhc2tSZWYpKTtcbiAgICAgICAgICAgICAgICBjb250YWluc0Rhc2hib2FyZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzcGxpdC50YXNrUmVmLnZhbHVlLmxlbmd0aCA9PT0gMCB8fCBzcGxpdC5lbmRHcm91cCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0LmVuZEdyb3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUdyb3Vwcy5zcGxpY2UoaSArIDEsIDAsIHNwbGl0LmVuZEdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdENoaWxkID0gZGF0YUdyb3Vwc1tpICsgMV07IC8vIHRoZSBkYXRhIGdyb3VwIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93cyBJUyBBTFdBWVMgYSBkaXJlY3QgY2hpbGRcbiAgICAgICAgICAgIGxldCBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCA9IGkgKyAyO1xuICAgICAgICAgICAgZm9yICg7IGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4IDwgZGF0YUdyb3Vwcy5sZW5ndGg7IGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0R3JvdXAgPSBkYXRhR3JvdXBzW2ZpcnN0Tm9uRGVzY2VuZGFudEluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gdW5kZWZpbmVkIHx8IG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPCBkaXJlY3RDaGlsZC5uZXN0aW5nTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBibG9jayBvZiBuZXN0ZWQgZGF0YSBncm91cHNcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0R3JvdXAubmVzdGluZ0xldmVsID09PSBkaXJlY3RDaGlsZC5uZXN0aW5nTGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgJiYgKG5leHRHcm91cC5wYXJlbnRUYXNrUmVmSWQgIT09IHNwbGl0LnRhc2tSZWYuc3RyaW5nSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzcGxpdC50YXNrUmVmLnZhbHVlLnNvbWUocmVmZmVkVGFza0lkID0+IHJlZmZlZFRhc2tJZCA9PT0gbmV4dEdyb3VwLnBhcmVudFRhc2tJZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YUdyb3Vwcy5zcGxpY2UoZmlyc3ROb25EZXNjZW5kYW50SW5kZXgsIDAsIHNwbGl0LmVuZEdyb3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhR3JvdXBzOiByZXN1bHQsXG4gICAgICAgICAgICBjb250YWluc0Rhc2hib2FyZFRhc2tSZWY6IGNvbnRhaW5zRGFzaGJvYXJkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cCBhcnJheS5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIGRhdGEgZ3JvdXBzIGFyZSBjbG9uZWQsIHRoZSBmaWVsZHMgYXJlIG9ubHkgY29waWVkIGFzIHJlZmVyZW5jZXMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGNsb25lZFxuICAgICAqIEByZXR1cm5zIHRoZSBkdXBsaWNhdGVkIGRhdGEgZ3JvdXBzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsb25lRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIHJldHVybiBkYXRhR3JvdXBzLm1hcChncm91cCA9PiB7XG4gICAgICAgICAgICBjb25zdCBnID0gey4uLmdyb3VwfTtcbiAgICAgICAgICAgIGcuZmllbGRzID0gZy5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkKTtcbiAgICAgICAgICAgIHJldHVybiBnO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhc3NlcyBvdmVyIGFsbCB0aGUgZmllbGRzIGluIHRoZSBwcm92aWRlZCBkYXRhIGdyb3VwcyBhbmQgaWYgdGhleSBhcmUgdmlzaWJsZSwgaW5pdGlhbGl6ZXMgdGhlaXIgbG9jYWwgbGF5b3V0IGF0dHJpYnV0ZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgY29udGFpbmVycyBvZiB0aGUgZmllbGRzIHRoYXQgc2hvdWxkIGhhdmUgdGhlaXIgbG9jYWwgbGF5b3V0IGluaXRpYWxpemVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVMb2NhbEZpZWxkTGF5b3V0KGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBnIG9mIGRhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBnLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChmLmJlaGF2aW9yLmhpZGRlbiB8fCBmLmJlaGF2aW9yLmZvcmJpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZi5yZXNldExvY2FsTGF5b3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlIG9mIHRoZSBwcm92aWRlZCBkYXRhIGdyb3VwIGFycmF5IGFuZCBmaWx0ZXJzIGF3YXkgYW55IGZpZWxkcyBhbmQgZGF0YSBncm91cHMgdGhhdCBhcmUgbWFya2VkIGFzIGhpZGRlbi5cbiAgICAgKiBCZWNhdXNlIG9mIHRoZSBkdXBsaWNhdGlvbiB0aGUgZmlsdGVyaW5nIGRvZXNuJ3QgYWZmZWN0IHRoZSBvcmlnaW5hbCBpbnN0YW5jZXMgYW5kIHRoZXkgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgZGF0YSBncm91cHMgdGhhdCBzaG91bGQgYmUgZmlsdGVyZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZmlsdGVyZWQgZHVwbGljYXRlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjbG9uZUFuZEZpbHRlckhpZGRlbihkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRhdGFHcm91cHMubWFwKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGcgPSB7Li4uZ3JvdXB9O1xuICAgICAgICAgICAgZy5maWVsZHMgPSBnLmZpZWxkcy5maWx0ZXIoZmllbGQgPT4gIWZpZWxkLmJlaGF2aW9yLmhpZGRlbiAmJiAhZmllbGQuYmVoYXZpb3IuZm9yYmlkZGVuKS5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGZpZWxkLnJlc2V0TG9jYWxMYXlvdXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBnO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihncm91cCA9PiBncm91cC5maWVsZHMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzVGFza1JlZihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZCBpbnN0YW5jZW9mIFRhc2tSZWZGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgaW5wdXQgZGF0YSBncm91cCBiYXNlZCBvbiB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBmaWVsZHMgYW5kIHNwbGl0cyBpdCBpbnRvIHBhcnRzIG9uIHRoZSBmaXJzdCB0YXNrIHJlZi5cbiAgICAgKiBJZiBzb21lIGZpZWxkcyBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCB0YXNrIHJlZiB0aGV5IGFyZSBleHRyYWN0ZWQgaW50byBhIG5ldyBbc3RhcnRHcm91cF17QGxpbmsgU3BsaXREYXRhR3JvdXAjc3RhcnRHcm91cH0uXG4gICAgICogSWYgc29tZSBmaWVsZHMgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCB0YXNrIHJlZiB0aGV5IGFyZSBleHRyYWN0ZWQgaW50byBhIG5ldyBbZW5kR3JvdXBde0BsaW5rIFNwbGl0RGF0YUdyb3VwI2VuZEdyb3VwfS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzcGxpdERhdGFHcm91cE9uVGFza1JlZihkYXRhR3JvdXA6IERhdGFHcm91cCk6IFNwbGl0RGF0YUdyb3VwIHtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5zb3J0KChhLCBiKSA9PiBhLmxvY2FsTGF5b3V0LnkgLSBiLmxvY2FsTGF5b3V0LnkpO1xuICAgICAgICBjb25zdCB0YXNrUmVmUG9zaXRpb24gPSBkYXRhR3JvdXAuZmllbGRzLmZpbmRJbmRleChmID0+IHRoaXMuaXNUYXNrUmVmKGYpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBTcGxpdERhdGFHcm91cCA9IHtcbiAgICAgICAgICAgIHRhc2tSZWY6IGRhdGFHcm91cC5maWVsZHNbdGFza1JlZlBvc2l0aW9uXSBhcyBUYXNrUmVmRmllbGRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGFza1JlZlBvc2l0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRHcm91cCA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogZGF0YUdyb3VwLnRpdGxlLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZGF0YUdyb3VwLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IGRhdGFHcm91cC5sYXlvdXQsXG4gICAgICAgICAgICAgICAgc3RyZXRjaDogZGF0YUdyb3VwLnN0cmV0Y2gsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBkYXRhR3JvdXAuZmllbGRzLnNsaWNlKDAsIHRhc2tSZWZQb3NpdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2tSZWZQb3NpdGlvbiAhPT0gZGF0YUdyb3VwLmZpZWxkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kR3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGRhdGFHcm91cC5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgbGF5b3V0OiBkYXRhR3JvdXAubGF5b3V0LFxuICAgICAgICAgICAgICAgIHN0cmV0Y2g6IGRhdGFHcm91cC5zdHJldGNoLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZGF0YUdyb3VwLmZpZWxkcy5zbGljZSh0YXNrUmVmUG9zaXRpb24gKyAxKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHQuZW5kR3JvdXAuZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgZi5sb2NhbExheW91dC55ID0gZi5sb2NhbExheW91dC55IC0gcmVzdWx0LnRhc2tSZWYubG9jYWxMYXlvdXQueSAtIDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkYXRhIGdyb3VwIHRoYXQgY29udGFpbnMgb25seSB0aGUgcGFzc2VkIHRhc2sgcmVmLlxuICAgICAqIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBuZXN0aW5nIGFuZCBwYXJlbnQgdGFzay9jYXNlIGFyZSBwcmVzZXJ2ZWQgZnJvbSB0aGUgcGFzc2VkIG9yaWdpbmFsIGRhdGEgZ3JvdXAuXG4gICAgICogQHBhcmFtIG9yaWdpbmFsRGF0YUdyb3VwIHNvdXJjZSBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgcGFyZW50IHRhc2svY2FzZVxuICAgICAqIEBwYXJhbSB0YXNrUmVmIHRoZSB0YXNrIHJlZiB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIG5ldyBkYXRhIGdyb3VwXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVEYXNoYm9hcmRUYXNrUmVmRGF0YUdyb3VwKG9yaWdpbmFsRGF0YUdyb3VwOiBEYXRhR3JvdXAsIHRhc2tSZWY6IFRhc2tSZWZGaWVsZCk6IERhdGFHcm91cCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZHM6IFt0YXNrUmVmXSxcbiAgICAgICAgICAgIGFsaWdubWVudDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RyZXRjaDogZmFsc2UsXG4gICAgICAgICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFyZW50VGFza0lkOiBvcmlnaW5hbERhdGFHcm91cC5wYXJlbnRUYXNrSWQsXG4gICAgICAgICAgICBwYXJlbnRUcmFuc2l0aW9uSWQ6IG9yaWdpbmFsRGF0YUdyb3VwLnBhcmVudFRyYW5zaXRpb25JZCxcbiAgICAgICAgICAgIHBhcmVudENhc2VJZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50Q2FzZUlkLFxuICAgICAgICAgICAgcGFyZW50VGFza1JlZklkOiBvcmlnaW5hbERhdGFHcm91cC5wYXJlbnRUYXNrUmVmSWQsXG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWw6IG9yaWdpbmFsRGF0YUdyb3VwLm5lc3RpbmdMZXZlbCxcbiAgICAgICAgICAgIGxheW91dDogb3JpZ2luYWxEYXRhR3JvdXAubGF5b3V0XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVzIGRhdGEgZ3JvdXBzIHRoYXQgcmVwcmVzZW50IGRhc2hib2FyZCB0aWxlcyxcbiAgICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgZGF0YSBncm91cCBhcnJheSBhbmQgcGFzc2VzIHRoZW0gb250byB0aGUgdGFzayByZWYgZmllbGQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByZXByb2Nlc3NlZERhdGFHcm91cHNcbiAgICAgKiBAcGFyYW0gcmF3RGF0YUdyb3Vwc1xuICAgICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGRhdGEgZ3JvdXAgb2JqZWN0cyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gZGFzaGJvYXJkIHRpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIGRhc2hib2FyZCB0YXNrIHJlZlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc0Rhc2hib2FyZFRhc2tSZWYocHJlcHJvY2Vzc2VkRGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPiwgcmF3RGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBkYXNoYm9hcmQgdGFzayByZWYgaW4gYSB0YXNrXG4gICAgICAgIGxldCBkYXNoYm9hcmRUYXNrUmVmRmllbGQ6IFRhc2tSZWZGaWVsZDtcbiAgICAgICAgbGV0IGRhc2hib2FyZFBhcmVudEluZm9ybWF0aW9uOiBQYXJlbnREYXRhR3JvdXBJbmZvcm1hdGlvbjtcbiAgICAgICAgZm9yIChjb25zdCBkZyBvZiBwcmVwcm9jZXNzZWREYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRnLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVGFza1JlZihmaWVsZCkgJiYgZmllbGQuY29tcG9uZW50Py5uYW1lID09PSBUYXNrUmVmQ29tcG9uZW50cy5EQVNIQk9BUkQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkID0gZmllbGQgYXMgVGFza1JlZkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFRhc2tJZDogZGcucGFyZW50VGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VHJhbnNpdGlvbklkOiBkZy5wYXJlbnRUcmFuc2l0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDYXNlSWQ6IGRnLnBhcmVudENhc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFRhc2tSZWZJZDogZGcucGFyZW50VGFza1JlZklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ0xldmVsOiBkZy5uZXN0aW5nTGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGFzaGJvYXJkVGFza1JlZkZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGFzaGJvYXJkVGFza1JlZkZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcigncHJlcHJvY2Vzc0Rhc2hib2FyZFRhc2tSZWYgbWV0aG9kIHdhcyBjYWxsZWQgb24gdGFzayBjb250ZW50IHdpdGhvdXQgZGFzaGJvYXJkIHRhc2sgcmVmcyEnKTtcbiAgICAgICAgICAgIHJldHVybiBwcmVwcm9jZXNzZWREYXRhR3JvdXBzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGlsZXMgPSBuZXcgTWFwPHN0cmluZywgVGFza1JlZkRhc2hib2FyZFRpbGU+KCk7XG5cbiAgICAgICAgLy8gVE9ETyByZXNvbHZlIHRyYW5zaXRpdmUgdGlsZSBjb250ZW50XG4gICAgICAgIGNvbnN0IG5vbkRhc2hib2FyZERhdGFHcm91cHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZyBvZiBwcmVwcm9jZXNzZWREYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAoZGcucGFyZW50VGFza1JlZklkICE9PSBkYXNoYm9hcmRUYXNrUmVmRmllbGQuc3RyaW5nSWQpIHtcbiAgICAgICAgICAgICAgICBub25EYXNoYm9hcmREYXRhR3JvdXBzLnB1c2goZGcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpbGVzLmhhcyhkZy5wYXJlbnRUYXNrSWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzLmdldChkZy5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgIHRpbGUuZGF0YUdyb3Vwcy5wdXNoKGRnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlsZXMuc2V0KGRnLnBhcmVudFRhc2tJZCwge2RhdGFHcm91cHM6IFtkZ119KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmRnIG9mIHJhd0RhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIGlmIChyZGcucGFyZW50VGFza0lkID09PSBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbi5wYXJlbnRUYXNrSWRcbiAgICAgICAgICAgICAgICAmJiByZGcucGFyZW50VHJhbnNpdGlvbklkID09PSBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbi5wYXJlbnRUcmFuc2l0aW9uSWRcbiAgICAgICAgICAgICAgICAmJiByZGcucGFyZW50Q2FzZUlkID09PSBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbi5wYXJlbnRDYXNlSWRcbiAgICAgICAgICAgICAgICAmJiByZGcucGFyZW50VGFza1JlZklkID09PSBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbi5wYXJlbnRUYXNrUmVmSWRcbiAgICAgICAgICAgICAgICAmJiByZGcubmVzdGluZ0xldmVsID09PSBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbi5uZXN0aW5nTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVkIG9mIHJkZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVkLnN0cmluZ0lkID09PSBUYXNrUmVmRGFzaGJvYXJkQ29uc3RhbnRzLkRBU0hCT0FSRF9DT0xTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRUYXNrUmVmRmllbGQuZGFzaGJvYXJkQ29scyA9IGZpbGVkLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVkLnN0cmluZ0lkID09PSBUYXNrUmVmRGFzaGJvYXJkQ29uc3RhbnRzLkRBU0hCT0FSRF9ST1dTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRUYXNrUmVmRmllbGQuZGFzaGJvYXJkUm93cyA9IGZpbGVkLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkLmRhc2hib2FyZFRpbGVzID0gQXJyYXkuZnJvbSh0aWxlcy52YWx1ZXMoKSk7XG4gICAgICAgIHJldHVybiBub25EYXNoYm9hcmREYXRhR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGdyaWQgbGF5b3V0LiBUaGUgcmVzdWx0aW5nIGxheW91dCBpcyBzYXZlZCBpbnRvIHRoZSBpbnB1dCBvYmplY3RzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGRhdGEgZ3JvdXAgdGhhdCBzaG91bGQgYmUgbGFpZCBvdXQgaW50byBhIGdyaWRcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVHcmlkTGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcyA9IFsuLi5kYXRhR3JvdXAuZmllbGRzXS5zb3J0KChmMSAsIGYyKSA9PiBmMS5sYXlvdXQueSA9PT0gZjIubGF5b3V0LnkgPyBmMS5sYXlvdXQueCAtIGYyLmxheW91dC54IDogZjEubGF5b3V0LnkgLSBmMi5sYXlvdXQueSlcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFGaWVsZC5sb2NhbExheW91dFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC54ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgJ2dyaWQnIGxheW91dCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBmaWVsZHMgKGZpZWxkIElEOiAke2RhdGFGaWVsZC5zdHJpbmdJZH0pYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChsb2NhbEdyaWQubGVuZ3RoIDwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnkgKyBkYXRhRmllbGQubG9jYWxMYXlvdXQucm93cykge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRFbGVtZW50ID0gc3ViZ3JpZC5hZGRGaWVsZChkYXRhRmllbGQsIHRoaXMuX2ZpZWxkQ29udmVydGVyLnJlc29sdmVUeXBlKGRhdGFGaWVsZCkpO1xuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC55LCBkYXRhRmllbGQubG9jYWxMYXlvdXQueCxcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQubG9jYWxMYXlvdXQuY29scywgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGxvY2FsR3JpZCwgZGF0YUdyb3VwLmxheW91dCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gobG9jYWxHcmlkUm93ID0+IHN1YmdyaWQuYWRkUm93KGxvY2FsR3JpZFJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGVtcHR5IHJvdyByZW1vdmFsIGFuZCBmaWVsZCBjb21wYWN0aW5nIHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXlvdXQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBsYXlvdXQgY29uZmlndXJhdGlvbiBvZiB0aGUgYXBwbGllZCBjb21wYWN0aW5nIHJ1bGVzXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBsYXlvdXQ6IERhdGFHcm91cExheW91dCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBoaWRlUm93cyA9IGxheW91dC5oaWRlRW1wdHlSb3dzID8/IHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzO1xuXG4gICAgICAgIGlmIChoaWRlUm93cyA9PT0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEwpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlSb3dzKGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsYXlvdXQuY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBDb21wYWN0LlVQOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdEZpZWxkc1VwKGdyaWQsIGhpZGVSb3dzLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGFueSBlbGVtZW50IGFzIGZhciBVUCBhcyBpdCBjYW4gZ28uIEVsZW1lbnRzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZSBzYW1lIHJvdyBtaWdodCBlbmQgdXAgaW4gZGlmZmVyZW50IHJvd3MuXG4gICAgICogUmVzdWx0aW5nIHRyYWlsaW5nIGVtcHR5IHJvd3MgYXJlIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0gaGlkZVJvd3MgY29uZmlndXJhdGlvbiBmb3IgZW1wdHkgcm93IHJlbW92YWwgZHVyaW5nIHRoZSBjb21wYWN0aW5nIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhY3RGaWVsZHNVcChncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgaGlkZVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3Jvd0luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHJvdy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbkluZGV4XSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZEVsZW1lbnRSb3dJbmRleCA9IHJvd0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgZm91bmRFbGVtZW50Um93SW5kZXggPCBncmlkLmxlbmd0aDsgZm91bmRFbGVtZW50Um93SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IDAgJiYgZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXggLSAxXSA9PT0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gdGhpcy5nZXRFbGVtZW50RGltZW5zaW9ucyhncmlkLCBjb2x1bW5JbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXgsIHN1YmdyaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcmVhRW1wdHkoZ3JpZCwgY29sdW1uSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZm91bmRFbGVtZW50Um93SW5kZXggLSByb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbZm91bmRFbGVtZW50Um93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCAnJywgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2UoZ3JpZCwgcm93SW5kZXgsIGNvbHVtbkluZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZWxlbWVudCwgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGVSb3dzICE9PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgdGhlIHJvd3MgcG90ZW50aWFsbHkgY2xlYXJlZCBieSBtb3ZpbmcgdGhlIGdyaWQgZWxlbWVudCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCwgZm91bmRFbGVtZW50Um93SW5kZXgsIGZvdW5kRWxlbWVudFJvd0luZGV4ICsgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBncmlkIHRoYXQgb25seSBjb250YWluIGVtcHR5IGVsZW1lbnRzIChhcmUgZW1wdHkpLiBUaGUgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBoYXZlIGl0J3MgZW1wdHkgcm93cyByZW1vdmVkXG4gICAgICogQHBhcmFtIGZpcnN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4gVXNlIDAgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBncmlkIHdpbGwgYmUgY2hlY2tlZCBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFJvdyB0aGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgcm93IHdoZXJlIHRoZSBjaGVja2luZyBzaG91bGQgZW5kLiBUaGUgcm93IHdpdGggdGhpcyBpbmRleCBpcyBub3QgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIHRoZSBgZmlyc3RSb3dgIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBgZmlyc3RSb3dgIGlzIHByb3ZpZGVkIG5vIGNoZWNrcyB3aWxsIGJlIHByZWZvcm1lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRW1wdHlSb3dzKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBmaXJzdFJvdyA9IDAsIGxhc3RSb3cgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgbGV0IGkgPSBmaXJzdFJvdztcbiAgICAgICAgd2hpbGUgKGkgPCBncmlkLmxlbmd0aCAmJiBpIDwgbGFzdFJvdykge1xuICAgICAgICAgICAgaWYgKGdyaWRbaV0uZXZlcnkoZWxlbWVudCA9PiBlbGVtZW50ID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBncmlkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZ3JpZCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIG9mIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudERpbWVuc2lvbnMoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbeV1beF07XG4gICAgICAgIGxldCB3aWR0aCA9IDE7XG4gICAgICAgIHdoaWxlICh4ICsgd2lkdGggPCBzdWJncmlkLmNvbHMgJiYgZ3JpZFt5XVt4ICsgd2lkdGhdID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWlnaHQgPSAxO1xuICAgICAgICB3aGlsZSAoeSArIGhlaWdodCA8IGdyaWQubGVuZ3RoICYmIGdyaWRbeSArIGhlaWdodF1beF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJlYSBpbiB0aGUgZ3JpZCBjb250YWlucyBubyBlbGVtZW50cywgb3Igbm90XG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdGVkIGFyZWFzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXN0ZWQgYXJlYVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0FyZWFFbXB0eShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5OyBpIDwgeSArIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geDsgaiA8IHggKyB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZmxvdyBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZCB1c2luZyB0aGUgZmxvdyBhbGdvcml0aG1cbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVGbG93TGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIHRoaXMuZmxvd0ZpZWxkcyhkYXRhR3JvdXAsIHN1YmdyaWQsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBUaGUgbGVnYWN5IGxheW91dCBmb3JjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIDQgYW5kIGxvZ3MgYSB3YXJuaW5nIGlmIHRoaXMgd2FzIG5vdCB0aGUgY2FzZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBsZWdhY3kgYWxnb3JpdGhtIHVzZWQgaW4gTkFFIHZlcnNpb25zIDwgNC4wLjBcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVMZWdhY3lMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgaWYgKHN1YmdyaWQuY29scyAhPT0gNCkge1xuICAgICAgICAgICAgc3ViZ3JpZC5jb2xzID0gNDtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKGBUYXNrIHdpdGggaWQgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZH0nIGhhcyBhIGRhdGEgZ3JvdXAgd2l0aCBsZWdhY3kgbGF5b3V0IHdpdGggYSBgXG4gICAgICAgICAgICAgICAgKyBgbm9uLWRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMuIElmIHlvdSB3YW50IHRvIHVzZSBhIGxheW91dCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucyB0aGFuIDIgdXNlIGEgZGlmZmVyZW50IGBcbiAgICAgICAgICAgICAgICArIGBsYXlvdXQgdHlwZSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF5cyBvdXQgdGhlIGZpZWxkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIGZyb20gdG9wIHRvIGJvdHRvbS4gSWYgdGhlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCB0aGUgYmxvY2sgb2YgZmxvd2VkIGZpZWxkcyBkb2Vzbid0IGZpdFxuICAgICAqIG5lYXRseSBpbnRvIHRoZSBjb2x1bW5zIChpZiB0aGUgd2lkdGggb2YgYSBzaW5nbGUgZmllbGQgaXMgbm90IGEgZGl2aXNvciBvZiBjb2x1bW4gY291bnQpLCB0aGVuIHRoZSBlbnRpcmUgYmxvY2sgb2YgZmllbGRzIGlzXG4gICAgICogbGVmdCBhbGlnbmVkLiBUaGUgbGFzdCByb3cgb2YgZmllbGRzIGlzIGFsaWduZWQgdG8gdGhlIGxlZnQsIGNlbnRlciBvciByaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBncm91cHMgcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxhc3Qgcm93IGNhbm5vdCBiZSBhbGlnbmVkIHRvIHRoZSBleGFjdCBjZW50ZXIgaXQgaXMgb2Zmc2V0IG9uZSBncmlkIHRpbGUgdG8gdGhlIGxlZnQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcGFyYW0gZmllbGRXaWR0aCB0aGUgbnVtYmVyIG9mIGdyaWQgdGlsZXMsIHRoYXQgc2hvdWxkIGJlIG9jY3VwaWVkIGJ5IGVhY2ggZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmxvd0ZpZWxkcyhkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCwgZmllbGRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1BlclJvdyA9IE1hdGguZmxvb3Ioc3ViZ3JpZC5jb2xzIC8gZmllbGRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFhQb3NpdGlvbiA9IGZpZWxkV2lkdGggKiAoZmllbGRzUGVyUm93IC0gMSk7XG5cbiAgICAgICAgbGV0IHhQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKChkYXRhRmllbGQsIGRhdGFGaWVsZENvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICBpZiAoZGF0YUdyb3VwLnN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbEdyaWQucHVzaCh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID09PSAwICYmIHRoaXMuaXNMYXN0Um93KGRhdGFGaWVsZENvdW50LCBkYXRhR3JvdXAsIGZpZWxkc1BlclJvdykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNJbkxhc3RSb3cgPSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAlIGZpZWxkc1BlclJvdztcbiAgICAgICAgICAgICAgICBjb25zdCByb3dXaWR0aCA9IG1heFhQb3NpdGlvbiArIGZpZWxkV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cC5hbGlnbm1lbnQgPT09IERhdGFHcm91cEFsaWdubWVudC5FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gcm93V2lkdGggLSBmaWVsZFdpZHRoICogZmllbGRzSW5MYXN0Um93O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkNFTlRFUikge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSBNYXRoLmZsb29yKChyb3dXaWR0aCAtIGZpZWxkc0luTGFzdFJvdyAqIGZpZWxkV2lkdGgpIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGxvY2FsR3JpZC5sZW5ndGggLSAxLCB4UG9zaXRpb24sIGZpZWxkV2lkdGgsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKTtcblxuICAgICAgICAgICAgeFBvc2l0aW9uICs9IGZpZWxkV2lkdGg7XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID4gbWF4WFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2FsR3JpZC5mb3JFYWNoKHJvdyA9PiBzdWJncmlkLmFkZFJvdyhyb3cpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJvd1xuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZpbGwgYWxsIGVsZW1lbnRzIGluIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmV3R3JpZFJvdyh3aWR0aDogbnVtYmVyLCBjb250ZW50ID0gJycpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5KHdpZHRoKS5maWxsKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFyZWEgY29udGFpbnMgdmFsdWVzIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB5IHRoZSAwIGJhc2VkIHJvdyBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB4IHRoZSAwIGJhc2VkIGNvbHVtbiBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbnRvIGV2ZXJ5IGNlbGwgb2YgdGhlIGdyaWQgaW5zaWRlIHRoZSBzcGVjaWZpZWQgYXJlYVxuICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gY2hlY2tPY2N1cGFudHMgd2hldGhlciB0aGUgZmlsbGVkIGFyZWEgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG90aGVyIGVsZW1lbnRzLlxuICAgICAqIElmIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGVsZW1lbnRzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHk6IG51bWJlciwgeDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLCBoZWlnaHQgPSAxLCBjaGVja09jY3VwYW50cyA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPY2N1cGFudHMgJiYgZ3JpZFtqXVtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGxhY2UgZWxlbWVudCAke3ZhbHVlfSBpbnRvIHRoZSBncmlkIGxheW91dCwgYmVjYXVzZSBpdCdzIHNwYWNlICh4OiAke2l9LCB5OiAke2p9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgZWxlbWVudCAoJHtncmlkW2pdW2ldfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3JpZFtqXVtpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50IHdpdGhpbiBpdHMgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGNoZWNrZWQgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBmaWVsZHNQZXJSb3cgdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBpcyByZXF1aXJlZCB0byBmaWxsIGFuIGVudGlyZSByb3dcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgd2l0aGluIHRoZSBsYXN0IHJvdyBvZiBlbGVtZW50cyBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGxhc3Qgcm93IGNvbnRhaW5zIGVub3VnaCBlbGVtZW50cyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzTGFzdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhR3JvdXA6IERhdGFHcm91cCwgZmllbGRzUGVyUm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgZmllbGRzUGVyUm93ID49IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBwcmV2aW91cyBjb250ZW50IGFuZCBwdXNoZXMgdGhlIG5ldyBjb250ZW50IGludG8gdGhlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBuZXcgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRlbnQ6IEFycmF5PFN1YmdyaWQ+ID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChzdWJncmlkID0+IHN1YmdyaWQuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlU3ViZ3JpZElkKGRhdGFHcm91cDogRGF0YUdyb3VwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGlkQmFzZTogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YUdyb3VwLnBhcmVudFRhc2tJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZEJhc2UgPSBbZGF0YUdyb3VwLnBhcmVudFRhc2tJZCwgZGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCwgZGF0YUdyb3VwLm5lc3RpbmdMZXZlbF0uam9pbignIycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRCYXNlID0gJ3Jvb3QnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGlkQmFzZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBpZCA9IGlkQmFzZSArIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5hZGQoaWQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlTdWJncmlkRm4gPSAoaW5kZXg6IG51bWJlciwgc3ViZ3JpZDogU3ViZ3JpZCkgPT4gc3ViZ3JpZC5zdWJncmlkSWQ7XG5cbiAgICBwdWJsaWMgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSA9PiB0aGlzLnRyYWNrQnlEYXRhZmllbGRzKGluZGV4LCBlbGVtZW50KTtcblxuICAgIHByb3RlY3RlZCB0cmFja0J5RGF0YWZpZWxkcyhpbmRleDogbnVtYmVyLCBlbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuQkxBTks6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5MT0FERVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctTC0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkRBVEFfR1JPVVBfVElUTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGUgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pdGVtLnN0cmluZ0lkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -14,9 +14,9 @@ export class AbstractToolbarComponent {
|
|
|
14
14
|
return this.translate.currentLang === lang;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
AbstractToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
18
|
-
AbstractToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
17
|
+
AbstractToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractToolbarComponent, deps: [{ token: i1.TranslateService }, { token: i2.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
18
|
+
AbstractToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractToolbarComponent, selector: "ncc-abstract-toolbar", inputs: { loggedUser: "loggedUser", appName: "appName", logoSrc: "logoSrc", logoAlt: "logoAlt" }, ngImport: i0, template: '', isInline: true });
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractToolbarComponent, decorators: [{
|
|
20
20
|
type: Component,
|
|
21
21
|
args: [{
|
|
22
22
|
selector: 'ncc-abstract-toolbar',
|
|
@@ -63,9 +63,9 @@ export class LanguageService {
|
|
|
63
63
|
return this._langChange$.asObservable();
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
LanguageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
67
|
-
LanguageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
68
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
66
|
+
LanguageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: LanguageService, deps: [{ token: i1.TranslateService }, { token: i2.UserPreferenceService }, { token: i3.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
67
|
+
LanguageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: LanguageService, providedIn: 'root' });
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: LanguageService, decorators: [{
|
|
69
69
|
type: Injectable,
|
|
70
70
|
args: [{
|
|
71
71
|
providedIn: 'root'
|
|
@@ -12,9 +12,9 @@ export class TranslateInterceptor {
|
|
|
12
12
|
return next.handle(req);
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
TranslateInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
16
|
-
TranslateInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
17
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
15
|
+
TranslateInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateInterceptor, deps: [{ token: i1.LanguageService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
16
|
+
TranslateInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateInterceptor });
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateInterceptor, decorators: [{
|
|
18
18
|
type: Injectable
|
|
19
19
|
}], ctorParameters: function () { return [{ type: i1.LanguageService }]; } });
|
|
20
20
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLWludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi90cmFuc2xhdGUvdHJhbnNsYXRlLWludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7OztBQUl6QyxNQUFNLE9BQU8sb0JBQW9CO0lBRTdCLFlBQW9CLE9BQXdCO1FBQXhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBQzVDLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUM5QyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNaLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzFFLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDOztrSEFWUSxvQkFBb0I7c0hBQXBCLG9CQUFvQjs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBIdHRwRXZlbnQsXG4gICAgSHR0cEhhbmRsZXIsXG4gICAgSHR0cEludGVyY2VwdG9yLFxuICAgIEh0dHBSZXF1ZXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMYW5ndWFnZVNlcnZpY2V9IGZyb20gJy4vbGFuZ3VhZ2Uuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZWxlY3Q6IExhbmd1YWdlU2VydmljZSkge1xuICAgIH1cblxuICAgIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgICAgICByZXEgPSByZXEuY2xvbmUoe1xuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMuc2V0KCdBY2NlcHQtTGFuZ3VhZ2UnLCB0aGlzLl9zZWxlY3QuZ2V0TGFuZ3VhZ2UoKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cbn1cblxuIl19
|
|
@@ -12,9 +12,9 @@ export function HttpLoaderFactory(http) {
|
|
|
12
12
|
}
|
|
13
13
|
export class TranslateLibModule {
|
|
14
14
|
}
|
|
15
|
-
TranslateLibModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
16
|
-
TranslateLibModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.
|
|
17
|
-
TranslateLibModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.
|
|
15
|
+
TranslateLibModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateLibModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
16
|
+
TranslateLibModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateLibModule, imports: [CommonModule, i1.TranslateModule], exports: [TranslateModule] });
|
|
17
|
+
TranslateLibModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateLibModule, providers: [
|
|
18
18
|
TranslateService,
|
|
19
19
|
TranslatePipe,
|
|
20
20
|
TranslateStore,
|
|
@@ -30,7 +30,7 @@ TranslateLibModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", vers
|
|
|
30
30
|
}
|
|
31
31
|
})
|
|
32
32
|
], TranslateModule] });
|
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TranslateLibModule, decorators: [{
|
|
34
34
|
type: NgModule,
|
|
35
35
|
args: [{
|
|
36
36
|
declarations: [],
|
|
@@ -35,9 +35,9 @@ export class AbstractUserCardComponent extends AbstractNavigationResizableDrawer
|
|
|
35
35
|
return this.user && this.user['avatar'] ? this.user['avatar'] : 'assets/default-user-avatar.png';
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
AbstractUserCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
39
|
-
AbstractUserCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.
|
|
40
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
38
|
+
AbstractUserCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractUserCardComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
39
|
+
AbstractUserCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractUserCardComponent, selector: "ncc-abstract-user-card", inputs: { user: "user", mode: "mode", tooltipPosition: "tooltipPosition", iconStyle: "iconStyle", link: "link" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractUserCardComponent, decorators: [{
|
|
41
41
|
type: Component,
|
|
42
42
|
args: [{
|
|
43
43
|
selector: 'ncc-abstract-user-card',
|
|
@@ -25,9 +25,9 @@ export class AbstractProfileComponent {
|
|
|
25
25
|
return this.user && this.user['avatar'] ? this.user['avatar'] : 'assets/default-user-avatar.png';
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
AbstractProfileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
29
|
-
AbstractProfileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
28
|
+
AbstractProfileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractProfileComponent, deps: [{ token: i1.UserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
29
|
+
AbstractProfileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractProfileComponent, selector: "ncc-abstract-profile", inputs: { user: "user" }, ngImport: i0, template: '', isInline: true });
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractProfileComponent, decorators: [{
|
|
31
31
|
type: Component,
|
|
32
32
|
args: [{
|
|
33
33
|
selector: 'ncc-abstract-profile',
|
|
@@ -11,9 +11,9 @@ export class UserComparatorService {
|
|
|
11
11
|
user.email.includes('anonymous') && this._userService.user.email.includes('anonymous');
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
UserComparatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
15
|
-
UserComparatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
16
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
14
|
+
UserComparatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: UserComparatorService, deps: [{ token: i1.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
15
|
+
UserComparatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: UserComparatorService, providedIn: 'root' });
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: UserComparatorService, decorators: [{
|
|
17
17
|
type: Injectable,
|
|
18
18
|
args: [{
|
|
19
19
|
providedIn: 'root'
|