@po-ui/ng-templates 6.0.0-rc.1 → 6.3.0
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/README.md +18 -18
- package/esm2020/lib/components/components.module.mjs +86 -86
- package/esm2020/lib/components/index.mjs +12 -12
- package/esm2020/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +17 -17
- package/esm2020/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +17 -17
- package/esm2020/lib/components/po-modal-password-recovery/index.mjs +8 -8
- package/esm2020/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +2 -2
- package/esm2020/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +119 -119
- package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +172 -172
- package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +31 -31
- package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +451 -451
- package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +29 -29
- package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +17 -17
- package/esm2020/lib/components/po-page-background/index.mjs +3 -3
- package/esm2020/lib/components/po-page-background/po-page-background.component.mjs +191 -191
- package/esm2020/lib/components/po-page-background/po-page-background.module.mjs +27 -27
- package/esm2020/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +17 -17
- package/esm2020/lib/components/po-page-blocked-user/index.mjs +8 -8
- package/esm2020/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +78 -78
- package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +170 -170
- package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +109 -109
- package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +104 -104
- package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +112 -112
- package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +29 -29
- package/esm2020/lib/components/po-page-change-password/index.mjs +7 -7
- package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +79 -79
- package/esm2020/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +186 -186
- package/esm2020/lib/components/po-page-change-password/po-page-change-password.component.mjs +423 -423
- package/esm2020/lib/components/po-page-change-password/po-page-change-password.module.mjs +30 -30
- package/esm2020/lib/components/po-page-change-password/po-page-change-password.service.mjs +17 -17
- package/esm2020/lib/components/po-page-dynamic-detail/index.mjs +10 -10
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +43 -43
- package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +462 -462
- package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +53 -53
- package/esm2020/lib/components/po-page-dynamic-edit/index.mjs +10 -10
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +43 -43
- package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +572 -572
- package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +59 -59
- package/esm2020/lib/components/po-page-dynamic-search/index.mjs +7 -7
- package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +134 -134
- package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +74 -74
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +260 -252
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +267 -267
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +54 -54
- package/esm2020/lib/components/po-page-dynamic-table/index.mjs +16 -16
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +104 -104
- package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +58 -58
- package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +63 -63
- package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +831 -803
- package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +52 -52
- package/esm2020/lib/components/po-page-job-scheduler/index.mjs +4 -4
- package/esm2020/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +80 -80
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +374 -374
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +15 -15
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +195 -195
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +21 -21
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +81 -81
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +195 -195
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +275 -275
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +72 -72
- package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +206 -206
- package/esm2020/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +15 -15
- package/esm2020/lib/components/po-page-login/index.mjs +8 -8
- package/esm2020/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +2 -2
- package/esm2020/lib/components/po-page-login/po-page-login-base.component.mjs +954 -954
- package/esm2020/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +139 -139
- package/esm2020/lib/components/po-page-login/po-page-login.component.mjs +487 -487
- package/esm2020/lib/components/po-page-login/po-page-login.module.mjs +31 -31
- package/esm2020/lib/components/po-page-login/po-page-login.service.mjs +31 -31
- package/esm2020/lib/index.mjs +4 -4
- package/esm2020/lib/po-templates.module.mjs +18 -18
- package/esm2020/lib/services/index.mjs +4 -4
- package/esm2020/lib/services/po-page-customization/index.mjs +4 -4
- package/esm2020/lib/services/po-page-customization/po-page-customization.module.mjs +24 -24
- package/esm2020/lib/services/po-page-customization/po-page-customization.service.mjs +85 -85
- package/esm2020/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +2 -2
- package/esm2020/lib/services/po-page-dynamic/index.mjs +3 -3
- package/esm2020/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +2 -2
- package/esm2020/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +24 -24
- package/esm2020/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +102 -102
- package/esm2020/lib/services/services.module.mjs +18 -18
- package/esm2020/lib/utils/util.mjs +352 -352
- package/esm2020/po-ui-ng-templates.mjs +4 -4
- package/esm2020/public-api.mjs +2 -2
- package/fesm2015/po-ui-ng-templates.mjs +9304 -9269
- package/fesm2015/po-ui-ng-templates.mjs.map +1 -1
- package/fesm2020/po-ui-ng-templates.mjs +8937 -8902
- package/fesm2020/po-ui-ng-templates.mjs.map +1 -1
- package/lib/components/components.module.d.ts +16 -16
- package/lib/components/index.d.ts +11 -11
- package/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.d.ts +15 -15
- package/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.d.ts +15 -15
- package/lib/components/po-modal-password-recovery/index.d.ts +7 -7
- package/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.d.ts +25 -25
- package/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.d.ts +6 -6
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +283 -283
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.d.ts +14 -14
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.d.ts +90 -90
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.d.ts +16 -16
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +13 -13
- package/lib/components/po-page-background/index.d.ts +2 -2
- package/lib/components/po-page-background/po-page-background.component.d.ts +54 -54
- package/lib/components/po-page-background/po-page-background.module.d.ts +16 -16
- package/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.d.ts +15 -15
- package/lib/components/po-page-blocked-user/index.d.ts +7 -7
- package/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.d.ts +15 -15
- package/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.d.ts +72 -72
- package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +146 -146
- package/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.d.ts +19 -19
- package/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.d.ts +26 -26
- package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +43 -43
- package/lib/components/po-page-blocked-user/po-page-blocked-user.module.d.ts +18 -18
- package/lib/components/po-page-change-password/index.d.ts +6 -6
- package/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.d.ts +30 -30
- package/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.d.ts +17 -17
- package/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.d.ts +13 -13
- package/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.d.ts +6 -6
- package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +233 -233
- package/lib/components/po-page-change-password/po-page-change-password.component.d.ts +93 -93
- package/lib/components/po-page-change-password/po-page-change-password.module.d.ts +17 -17
- package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +10 -10
- package/lib/components/po-page-dynamic-detail/index.d.ts +9 -9
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.d.ts +95 -95
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.d.ts +16 -16
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.d.ts +31 -31
- package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.d.ts +36 -36
- package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.d.ts +18 -18
- package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.d.ts +257 -257
- package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.d.ts +17 -17
- package/lib/components/po-page-dynamic-edit/index.d.ts +9 -9
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.d.ts +123 -123
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.d.ts +44 -44
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.d.ts +43 -43
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.d.ts +12 -12
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.d.ts +25 -25
- package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.d.ts +28 -28
- package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.d.ts +18 -18
- package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.d.ts +329 -329
- package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.d.ts +17 -17
- package/lib/components/po-page-dynamic-search/index.d.ts +6 -6
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +48 -48
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.d.ts +15 -15
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.d.ts +29 -29
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +184 -183
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.d.ts +14 -14
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.d.ts +21 -21
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.d.ts +59 -59
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +62 -62
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.d.ts +29 -29
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.d.ts +18 -18
- package/lib/components/po-page-dynamic-table/index.d.ts +15 -15
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.d.ts +196 -196
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.d.ts +21 -21
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.d.ts +29 -29
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.d.ts +22 -22
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.d.ts +39 -39
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +82 -82
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +91 -83
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.d.ts +49 -38
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.d.ts +18 -18
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.d.ts +31 -31
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.d.ts +91 -91
- package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +130 -130
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.d.ts +26 -26
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.d.ts +62 -62
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +314 -303
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.d.ts +19 -19
- package/lib/components/po-page-job-scheduler/index.d.ts +3 -3
- package/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.d.ts +14 -14
- package/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.d.ts +48 -48
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +176 -176
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +52 -52
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.d.ts +9 -9
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.d.ts +194 -194
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.d.ts +16 -16
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.d.ts +14 -14
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +36 -36
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.d.ts +116 -116
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.d.ts +13 -13
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.d.ts +32 -32
- package/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.d.ts +13 -13
- package/lib/components/po-page-login/index.d.ts +7 -7
- package/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.d.ts +72 -72
- package/lib/components/po-page-login/interfaces/po-page-login-literals.interface.d.ts +59 -59
- package/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.d.ts +30 -30
- package/lib/components/po-page-login/interfaces/po-page-login.interface.d.ts +15 -15
- package/lib/components/po-page-login/po-page-login-base.component.d.ts +663 -663
- package/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.d.ts +19 -19
- package/lib/components/po-page-login/po-page-login.component.d.ts +72 -72
- package/lib/components/po-page-login/po-page-login.module.d.ts +18 -18
- package/lib/components/po-page-login/po-page-login.service.d.ts +12 -12
- package/lib/index.d.ts +3 -3
- package/lib/po-templates.module.d.ts +8 -8
- package/lib/services/index.d.ts +3 -3
- package/lib/services/po-page-customization/index.d.ts +3 -3
- package/lib/services/po-page-customization/po-page-customization.module.d.ts +13 -13
- package/lib/services/po-page-customization/po-page-customization.service.d.ts +19 -19
- package/lib/services/po-page-customization/po-page-dynamic-options.interface.d.ts +8 -8
- package/lib/services/po-page-dynamic/index.d.ts +2 -2
- package/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.d.ts +4 -4
- package/lib/services/po-page-dynamic/po-page-dynamic.module.d.ts +13 -13
- package/lib/services/po-page-dynamic/po-page-dynamic.service.d.ts +31 -31
- package/lib/services/services.module.d.ts +8 -8
- package/lib/utils/util.d.ts +152 -152
- package/package.json +9 -6
- package/po-ui-ng-templates-6.3.0.tgz +0 -0
- package/po-ui-ng-templates.d.ts +5 -5
- package/public-api.d.ts +1 -1
- package/schematics/README.md +14 -14
- package/schematics/collection.json +50 -50
- package/schematics/ng-add/index.d.ts +8 -8
- package/schematics/ng-add/index.js +60 -60
- package/schematics/ng-add/index.spec.d.ts +1 -1
- package/schematics/ng-add/index.spec.js +90 -90
- package/schematics/ng-add/schema.json +7 -7
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-blocked-user/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-blocked-user/index.js +12 -12
- package/schematics/ng-generate/po-page-blocked-user/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-blocked-user/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-blocked-user/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-blocked-user/schema.js +2 -2
- package/schematics/ng-generate/po-page-blocked-user/schema.json +67 -67
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-change-password/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-change-password/index.js +12 -12
- package/schematics/ng-generate/po-page-change-password/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-change-password/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-change-password/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-change-password/schema.js +2 -2
- package/schematics/ng-generate/po-page-change-password/schema.json +67 -67
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +23 -23
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-dynamic-detail/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-dynamic-detail/index.js +12 -12
- package/schematics/ng-generate/po-page-dynamic-detail/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-dynamic-detail/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-dynamic-detail/schema.js +2 -2
- package/schematics/ng-generate/po-page-dynamic-detail/schema.json +67 -67
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +23 -23
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-dynamic-edit/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-dynamic-edit/index.js +12 -12
- package/schematics/ng-generate/po-page-dynamic-edit/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-dynamic-edit/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-dynamic-edit/schema.js +2 -2
- package/schematics/ng-generate/po-page-dynamic-edit/schema.json +67 -67
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +28 -28
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-dynamic-search/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-dynamic-search/index.js +12 -12
- package/schematics/ng-generate/po-page-dynamic-search/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-dynamic-search/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-dynamic-search/schema.js +2 -2
- package/schematics/ng-generate/po-page-dynamic-search/schema.json +67 -67
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +21 -21
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-dynamic-table/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-dynamic-table/index.js +12 -12
- package/schematics/ng-generate/po-page-dynamic-table/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-dynamic-table/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-dynamic-table/schema.js +2 -2
- package/schematics/ng-generate/po-page-dynamic-table/schema.json +67 -67
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +3 -3
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +17 -17
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-job-scheduler/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-job-scheduler/index.js +12 -12
- package/schematics/ng-generate/po-page-job-scheduler/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-job-scheduler/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-job-scheduler/schema.js +2 -2
- package/schematics/ng-generate/po-page-job-scheduler/schema.json +67 -67
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
- package/schematics/ng-generate/po-page-login/index.d.ts +4 -4
- package/schematics/ng-generate/po-page-login/index.js +12 -12
- package/schematics/ng-generate/po-page-login/index.spec.d.ts +1 -1
- package/schematics/ng-generate/po-page-login/index.spec.js +120 -120
- package/schematics/ng-generate/po-page-login/schema.d.ts +3 -3
- package/schematics/ng-generate/po-page-login/schema.js +2 -2
- package/schematics/ng-generate/po-page-login/schema.json +67 -67
- package/po-ui-ng-templates-6.0.0-rc.1.tgz +0 -0
|
@@ -1,954 +1,954 @@
|
|
|
1
|
-
import { EventEmitter, Input, Output, Directive } from '@angular/core';
|
|
2
|
-
import { convertToBoolean, convertToInt, getShortBrowserLanguage, isExternalLink, isTypeof } from './../../utils/util';
|
|
3
|
-
import { poLocaleDefault, poLanguageDefault } from '@po-ui/ng-components';
|
|
4
|
-
import { PoPageLoginAuthenticationType } from './enums/po-page-login-authentication-type.enum';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./po-page-login.service";
|
|
7
|
-
import * as i2 from "@angular/router";
|
|
8
|
-
import * as i3 from "@po-ui/ng-components";
|
|
9
|
-
const poPageLoginContentMaxLength = 40;
|
|
10
|
-
export const poPageLoginLiteralsDefault = {
|
|
11
|
-
en: {
|
|
12
|
-
title: 'Welcome',
|
|
13
|
-
loginErrorPattern: 'Invalid Login',
|
|
14
|
-
loginHint: `Your login user was given to you at your first day.
|
|
15
|
-
If you don't have this information contact support`,
|
|
16
|
-
loginPlaceholder: 'Insert your e-mail',
|
|
17
|
-
passwordErrorPattern: 'Invalid Password',
|
|
18
|
-
passwordPlaceholder: 'Insert your password',
|
|
19
|
-
customFieldErrorPattern: 'Invalid value',
|
|
20
|
-
customFieldPlaceholder: 'Please enter a value',
|
|
21
|
-
rememberUser: 'Automatic login',
|
|
22
|
-
rememberUserHint: 'You can disable this option in system configuration',
|
|
23
|
-
submitLabel: 'Enter',
|
|
24
|
-
submittedLabel: 'Loading...',
|
|
25
|
-
forgotPassword: 'Forgot your Password?',
|
|
26
|
-
highlightInfo: '',
|
|
27
|
-
registerUrl: 'New register',
|
|
28
|
-
titlePopover: 'Oops!',
|
|
29
|
-
forgotYourPassword: 'Forgot your password?',
|
|
30
|
-
ifYouTryHarder: 'If you try ',
|
|
31
|
-
attempts: '{0} more time(s) ',
|
|
32
|
-
yourUserWillBeBlocked: 'without success your user will be blocked and you will be left 24 hours without being able to access :(',
|
|
33
|
-
createANewPasswordNow: 'Better create a new password now! You will be able to log into the system right away.',
|
|
34
|
-
iForgotMyPassword: 'I forgot my password',
|
|
35
|
-
welcome: 'Welcome',
|
|
36
|
-
support: 'Support'
|
|
37
|
-
},
|
|
38
|
-
es: {
|
|
39
|
-
title: 'Bienvenido',
|
|
40
|
-
loginErrorPattern: 'Login inválido',
|
|
41
|
-
loginHint: `Su usuario ha sido entregado para usted en su primer día.
|
|
42
|
-
Si no tiene esta información, póngase en contacto con el soporte técnico`,
|
|
43
|
-
loginPlaceholder: 'Inserte su e-mail',
|
|
44
|
-
passwordErrorPattern: 'Contraseña inválida',
|
|
45
|
-
passwordPlaceholder: 'Inserte su contraseña',
|
|
46
|
-
customFieldErrorPattern: 'Valor no válido.',
|
|
47
|
-
customFieldPlaceholder: 'Por favor introduzca un valor',
|
|
48
|
-
rememberUser: 'Inicio de sesión automáticamente',
|
|
49
|
-
rememberUserHint: 'Puede deshabilitar esta opción en el menú del sistema.',
|
|
50
|
-
submitLabel: 'Entrar',
|
|
51
|
-
submittedLabel: 'Cargando...',
|
|
52
|
-
forgotPassword: 'Olvidaste tu contraseña?',
|
|
53
|
-
highlightInfo: '',
|
|
54
|
-
registerUrl: 'Nuevo registro',
|
|
55
|
-
titlePopover: 'Opa!',
|
|
56
|
-
forgotYourPassword: 'Olvidaste tu contraseña?',
|
|
57
|
-
ifYouTryHarder: 'Si intenta más ',
|
|
58
|
-
attempts: '{0} vez/veces ',
|
|
59
|
-
yourUserWillBeBlocked: 'sin éxito su usuario sera bloqueado y usted vás permanecer 24 horas sin poder acceder a :(',
|
|
60
|
-
createANewPasswordNow: '¡Mejor crear una nueva contraseña ahora! Usted podrá entrar en el sistema inmediatamente después.',
|
|
61
|
-
iForgotMyPassword: 'Olvide mi contraseña',
|
|
62
|
-
welcome: 'Bienvenido',
|
|
63
|
-
support: 'Soporte'
|
|
64
|
-
},
|
|
65
|
-
pt: {
|
|
66
|
-
title: 'Bem-vindo',
|
|
67
|
-
loginErrorPattern: 'Login inválido',
|
|
68
|
-
loginHint: `Seu usuário foi entregue a você no seu primeiro dia.
|
|
69
|
-
Caso não tenha mais essa informação contacte o suporte`,
|
|
70
|
-
loginPlaceholder: 'Insira seu e-mail',
|
|
71
|
-
passwordErrorPattern: 'Senha inválida',
|
|
72
|
-
passwordPlaceholder: 'Insira sua senha',
|
|
73
|
-
customFieldErrorPattern: 'Valor inválido.',
|
|
74
|
-
customFieldPlaceholder: 'Por favor insira um valor',
|
|
75
|
-
rememberUser: 'Logar automaticamente',
|
|
76
|
-
rememberUserHint: 'Você pode desabilitar essa opção no menu do sistema',
|
|
77
|
-
submitLabel: 'Entrar',
|
|
78
|
-
submittedLabel: 'Carregando...',
|
|
79
|
-
forgotPassword: 'Esqueceu sua senha?',
|
|
80
|
-
highlightInfo: '',
|
|
81
|
-
registerUrl: 'Novo registro',
|
|
82
|
-
titlePopover: 'Opa!',
|
|
83
|
-
forgotYourPassword: 'Esqueceu sua senha?',
|
|
84
|
-
ifYouTryHarder: 'Se tentar mais ',
|
|
85
|
-
attempts: '{0} vez(es) ',
|
|
86
|
-
yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :(',
|
|
87
|
-
createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
|
|
88
|
-
iForgotMyPassword: 'Esqueci minha senha',
|
|
89
|
-
welcome: 'Boas-vindas',
|
|
90
|
-
support: 'Suporte'
|
|
91
|
-
},
|
|
92
|
-
ru: {
|
|
93
|
-
title: 'Добро пожаловать!',
|
|
94
|
-
loginErrorPattern: 'Неверный логин',
|
|
95
|
-
loginHint: `Ваш логин был предоставлен вам в первый день.
|
|
96
|
-
Если у вас нет этой информации, обратитесь в службу поддержки`,
|
|
97
|
-
loginPlaceholder: 'Вставьте свой адрес электронной почты',
|
|
98
|
-
passwordErrorPattern: 'Неверный пароль',
|
|
99
|
-
passwordPlaceholder: 'Введите свой пароль',
|
|
100
|
-
customFieldErrorPattern: 'Неверное значение.',
|
|
101
|
-
customFieldPlaceholder: 'Пожалуйста, введите значение',
|
|
102
|
-
rememberUser: 'Автоматический вход',
|
|
103
|
-
rememberUserHint: 'Вы можете отключить эту опцию в конфигурации системы',
|
|
104
|
-
submitLabel: 'Войти',
|
|
105
|
-
submittedLabel: '3агрузка...',
|
|
106
|
-
forgotPassword: 'Забыли пароль?',
|
|
107
|
-
highlightInfo: '',
|
|
108
|
-
registerUrl: 'Новый регистр',
|
|
109
|
-
titlePopover: 'Ой!',
|
|
110
|
-
forgotYourPassword: 'Забыли пароль?',
|
|
111
|
-
ifYouTryHarder: 'Если вы безуспешно попытаетесь войти еще ',
|
|
112
|
-
attempts: '{0} раз(а) ',
|
|
113
|
-
yourUserWillBeBlocked: 'Ваш пользователь будет заблокирован, и Вы останетесь на 24 часа без возможности доступа :(',
|
|
114
|
-
createANewPasswordNow: 'Лучше создайте новый пароль сейчас! Вы сможете сразу войти в систему.',
|
|
115
|
-
iForgotMyPassword: 'Я забыл свой пароль',
|
|
116
|
-
welcome: 'добро пожаловать',
|
|
117
|
-
support: 'Поддержка'
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
export const poPageLoginLiteralIn = {
|
|
121
|
-
en: 'in',
|
|
122
|
-
es: 'en',
|
|
123
|
-
pt: 'em',
|
|
124
|
-
ru: 'в'
|
|
125
|
-
};
|
|
126
|
-
/**
|
|
127
|
-
* @description
|
|
128
|
-
*
|
|
129
|
-
* O componente `po-page-login` é utilizado como template para tela de login.
|
|
130
|
-
* Com ele é possível definirmos valores para usuário, senha e definir ações para recuperação de senha e gravação de dados do usuário.
|
|
131
|
-
* Também é possível inserir uma imagem em conjunto com um texto de destaque.
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* A propriedade `p-authentication-url` automatiza a rotina do componente e simplifica o processo para autenticação do usuário, bastando
|
|
135
|
-
* definir uma url para requisição da autenticação. A flexibilidade e praticidade podem chegar a um nível em que o desenvolvimento
|
|
136
|
-
* da aplicação no *client side* é desprovida de qualquer código-fonte relacionado à rotina de login de usuário.
|
|
137
|
-
* Seu detalhamento para uso pode ser visto logo abaixo em *propriedades*.
|
|
138
|
-
* Caso julgue necessário, pode-se também definir manualmente a rotina do componente.
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* Para que as imagens sejam exibidas corretamente, é necessário incluir o caminho delas ao projeto. Para isso, edite
|
|
142
|
-
* o *assets* no arquivo **angular.json** da aplicação na seguinte ordem:
|
|
143
|
-
* ```
|
|
144
|
-
* "assets": [
|
|
145
|
-
* "src/assets",
|
|
146
|
-
* "src/favicon.ico",
|
|
147
|
-
* {
|
|
148
|
-
* "glob": "**\/*",
|
|
149
|
-
* "input": "node_modules/@po-ui/style/images",
|
|
150
|
-
* "output": "assets/images"
|
|
151
|
-
* }
|
|
152
|
-
* ]
|
|
153
|
-
* ```
|
|
154
|
-
*/
|
|
155
|
-
export class PoPageLoginBaseComponent {
|
|
156
|
-
constructor(loginService, router, poLanguageService) {
|
|
157
|
-
this.loginService = loginService;
|
|
158
|
-
this.router = router;
|
|
159
|
-
this.poLanguageService = poLanguageService;
|
|
160
|
-
/**
|
|
161
|
-
* @optional
|
|
162
|
-
*
|
|
163
|
-
* @description
|
|
164
|
-
*
|
|
165
|
-
* Evento disparado quando o usuário alterar o input do campo login.
|
|
166
|
-
*
|
|
167
|
-
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
168
|
-
*
|
|
169
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
170
|
-
*/
|
|
171
|
-
this.loginChange = new EventEmitter();
|
|
172
|
-
/**
|
|
173
|
-
* Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
|
|
174
|
-
*
|
|
175
|
-
* Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
|
|
176
|
-
*
|
|
177
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
|
|
178
|
-
*
|
|
179
|
-
* > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
|
|
180
|
-
*/
|
|
181
|
-
this.loginSubmit = new EventEmitter();
|
|
182
|
-
/**
|
|
183
|
-
* @optional
|
|
184
|
-
*
|
|
185
|
-
* @description
|
|
186
|
-
*
|
|
187
|
-
* Evento disparado quando o usuário alterar o input do campo password.
|
|
188
|
-
*
|
|
189
|
-
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
190
|
-
*
|
|
191
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
192
|
-
*/
|
|
193
|
-
this.passwordChange = new EventEmitter();
|
|
194
|
-
/**
|
|
195
|
-
* @optional
|
|
196
|
-
*
|
|
197
|
-
* @description
|
|
198
|
-
*
|
|
199
|
-
* Evento disparado quando o usuário alterar o idioma da página.
|
|
200
|
-
*
|
|
201
|
-
* Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
|
|
202
|
-
*
|
|
203
|
-
*/
|
|
204
|
-
this.languageChange = new EventEmitter();
|
|
205
|
-
this.allLoginErrors = [];
|
|
206
|
-
this.allPasswordErrors = [];
|
|
207
|
-
this.rememberUser = false;
|
|
208
|
-
this.showExceededAttemptsWarning = false;
|
|
209
|
-
this._authenticationType = PoPageLoginAuthenticationType.Basic;
|
|
210
|
-
this._hideRememberUser = false;
|
|
211
|
-
this._loading = false;
|
|
212
|
-
this._loginErrors = [];
|
|
213
|
-
this._passwordErrors = [];
|
|
214
|
-
this.selectedLanguage = this.poLanguageService.getShortLanguage();
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* @optional
|
|
218
|
-
*
|
|
219
|
-
* @description
|
|
220
|
-
*
|
|
221
|
-
* Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
|
|
222
|
-
* os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
|
|
223
|
-
*
|
|
224
|
-
* Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
|
|
225
|
-
* através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
|
|
226
|
-
* ou `po-select` para valores fixos.
|
|
227
|
-
*
|
|
228
|
-
* Abaixo seguem os exemplos de cada tipo de campo.
|
|
229
|
-
*
|
|
230
|
-
* `po-input`:
|
|
231
|
-
*
|
|
232
|
-
* ```
|
|
233
|
-
* {
|
|
234
|
-
* property: 'domain',
|
|
235
|
-
* value: 'jv01',
|
|
236
|
-
* placeholder: 'Enter your domain',
|
|
237
|
-
* pattern: '[a-z]',
|
|
238
|
-
* errorPattern: 'Invalid value'
|
|
239
|
-
* }
|
|
240
|
-
* ```
|
|
241
|
-
*
|
|
242
|
-
* `po-combo`:
|
|
243
|
-
*
|
|
244
|
-
* ```
|
|
245
|
-
* {
|
|
246
|
-
* property: 'domain',
|
|
247
|
-
* value: 'jv01',
|
|
248
|
-
* placeholder: 'Enter your domain',
|
|
249
|
-
* url: 'https://po-ui.io/sample/api/comboOption/domains',
|
|
250
|
-
* fieldValue: 'nickname'
|
|
251
|
-
* }
|
|
252
|
-
* ```
|
|
253
|
-
*
|
|
254
|
-
* `po-select`:
|
|
255
|
-
*
|
|
256
|
-
* ```
|
|
257
|
-
* {
|
|
258
|
-
* property: 'domain',
|
|
259
|
-
* value: 'jv01',
|
|
260
|
-
* placeholder: 'Enter your domain',
|
|
261
|
-
* options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
|
|
262
|
-
* }
|
|
263
|
-
* ```
|
|
264
|
-
*
|
|
265
|
-
* Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
|
|
266
|
-
* utilizando o options.
|
|
267
|
-
*
|
|
268
|
-
*/
|
|
269
|
-
set customField(value) {
|
|
270
|
-
if (value) {
|
|
271
|
-
if (isTypeof(value, 'string')) {
|
|
272
|
-
this.customFieldType = 'input';
|
|
273
|
-
this._customField = value;
|
|
274
|
-
this.customFieldObject = this.getDefaultCustomFieldObject(value);
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
|
|
278
|
-
this._customField = value;
|
|
279
|
-
this.customFieldObject = value;
|
|
280
|
-
if (!this.customFieldObject.options && !this.customFieldObject.url) {
|
|
281
|
-
this.customFieldType = 'input';
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
|
|
285
|
-
}
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
this._customField = undefined;
|
|
290
|
-
this.customFieldObject = undefined;
|
|
291
|
-
}
|
|
292
|
-
get customField() {
|
|
293
|
-
return this._customField;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* @optional
|
|
297
|
-
*
|
|
298
|
-
* @description
|
|
299
|
-
*
|
|
300
|
-
* Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
|
|
301
|
-
*/
|
|
302
|
-
set contactEmail(value) {
|
|
303
|
-
this._contactEmail = value;
|
|
304
|
-
}
|
|
305
|
-
get contactEmail() {
|
|
306
|
-
return this._contactEmail;
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* @optional
|
|
310
|
-
*
|
|
311
|
-
* @description
|
|
312
|
-
*
|
|
313
|
-
* Texto customizado que fica entre a logo e a mensagem de boas-vindas.
|
|
314
|
-
*/
|
|
315
|
-
set productName(value) {
|
|
316
|
-
this._productName = value;
|
|
317
|
-
}
|
|
318
|
-
get productName() {
|
|
319
|
-
return this._productName;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* @optional
|
|
323
|
-
*
|
|
324
|
-
* @description
|
|
325
|
-
* Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
|
|
326
|
-
*
|
|
327
|
-
* > Essa propriedade limita o texto em 40 caracteres.
|
|
328
|
-
*/
|
|
329
|
-
set environment(environment) {
|
|
330
|
-
if (environment && environment.length > poPageLoginContentMaxLength) {
|
|
331
|
-
this._environment = environment.substring(0, poPageLoginContentMaxLength);
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
this._environment = environment;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
get environment() {
|
|
338
|
-
return this._environment;
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* @optional
|
|
342
|
-
*
|
|
343
|
-
* @description
|
|
344
|
-
* Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
|
|
345
|
-
* O aviso será exibido somente se a quantidade for maior que zero.
|
|
346
|
-
*
|
|
347
|
-
* > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
|
|
348
|
-
* para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
|
|
349
|
-
*
|
|
350
|
-
* @default `0`
|
|
351
|
-
*/
|
|
352
|
-
set exceededAttemptsWarning(value) {
|
|
353
|
-
this._exceededAttemptsWarning = convertToInt(value);
|
|
354
|
-
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
355
|
-
}
|
|
356
|
-
get exceededAttemptsWarning() {
|
|
357
|
-
return this._exceededAttemptsWarning;
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* @optional
|
|
361
|
-
*
|
|
362
|
-
* @description
|
|
363
|
-
*
|
|
364
|
-
* Esconde a função "Lembrar usuário" do formulário de login.
|
|
365
|
-
*
|
|
366
|
-
* Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
|
|
367
|
-
* `false`.
|
|
368
|
-
*
|
|
369
|
-
* > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
|
|
370
|
-
*
|
|
371
|
-
* @default `false`
|
|
372
|
-
*/
|
|
373
|
-
set hideRememberUser(value) {
|
|
374
|
-
this._hideRememberUser = value === '' ? true : convertToBoolean(value);
|
|
375
|
-
if (this._hideRememberUser) {
|
|
376
|
-
this.rememberUser = false;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
get hideRememberUser() {
|
|
380
|
-
return this._hideRememberUser;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* @optional
|
|
384
|
-
*
|
|
385
|
-
* @description
|
|
386
|
-
*
|
|
387
|
-
* Objeto com as literais usadas no `po-page-login`.
|
|
388
|
-
*
|
|
389
|
-
* Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
|
|
390
|
-
*
|
|
391
|
-
* ```
|
|
392
|
-
* const customLiterals: PoPageLoginLiterals = {
|
|
393
|
-
* attempts: '{0} vez(es) ',
|
|
394
|
-
* createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
|
|
395
|
-
* forgotPassword: 'Esqueceu sua senha?',
|
|
396
|
-
* forgotYourPassword: 'Esqueceu sua senha?',
|
|
397
|
-
* highlightInfo: '',
|
|
398
|
-
* iForgotMyPassword: 'Esqueci minha senha',
|
|
399
|
-
* ifYouTryHarder: 'Se tentar mais ',
|
|
400
|
-
* welcome: 'Boas-vindas',
|
|
401
|
-
* loginErrorPattern: 'Login obrigatório',
|
|
402
|
-
* loginHint: 'Caso não possua usuário entre em contato com o suporte',
|
|
403
|
-
* loginLabel: 'Insira seu usuário',
|
|
404
|
-
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
405
|
-
* passwordErrorPattern: 'Senha obrigatória',
|
|
406
|
-
* passwordLabel: 'Insira sua senha',
|
|
407
|
-
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
408
|
-
* customFieldErrorPattern: 'Campo customizado inválido',
|
|
409
|
-
* customFieldPlaceholder: 'Por favor insira um valor',
|
|
410
|
-
* registerUrl: 'Novo registro',
|
|
411
|
-
* rememberUser: 'Lembrar usuário',
|
|
412
|
-
* rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
|
|
413
|
-
* submitLabel: 'Acessar sistema',
|
|
414
|
-
* submittedLabel: 'Carregando...',
|
|
415
|
-
* titlePopover: 'Opa!',
|
|
416
|
-
* yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
|
|
417
|
-
* };
|
|
418
|
-
* ```
|
|
419
|
-
*
|
|
420
|
-
* Ou passando apenas as literais que deseja customizar:
|
|
421
|
-
*
|
|
422
|
-
* ```
|
|
423
|
-
* const customLiterals: PoPageLoginLiterals = {
|
|
424
|
-
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
425
|
-
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
426
|
-
* submitLabel: 'Acessar sistema'
|
|
427
|
-
* };
|
|
428
|
-
* ```
|
|
429
|
-
*
|
|
430
|
-
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
|
|
431
|
-
*
|
|
432
|
-
* ```
|
|
433
|
-
* <po-page-login
|
|
434
|
-
* [p-literals]="customLiterals">
|
|
435
|
-
* </po-page-login>
|
|
436
|
-
* ```
|
|
437
|
-
*
|
|
438
|
-
* > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
|
|
439
|
-
* > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
|
|
440
|
-
* nesse caso, há também a opção do idioma russo.
|
|
441
|
-
*/
|
|
442
|
-
set literals(value) {
|
|
443
|
-
this._literals = value;
|
|
444
|
-
}
|
|
445
|
-
get literals() {
|
|
446
|
-
return this._literals;
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* @optional
|
|
450
|
-
*
|
|
451
|
-
* @description
|
|
452
|
-
*
|
|
453
|
-
* Habilita um estado de carregamento ao botão de *login*.
|
|
454
|
-
*
|
|
455
|
-
* > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
|
|
456
|
-
*
|
|
457
|
-
* @default `false`
|
|
458
|
-
*/
|
|
459
|
-
set loading(value) {
|
|
460
|
-
this._loading = convertToBoolean(value);
|
|
461
|
-
}
|
|
462
|
-
get loading() {
|
|
463
|
-
return this._loading;
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* @optional
|
|
467
|
-
*
|
|
468
|
-
* @description
|
|
469
|
-
*
|
|
470
|
-
* Valor do modelo do campo de login.
|
|
471
|
-
*/
|
|
472
|
-
set login(value) {
|
|
473
|
-
this._login = value;
|
|
474
|
-
if (!this.authenticationUrl) {
|
|
475
|
-
this.loginChange.emit(this._login);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
get login() {
|
|
479
|
-
return this._login;
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* @optional
|
|
483
|
-
*
|
|
484
|
-
* @description
|
|
485
|
-
*
|
|
486
|
-
* Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
|
|
487
|
-
*/
|
|
488
|
-
set loginErrors(value) {
|
|
489
|
-
this._loginErrors = value || [];
|
|
490
|
-
this.setLoginErrors(this._loginErrors);
|
|
491
|
-
}
|
|
492
|
-
get loginErrors() {
|
|
493
|
-
return this._loginErrors;
|
|
494
|
-
}
|
|
495
|
-
/**
|
|
496
|
-
* @optional
|
|
497
|
-
*
|
|
498
|
-
* @description
|
|
499
|
-
*
|
|
500
|
-
* Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
|
|
501
|
-
*/
|
|
502
|
-
set passwordErrors(value) {
|
|
503
|
-
this._passwordErrors = value || [];
|
|
504
|
-
this.setPasswordErrors(this._passwordErrors);
|
|
505
|
-
}
|
|
506
|
-
get passwordErrors() {
|
|
507
|
-
return this._passwordErrors;
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* @optional
|
|
511
|
-
*
|
|
512
|
-
* @description
|
|
513
|
-
*
|
|
514
|
-
* Exibe um link abaixo do formulário de login para que os usuários da aplicação façam a recuperação dos dados de autenticação.
|
|
515
|
-
*
|
|
516
|
-
* A propriedade aceita os seguintes tipos:
|
|
517
|
-
*
|
|
518
|
-
* - **String**: informe uma url externa ou uma rota válida;
|
|
519
|
-
* - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
|
|
520
|
-
* ```
|
|
521
|
-
* <po-page-login>
|
|
522
|
-
* [recovery]="this.myRecovery.bind(this)">
|
|
523
|
-
* </po-page-login>
|
|
524
|
-
* ```
|
|
525
|
-
*
|
|
526
|
-
* - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
|
|
527
|
-
* O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
|
|
528
|
-
* **email** para contato e **máscara** do campo de telefone.
|
|
529
|
-
*/
|
|
530
|
-
set recovery(value) {
|
|
531
|
-
this._recovery = value;
|
|
532
|
-
}
|
|
533
|
-
get recovery() {
|
|
534
|
-
return this._recovery;
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* @optional
|
|
538
|
-
*
|
|
539
|
-
* @description
|
|
540
|
-
*
|
|
541
|
-
* Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
|
|
542
|
-
* forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
|
|
543
|
-
*
|
|
544
|
-
* Exemplos de valores válidos:
|
|
545
|
-
* - **local**: `/home`
|
|
546
|
-
* - **url externa**: `https://po-ui.io`
|
|
547
|
-
*
|
|
548
|
-
* > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
|
|
549
|
-
*/
|
|
550
|
-
set registerUrl(value) {
|
|
551
|
-
this._registerUrl = isTypeof(value, 'string') ? value : undefined;
|
|
552
|
-
}
|
|
553
|
-
get registerUrl() {
|
|
554
|
-
return this._registerUrl;
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* @optional
|
|
558
|
-
*
|
|
559
|
-
* @description
|
|
560
|
-
*
|
|
561
|
-
* Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
|
|
562
|
-
*
|
|
563
|
-
* > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
|
|
564
|
-
*
|
|
565
|
-
* ```
|
|
566
|
-
* headers {
|
|
567
|
-
* Authorization: Basic base64(login:password)
|
|
568
|
-
* }
|
|
569
|
-
*
|
|
570
|
-
* body {
|
|
571
|
-
* rememberUser: rememberUser
|
|
572
|
-
* }
|
|
573
|
-
* ```
|
|
574
|
-
*
|
|
575
|
-
* > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
|
|
576
|
-
*
|
|
577
|
-
* ```
|
|
578
|
-
* body {
|
|
579
|
-
* login: login,
|
|
580
|
-
* password: base64(password),
|
|
581
|
-
* rememberUser: rememberUser
|
|
582
|
-
* }
|
|
583
|
-
* ```
|
|
584
|
-
*
|
|
585
|
-
* @default `PoPageLoginAuthenticationType.Basic`
|
|
586
|
-
*/
|
|
587
|
-
set authenticationType(value) {
|
|
588
|
-
this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
|
|
589
|
-
? value
|
|
590
|
-
: PoPageLoginAuthenticationType.Basic;
|
|
591
|
-
}
|
|
592
|
-
get authenticationType() {
|
|
593
|
-
return this._authenticationType;
|
|
594
|
-
}
|
|
595
|
-
/**
|
|
596
|
-
* @optional
|
|
597
|
-
*
|
|
598
|
-
* @description
|
|
599
|
-
*
|
|
600
|
-
* Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
|
|
601
|
-
* componente adquirirá automatização para o processo de autenticação.
|
|
602
|
-
*
|
|
603
|
-
* ### Processos
|
|
604
|
-
* Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
|
|
605
|
-
* na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
|
|
606
|
-
*
|
|
607
|
-
* ```
|
|
608
|
-
* headers {
|
|
609
|
-
* Authorization: Basic base64(login:password)
|
|
610
|
-
* }
|
|
611
|
-
*
|
|
612
|
-
* body {
|
|
613
|
-
* rememberUser: rememberUser
|
|
614
|
-
* }
|
|
615
|
-
* ```
|
|
616
|
-
*
|
|
617
|
-
* Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
|
|
618
|
-
* aplicação `/`.
|
|
619
|
-
*
|
|
620
|
-
* ```
|
|
621
|
-
* 200:
|
|
622
|
-
* {
|
|
623
|
-
* user: user
|
|
624
|
-
* }
|
|
625
|
-
* ```
|
|
626
|
-
*
|
|
627
|
-
* Em caso de **erro** na autenticação, espera-se o seguinte retorno:
|
|
628
|
-
*
|
|
629
|
-
* ```
|
|
630
|
-
* 400/401
|
|
631
|
-
* {
|
|
632
|
-
* code: 400/401,
|
|
633
|
-
* message: message,
|
|
634
|
-
* detailedMessage: detailedMessage,
|
|
635
|
-
* helpUrl?: helpUrl
|
|
636
|
-
* }
|
|
637
|
-
* ```
|
|
638
|
-
*
|
|
639
|
-
* > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
|
|
640
|
-
* assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
|
|
641
|
-
* `p-password-errors` conforme retorno abaixo:
|
|
642
|
-
*
|
|
643
|
-
* ```
|
|
644
|
-
* 400
|
|
645
|
-
* {
|
|
646
|
-
* code: 400/401,
|
|
647
|
-
* message: message,
|
|
648
|
-
* detailedMessage: detailedMessage,
|
|
649
|
-
* helpUrl?: helpUrl,
|
|
650
|
-
* maxAttemptsRemaining?: maxAttemptsRemaining,
|
|
651
|
-
* loginWarnings?: [loginWarnings],
|
|
652
|
-
* passwordWarnings?: [passwordWarnings]
|
|
653
|
-
* }
|
|
654
|
-
* ```
|
|
655
|
-
*
|
|
656
|
-
* > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
|
|
657
|
-
* atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
|
|
658
|
-
*
|
|
659
|
-
* *Processo finalizado.*
|
|
660
|
-
*
|
|
661
|
-
* _______________
|
|
662
|
-
*
|
|
663
|
-
* #### Praticidade
|
|
664
|
-
* As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
|
|
665
|
-
* dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
|
|
666
|
-
* a forma dinâmica com a qual o template de tela de login pode ser gerado ao navegar para rota `/login`, e também como ele se comunica
|
|
667
|
-
* com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
|
|
668
|
-
* Basta definir nas configurações de rota:
|
|
669
|
-
*
|
|
670
|
-
*
|
|
671
|
-
* ```
|
|
672
|
-
* import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
|
|
673
|
-
*
|
|
674
|
-
* ...
|
|
675
|
-
* const routes: Routes = [
|
|
676
|
-
* {
|
|
677
|
-
* path: 'login', component: PoPageLoginComponent, data: {
|
|
678
|
-
* serviceApi: 'https://po-ui.io/sample/api/users/authentication',
|
|
679
|
-
* environment: 'development',
|
|
680
|
-
* recovery: {
|
|
681
|
-
* url: 'https://po-ui.io/sample/api/users',
|
|
682
|
-
* type: PoModalPasswordRecoveryType.All,
|
|
683
|
-
* contactMail: 'dev.po@po-ui.com',
|
|
684
|
-
* phoneMask: '9-999-999-9999'
|
|
685
|
-
* },
|
|
686
|
-
* registerUrl: '/new-password',
|
|
687
|
-
* authenticationType: PoPageLoginAthenticationType.Basic
|
|
688
|
-
* }
|
|
689
|
-
* }
|
|
690
|
-
* ...
|
|
691
|
-
* ];
|
|
692
|
-
*
|
|
693
|
-
* @NgModule({
|
|
694
|
-
* imports: [RouterModule.forRoot(routes)],
|
|
695
|
-
* exports: [RouterModule]
|
|
696
|
-
* })
|
|
697
|
-
* export class AppRoutingModule { }
|
|
698
|
-
* ```
|
|
699
|
-
*
|
|
700
|
-
*
|
|
701
|
-
* O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
|
|
702
|
-
* `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
|
|
703
|
-
* senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
|
|
704
|
-
*
|
|
705
|
-
* > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
|
|
706
|
-
*
|
|
707
|
-
*/
|
|
708
|
-
set authenticationUrl(value) {
|
|
709
|
-
this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
|
|
710
|
-
}
|
|
711
|
-
get authenticationUrl() {
|
|
712
|
-
return this._authenticationUrl;
|
|
713
|
-
}
|
|
714
|
-
/**
|
|
715
|
-
* @optional
|
|
716
|
-
*
|
|
717
|
-
* @description
|
|
718
|
-
*
|
|
719
|
-
* Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero) e a aplicação tenha um link de bloqueio de usuário,
|
|
720
|
-
* informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
|
|
721
|
-
*/
|
|
722
|
-
set blockedUrl(value) {
|
|
723
|
-
this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
|
|
724
|
-
}
|
|
725
|
-
get blockedUrl() {
|
|
726
|
-
return this._blockedUrl;
|
|
727
|
-
}
|
|
728
|
-
/**
|
|
729
|
-
* @optional
|
|
730
|
-
*
|
|
731
|
-
* @description
|
|
732
|
-
*
|
|
733
|
-
* Exibe um botão para suporte.
|
|
734
|
-
*
|
|
735
|
-
* A propriedade aceita os seguintes tipos:
|
|
736
|
-
*
|
|
737
|
-
* - **String**: URL externa ou uma rota válida;
|
|
738
|
-
* - **Function**: Função a ser disparada ao clicar no botão de suporte;
|
|
739
|
-
* ```
|
|
740
|
-
* <po-page-login>
|
|
741
|
-
* [p-support]="this.mySupport.bind(this)">
|
|
742
|
-
* </po-page-login>
|
|
743
|
-
* ```
|
|
744
|
-
*
|
|
745
|
-
*/
|
|
746
|
-
set support(value) {
|
|
747
|
-
this._support = value;
|
|
748
|
-
}
|
|
749
|
-
get support() {
|
|
750
|
-
return this._support;
|
|
751
|
-
}
|
|
752
|
-
/**
|
|
753
|
-
* @optional
|
|
754
|
-
*
|
|
755
|
-
* @description
|
|
756
|
-
*
|
|
757
|
-
* Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
|
|
758
|
-
*
|
|
759
|
-
* Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
|
|
760
|
-
*
|
|
761
|
-
* Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
|
|
762
|
-
*
|
|
763
|
-
* Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
|
|
764
|
-
*
|
|
765
|
-
* > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
|
|
766
|
-
*
|
|
767
|
-
*
|
|
768
|
-
*/
|
|
769
|
-
set languagesList(languagesList) {
|
|
770
|
-
if (languagesList) {
|
|
771
|
-
if (languagesList.length) {
|
|
772
|
-
this._languagesList = languagesList;
|
|
773
|
-
}
|
|
774
|
-
else {
|
|
775
|
-
this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
get languagesList() {
|
|
780
|
-
if (this._languagesList) {
|
|
781
|
-
return this._languagesList;
|
|
782
|
-
}
|
|
783
|
-
return poLanguageDefault;
|
|
784
|
-
}
|
|
785
|
-
get showLanguage() {
|
|
786
|
-
return this.languagesList.length > 1;
|
|
787
|
-
}
|
|
788
|
-
get language() {
|
|
789
|
-
return this.selectedLanguage || getShortBrowserLanguage();
|
|
790
|
-
}
|
|
791
|
-
get pageLoginLiterals() {
|
|
792
|
-
const loginHintWithContactEmail = this.contactEmail
|
|
793
|
-
? this.concatenateLoginHintWithContactEmail(this.contactEmail)
|
|
794
|
-
: undefined;
|
|
795
|
-
return {
|
|
796
|
-
...poPageLoginLiteralsDefault[poLocaleDefault],
|
|
797
|
-
...poPageLoginLiteralsDefault[this.language],
|
|
798
|
-
...loginHintWithContactEmail,
|
|
799
|
-
...this.literals
|
|
800
|
-
};
|
|
801
|
-
}
|
|
802
|
-
ngOnDestroy() {
|
|
803
|
-
if (this.loginSubscription) {
|
|
804
|
-
this.loginSubscription.unsubscribe();
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
closePopover() {
|
|
808
|
-
this.showExceededAttemptsWarning = false;
|
|
809
|
-
}
|
|
810
|
-
onLoginSubmit() {
|
|
811
|
-
const loginForm = {
|
|
812
|
-
login: this.login,
|
|
813
|
-
password: this.password,
|
|
814
|
-
rememberUser: this.rememberUser
|
|
815
|
-
};
|
|
816
|
-
if (this.customField) {
|
|
817
|
-
loginForm[this.customFieldObject.property] = this.customFieldObject.value;
|
|
818
|
-
}
|
|
819
|
-
if (this.authenticationUrl) {
|
|
820
|
-
this.loginSubscription = this.loginService
|
|
821
|
-
.onLogin(this.authenticationUrl, this.authenticationType, loginForm)
|
|
822
|
-
.subscribe(data => {
|
|
823
|
-
this.setValuesToProperties();
|
|
824
|
-
sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
|
|
825
|
-
this.openInternalLink('/');
|
|
826
|
-
}, error => {
|
|
827
|
-
if (error.error.code === '400' || error.error.code === '401') {
|
|
828
|
-
this.setValuesToProperties(error);
|
|
829
|
-
this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
|
|
830
|
-
}
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
else {
|
|
834
|
-
this.loginSubmit.emit(loginForm);
|
|
835
|
-
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
getDefaultCustomFieldObject(property) {
|
|
839
|
-
return { property };
|
|
840
|
-
}
|
|
841
|
-
openExternalLink(url) {
|
|
842
|
-
window.open(url, '_blank');
|
|
843
|
-
}
|
|
844
|
-
openInternalLink(url) {
|
|
845
|
-
this.router.navigate([url]);
|
|
846
|
-
}
|
|
847
|
-
redirectBlockedUrl(attempts, blockedUrl) {
|
|
848
|
-
if (attempts === 0 && blockedUrl) {
|
|
849
|
-
this.showExceededAttemptsWarning = false;
|
|
850
|
-
isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
setValuesToProperties(result) {
|
|
854
|
-
if (result) {
|
|
855
|
-
this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
|
|
856
|
-
this.loginErrors = result.error.loginWarnings;
|
|
857
|
-
this.passwordErrors = result.error.passwordWarnings;
|
|
858
|
-
this.blockedUrl = result.error.blockedUrl;
|
|
859
|
-
}
|
|
860
|
-
else {
|
|
861
|
-
this.exceededAttemptsWarning = 0;
|
|
862
|
-
this.loginErrors = [];
|
|
863
|
-
this.passwordErrors = [];
|
|
864
|
-
this.blockedUrl = '';
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
PoPageLoginBaseComponent.ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
|
|
869
|
-
PoPageLoginBaseComponent.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: ["p-background", "background"], logo: ["p-logo", "logo"], loginPattern: ["p-login-pattern", "loginPattern"], passwordPattern: ["p-password-pattern", "passwordPattern"], secondaryLogo: ["p-secondary-logo", "secondaryLogo"], customField: ["p-custom-field", "customField"], contactEmail: ["p-contact-email", "contactEmail"], productName: ["p-product-name", "productName"], environment: ["p-environment", "environment"], exceededAttemptsWarning: ["p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: ["p-hide-remember-user", "hideRememberUser"], literals: ["p-literals", "literals"], loading: ["p-loading", "loading"], login: ["p-login", "login"], loginErrors: ["p-login-errors", "loginErrors"], passwordErrors: ["p-password-errors", "passwordErrors"], recovery: ["p-recovery", "recovery"], registerUrl: ["p-register-url", "registerUrl"], authenticationType: ["p-authentication-type", "authenticationType"], authenticationUrl: ["p-authentication-url", "authenticationUrl"], blockedUrl: ["p-blocked-url", "blockedUrl"], support: ["p-support", "support"], languagesList: ["p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" } });
|
|
870
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
|
|
871
|
-
type: Directive
|
|
872
|
-
}], function () { return [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }]; }, { background: [{
|
|
873
|
-
type: Input,
|
|
874
|
-
args: ['p-background']
|
|
875
|
-
}], logo: [{
|
|
876
|
-
type: Input,
|
|
877
|
-
args: ['p-logo']
|
|
878
|
-
}], loginPattern: [{
|
|
879
|
-
type: Input,
|
|
880
|
-
args: ['p-login-pattern']
|
|
881
|
-
}], passwordPattern: [{
|
|
882
|
-
type: Input,
|
|
883
|
-
args: ['p-password-pattern']
|
|
884
|
-
}], secondaryLogo: [{
|
|
885
|
-
type: Input,
|
|
886
|
-
args: ['p-secondary-logo']
|
|
887
|
-
}], loginChange: [{
|
|
888
|
-
type: Output,
|
|
889
|
-
args: ['p-login-change']
|
|
890
|
-
}], loginSubmit: [{
|
|
891
|
-
type: Output,
|
|
892
|
-
args: ['p-login-submit']
|
|
893
|
-
}], passwordChange: [{
|
|
894
|
-
type: Output,
|
|
895
|
-
args: ['p-password-change']
|
|
896
|
-
}], languageChange: [{
|
|
897
|
-
type: Output,
|
|
898
|
-
args: ['p-language-change']
|
|
899
|
-
}], customField: [{
|
|
900
|
-
type: Input,
|
|
901
|
-
args: ['p-custom-field']
|
|
902
|
-
}], contactEmail: [{
|
|
903
|
-
type: Input,
|
|
904
|
-
args: ['p-contact-email']
|
|
905
|
-
}], productName: [{
|
|
906
|
-
type: Input,
|
|
907
|
-
args: ['p-product-name']
|
|
908
|
-
}], environment: [{
|
|
909
|
-
type: Input,
|
|
910
|
-
args: ['p-environment']
|
|
911
|
-
}], exceededAttemptsWarning: [{
|
|
912
|
-
type: Input,
|
|
913
|
-
args: ['p-exceeded-attempts-warning']
|
|
914
|
-
}], hideRememberUser: [{
|
|
915
|
-
type: Input,
|
|
916
|
-
args: ['p-hide-remember-user']
|
|
917
|
-
}], literals: [{
|
|
918
|
-
type: Input,
|
|
919
|
-
args: ['p-literals']
|
|
920
|
-
}], loading: [{
|
|
921
|
-
type: Input,
|
|
922
|
-
args: ['p-loading']
|
|
923
|
-
}], login: [{
|
|
924
|
-
type: Input,
|
|
925
|
-
args: ['p-login']
|
|
926
|
-
}], loginErrors: [{
|
|
927
|
-
type: Input,
|
|
928
|
-
args: ['p-login-errors']
|
|
929
|
-
}], passwordErrors: [{
|
|
930
|
-
type: Input,
|
|
931
|
-
args: ['p-password-errors']
|
|
932
|
-
}], recovery: [{
|
|
933
|
-
type: Input,
|
|
934
|
-
args: ['p-recovery']
|
|
935
|
-
}], registerUrl: [{
|
|
936
|
-
type: Input,
|
|
937
|
-
args: ['p-register-url']
|
|
938
|
-
}], authenticationType: [{
|
|
939
|
-
type: Input,
|
|
940
|
-
args: ['p-authentication-type']
|
|
941
|
-
}], authenticationUrl: [{
|
|
942
|
-
type: Input,
|
|
943
|
-
args: ['p-authentication-url']
|
|
944
|
-
}], blockedUrl: [{
|
|
945
|
-
type: Input,
|
|
946
|
-
args: ['p-blocked-url']
|
|
947
|
-
}], support: [{
|
|
948
|
-
type: Input,
|
|
949
|
-
args: ['p-support']
|
|
950
|
-
}], languagesList: [{
|
|
951
|
-
type: Input,
|
|
952
|
-
args: ['p-languages']
|
|
953
|
-
}] }); })();
|
|
954
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztR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bUJLLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQWVJLEtBQUs7a0JBQTFCLEtBQUs7bUJBQUMsU0FBUztZQW1CYSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVTLGNBQWM7a0JBQTdDLEtBQUs7bUJBQUMsbUJBQW1CO1lBNkJELFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQXNCVSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXVDYSxrQkFBa0I7a0JBQXJELEtBQUs7bUJBQUMsdUJBQXVCO1lBMkhLLGlCQUFpQjtrQkFBbkQsS0FBSzttQkFBQyxzQkFBc0I7WUFnQkQsVUFBVTtrQkFBckMsS0FBSzttQkFBQyxlQUFlO1lBMEJFLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQXlCUSxhQUFhO2tCQUF0QyxLQUFLO21CQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgY29udmVydFRvQm9vbGVhbiwgY29udmVydFRvSW50LCBnZXRTaG9ydEJyb3dzZXJMYW5ndWFnZSwgaXNFeHRlcm5hbExpbmssIGlzVHlwZW9mIH0gZnJvbSAnLi8uLi8uLi91dGlscy91dGlsJztcclxuXHJcbmltcG9ydCB7IFBvTGFuZ3VhZ2VTZXJ2aWNlLCBwb0xvY2FsZURlZmF1bHQsIFBvTGFuZ3VhZ2UsIHBvTGFuZ3VhZ2VEZWZhdWx0IH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xyXG5cclxuaW1wb3J0IHsgUG9QYWdlTG9naW4gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW51bXMvcG8tcGFnZS1sb2dpbi1hdXRoZW50aWNhdGlvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tY3VzdG9tLWZpZWxkLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUxvZ2luTGl0ZXJhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1saXRlcmFscy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpblJlY292ZXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tcmVjb3ZlcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlTG9naW5TZXJ2aWNlIH0gZnJvbSAnLi9wby1wYWdlLWxvZ2luLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoID0gNDA7XHJcblxyXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHQgPSB7XHJcbiAgZW46IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcclxuICAgIHRpdGxlOiAnV2VsY29tZScsXHJcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0ludmFsaWQgTG9naW4nLFxyXG4gICAgbG9naW5IaW50OiBgWW91ciBsb2dpbiB1c2VyIHdhcyBnaXZlbiB0byB5b3UgYXQgeW91ciBmaXJzdCBkYXkuXHJcbiAgICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGNvbnRhY3Qgc3VwcG9ydGAsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgZS1tYWlsJyxcclxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBQYXNzd29yZCcsXHJcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgcGFzc3dvcmQnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJyxcclxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZScsXHJcbiAgICByZW1lbWJlclVzZXI6ICdBdXRvbWF0aWMgbG9naW4nLFxyXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1lvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiBzeXN0ZW0gY29uZmlndXJhdGlvbicsXHJcbiAgICBzdWJtaXRMYWJlbDogJ0VudGVyJyxcclxuICAgIHN1Ym1pdHRlZExhYmVsOiAnTG9hZGluZy4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIFBhc3N3b3JkPycsXHJcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgIHJlZ2lzdGVyVXJsOiAnTmV3IHJlZ2lzdGVyJyxcclxuICAgIHRpdGxlUG9wb3ZlcjogJ09vcHMhJyxcclxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIHBhc3N3b3JkPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ0lmIHlvdSB0cnkgJyxcclxuICAgIGF0dGVtcHRzOiAnezB9IG1vcmUgdGltZShzKSAnLFxyXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOlxyXG4gICAgICAnd2l0aG91dCBzdWNjZXNzIHlvdXIgdXNlciB3aWxsIGJlIGJsb2NrZWQgYW5kIHlvdSB3aWxsIGJlIGxlZnQgMjQgaG91cnMgd2l0aG91dCBiZWluZyBhYmxlIHRvIGFjY2VzcyA6KCcsXHJcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdCZXR0ZXIgY3JlYXRlIGEgbmV3IHBhc3N3b3JkIG5vdyEgWW91IHdpbGwgYmUgYWJsZSB0byBsb2cgaW50byB0aGUgc3lzdGVtIHJpZ2h0IGF3YXkuJyxcclxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnSSBmb3Jnb3QgbXkgcGFzc3dvcmQnLFxyXG4gICAgd2VsY29tZTogJ1dlbGNvbWUnLFxyXG4gICAgc3VwcG9ydDogJ1N1cHBvcnQnXHJcbiAgfSxcclxuICBlczogPFBvUGFnZUxvZ2luTGl0ZXJhbHM+e1xyXG4gICAgdGl0bGU6ICdCaWVudmVuaWRvJyxcclxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcclxuICAgIGxvZ2luSGludDogYFN1IHVzdWFyaW8gaGEgc2lkbyBlbnRyZWdhZG8gcGFyYSB1c3RlZCBlbiBzdSBwcmltZXIgZMOtYS5cclxuICAgIFNpIG5vIHRpZW5lIGVzdGEgaW5mb3JtYWNpw7NuLCBww7NuZ2FzZSBlbiBjb250YWN0byBjb24gZWwgc29wb3J0ZSB0w6ljbmljb2AsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBlLW1haWwnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdDb250cmFzZcOxYSBpbnbDoWxpZGEnLFxyXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgY29udHJhc2XDsWEnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBubyB2w6FsaWRvLicsXHJcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUG9yIGZhdm9yIGludHJvZHV6Y2EgdW4gdmFsb3InLFxyXG4gICAgcmVtZW1iZXJVc2VyOiAnSW5pY2lvIGRlIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZScsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAnUHVlZGUgZGVzaGFiaWxpdGFyIGVzdGEgb3BjacOzbiBlbiBlbCBtZW7DuiBkZWwgc2lzdGVtYS4nLFxyXG4gICAgc3VibWl0TGFiZWw6ICdFbnRyYXInLFxyXG4gICAgc3VibWl0dGVkTGFiZWw6ICdDYXJnYW5kby4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxyXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXHJcbiAgICByZWdpc3RlclVybDogJ051ZXZvIHJlZ2lzdHJvJyxcclxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxyXG4gICAgZm9yZ290WW91clBhc3N3b3JkOiAnT2x2aWRhc3RlIHR1IGNvbnRyYXNlw7FhPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NpIGludGVudGEgbcOhcyAnLFxyXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6L3ZlY2VzICcsXHJcbiAgICB5b3VyVXNlcldpbGxCZUJsb2NrZWQ6ICdzaW4gw6l4aXRvIHN1IHVzdWFyaW8gc2VyYSBibG9xdWVhZG8geSB1c3RlZCB2w6FzIHBlcm1hbmVjZXIgMjQgaG9yYXMgc2luIHBvZGVyIGFjY2VkZXIgYSA6KCcsXHJcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6XHJcbiAgICAgICfCoU1lam9yIGNyZWFyIHVuYSBudWV2YSBjb250cmFzZcOxYSBhaG9yYSEgVXN0ZWQgcG9kcsOhIGVudHJhciBlbiBlbCBzaXN0ZW1hIGlubWVkaWF0YW1lbnRlIGRlc3B1w6lzLicsXHJcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ09sdmlkZSBtaSBjb250cmFzZcOxYScsXHJcbiAgICB3ZWxjb21lOiAnQmllbnZlbmlkbycsXHJcbiAgICBzdXBwb3J0OiAnU29wb3J0ZSdcclxuICB9LFxyXG4gIHB0OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XHJcbiAgICB0aXRsZTogJ0JlbS12aW5kbycsXHJcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0xvZ2luIGludsOhbGlkbycsXHJcbiAgICBsb2dpbkhpbnQ6IGBTZXUgdXN1w6FyaW8gZm9pIGVudHJlZ3VlIGEgdm9jw6ogbm8gc2V1IHByaW1laXJvIGRpYS5cclxuICAgIENhc28gbsOjbyB0ZW5oYSBtYWlzIGVzc2EgaW5mb3JtYcOnw6NvIGNvbnRhY3RlIG8gc3Vwb3J0ZWAsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zaXJhIHNldSBlLW1haWwnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBpbnbDoWxpZGEnLFxyXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBpbnbDoWxpZG8uJyxcclxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcclxuICAgIHJlbWVtYmVyVXNlcjogJ0xvZ2FyIGF1dG9tYXRpY2FtZW50ZScsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAnVm9jw6ogcG9kZSBkZXNhYmlsaXRhciBlc3NhIG9ww6fDo28gbm8gbWVudSBkbyBzaXN0ZW1hJyxcclxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcclxuICAgIHN1Ym1pdHRlZExhYmVsOiAnQ2FycmVnYW5kby4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxyXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXHJcbiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxyXG4gICAgdGl0bGVQb3BvdmVyOiAnT3BhIScsXHJcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcclxuICAgIGF0dGVtcHRzOiAnezB9IHZleihlcykgJyxcclxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJyxcclxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxyXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICdFc3F1ZWNpIG1pbmhhIHNlbmhhJyxcclxuICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXHJcbiAgICBzdXBwb3J0OiAnU3Vwb3J0ZSdcclxuICB9LFxyXG4gIHJ1OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XHJcbiAgICB0aXRsZTogJ9CU0L7QsdGA0L4g0L/QvtC20LDQu9C+0LLQsNGC0YwhJyxcclxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAn0J3QtdCy0LXRgNC90YvQuSDQu9C+0LPQuNC9JyxcclxuICAgIGxvZ2luSGludDogYNCS0LDRiCDQu9C+0LPQuNC9INCx0YvQuyDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0LLQsNC8INCyINC/0LXRgNCy0YvQuSDQtNC10L3RjC5cclxuICAgINCV0YHQu9C4INGDINCy0LDRgSDQvdC10YIg0Y3RgtC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LgsINC+0LHRgNCw0YLQuNGC0LXRgdGMINCyINGB0LvRg9C20LHRgyDQv9C+0LTQtNC10YDQttC60LhgLFxyXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ9CS0YHRgtCw0LLRjNGC0LUg0YHQstC+0Lkg0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC/0LDRgNC+0LvRjCcsXHJcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAn0JLQstC10LTQuNGC0LUg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcclxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAn0J3QtdCy0LXRgNC90L7QtSDQt9C90LDRh9C10L3QuNC1LicsXHJcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC30L3QsNGH0LXQvdC40LUnLFxyXG4gICAgcmVtZW1iZXJVc2VyOiAn0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQstGF0L7QtCcsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAn0JLRiyDQvNC+0LbQtdGC0LUg0L7RgtC60LvRjtGH0LjRgtGMINGN0YLRgyDQvtC/0YbQuNGOINCyINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuCDRgdC40YHRgtC10LzRiycsXHJcbiAgICBzdWJtaXRMYWJlbDogJ9CS0L7QudGC0LgnLFxyXG4gICAgc3VibWl0dGVkTGFiZWw6ICcz0LDQs9GA0YPQt9C60LAuLi4nLFxyXG4gICAgZm9yZ290UGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXHJcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgIHJlZ2lzdGVyVXJsOiAn0J3QvtCy0YvQuSDRgNC10LPQuNGB0YLRgCcsXHJcbiAgICB0aXRsZVBvcG92ZXI6ICfQntC5IScsXHJcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ9CV0YHQu9C4INCy0Ysg0LHQtdC30YPRgdC/0LXRiNC90L4g0L/QvtC/0YvRgtCw0LXRgtC10YHRjCDQstC+0LnRgtC4INC10YnQtSAnLFxyXG4gICAgYXR0ZW1wdHM6ICd7MH0g0YDQsNC3KNCwKSAnLFxyXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAn0JLQsNGIINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQsdGD0LTQtdGCINC30LDQsdC70L7QutC40YDQvtCy0LDQvSwg0Lgg0JLRiyDQvtGB0YLQsNC90LXRgtC10YHRjCDQvdCwIDI0INGH0LDRgdCwINCx0LXQtyDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC00L7RgdGC0YPQv9CwIDooJyxcclxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ9Cb0YPRh9GI0LUg0YHQvtC30LTQsNC50YLQtSDQvdC+0LLRi9C5INC/0LDRgNC+0LvRjCDRgdC10LnRh9Cw0YEhwqDQktGLINGB0LzQvtC20LXRgtC1INGB0YDQsNC30YMg0LLQvtC50YLQuCDQsiDRgdC40YHRgtC10LzRgy4nLFxyXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICfQryDQt9Cw0LHRi9C7INGB0LLQvtC5INC/0LDRgNC+0LvRjCcsXHJcbiAgICB3ZWxjb21lOiAn0LTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCcsXHJcbiAgICBzdXBwb3J0OiAn0J/QvtC00LTQtdGA0LbQutCwJ1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBwb1BhZ2VMb2dpbkxpdGVyYWxJbiA9IHtcclxuICBlbjogJ2luJyxcclxuICBlczogJ2VuJyxcclxuICBwdDogJ2VtJyxcclxuICBydTogJ9CyJ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBPIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIMOpIHV0aWxpemFkbyBjb21vIHRlbXBsYXRlIHBhcmEgdGVsYSBkZSBsb2dpbi5cclxuICogQ29tIGVsZSDDqSBwb3Nzw612ZWwgZGVmaW5pcm1vcyB2YWxvcmVzIHBhcmEgdXN1w6FyaW8sIHNlbmhhIGUgZGVmaW5pciBhw6fDtWVzIHBhcmEgcmVjdXBlcmHDp8OjbyBkZSBzZW5oYSBlIGdyYXZhw6fDo28gZGUgZGFkb3MgZG8gdXN1w6FyaW8uXHJcbiAqIFRhbWLDqW0gw6kgcG9zc8OtdmVsIGluc2VyaXIgdW1hIGltYWdlbSBlbSBjb25qdW50byBjb20gdW0gdGV4dG8gZGUgZGVzdGFxdWUuXHJcbiAqXHJcbiAqXHJcbiAqIEEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYCBhdXRvbWF0aXphIGEgcm90aW5hIGRvIGNvbXBvbmVudGUgZSBzaW1wbGlmaWNhIG8gcHJvY2Vzc28gcGFyYSBhdXRlbnRpY2HDp8OjbyBkbyB1c3XDoXJpbywgYmFzdGFuZG9cclxuICogZGVmaW5pciB1bWEgdXJsIHBhcmEgcmVxdWlzacOnw6NvIGRhIGF1dGVudGljYcOnw6NvLiBBIGZsZXhpYmlsaWRhZGUgZSBwcmF0aWNpZGFkZSBwb2RlbSBjaGVnYXIgYSB1bSBuw612ZWwgZW0gcXVlIG8gZGVzZW52b2x2aW1lbnRvXHJcbiAqIGRhIGFwbGljYcOnw6NvIG5vICpjbGllbnQgc2lkZSogw6kgZGVzcHJvdmlkYSBkZSBxdWFscXVlciBjw7NkaWdvLWZvbnRlIHJlbGFjaW9uYWRvIMOgIHJvdGluYSBkZSBsb2dpbiBkZSB1c3XDoXJpby5cclxuICogU2V1IGRldGFsaGFtZW50byBwYXJhIHVzbyBwb2RlIHNlciB2aXN0byBsb2dvIGFiYWl4byBlbSAqcHJvcHJpZWRhZGVzKi5cclxuICogQ2FzbyBqdWxndWUgbmVjZXNzw6FyaW8sIHBvZGUtc2UgdGFtYsOpbSBkZWZpbmlyIG1hbnVhbG1lbnRlIGEgcm90aW5hIGRvIGNvbXBvbmVudGUuXHJcbiAqXHJcbiAqXHJcbiAqIFBhcmEgcXVlIGFzIGltYWdlbnMgc2VqYW0gZXhpYmlkYXMgY29ycmV0YW1lbnRlLCDDqSBuZWNlc3PDoXJpbyBpbmNsdWlyIG8gY2FtaW5obyBkZWxhcyBhbyBwcm9qZXRvLiBQYXJhIGlzc28sIGVkaXRlXHJcbiAqIG8gKmFzc2V0cyogbm8gYXJxdWl2byAqKmFuZ3VsYXIuanNvbioqIGRhIGFwbGljYcOnw6NvIG5hIHNlZ3VpbnRlIG9yZGVtOlxyXG4gKiBgYGBcclxuICogICBcImFzc2V0c1wiOiBbXHJcbiAqICAgICBcInNyYy9hc3NldHNcIixcclxuICogICAgIFwic3JjL2Zhdmljb24uaWNvXCIsXHJcbiAqICAgICB7XHJcbiAqICAgICAgIFwiZ2xvYlwiOiBcIioqXFwvKlwiLFxyXG4gKiAgICAgICBcImlucHV0XCI6IFwibm9kZV9tb2R1bGVzL0Bwby11aS9zdHlsZS9pbWFnZXNcIixcclxuICogICAgICAgXCJvdXRwdXRcIjogXCJhc3NldHMvaW1hZ2VzXCJcclxuICogICAgIH1cclxuICogICBdXHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb1BhZ2VMb2dpbkJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIC8qKlxyXG4gICAqIE8gYHAtYmFja2dyb3VuZGAgcGVybWl0ZSBpbnNlcmlyIHVtYSBpbWFnZW0gZGUgZGVzdGFxdWUgYW8gbGFkbyBkaXJlaXRvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luLCBjYXNvIGEgcHJvcHJpZWRhZGVcclxuICAgKiBuw6NvIHNlamEgcHJlZW5jaGlkYSBvIGZvcm11bMOhcmlvIHNlcsOhIGNlbnRyYWxpemFkbyBubyBlc3Bhw6dvIGRpc3BvbsOtdmVsLlxyXG4gICAqXHJcbiAgICogQSBmb250ZSBkYSBpbWFnZW0gcG9kZSBzZXIgZGUgdW0gY2FtaW5obyBsb2NhbCBvdSB1bWEgdXJsIGRlIHVtIHNlcnZpZG9yIGV4dGVybm8uXHJcbiAgICpcclxuICAgKiBBbMOpbSBkYSBpbWFnZW0sIMOpIHBvc3PDrXZlbCBhZGljaW9uYXIgdW0gdGV4dG8gaW5mb3JtYXRpdm8gcG9yIGNpbWEgZGEgaW1hZ2VtIGRhIGltYWdlbSBkZSBkZXN0YXF1ZSwgcGFyYSBpc3NvIGluZm9ybWVcclxuICAgKiB1bSB2YWxvciBwYXJhIGEgbGl0ZXJhbCBgaGlnaGxpZ2h0SW5mb2AuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBzb2JyZSBhcyBsaXRlcmFpcyBuYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AuXHJcbiAgICpcclxuICAgKiBFeGVtcGxvcyBkZSB2YWxvcmVzIHbDoWxpZG9zOlxyXG4gICAqIC0gKipsb2NhbCoqOiBgLi9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxyXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pby9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxyXG4gICAqXHJcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIMOpIGlnbm9yYWRhIHBhcmEgYXBsaWNhw6fDtWVzIG1vYmlsZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtYmFja2dyb3VuZCcpIGJhY2tncm91bmQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBuYSBwYXJ0ZSBzdXBlcmlvci5cclxuICAgKlxyXG4gICAqID4gQ2FzbyBzZWphIGluZGVmaW5pZGEgbyBlc3Bhw6dvIHNlIG1hbnTDqW0gcHJlc2VydmFkbyBwb3LDqW0gdmF6aW8uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ28nKSBsb2dvPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIGxvZ2luLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gXHJcbiAgICogc2Vyw6EgZXhpYmlkYS5cclxuICAgKlxyXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XHJcbiAgICogLSBlbWFpbDogYFtleHByZXNzYW8tcmVndWxhci1lbWFpbF1gXHJcbiAgICogLSBjcGY6IGBbZXhwcmVzc2FvLXJlZ3VsYXItY3BmXWBcclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmAuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ2luLXBhdHRlcm4nKSBsb2dpblBhdHRlcm4/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgcGFzc3dvcmQsIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmBcclxuICAgKiBzZXLDoSBleGliaWRhLlxyXG4gICAqXHJcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcclxuICAgKiAtIEFwZW5hcyBuw7ptZXJvczogYFxcZD9gXHJcbiAgICogLSBMZXRyYXMgbcOtbnVzY3VsYXM6IGBcXHo/YFxyXG4gICAqXHJcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHBhc3N3b3JkRXJyb3JQYXR0ZXJuYC5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcGFzc3dvcmQtcGF0dGVybicpIHBhc3N3b3JkUGF0dGVybj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIENhbWluaG8gcGFyYSBhIGxvZ29tYXJjYSBsb2NhbGl6YWRhIG5vIHJvZGFww6kuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXNlY29uZGFyeS1sb2dvJykgc2Vjb25kYXJ5TG9nbz86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlucHV0IGRvIGNhbXBvIGxvZ2luLlxyXG4gICAqXHJcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bWEgdmFyacOhdmVsIGRvIHRpcG8gYHN0cmluZ2AgY29tIG8gdGV4dG8gaW5mb3JtYWRvIG5vIGNhbXBvLlxyXG4gICAqXHJcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cclxuICAgKi9cclxuICBAT3V0cHV0KCdwLWxvZ2luLWNoYW5nZScpIGxvZ2luQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGlzcGFyYWRvIGFvIHN1Ym1ldGVyIG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gKGFwZXJ0YW5kbyBgRW50ZXJgIGRlbnRybyBkb3MgY2FtcG9zIG91IHByZXNzaW9uYW5kbyBvIGJvdMOjbyBkZSBjb25maXJtYcOnw6NvKS5cclxuICAgKlxyXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvUGFnZUxvZ2luYCBjb20gb3MgZGFkb3MgaW5mb3JtYWRvcyBubyBmb3JtdWzDoXJpby5cclxuICAgKlxyXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLXVybC1yZWNvdmVyeWAuXHJcbiAgICpcclxuICAgKiA+IFBhcmEgbWFpcyBkZXRhbGhlcyBjb25zdWx0ZSBhIGRvY3VtZW50YcOnw6NvIHNvYnJlIGEgaW50ZXJmYWNlIGBQb1BhZ2VMb2dpbmAgbWFpcyBhYmFpeG8uXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1sb2dpbi1zdWJtaXQnKSBsb2dpblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UG9QYWdlTG9naW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFdmVudG8gZGlzcGFyYWRvIHF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYXIgbyBpbnB1dCBkbyBjYW1wbyBwYXNzd29yZC5cclxuICAgKlxyXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cclxuICAgKlxyXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAuXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1wYXNzd29yZC1jaGFuZ2UnKSBwYXNzd29yZENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlkaW9tYSBkYSBww6FnaW5hLlxyXG4gICAqXHJcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bSBvYmpldG8gZG8gdGlwbyBgUG9MYW5ndWFnZWAgY29tIGEgbGluZ3VhZ2VtIHNlbGVjaW9uYWRhLlxyXG4gICAqXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1sYW5ndWFnZS1jaGFuZ2UnKSBsYW5ndWFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPFBvTGFuZ3VhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxQb0xhbmd1YWdlPigpO1xyXG5cclxuICBhbGxMb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIGFsbFBhc3N3b3JkRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgY3VzdG9tRmllbGRPYmplY3Q6IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQ7XHJcbiAgY3VzdG9tRmllbGRUeXBlOiBzdHJpbmc7XHJcbiAgbG9naW5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG4gIHJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZztcclxuICBzaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25UeXBlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSA9IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xyXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfYmxvY2tlZFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2NvbnRhY3RFbWFpbDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2N1c3RvbUZpZWxkOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkO1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50Pzogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nPzogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2hpZGVSZW1lbWJlclVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9saXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscztcclxuICBwcml2YXRlIF9sb2FkaW5nPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2xvZ2luOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbG9naW5FcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBwcml2YXRlIF9wYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIHByaXZhdGUgX3Byb2R1Y3ROYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVjb3Zlcnk6IHN0cmluZyB8IFBvUGFnZUxvZ2luUmVjb3ZlcnkgfCBGdW5jdGlvbjtcclxuICBwcml2YXRlIF9yZWdpc3RlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3N1cHBvcnQ6IHN0cmluZyB8IEZ1bmN0aW9uO1xyXG4gIHByaXZhdGUgX2xhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+O1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogQW8gaW5mb3JtYXIgdW0gdmFsb3IgZG8gdGlwbyBgc3RyaW5nYCwgbyBtZXNtbyBzZXLDoSBhcGxpY2FkbyBjb21vIGEgY2hhdmUgZG8gY2FtcG8gY3VzdG9taXphZG8gZSB1dGlsaXphcsOhXHJcbiAgICogb3MgdmFsb3JlcyBwYWRyw7VlcyBjb250aWRvcyBuYSBwcm9wcmllZGFkZSBgbGl0ZXJhbHNgIGNvbW8gYGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuYCBlIGBjdXN0b21GaWVsZFBsYWNlaG9sZGVyYC5cclxuICAgKlxyXG4gICAqIEV4aXN0ZSBhIHBvc3NpYmlsaWRhZGUgZGUgaW5mb3JtYXIgdW0gb2JqZXRvIHF1ZSBzZWd1ZSBhIGRlZmluacOnw6NvIGRhIGludGVyZmFjZSBgUG9QYWdlTG9naW5DdXN0b21GaWVsZGAsIG9uZGVcclxuICAgKiBhdHJhdsOpcyBkb3MgcGFyw6JtZXRyb3MgZW52aWFkb3MgcG9kZSBnZXJhciB1bSBgcG8taW5wdXRgLCBgcG8tY29tYm9gIGVzcGVjaWZpY2FtZW50ZSBwYXJhIHNlcnZpw6dvc1xyXG4gICAqIG91IGBwby1zZWxlY3RgIHBhcmEgdmFsb3JlcyBmaXhvcy5cclxuICAgKlxyXG4gICAqIEFiYWl4byBzZWd1ZW0gb3MgZXhlbXBsb3MgZGUgY2FkYSB0aXBvIGRlIGNhbXBvLlxyXG4gICAqXHJcbiAgICogYHBvLWlucHV0YDpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIHtcclxuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcclxuICAgKiAgIHZhbHVlOiAnanYwMScsXHJcbiAgICogICBwbGFjZWhvbGRlcjogJ0VudGVyIHlvdXIgZG9tYWluJyxcclxuICAgKiAgIHBhdHRlcm46ICdbYS16XScsXHJcbiAgICogICBlcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJ1xyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIGBwby1jb21ib2A6XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiB7XHJcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXHJcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxyXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXHJcbiAgICogICB1cmw6ICdodHRwczovL3BvLXVpLmlvL3NhbXBsZS9hcGkvY29tYm9PcHRpb24vZG9tYWlucycsXHJcbiAgICogICBmaWVsZFZhbHVlOiAnbmlja25hbWUnXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogYHBvLXNlbGVjdGA6XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiB7XHJcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXHJcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxyXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXHJcbiAgICogICBvcHRpb25zOiBbe2xhYmVsOiAnRG9tYWluIDEnLCB2YWx1ZTogJzEnfSwge2xhYmVsOiAnRG9tYWluIDInLCB2YWx1ZTogJzInfV1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBDYXNvIG8gY3VzdG9tRmllbGQgcG9zc3VhIG9wdGlvbnMsIHVybCBlIGZpZWxkVmFsdWUgcHJlZW5jaGlkb3MsIHNlcsOhIHByaW9yaXphZG8gbyBwby1zZWxlY3RcclxuICAgKiB1dGlsaXphbmRvIG8gb3B0aW9ucy5cclxuICAgKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1jdXN0b20tZmllbGQnKSBzZXQgY3VzdG9tRmllbGQodmFsdWU6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcclxuICAgICAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSB0aGlzLmdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdCh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdvYmplY3QnKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3Byb3BlcnR5J10pIHtcclxuICAgICAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSA8UG9QYWdlTG9naW5DdXN0b21GaWVsZD52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbUZpZWxkT2JqZWN0Lm9wdGlvbnMgJiYgIXRoaXMuY3VzdG9tRmllbGRPYmplY3QudXJsKSB7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gdGhpcy5jdXN0b21GaWVsZE9iamVjdC5vcHRpb25zID8gJ3NlbGVjdCcgOiAnY29tYm8nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fY3VzdG9tRmllbGQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1c3RvbUZpZWxkKCk6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFBlcnNvbmFsaXphIG8gZS1tYWlsIHF1ZSDDqSBleGliaWRvIG5hIG1lbnNhZ2VtIGRlIGRpY2EgZGUgbG9naW4gcGFkcsOjbyBwYXJhIGNvbnRhdG8gZGUgc3Vwb3J0ZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtY29udGFjdC1lbWFpbCcpIHNldCBjb250YWN0RW1haWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY29udGFjdEVtYWlsID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldCBjb250YWN0RW1haWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFjdEVtYWlsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFRleHRvIGN1c3RvbWl6YWRvIHF1ZSBmaWNhIGVudHJlIGEgbG9nbyBlIGEgbWVuc2FnZW0gZGUgYm9hcy12aW5kYXMuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXByb2R1Y3QtbmFtZScpIHNldCBwcm9kdWN0TmFtZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9wcm9kdWN0TmFtZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgcHJvZHVjdE5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvZHVjdE5hbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEFkaWNpb25hIHVtYSBgdGFnYCBhYmFpeG8gZG8gdMOtdHVsbyBxdWUgZXNwZWNpZmljYSBvIGFtYmllbnRlIHF1ZSBvIHVzdcOhcmlvIGVzdMOhIGZhemVuZG8gbyBsb2dpbi5cclxuICAgKlxyXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSBsaW1pdGEgbyB0ZXh0byBlbSA0MCBjYXJhY3RlcmVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1lbnZpcm9ubWVudCcpIHNldCBlbnZpcm9ubWVudChlbnZpcm9ubWVudDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQubGVuZ3RoID4gcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQuc3Vic3RyaW5nKDAsIHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgZW52aXJvbm1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEV4aWJlIHVtIGF2aXNvIGRlIGJsb3F1ZWlvIGRlIGFjb3JkbyBjb20gYSBxdWFudGlkYWRlIHJlc3RhbnRlIGRlIHRlbnRhdGl2YXMuXHJcbiAgICogTyBhdmlzbyBzZXLDoSBleGliaWRvIHNvbWVudGUgc2UgYSBxdWFudGlkYWRlIGZvciBtYWlvciBxdWUgemVyby5cclxuICAgKlxyXG4gICAqID4gQ2FzbyB0ZW5oYSBhbGd1bSB2YWxvciBhdHJpYnXDrWRvIHBhcmEgbyBhdHJpYnV0byBgcC1hdXRoZW50aWNhdGlvbi11cmxgIGUgbyByZXRvcm5vIGRhIHJlcXVpc2nDp8OjbyBlc3RpdmVyIGF0cmlidWluZG8gdmFsb3JcclxuICAgKiBwYXJhIG8gYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2AsIG8gdmFsb3IgY29uc2lkZXJhZG8gc2Vyw6EgbyBkbyByZXRvcm5vIGRhIHJlcXVpc2nDp8Ojby5cclxuICAgKlxyXG4gICAqIEBkZWZhdWx0IGAwYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nJykgc2V0IGV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gY29udmVydFRvSW50KHZhbHVlKTtcclxuICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA+IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFc2NvbmRlIGEgZnVuw6fDo28gXCJMZW1icmFyIHVzdcOhcmlvXCIgZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4uXHJcbiAgICpcclxuICAgKiBRdWFuZG8gZXNzYSBwcm9wcmllZGFkZSDDqSBzZXRhZGEgY29tIGB0cnVlYCBhIHByb3ByaWVkYWRlIGByZW1lbWJlclVzZXJgIGVudmlhZGEgbm8gZXZlbnRvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6Egc2VtcHJlXHJcbiAgICogYGZhbHNlYC5cclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGByZW1lbWJlclVzZXJgLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1oaWRlLXJlbWVtYmVyLXVzZXInKSBzZXQgaGlkZVJlbWVtYmVyVXNlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGlkZVJlbWVtYmVyVXNlciA9IDxhbnk+dmFsdWUgPT09ICcnID8gdHJ1ZSA6IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLl9oaWRlUmVtZW1iZXJVc2VyKSB7XHJcbiAgICAgIHRoaXMucmVtZW1iZXJVc2VyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBoaWRlUmVtZW1iZXJVc2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGVSZW1lbWJlclVzZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogT2JqZXRvIGNvbSBhcyBsaXRlcmFpcyB1c2FkYXMgbm8gYHBvLXBhZ2UtbG9naW5gLlxyXG4gICAqXHJcbiAgICogRXhpc3RlbSBkdWFzIG1hbmVpcmFzIGRlIGN1c3RvbWl6YXIgbyBjb21wb25lbnRlLCBwYXNzYW5kbyB1bSBvYmpldG8gY29tIHRvZGFzIGFzIGxpdGVyYWlzIGRpc3BvbsOtdmVpczpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcclxuICAgKiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXHJcbiAgICogICAgY3JlYXRlQU5ld1Bhc3N3b3JkTm93OiAnTWVsaG9yIGNyaWFyIHVtYSBzZW5oYSBub3ZhIGFnb3JhISBWb2PDqiB2YWkgcG9kZXIgZW50cmFyIG5vIHNpc3RlbWEgbG9nbyBlbSBzZWd1aWRhLicsXHJcbiAgICogICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgKiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgKiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgKiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxyXG4gICAqICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcclxuICAgKiAgICB3ZWxjb21lOiAnQm9hcy12aW5kYXMnLFxyXG4gICAqICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gb2JyaWdhdMOzcmlvJyxcclxuICAgKiAgICBsb2dpbkhpbnQ6ICdDYXNvIG7Do28gcG9zc3VhIHVzdcOhcmlvIGVudHJlIGVtIGNvbnRhdG8gY29tIG8gc3Vwb3J0ZScsXHJcbiAgICogICAgbG9naW5MYWJlbDogJ0luc2lyYSBzZXUgdXN1w6FyaW8nLFxyXG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXHJcbiAgICogICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBvYnJpZ2F0w7NyaWEnLFxyXG4gICAqICAgIHBhc3N3b3JkTGFiZWw6ICdJbnNpcmEgc3VhIHNlbmhhJyxcclxuICAgKiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zaXJhIHN1YSBzZW5oYSBkZSBhY2Vzc28nLFxyXG4gICAqICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnQ2FtcG8gY3VzdG9taXphZG8gaW52w6FsaWRvJyxcclxuICAgKiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUG9yIGZhdm9yIGluc2lyYSB1bSB2YWxvcicsXHJcbiAgICogICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcclxuICAgKiAgICByZW1lbWJlclVzZXI6ICdMZW1icmFyIHVzdcOhcmlvJyxcclxuICAgKiAgICByZW1lbWJlclVzZXJIaW50OiAnRXN0YSBvcMOnw6NvIHBvZGUgc2VyIGRlc2FiaWxpdGFkYSBuYXMgY29uZmlndXJhw6fDtWVzIGRvIHNpc3RlbWEnLFxyXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJyxcclxuICAgKiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxyXG4gICAqICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxyXG4gICAqICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJ1xyXG4gICAqICB9O1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogT3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphcjpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcclxuICAgKiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zaXJhIHNldSB1c3XDoXJpbyBkZSBhY2Vzc28nLFxyXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXHJcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnXHJcbiAgICogIH07XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFIHBhcmEgY2FycmVnYXIgYXMgbGl0ZXJhaXMgY3VzdG9taXphZGFzLCBiYXN0YSBhcGVuYXMgcGFzc2FyIG8gb2JqZXRvIHBhcmEgbyBjb21wb25lbnRlLlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogPHBvLXBhZ2UtbG9naW5cclxuICAgKiAgIFtwLWxpdGVyYWxzXT1cImN1c3RvbUxpdGVyYWxzXCI+XHJcbiAgICogPC9wby1wYWdlLWxvZ2luPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogID4gTyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBkbyBicm93c2VyIChwdCwgZW4sIGVzKS5cclxuICAgKiAgPiDDiSB0YW1iw6ltIHBvc3PDrXZlbCBhbHRlcm5hciBvIG9iamV0byBwYWRyw6NvIGRlIGxpdGVyYWlzIGF0cmF2w6lzIGRvIHNlbGV0b3IgZGUgaWRpb21hcyBsb2NhbGl6YWRvIG5hIHBhcnRlIGluZmVyaW9yIGRvIHRlbXBsYXRlLFxyXG4gICAqIG5lc3NlIGNhc28sIGjDoSB0YW1iw6ltIGEgb3DDp8OjbyBkbyBpZGlvbWEgcnVzc28uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxpdGVyYWxzJykgc2V0IGxpdGVyYWxzKHZhbHVlOiBQb1BhZ2VMb2dpbkxpdGVyYWxzKSB7XHJcbiAgICB0aGlzLl9saXRlcmFscyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxpdGVyYWxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpdGVyYWxzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEhhYmlsaXRhIHVtIGVzdGFkbyBkZSBjYXJyZWdhbWVudG8gYW8gYm90w6NvIGRlICpsb2dpbiouXHJcbiAgICpcclxuICAgKiA+IMOJIG5lY2Vzc8OhcmlvIGF0cmlidWlyIGB0cnVlYCDDoCBlc3RhIHByb3ByaWVkYWRlIG5hIGZ1bsOnw6NvIGRlZmluaWRhIGVtIGBwLWxvZ2luLXN1Ym1pdGAuXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvYWRpbmcnKSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBWYWxvciBkbyBtb2RlbG8gZG8gY2FtcG8gZGUgbG9naW4uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ2luJykgc2V0IGxvZ2luKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2xvZ2luID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XHJcbiAgICAgIHRoaXMubG9naW5DaGFuZ2UuZW1pdCh0aGlzLl9sb2dpbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbG9naW4oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2dpbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIHVtYSBsaXN0YSBkZSBlcnJvcyBlIGV4aWJlIGFiYWl4byBkbyBjYW1wbyBkZSBsb2dpbi5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtbG9naW4tZXJyb3JzJykgc2V0IGxvZ2luRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9sb2dpbkVycm9ycyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5zZXRMb2dpbkVycm9ycyh0aGlzLl9sb2dpbkVycm9ycyk7XHJcbiAgfVxyXG4gIGdldCBsb2dpbkVycm9ycygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2dpbkVycm9ycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIHVtYSBsaXN0YSBkZSBlcnJvcyBlIGV4aWJlIGFiYWl4byBkbyBjYW1wbyBkZSBwYXNzd29yZC5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcGFzc3dvcmQtZXJyb3JzJykgc2V0IHBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9wYXNzd29yZEVycm9ycyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5zZXRQYXNzd29yZEVycm9ycyh0aGlzLl9wYXNzd29yZEVycm9ycyk7XHJcbiAgfVxyXG4gIGdldCBwYXNzd29yZEVycm9ycygpIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXNzd29yZEVycm9ycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFeGliZSB1bSBsaW5rIGFiYWl4byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiBwYXJhIHF1ZSBvcyB1c3XDoXJpb3MgZGEgYXBsaWNhw6fDo28gZmHDp2FtIGEgcmVjdXBlcmHDp8OjbyBkb3MgZGFkb3MgZGUgYXV0ZW50aWNhw6fDo28uXHJcbiAgICpcclxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XHJcbiAgICpcclxuICAgKiAtICoqU3RyaW5nKio6IGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XHJcbiAgICogLSAqKkZ1bmN0aW9uKio6IHBvZGUtc2UgY3VzdG9taXphciBhIGHDp8Ojby4gUGFyYSBlc3RhIHBvc3NpbGlkYWRlIGJhc3RhIGF0cmlidWlyOlxyXG4gICAqIGBgYFxyXG4gICAqIDxwby1wYWdlLWxvZ2luPlxyXG4gICAqICAgW3JlY292ZXJ5XT1cInRoaXMubXlSZWNvdmVyeS5iaW5kKHRoaXMpXCI+XHJcbiAgICogPC9wby1wYWdlLWxvZ2luPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogLSAqKlBvUGFnZUxvZ2luUmVjb3ZlcnkqKjogY3JpYS1zZSB2w61uY3VsbyBhdXRvbcOhdGljbyBjb20gbyB0ZW1wbGF0ZSAqKnBvLW1vZGFsLXBhc3N3b3JkLXJlY292ZXJ5KiouXHJcbiAgICogICBPIG9iamV0byBkZXZlIGNvbnRlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGUgcG9kZS1zZSBkZWZpbmlyIG8gKip0aXBvKiogZGUgbW9kYWwgcGFyYSByZWN1cGVyYcOnw6NvIGRlIHNlbmhhLFxyXG4gICAqICAgKiplbWFpbCoqIHBhcmEgY29udGF0byBlICoqbcOhc2NhcmEqKiBkbyBjYW1wbyBkZSB0ZWxlZm9uZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcmVjb3ZlcnknKSBzZXQgcmVjb3ZlcnkodmFsdWU6IHN0cmluZyB8IEZ1bmN0aW9uIHwgUG9QYWdlTG9naW5SZWNvdmVyeSkge1xyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCByZWNvdmVyeSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvdmVyeTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDYXNvIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBwYXJhIG5vdm9zIGNhZGFzdHJvcywgaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYSwgZGVzc2FcclxuICAgKiBmb3JtYSBzZXLDoSBleGliaWRvIHVtIGxpbmsgYWJhaXhvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luIHBhcmEgb3MgdXN1w6FyaW9zIGRhIGFwbGljYcOnw6NvLlxyXG4gICAqXHJcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcclxuICAgKiAtICoqbG9jYWwqKjogYC9ob21lYFxyXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pb2BcclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGByZWdpc3RlclVybGAuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXJlZ2lzdGVyLXVybCcpIHNldCByZWdpc3RlclVybCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWdpc3RlclVybCA9IGlzVHlwZW9mKHZhbHVlLCAnc3RyaW5nJykgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlclVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgbyB0aXBvIGRlIGVzcXVlbWEgZGEgYXV0ZW50aWNhw6fDo28sIHNlbmRvIHN1cG9ydGFkb3MgYXBlbmFzIG9zIHZhbG9yZXMgYEJhc2ljYCBlIGBCZWFyZXJgLlxyXG4gICAqXHJcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCYXNpY2AsIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYCBjb250ZW5kbzpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIGhlYWRlcnMge1xyXG4gICAqICBBdXRob3JpemF0aW9uOiBCYXNpYyBiYXNlNjQobG9naW46cGFzc3dvcmQpXHJcbiAgICogfVxyXG4gICAqXHJcbiAgICogYm9keSB7XHJcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCZWFyZXJgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBib2R5IHtcclxuICAgKiAgbG9naW46IGxvZ2luLFxyXG4gICAqICBwYXNzd29yZDogYmFzZTY0KHBhc3N3b3JkKSxcclxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWNgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXR5cGUnKSBzZXQgYXV0aGVudGljYXRpb25UeXBlKHZhbHVlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25UeXBlID0gKDxhbnk+T2JqZWN0KS52YWx1ZXMoUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUpLmluY2x1ZGVzKHZhbHVlKVxyXG4gICAgICA/IHZhbHVlXHJcbiAgICAgIDogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWM7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aGVudGljYXRpb25UeXBlKCk6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvLiBRdWFuZG8gcHJlZW5jaGlkbywgbyBtw6l0b2RvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6EgaWdub3JhZG8gZSBvXHJcbiAgICogY29tcG9uZW50ZSBhZHF1aXJpcsOhIGF1dG9tYXRpemHDp8OjbyBwYXJhIG8gcHJvY2Vzc28gZGUgYXV0ZW50aWNhw6fDo28uXHJcbiAgICpcclxuICAgKiAjIyMgUHJvY2Vzc29zXHJcbiAgICogQW8gZGlnaXRhciB1bSB2YWxvciB2w6FsaWRvIG5vIGNhbXBvIGRlIGxvZ2luL3Bhc3N3b3JkIGUgcHJlc3Npb25hciAqKkVudGVyKiosIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYFxyXG4gICAqIG5hIHVybCBlc3BlY2lmaWNhZGEgbmVzdGEgcHJvcHJpZWRhZGUgcGFzc2FuZG8gbyBvYmpldG8gY29udGVuZG8gbyB2YWxvciBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogaGVhZGVycyB7XHJcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcclxuICAgKiB9XHJcbiAgICpcclxuICAgKiBib2R5IHtcclxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFbSBjYXNvIGRlICoqc3VjZXNzbyoqLCBvIG9iamV0byBkZSByZXRvcm5vIMOpIGFybWF6ZW5hZG8gbm8gYHNlc3Npb25TdG9yYWdlYCBlIG8gdXN1w6FyaW8gw6kgcmVkaXJlY2lvbmFkbyBwYXJhIGEgcMOhZ2luYSBpbmljaWFsIGRhXHJcbiAgICogYXBsaWNhw6fDo28gYC9gLlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogMjAwOlxyXG4gICAqICB7XHJcbiAgICogICAgdXNlcjogdXNlclxyXG4gICAqICB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFbSBjYXNvIGRlICoqZXJybyoqIG5hIGF1dGVudGljYcOnw6NvLCBlc3BlcmEtc2UgbyBzZWd1aW50ZSByZXRvcm5vOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogNDAwLzQwMVxyXG4gICAqICB7XHJcbiAgICogICAgY29kZTogNDAwLzQwMSxcclxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAqICAgIGRldGFpbGVkTWVzc2FnZTogZGV0YWlsZWRNZXNzYWdlLFxyXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsXHJcbiAgICogIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqID4gUG9kZS1zZSBhdHJpYnVpciB1bWEgcXVhbnRpZGFkZSBtw6F4aW1hIGRlIHRlbnRhdGl2YXMgcmVzdGFudGVzIChtYXhBdHRlbXB0c1JlbWFpbmluZykgcGFyYSBvIGF0cmlidXRvIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgLFxyXG4gICAqIGFzc2ltIGNvbW8gb3MgYXZpc29zIHJlbGFjaW9uYWRvcyBhb3MgY2FtcG9zIGxvZ2luIGUgcGFzc3dvcmQgKGxvZ2luV2FybmluZ3MsIHBhc3N3b3JkV2FybmluZ3MpIHBhcmEgb3MgYXRyaWJ1dG9zIGBwLWxvZ2luLWVycm9yc2AgZVxyXG4gICAqIGBwLXBhc3N3b3JkLWVycm9yc2AgY29uZm9ybWUgcmV0b3JubyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiA0MDBcclxuICAgKiAge1xyXG4gICAqICAgIGNvZGU6IDQwMC80MDEsXHJcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcclxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcclxuICAgKiAgICBoZWxwVXJsPzogaGVscFVybCxcclxuICAgKiAgICBtYXhBdHRlbXB0c1JlbWFpbmluZz86IG1heEF0dGVtcHRzUmVtYWluaW5nLFxyXG4gICAqICAgIGxvZ2luV2FybmluZ3M/OiBbbG9naW5XYXJuaW5nc10sXHJcbiAgICogICAgcGFzc3dvcmRXYXJuaW5ncz86IFtwYXNzd29yZFdhcm5pbmdzXVxyXG4gICAqICB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiA+IENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybyksIHBvZGVyw6Egc2VyIHBhc3NhZG8gdW0gdmFsb3IgcGFyYSBvXHJcbiAgICogYXRyaWJ1dG8gYHAtYmxvY2tlZC11cmxgIGUgbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvIHBhcmEgdW1hIHRlbGEgZGUgYmxvcXVlaW8uXHJcbiAgICpcclxuICAgKiAqUHJvY2Vzc28gZmluYWxpemFkby4qXHJcbiAgICpcclxuICAgKiBfX19fX19fX19fX19fX19cclxuICAgKlxyXG4gICAqICMjIyMgUHJhdGljaWRhZGVcclxuICAgKiBBcyBpbmZvcm1hw6fDtWVzIGRvIHNlcnZpw6dvIGRlIGF1dGVudGljYcOnw6NvIHRhbWLDqW0gcG9kZW0gc2VyIHRyYW5zbWl0aWRhcyBkaXJldGFtZW50ZSBwZWxhcyBjb25maWd1cmHDp8Ojb3MgZGUgcm90YSBlLCBkZXN0YSBtYW5laXJhLFxyXG4gICAqIGRpc3BlbnNhLXNlIHF1YWxxdWVyIG1lbsOnw6NvIGUvb3UgaW1wb3J0YcOnw6NvIGRvIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIG5vIHJlc3RhbnRlIGRhIGFwbGljYcOnw6NvLiBPIGV4ZW1wbG8gYWJhaXhvIGV4ZW1wbGlmaWNhXHJcbiAgICogYSBmb3JtYSBkaW7Dom1pY2EgY29tIGEgcXVhbCBvIHRlbXBsYXRlIGRlIHRlbGEgZGUgbG9naW4gcG9kZSBzZXIgZ2VyYWRvIGFvIG5hdmVnYXIgcGFyYSByb3RhIGAvbG9naW5gLCBlIHRhbWLDqW0gY29tbyBlbGUgc2UgY29tdW5pY2FcclxuICAgKiBjb20gbyBzZXJ2acOnbyBwYXJhIGVmZXR1YcOnw6NvIGRvIHByb2Nlc3NvIGRlIGF1dGVudGljYcOnw6NvIGRvIHVzdcOhcmlvIGUgc29saWNpdGHDp8OjbyBkZSBub3ZhIHNlbmhhLlxyXG4gICAqIEJhc3RhIGRlZmluaXIgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkZSByb3RhOlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiAgIGltcG9ydCB7IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBQb1BhZ2VMb2dpbkF0aGVudGljYXRpb25UeXBlIH0gZnJvbSAnQHBvLXVpL25nLXRlbXBsYXRlcyc7XHJcbiAgICpcclxuICAgKiAgIC4uLlxyXG4gICAqICAgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXHJcbiAgICogICAgIHtcclxuICAgKiAgICAgICBwYXRoOiAnbG9naW4nLCBjb21wb25lbnQ6IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBkYXRhOiB7XHJcbiAgICogICAgICAgICBzZXJ2aWNlQXBpOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzL2F1dGhlbnRpY2F0aW9uJyxcclxuICAgKiAgICAgICAgIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnLFxyXG4gICAqICAgICAgICAgcmVjb3Zlcnk6IHtcclxuICAgKiAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzJyxcclxuICAgKiAgICAgICAgICAgdHlwZTogUG9Nb2RhbFBhc3N3b3JkUmVjb3ZlcnlUeXBlLkFsbCxcclxuICAgKiAgICAgICAgICAgY29udGFjdE1haWw6ICdkZXYucG9AcG8tdWkuY29tJyxcclxuICAgKiAgICAgICAgICAgcGhvbmVNYXNrOiAnOS05OTktOTk5LTk5OTknXHJcbiAgICogICAgICAgICB9LFxyXG4gICAqICAgICAgICAgcmVnaXN0ZXJVcmw6ICcvbmV3LXBhc3N3b3JkJyxcclxuICAgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZS5CYXNpY1xyXG4gICAqICAgICAgIH1cclxuICAgKiAgICAgfVxyXG4gICAqICAgICAuLi5cclxuICAgKiAgIF07XHJcbiAgICpcclxuICAgKiAgIEBOZ01vZHVsZSh7XHJcbiAgICogICAgIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yUm9vdChyb3V0ZXMpXSxcclxuICAgKiAgICAgZXhwb3J0czogW1JvdXRlck1vZHVsZV1cclxuICAgKiAgIH0pXHJcbiAgICogICBleHBvcnQgY2xhc3MgQXBwUm91dGluZ01vZHVsZSB7IH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqXHJcbiAgICogTyBtZXRhZGFkbyBgc2VydmljZUFwaWAgZGV2ZSBzZXIgYSAqKnVybCoqIHBhcmEgcmVxdWlzacOnw6NvIGRvcyByZWN1cnNvcyBkZSBhdXRlbnRpY2HDp8OjbywgbyBgZW52aXJvbm1lbnRgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGVcclxuICAgKiBgcC1lbnZpcm9ubWVudGAsIGByZWNvdmVyeWAgw6kgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luUmVjb3ZlcnlgIHJlc3BvbnPDoXZlbCBwZWxhcyBlc3BlY2lmaWNhw6fDtWVzIGNvbnRpZGFzIG5hIG1vZGFsIGRlIHJlY3VwZXJhw6fDo28gZGVcclxuICAgKiBzZW5oYSwgYHJlZ2lzdGVyVXJsYCBhbGltZW50YSBhIHByb3ByaWVkYWRlIGBwLXJlZ2lzdGVyLXVybGAgZSBgYXV0aGVudGljYXRpb25UeXBlYCBxdWUgZGVmaW5lIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdHlwZWAuXHJcbiAgICpcclxuICAgKiA+IMOJIGVzc2VuY2lhbCBxdWUgc2lnYSBhIG5vbWVuY2xhdHVyYSBkb3MgYXRyaWJ1dG9zIGV4ZW1wbGlmaWNhZG9zIGFjaW1hIHBhcmEgc3VhIGVmZXRpdmEgZnVuY2lvbmFsaWRhZGUuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3AtYXV0aGVudGljYXRpb24tdXJsJykgc2V0IGF1dGhlbnRpY2F0aW9uVXJsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dGhlbnRpY2F0aW9uVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Vcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogQ2FzbyBvIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCBzZWphIGlndWFsIGEgMCh6ZXJvKSBlIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBkZSBibG9xdWVpbyBkZSB1c3XDoXJpbyxcclxuICAgKiBpbmZvcm1lIHVtYSB1cmwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhLCBkZXNzYSBmb3JtYSBlbSBjYXNvIGRlIGJsb3F1ZWlvIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkby5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtYmxvY2tlZC11cmwnKSBzZXQgYmxvY2tlZFVybCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9ibG9ja2VkVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJsb2NrZWRVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9ibG9ja2VkVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV4aWJlIHVtIGJvdMOjbyBwYXJhIHN1cG9ydGUuXHJcbiAgICpcclxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XHJcbiAgICpcclxuICAgKiAtICoqU3RyaW5nKio6IFVSTCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XHJcbiAgICogLSAqKkZ1bmN0aW9uKio6IEZ1bsOnw6NvIGEgc2VyIGRpc3BhcmFkYSBhbyBjbGljYXIgbm8gYm90w6NvIGRlIHN1cG9ydGU7XHJcbiAgICogYGBgXHJcbiAgICogPHBvLXBhZ2UtbG9naW4+XHJcbiAgICogICBbcC1zdXBwb3J0XT1cInRoaXMubXlTdXBwb3J0LmJpbmQodGhpcylcIj5cclxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3Atc3VwcG9ydCcpIHNldCBzdXBwb3J0KHZhbHVlOiBzdHJpbmcgfCBGdW5jdGlvbikge1xyXG4gICAgdGhpcy5fc3VwcG9ydCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN1cHBvcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDb2xlw6fDo28gZGUgaWRpb21hcyBxdWUgbyBjb21wb25lbnRlIGlyw6EgdHJhdGFyIGUgZGlzcG9uaWJpbGl6YXLDoSBwYXJhIG8gdXN1w6FyaW8gZXNjb2xoZXIuXHJcbiAgICpcclxuICAgKiBDYXNvIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBzZWphIHV0aWxpemFkYSBvIGNvbXBvbmVudGUgbW9zdHJhcsOhIG5vIGNvbWJvIG9zIGlkaW9tYXMgcXVlIGVsZSBzdXBvcnRhIHBvciBwYWRyw6NvLlxyXG4gICAqXHJcbiAgICogQ2FzbyBhIGNvbGXDp8OjbyB0ZW5oYSB1bSBpZGlvbWEsIGEgcMOhZ2luYSBlc3RhcsOhIG5lc3NlIGlkaW9tYSBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8uXHJcbiAgICpcclxuICAgKiBDYXNvIHNlamEgcGFzc2FkbyB1bSBhcnJheSB2YXppbywgYSBww6FnaW5hIHRlcsOhIG8gaWRpb21hIGNvbmZpZ3VyYWRvIG5vIGBpMThuYCBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8gZGUgc2VsZcOnw6NvLlxyXG4gICAqXHJcbiAgICogPiBTZSBmb3IgcGFzc2FkbyB1bSBpZGlvbWEgbsOjbyBzdXBvcnRhZG8sIHNlcsOhIHByZWNpc28gcGFzc2FyIGFzIGxpdGVyYWlzIHBlbGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxyXG4gICAqXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3AtbGFuZ3VhZ2VzJykgc2V0IGxhbmd1YWdlc0xpc3QobGFuZ3VhZ2VzTGlzdDogQXJyYXk8UG9MYW5ndWFnZT4pIHtcclxuICAgIGlmIChsYW5ndWFnZXNMaXN0KSB7XHJcbiAgICAgIGlmIChsYW5ndWFnZXNMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBsYW5ndWFnZXNMaXN0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBwb0xhbmd1YWdlRGVmYXVsdC5maWx0ZXIobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2UubGFuZ3VhZ2UgPT09IHRoaXMubGFuZ3VhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2VzTGlzdCgpOiBBcnJheTxQb0xhbmd1YWdlPiB7XHJcbiAgICBpZiAodGhpcy5fbGFuZ3VhZ2VzTGlzdCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzTGlzdDtcclxuICAgIH1cclxuICAgIHJldHVybiBwb0xhbmd1YWdlRGVmYXVsdDtcclxuICB9XHJcblxyXG4gIGdldCBzaG93TGFuZ3VhZ2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZXNMaXN0Lmxlbmd0aCA+IDE7XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgfHwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UoKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlTG9naW5MaXRlcmFscygpOiBQb1BhZ2VMb2dpbkxpdGVyYWxzIHtcclxuICAgIGNvbnN0IGxvZ2luSGludFdpdGhDb250YWN0RW1haWwgPSB0aGlzLmNvbnRhY3RFbWFpbFxyXG4gICAgICA/IHRoaXMuY29uY2F0ZW5hdGVMb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsKHRoaXMuY29udGFjdEVtYWlsKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxyXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFt0aGlzLmxhbmd1YWdlXSxcclxuICAgICAgLi4ubG9naW5IaW50V2l0aENvbnRhY3RFbWFpbCxcclxuICAgICAgLi4udGhpcy5saXRlcmFsc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsb2dpblNlcnZpY2U6IFBvUGFnZUxvZ2luU2VydmljZSxcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBwb0xhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMucG9MYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5sb2dpblN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZVBvcG92ZXIoKSB7XHJcbiAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25Mb2dpblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxvZ2luRm9ybTogUG9QYWdlTG9naW4gPSB7XHJcbiAgICAgIGxvZ2luOiB0aGlzLmxvZ2luLFxyXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcclxuICAgICAgcmVtZW1iZXJVc2VyOiB0aGlzLnJlbWVtYmVyVXNlclxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5jdXN0b21GaWVsZCkge1xyXG4gICAgICBsb2dpbkZvcm1bdGhpcy5jdXN0b21GaWVsZE9iamVjdC5wcm9wZXJ0eV0gPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XHJcbiAgICAgIHRoaXMubG9naW5TdWJzY3JpcHRpb24gPSB0aGlzLmxvZ2luU2VydmljZVxyXG4gICAgICAgIC5vbkxvZ2luKHRoaXMuYXV0aGVudGljYXRpb25VcmwsIHRoaXMuYXV0aGVudGljYXRpb25UeXBlLCBsb2dpbkZvcm0pXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlc1RvUHJvcGVydGllcygpO1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5JbnRlcm5hbExpbmsoJy8nKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5jb2RlID09PSAnNDAwJyB8fCBlcnJvci5lcnJvci5jb2RlID09PSAnNDAxJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0QmxvY2tlZFVybCh0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nLCB0aGlzLmJsb2NrZWRVcmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChsb2dpbkZvcm0pO1xyXG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWZhdWx0Q3VzdG9tRmllbGRPYmplY3QocHJvcGVydHkpOiBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIHtcclxuICAgIHJldHVybiB7IHByb3BlcnR5IH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5FeHRlcm5hbExpbmsodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuSW50ZXJuYWxMaW5rKHVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZGlyZWN0QmxvY2tlZFVybChhdHRlbXB0czogbnVtYmVyLCBibG9ja2VkVXJsOiBzdHJpbmcpIHtcclxuICAgIGlmIChhdHRlbXB0cyA9PT0gMCAmJiBibG9ja2VkVXJsKSB7XHJcbiAgICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XHJcbiAgICAgIGlzRXh0ZXJuYWxMaW5rKGJsb2NrZWRVcmwpID8gdGhpcy5vcGVuRXh0ZXJuYWxMaW5rKGJsb2NrZWRVcmwpIDogdGhpcy5vcGVuSW50ZXJuYWxMaW5rKGJsb2NrZWRVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZXNUb1Byb3BlcnRpZXMocmVzdWx0Pykge1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gcmVzdWx0LmVycm9yLm1heEF0dGVtcHRzUmVtYWluaW5nO1xyXG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gcmVzdWx0LmVycm9yLmxvZ2luV2FybmluZ3M7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSByZXN1bHQuZXJyb3IucGFzc3dvcmRXYXJuaW5ncztcclxuICAgICAgdGhpcy5ibG9ja2VkVXJsID0gcmVzdWx0LmVycm9yLmJsb2NrZWRVcmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gMDtcclxuICAgICAgdGhpcy5sb2dpbkVycm9ycyA9IFtdO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gW107XHJcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbmNhdGVuYXRlTG9naW5IaW50V2l0aENvbnRhY3RFbWFpbChjb250YWN0RW1haWw6IHN0cmluZyk7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRMb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRQYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XHJcbn1cclxuIl19
|
|
1
|
+
import { EventEmitter, Input, Output, Directive } from '@angular/core';
|
|
2
|
+
import { convertToBoolean, convertToInt, getShortBrowserLanguage, isExternalLink, isTypeof } from './../../utils/util';
|
|
3
|
+
import { poLocaleDefault, poLanguageDefault } from '@po-ui/ng-components';
|
|
4
|
+
import { PoPageLoginAuthenticationType } from './enums/po-page-login-authentication-type.enum';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./po-page-login.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@po-ui/ng-components";
|
|
9
|
+
const poPageLoginContentMaxLength = 40;
|
|
10
|
+
export const poPageLoginLiteralsDefault = {
|
|
11
|
+
en: {
|
|
12
|
+
title: 'Welcome',
|
|
13
|
+
loginErrorPattern: 'Invalid Login',
|
|
14
|
+
loginHint: `Your login user was given to you at your first day.
|
|
15
|
+
If you don't have this information contact support`,
|
|
16
|
+
loginPlaceholder: 'Insert your e-mail',
|
|
17
|
+
passwordErrorPattern: 'Invalid Password',
|
|
18
|
+
passwordPlaceholder: 'Insert your password',
|
|
19
|
+
customFieldErrorPattern: 'Invalid value',
|
|
20
|
+
customFieldPlaceholder: 'Please enter a value',
|
|
21
|
+
rememberUser: 'Automatic login',
|
|
22
|
+
rememberUserHint: 'You can disable this option in system configuration',
|
|
23
|
+
submitLabel: 'Enter',
|
|
24
|
+
submittedLabel: 'Loading...',
|
|
25
|
+
forgotPassword: 'Forgot your Password?',
|
|
26
|
+
highlightInfo: '',
|
|
27
|
+
registerUrl: 'New register',
|
|
28
|
+
titlePopover: 'Oops!',
|
|
29
|
+
forgotYourPassword: 'Forgot your password?',
|
|
30
|
+
ifYouTryHarder: 'If you try ',
|
|
31
|
+
attempts: '{0} more time(s) ',
|
|
32
|
+
yourUserWillBeBlocked: 'without success your user will be blocked and you will be left 24 hours without being able to access :(',
|
|
33
|
+
createANewPasswordNow: 'Better create a new password now! You will be able to log into the system right away.',
|
|
34
|
+
iForgotMyPassword: 'I forgot my password',
|
|
35
|
+
welcome: 'Welcome',
|
|
36
|
+
support: 'Support'
|
|
37
|
+
},
|
|
38
|
+
es: {
|
|
39
|
+
title: 'Bienvenido',
|
|
40
|
+
loginErrorPattern: 'Login inválido',
|
|
41
|
+
loginHint: `Su usuario ha sido entregado para usted en su primer día.
|
|
42
|
+
Si no tiene esta información, póngase en contacto con el soporte técnico`,
|
|
43
|
+
loginPlaceholder: 'Inserte su e-mail',
|
|
44
|
+
passwordErrorPattern: 'Contraseña inválida',
|
|
45
|
+
passwordPlaceholder: 'Inserte su contraseña',
|
|
46
|
+
customFieldErrorPattern: 'Valor no válido.',
|
|
47
|
+
customFieldPlaceholder: 'Por favor introduzca un valor',
|
|
48
|
+
rememberUser: 'Inicio de sesión automáticamente',
|
|
49
|
+
rememberUserHint: 'Puede deshabilitar esta opción en el menú del sistema.',
|
|
50
|
+
submitLabel: 'Entrar',
|
|
51
|
+
submittedLabel: 'Cargando...',
|
|
52
|
+
forgotPassword: 'Olvidaste tu contraseña?',
|
|
53
|
+
highlightInfo: '',
|
|
54
|
+
registerUrl: 'Nuevo registro',
|
|
55
|
+
titlePopover: 'Opa!',
|
|
56
|
+
forgotYourPassword: 'Olvidaste tu contraseña?',
|
|
57
|
+
ifYouTryHarder: 'Si intenta más ',
|
|
58
|
+
attempts: '{0} vez/veces ',
|
|
59
|
+
yourUserWillBeBlocked: 'sin éxito su usuario sera bloqueado y usted vás permanecer 24 horas sin poder acceder a :(',
|
|
60
|
+
createANewPasswordNow: '¡Mejor crear una nueva contraseña ahora! Usted podrá entrar en el sistema inmediatamente después.',
|
|
61
|
+
iForgotMyPassword: 'Olvide mi contraseña',
|
|
62
|
+
welcome: 'Bienvenido',
|
|
63
|
+
support: 'Soporte'
|
|
64
|
+
},
|
|
65
|
+
pt: {
|
|
66
|
+
title: 'Bem-vindo',
|
|
67
|
+
loginErrorPattern: 'Login inválido',
|
|
68
|
+
loginHint: `Seu usuário foi entregue a você no seu primeiro dia.
|
|
69
|
+
Caso não tenha mais essa informação contacte o suporte`,
|
|
70
|
+
loginPlaceholder: 'Insira seu e-mail',
|
|
71
|
+
passwordErrorPattern: 'Senha inválida',
|
|
72
|
+
passwordPlaceholder: 'Insira sua senha',
|
|
73
|
+
customFieldErrorPattern: 'Valor inválido.',
|
|
74
|
+
customFieldPlaceholder: 'Por favor insira um valor',
|
|
75
|
+
rememberUser: 'Logar automaticamente',
|
|
76
|
+
rememberUserHint: 'Você pode desabilitar essa opção no menu do sistema',
|
|
77
|
+
submitLabel: 'Entrar',
|
|
78
|
+
submittedLabel: 'Carregando...',
|
|
79
|
+
forgotPassword: 'Esqueceu sua senha?',
|
|
80
|
+
highlightInfo: '',
|
|
81
|
+
registerUrl: 'Novo registro',
|
|
82
|
+
titlePopover: 'Opa!',
|
|
83
|
+
forgotYourPassword: 'Esqueceu sua senha?',
|
|
84
|
+
ifYouTryHarder: 'Se tentar mais ',
|
|
85
|
+
attempts: '{0} vez(es) ',
|
|
86
|
+
yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :(',
|
|
87
|
+
createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
|
|
88
|
+
iForgotMyPassword: 'Esqueci minha senha',
|
|
89
|
+
welcome: 'Boas-vindas',
|
|
90
|
+
support: 'Suporte'
|
|
91
|
+
},
|
|
92
|
+
ru: {
|
|
93
|
+
title: 'Добро пожаловать!',
|
|
94
|
+
loginErrorPattern: 'Неверный логин',
|
|
95
|
+
loginHint: `Ваш логин был предоставлен вам в первый день.
|
|
96
|
+
Если у вас нет этой информации, обратитесь в службу поддержки`,
|
|
97
|
+
loginPlaceholder: 'Вставьте свой адрес электронной почты',
|
|
98
|
+
passwordErrorPattern: 'Неверный пароль',
|
|
99
|
+
passwordPlaceholder: 'Введите свой пароль',
|
|
100
|
+
customFieldErrorPattern: 'Неверное значение.',
|
|
101
|
+
customFieldPlaceholder: 'Пожалуйста, введите значение',
|
|
102
|
+
rememberUser: 'Автоматический вход',
|
|
103
|
+
rememberUserHint: 'Вы можете отключить эту опцию в конфигурации системы',
|
|
104
|
+
submitLabel: 'Войти',
|
|
105
|
+
submittedLabel: '3агрузка...',
|
|
106
|
+
forgotPassword: 'Забыли пароль?',
|
|
107
|
+
highlightInfo: '',
|
|
108
|
+
registerUrl: 'Новый регистр',
|
|
109
|
+
titlePopover: 'Ой!',
|
|
110
|
+
forgotYourPassword: 'Забыли пароль?',
|
|
111
|
+
ifYouTryHarder: 'Если вы безуспешно попытаетесь войти еще ',
|
|
112
|
+
attempts: '{0} раз(а) ',
|
|
113
|
+
yourUserWillBeBlocked: 'Ваш пользователь будет заблокирован, и Вы останетесь на 24 часа без возможности доступа :(',
|
|
114
|
+
createANewPasswordNow: 'Лучше создайте новый пароль сейчас! Вы сможете сразу войти в систему.',
|
|
115
|
+
iForgotMyPassword: 'Я забыл свой пароль',
|
|
116
|
+
welcome: 'добро пожаловать',
|
|
117
|
+
support: 'Поддержка'
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
export const poPageLoginLiteralIn = {
|
|
121
|
+
en: 'in',
|
|
122
|
+
es: 'en',
|
|
123
|
+
pt: 'em',
|
|
124
|
+
ru: 'в'
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* @description
|
|
128
|
+
*
|
|
129
|
+
* O componente `po-page-login` é utilizado como template para tela de login.
|
|
130
|
+
* Com ele é possível definirmos valores para usuário, senha e definir ações para recuperação de senha e gravação de dados do usuário.
|
|
131
|
+
* Também é possível inserir uma imagem em conjunto com um texto de destaque.
|
|
132
|
+
*
|
|
133
|
+
*
|
|
134
|
+
* A propriedade `p-authentication-url` automatiza a rotina do componente e simplifica o processo para autenticação do usuário, bastando
|
|
135
|
+
* definir uma url para requisição da autenticação. A flexibilidade e praticidade podem chegar a um nível em que o desenvolvimento
|
|
136
|
+
* da aplicação no *client side* é desprovida de qualquer código-fonte relacionado à rotina de login de usuário.
|
|
137
|
+
* Seu detalhamento para uso pode ser visto logo abaixo em *propriedades*.
|
|
138
|
+
* Caso julgue necessário, pode-se também definir manualmente a rotina do componente.
|
|
139
|
+
*
|
|
140
|
+
*
|
|
141
|
+
* Para que as imagens sejam exibidas corretamente, é necessário incluir o caminho delas ao projeto. Para isso, edite
|
|
142
|
+
* o *assets* no arquivo **angular.json** da aplicação na seguinte ordem:
|
|
143
|
+
* ```
|
|
144
|
+
* "assets": [
|
|
145
|
+
* "src/assets",
|
|
146
|
+
* "src/favicon.ico",
|
|
147
|
+
* {
|
|
148
|
+
* "glob": "**\/*",
|
|
149
|
+
* "input": "node_modules/@po-ui/style/images",
|
|
150
|
+
* "output": "assets/images"
|
|
151
|
+
* }
|
|
152
|
+
* ]
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export class PoPageLoginBaseComponent {
|
|
156
|
+
constructor(loginService, router, poLanguageService) {
|
|
157
|
+
this.loginService = loginService;
|
|
158
|
+
this.router = router;
|
|
159
|
+
this.poLanguageService = poLanguageService;
|
|
160
|
+
/**
|
|
161
|
+
* @optional
|
|
162
|
+
*
|
|
163
|
+
* @description
|
|
164
|
+
*
|
|
165
|
+
* Evento disparado quando o usuário alterar o input do campo login.
|
|
166
|
+
*
|
|
167
|
+
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
168
|
+
*
|
|
169
|
+
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
170
|
+
*/
|
|
171
|
+
this.loginChange = new EventEmitter();
|
|
172
|
+
/**
|
|
173
|
+
* Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
|
|
174
|
+
*
|
|
175
|
+
* Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
|
|
176
|
+
*
|
|
177
|
+
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
|
|
178
|
+
*
|
|
179
|
+
* > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
|
|
180
|
+
*/
|
|
181
|
+
this.loginSubmit = new EventEmitter();
|
|
182
|
+
/**
|
|
183
|
+
* @optional
|
|
184
|
+
*
|
|
185
|
+
* @description
|
|
186
|
+
*
|
|
187
|
+
* Evento disparado quando o usuário alterar o input do campo password.
|
|
188
|
+
*
|
|
189
|
+
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
190
|
+
*
|
|
191
|
+
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
192
|
+
*/
|
|
193
|
+
this.passwordChange = new EventEmitter();
|
|
194
|
+
/**
|
|
195
|
+
* @optional
|
|
196
|
+
*
|
|
197
|
+
* @description
|
|
198
|
+
*
|
|
199
|
+
* Evento disparado quando o usuário alterar o idioma da página.
|
|
200
|
+
*
|
|
201
|
+
* Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
|
|
202
|
+
*
|
|
203
|
+
*/
|
|
204
|
+
this.languageChange = new EventEmitter();
|
|
205
|
+
this.allLoginErrors = [];
|
|
206
|
+
this.allPasswordErrors = [];
|
|
207
|
+
this.rememberUser = false;
|
|
208
|
+
this.showExceededAttemptsWarning = false;
|
|
209
|
+
this._authenticationType = PoPageLoginAuthenticationType.Basic;
|
|
210
|
+
this._hideRememberUser = false;
|
|
211
|
+
this._loading = false;
|
|
212
|
+
this._loginErrors = [];
|
|
213
|
+
this._passwordErrors = [];
|
|
214
|
+
this.selectedLanguage = this.poLanguageService.getShortLanguage();
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* @optional
|
|
218
|
+
*
|
|
219
|
+
* @description
|
|
220
|
+
*
|
|
221
|
+
* Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
|
|
222
|
+
* os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
|
|
223
|
+
*
|
|
224
|
+
* Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
|
|
225
|
+
* através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
|
|
226
|
+
* ou `po-select` para valores fixos.
|
|
227
|
+
*
|
|
228
|
+
* Abaixo seguem os exemplos de cada tipo de campo.
|
|
229
|
+
*
|
|
230
|
+
* `po-input`:
|
|
231
|
+
*
|
|
232
|
+
* ```
|
|
233
|
+
* {
|
|
234
|
+
* property: 'domain',
|
|
235
|
+
* value: 'jv01',
|
|
236
|
+
* placeholder: 'Enter your domain',
|
|
237
|
+
* pattern: '[a-z]',
|
|
238
|
+
* errorPattern: 'Invalid value'
|
|
239
|
+
* }
|
|
240
|
+
* ```
|
|
241
|
+
*
|
|
242
|
+
* `po-combo`:
|
|
243
|
+
*
|
|
244
|
+
* ```
|
|
245
|
+
* {
|
|
246
|
+
* property: 'domain',
|
|
247
|
+
* value: 'jv01',
|
|
248
|
+
* placeholder: 'Enter your domain',
|
|
249
|
+
* url: 'https://po-ui.io/sample/api/comboOption/domains',
|
|
250
|
+
* fieldValue: 'nickname'
|
|
251
|
+
* }
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* `po-select`:
|
|
255
|
+
*
|
|
256
|
+
* ```
|
|
257
|
+
* {
|
|
258
|
+
* property: 'domain',
|
|
259
|
+
* value: 'jv01',
|
|
260
|
+
* placeholder: 'Enter your domain',
|
|
261
|
+
* options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
|
|
262
|
+
* }
|
|
263
|
+
* ```
|
|
264
|
+
*
|
|
265
|
+
* Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
|
|
266
|
+
* utilizando o options.
|
|
267
|
+
*
|
|
268
|
+
*/
|
|
269
|
+
set customField(value) {
|
|
270
|
+
if (value) {
|
|
271
|
+
if (isTypeof(value, 'string')) {
|
|
272
|
+
this.customFieldType = 'input';
|
|
273
|
+
this._customField = value;
|
|
274
|
+
this.customFieldObject = this.getDefaultCustomFieldObject(value);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
|
|
278
|
+
this._customField = value;
|
|
279
|
+
this.customFieldObject = value;
|
|
280
|
+
if (!this.customFieldObject.options && !this.customFieldObject.url) {
|
|
281
|
+
this.customFieldType = 'input';
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
|
|
285
|
+
}
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
this._customField = undefined;
|
|
290
|
+
this.customFieldObject = undefined;
|
|
291
|
+
}
|
|
292
|
+
get customField() {
|
|
293
|
+
return this._customField;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @optional
|
|
297
|
+
*
|
|
298
|
+
* @description
|
|
299
|
+
*
|
|
300
|
+
* Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
|
|
301
|
+
*/
|
|
302
|
+
set contactEmail(value) {
|
|
303
|
+
this._contactEmail = value;
|
|
304
|
+
}
|
|
305
|
+
get contactEmail() {
|
|
306
|
+
return this._contactEmail;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* @optional
|
|
310
|
+
*
|
|
311
|
+
* @description
|
|
312
|
+
*
|
|
313
|
+
* Texto customizado que fica entre a logo e a mensagem de boas-vindas.
|
|
314
|
+
*/
|
|
315
|
+
set productName(value) {
|
|
316
|
+
this._productName = value;
|
|
317
|
+
}
|
|
318
|
+
get productName() {
|
|
319
|
+
return this._productName;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* @optional
|
|
323
|
+
*
|
|
324
|
+
* @description
|
|
325
|
+
* Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
|
|
326
|
+
*
|
|
327
|
+
* > Essa propriedade limita o texto em 40 caracteres.
|
|
328
|
+
*/
|
|
329
|
+
set environment(environment) {
|
|
330
|
+
if (environment && environment.length > poPageLoginContentMaxLength) {
|
|
331
|
+
this._environment = environment.substring(0, poPageLoginContentMaxLength);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this._environment = environment;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
get environment() {
|
|
338
|
+
return this._environment;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* @optional
|
|
342
|
+
*
|
|
343
|
+
* @description
|
|
344
|
+
* Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
|
|
345
|
+
* O aviso será exibido somente se a quantidade for maior que zero.
|
|
346
|
+
*
|
|
347
|
+
* > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
|
|
348
|
+
* para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
|
|
349
|
+
*
|
|
350
|
+
* @default `0`
|
|
351
|
+
*/
|
|
352
|
+
set exceededAttemptsWarning(value) {
|
|
353
|
+
this._exceededAttemptsWarning = convertToInt(value);
|
|
354
|
+
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
355
|
+
}
|
|
356
|
+
get exceededAttemptsWarning() {
|
|
357
|
+
return this._exceededAttemptsWarning;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* @optional
|
|
361
|
+
*
|
|
362
|
+
* @description
|
|
363
|
+
*
|
|
364
|
+
* Esconde a função "Lembrar usuário" do formulário de login.
|
|
365
|
+
*
|
|
366
|
+
* Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
|
|
367
|
+
* `false`.
|
|
368
|
+
*
|
|
369
|
+
* > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
|
|
370
|
+
*
|
|
371
|
+
* @default `false`
|
|
372
|
+
*/
|
|
373
|
+
set hideRememberUser(value) {
|
|
374
|
+
this._hideRememberUser = value === '' ? true : convertToBoolean(value);
|
|
375
|
+
if (this._hideRememberUser) {
|
|
376
|
+
this.rememberUser = false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
get hideRememberUser() {
|
|
380
|
+
return this._hideRememberUser;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* @optional
|
|
384
|
+
*
|
|
385
|
+
* @description
|
|
386
|
+
*
|
|
387
|
+
* Objeto com as literais usadas no `po-page-login`.
|
|
388
|
+
*
|
|
389
|
+
* Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
|
|
390
|
+
*
|
|
391
|
+
* ```
|
|
392
|
+
* const customLiterals: PoPageLoginLiterals = {
|
|
393
|
+
* attempts: '{0} vez(es) ',
|
|
394
|
+
* createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
|
|
395
|
+
* forgotPassword: 'Esqueceu sua senha?',
|
|
396
|
+
* forgotYourPassword: 'Esqueceu sua senha?',
|
|
397
|
+
* highlightInfo: '',
|
|
398
|
+
* iForgotMyPassword: 'Esqueci minha senha',
|
|
399
|
+
* ifYouTryHarder: 'Se tentar mais ',
|
|
400
|
+
* welcome: 'Boas-vindas',
|
|
401
|
+
* loginErrorPattern: 'Login obrigatório',
|
|
402
|
+
* loginHint: 'Caso não possua usuário entre em contato com o suporte',
|
|
403
|
+
* loginLabel: 'Insira seu usuário',
|
|
404
|
+
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
405
|
+
* passwordErrorPattern: 'Senha obrigatória',
|
|
406
|
+
* passwordLabel: 'Insira sua senha',
|
|
407
|
+
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
408
|
+
* customFieldErrorPattern: 'Campo customizado inválido',
|
|
409
|
+
* customFieldPlaceholder: 'Por favor insira um valor',
|
|
410
|
+
* registerUrl: 'Novo registro',
|
|
411
|
+
* rememberUser: 'Lembrar usuário',
|
|
412
|
+
* rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
|
|
413
|
+
* submitLabel: 'Acessar sistema',
|
|
414
|
+
* submittedLabel: 'Carregando...',
|
|
415
|
+
* titlePopover: 'Opa!',
|
|
416
|
+
* yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
|
|
417
|
+
* };
|
|
418
|
+
* ```
|
|
419
|
+
*
|
|
420
|
+
* Ou passando apenas as literais que deseja customizar:
|
|
421
|
+
*
|
|
422
|
+
* ```
|
|
423
|
+
* const customLiterals: PoPageLoginLiterals = {
|
|
424
|
+
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
425
|
+
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
426
|
+
* submitLabel: 'Acessar sistema'
|
|
427
|
+
* };
|
|
428
|
+
* ```
|
|
429
|
+
*
|
|
430
|
+
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
|
|
431
|
+
*
|
|
432
|
+
* ```
|
|
433
|
+
* <po-page-login
|
|
434
|
+
* [p-literals]="customLiterals">
|
|
435
|
+
* </po-page-login>
|
|
436
|
+
* ```
|
|
437
|
+
*
|
|
438
|
+
* > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
|
|
439
|
+
* > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
|
|
440
|
+
* nesse caso, há também a opção do idioma russo.
|
|
441
|
+
*/
|
|
442
|
+
set literals(value) {
|
|
443
|
+
this._literals = value;
|
|
444
|
+
}
|
|
445
|
+
get literals() {
|
|
446
|
+
return this._literals;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* @optional
|
|
450
|
+
*
|
|
451
|
+
* @description
|
|
452
|
+
*
|
|
453
|
+
* Habilita um estado de carregamento ao botão de *login*.
|
|
454
|
+
*
|
|
455
|
+
* > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
|
|
456
|
+
*
|
|
457
|
+
* @default `false`
|
|
458
|
+
*/
|
|
459
|
+
set loading(value) {
|
|
460
|
+
this._loading = convertToBoolean(value);
|
|
461
|
+
}
|
|
462
|
+
get loading() {
|
|
463
|
+
return this._loading;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* @optional
|
|
467
|
+
*
|
|
468
|
+
* @description
|
|
469
|
+
*
|
|
470
|
+
* Valor do modelo do campo de login.
|
|
471
|
+
*/
|
|
472
|
+
set login(value) {
|
|
473
|
+
this._login = value;
|
|
474
|
+
if (!this.authenticationUrl) {
|
|
475
|
+
this.loginChange.emit(this._login);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
get login() {
|
|
479
|
+
return this._login;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* @optional
|
|
483
|
+
*
|
|
484
|
+
* @description
|
|
485
|
+
*
|
|
486
|
+
* Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
|
|
487
|
+
*/
|
|
488
|
+
set loginErrors(value) {
|
|
489
|
+
this._loginErrors = value || [];
|
|
490
|
+
this.setLoginErrors(this._loginErrors);
|
|
491
|
+
}
|
|
492
|
+
get loginErrors() {
|
|
493
|
+
return this._loginErrors;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* @optional
|
|
497
|
+
*
|
|
498
|
+
* @description
|
|
499
|
+
*
|
|
500
|
+
* Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
|
|
501
|
+
*/
|
|
502
|
+
set passwordErrors(value) {
|
|
503
|
+
this._passwordErrors = value || [];
|
|
504
|
+
this.setPasswordErrors(this._passwordErrors);
|
|
505
|
+
}
|
|
506
|
+
get passwordErrors() {
|
|
507
|
+
return this._passwordErrors;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* @optional
|
|
511
|
+
*
|
|
512
|
+
* @description
|
|
513
|
+
*
|
|
514
|
+
* Exibe um link abaixo do formulário de login para que os usuários da aplicação façam a recuperação dos dados de autenticação.
|
|
515
|
+
*
|
|
516
|
+
* A propriedade aceita os seguintes tipos:
|
|
517
|
+
*
|
|
518
|
+
* - **String**: informe uma url externa ou uma rota válida;
|
|
519
|
+
* - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
|
|
520
|
+
* ```
|
|
521
|
+
* <po-page-login>
|
|
522
|
+
* [recovery]="this.myRecovery.bind(this)">
|
|
523
|
+
* </po-page-login>
|
|
524
|
+
* ```
|
|
525
|
+
*
|
|
526
|
+
* - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
|
|
527
|
+
* O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
|
|
528
|
+
* **email** para contato e **máscara** do campo de telefone.
|
|
529
|
+
*/
|
|
530
|
+
set recovery(value) {
|
|
531
|
+
this._recovery = value;
|
|
532
|
+
}
|
|
533
|
+
get recovery() {
|
|
534
|
+
return this._recovery;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* @optional
|
|
538
|
+
*
|
|
539
|
+
* @description
|
|
540
|
+
*
|
|
541
|
+
* Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
|
|
542
|
+
* forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
|
|
543
|
+
*
|
|
544
|
+
* Exemplos de valores válidos:
|
|
545
|
+
* - **local**: `/home`
|
|
546
|
+
* - **url externa**: `https://po-ui.io`
|
|
547
|
+
*
|
|
548
|
+
* > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
|
|
549
|
+
*/
|
|
550
|
+
set registerUrl(value) {
|
|
551
|
+
this._registerUrl = isTypeof(value, 'string') ? value : undefined;
|
|
552
|
+
}
|
|
553
|
+
get registerUrl() {
|
|
554
|
+
return this._registerUrl;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* @optional
|
|
558
|
+
*
|
|
559
|
+
* @description
|
|
560
|
+
*
|
|
561
|
+
* Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
|
|
562
|
+
*
|
|
563
|
+
* > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
|
|
564
|
+
*
|
|
565
|
+
* ```
|
|
566
|
+
* headers {
|
|
567
|
+
* Authorization: Basic base64(login:password)
|
|
568
|
+
* }
|
|
569
|
+
*
|
|
570
|
+
* body {
|
|
571
|
+
* rememberUser: rememberUser
|
|
572
|
+
* }
|
|
573
|
+
* ```
|
|
574
|
+
*
|
|
575
|
+
* > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
|
|
576
|
+
*
|
|
577
|
+
* ```
|
|
578
|
+
* body {
|
|
579
|
+
* login: login,
|
|
580
|
+
* password: base64(password),
|
|
581
|
+
* rememberUser: rememberUser
|
|
582
|
+
* }
|
|
583
|
+
* ```
|
|
584
|
+
*
|
|
585
|
+
* @default `PoPageLoginAuthenticationType.Basic`
|
|
586
|
+
*/
|
|
587
|
+
set authenticationType(value) {
|
|
588
|
+
this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
|
|
589
|
+
? value
|
|
590
|
+
: PoPageLoginAuthenticationType.Basic;
|
|
591
|
+
}
|
|
592
|
+
get authenticationType() {
|
|
593
|
+
return this._authenticationType;
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* @optional
|
|
597
|
+
*
|
|
598
|
+
* @description
|
|
599
|
+
*
|
|
600
|
+
* Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
|
|
601
|
+
* componente adquirirá automatização para o processo de autenticação.
|
|
602
|
+
*
|
|
603
|
+
* ### Processos
|
|
604
|
+
* Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
|
|
605
|
+
* na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
|
|
606
|
+
*
|
|
607
|
+
* ```
|
|
608
|
+
* headers {
|
|
609
|
+
* Authorization: Basic base64(login:password)
|
|
610
|
+
* }
|
|
611
|
+
*
|
|
612
|
+
* body {
|
|
613
|
+
* rememberUser: rememberUser
|
|
614
|
+
* }
|
|
615
|
+
* ```
|
|
616
|
+
*
|
|
617
|
+
* Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
|
|
618
|
+
* aplicação `/`.
|
|
619
|
+
*
|
|
620
|
+
* ```
|
|
621
|
+
* 200:
|
|
622
|
+
* {
|
|
623
|
+
* user: user
|
|
624
|
+
* }
|
|
625
|
+
* ```
|
|
626
|
+
*
|
|
627
|
+
* Em caso de **erro** na autenticação, espera-se o seguinte retorno:
|
|
628
|
+
*
|
|
629
|
+
* ```
|
|
630
|
+
* 400/401
|
|
631
|
+
* {
|
|
632
|
+
* code: 400/401,
|
|
633
|
+
* message: message,
|
|
634
|
+
* detailedMessage: detailedMessage,
|
|
635
|
+
* helpUrl?: helpUrl
|
|
636
|
+
* }
|
|
637
|
+
* ```
|
|
638
|
+
*
|
|
639
|
+
* > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
|
|
640
|
+
* assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
|
|
641
|
+
* `p-password-errors` conforme retorno abaixo:
|
|
642
|
+
*
|
|
643
|
+
* ```
|
|
644
|
+
* 400
|
|
645
|
+
* {
|
|
646
|
+
* code: 400/401,
|
|
647
|
+
* message: message,
|
|
648
|
+
* detailedMessage: detailedMessage,
|
|
649
|
+
* helpUrl?: helpUrl,
|
|
650
|
+
* maxAttemptsRemaining?: maxAttemptsRemaining,
|
|
651
|
+
* loginWarnings?: [loginWarnings],
|
|
652
|
+
* passwordWarnings?: [passwordWarnings]
|
|
653
|
+
* }
|
|
654
|
+
* ```
|
|
655
|
+
*
|
|
656
|
+
* > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
|
|
657
|
+
* atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
|
|
658
|
+
*
|
|
659
|
+
* *Processo finalizado.*
|
|
660
|
+
*
|
|
661
|
+
* _______________
|
|
662
|
+
*
|
|
663
|
+
* #### Praticidade
|
|
664
|
+
* As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
|
|
665
|
+
* dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
|
|
666
|
+
* a forma dinâmica com a qual o template de tela de login pode ser gerado ao navegar para rota `/login`, e também como ele se comunica
|
|
667
|
+
* com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
|
|
668
|
+
* Basta definir nas configurações de rota:
|
|
669
|
+
*
|
|
670
|
+
*
|
|
671
|
+
* ```
|
|
672
|
+
* import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
|
|
673
|
+
*
|
|
674
|
+
* ...
|
|
675
|
+
* const routes: Routes = [
|
|
676
|
+
* {
|
|
677
|
+
* path: 'login', component: PoPageLoginComponent, data: {
|
|
678
|
+
* serviceApi: 'https://po-ui.io/sample/api/users/authentication',
|
|
679
|
+
* environment: 'development',
|
|
680
|
+
* recovery: {
|
|
681
|
+
* url: 'https://po-ui.io/sample/api/users',
|
|
682
|
+
* type: PoModalPasswordRecoveryType.All,
|
|
683
|
+
* contactMail: 'dev.po@po-ui.com',
|
|
684
|
+
* phoneMask: '9-999-999-9999'
|
|
685
|
+
* },
|
|
686
|
+
* registerUrl: '/new-password',
|
|
687
|
+
* authenticationType: PoPageLoginAthenticationType.Basic
|
|
688
|
+
* }
|
|
689
|
+
* }
|
|
690
|
+
* ...
|
|
691
|
+
* ];
|
|
692
|
+
*
|
|
693
|
+
* @NgModule({
|
|
694
|
+
* imports: [RouterModule.forRoot(routes)],
|
|
695
|
+
* exports: [RouterModule]
|
|
696
|
+
* })
|
|
697
|
+
* export class AppRoutingModule { }
|
|
698
|
+
* ```
|
|
699
|
+
*
|
|
700
|
+
*
|
|
701
|
+
* O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
|
|
702
|
+
* `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
|
|
703
|
+
* senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
|
|
704
|
+
*
|
|
705
|
+
* > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
|
|
706
|
+
*
|
|
707
|
+
*/
|
|
708
|
+
set authenticationUrl(value) {
|
|
709
|
+
this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
|
|
710
|
+
}
|
|
711
|
+
get authenticationUrl() {
|
|
712
|
+
return this._authenticationUrl;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* @optional
|
|
716
|
+
*
|
|
717
|
+
* @description
|
|
718
|
+
*
|
|
719
|
+
* Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero) e a aplicação tenha um link de bloqueio de usuário,
|
|
720
|
+
* informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
|
|
721
|
+
*/
|
|
722
|
+
set blockedUrl(value) {
|
|
723
|
+
this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
|
|
724
|
+
}
|
|
725
|
+
get blockedUrl() {
|
|
726
|
+
return this._blockedUrl;
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* @optional
|
|
730
|
+
*
|
|
731
|
+
* @description
|
|
732
|
+
*
|
|
733
|
+
* Exibe um botão para suporte.
|
|
734
|
+
*
|
|
735
|
+
* A propriedade aceita os seguintes tipos:
|
|
736
|
+
*
|
|
737
|
+
* - **String**: URL externa ou uma rota válida;
|
|
738
|
+
* - **Function**: Função a ser disparada ao clicar no botão de suporte;
|
|
739
|
+
* ```
|
|
740
|
+
* <po-page-login>
|
|
741
|
+
* [p-support]="this.mySupport.bind(this)">
|
|
742
|
+
* </po-page-login>
|
|
743
|
+
* ```
|
|
744
|
+
*
|
|
745
|
+
*/
|
|
746
|
+
set support(value) {
|
|
747
|
+
this._support = value;
|
|
748
|
+
}
|
|
749
|
+
get support() {
|
|
750
|
+
return this._support;
|
|
751
|
+
}
|
|
752
|
+
/**
|
|
753
|
+
* @optional
|
|
754
|
+
*
|
|
755
|
+
* @description
|
|
756
|
+
*
|
|
757
|
+
* Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
|
|
758
|
+
*
|
|
759
|
+
* Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
|
|
760
|
+
*
|
|
761
|
+
* Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
|
|
762
|
+
*
|
|
763
|
+
* Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
|
|
764
|
+
*
|
|
765
|
+
* > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
|
|
766
|
+
*
|
|
767
|
+
*
|
|
768
|
+
*/
|
|
769
|
+
set languagesList(languagesList) {
|
|
770
|
+
if (languagesList) {
|
|
771
|
+
if (languagesList.length) {
|
|
772
|
+
this._languagesList = languagesList;
|
|
773
|
+
}
|
|
774
|
+
else {
|
|
775
|
+
this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
get languagesList() {
|
|
780
|
+
if (this._languagesList) {
|
|
781
|
+
return this._languagesList;
|
|
782
|
+
}
|
|
783
|
+
return poLanguageDefault;
|
|
784
|
+
}
|
|
785
|
+
get showLanguage() {
|
|
786
|
+
return this.languagesList.length > 1;
|
|
787
|
+
}
|
|
788
|
+
get language() {
|
|
789
|
+
return this.selectedLanguage || getShortBrowserLanguage();
|
|
790
|
+
}
|
|
791
|
+
get pageLoginLiterals() {
|
|
792
|
+
const loginHintWithContactEmail = this.contactEmail
|
|
793
|
+
? this.concatenateLoginHintWithContactEmail(this.contactEmail)
|
|
794
|
+
: undefined;
|
|
795
|
+
return {
|
|
796
|
+
...poPageLoginLiteralsDefault[poLocaleDefault],
|
|
797
|
+
...poPageLoginLiteralsDefault[this.language],
|
|
798
|
+
...loginHintWithContactEmail,
|
|
799
|
+
...this.literals
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
ngOnDestroy() {
|
|
803
|
+
if (this.loginSubscription) {
|
|
804
|
+
this.loginSubscription.unsubscribe();
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
closePopover() {
|
|
808
|
+
this.showExceededAttemptsWarning = false;
|
|
809
|
+
}
|
|
810
|
+
onLoginSubmit() {
|
|
811
|
+
const loginForm = {
|
|
812
|
+
login: this.login,
|
|
813
|
+
password: this.password,
|
|
814
|
+
rememberUser: this.rememberUser
|
|
815
|
+
};
|
|
816
|
+
if (this.customField) {
|
|
817
|
+
loginForm[this.customFieldObject.property] = this.customFieldObject.value;
|
|
818
|
+
}
|
|
819
|
+
if (this.authenticationUrl) {
|
|
820
|
+
this.loginSubscription = this.loginService
|
|
821
|
+
.onLogin(this.authenticationUrl, this.authenticationType, loginForm)
|
|
822
|
+
.subscribe(data => {
|
|
823
|
+
this.setValuesToProperties();
|
|
824
|
+
sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
|
|
825
|
+
this.openInternalLink('/');
|
|
826
|
+
}, error => {
|
|
827
|
+
if (error.error.code === '400' || error.error.code === '401') {
|
|
828
|
+
this.setValuesToProperties(error);
|
|
829
|
+
this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
|
|
830
|
+
}
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
this.loginSubmit.emit(loginForm);
|
|
835
|
+
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
getDefaultCustomFieldObject(property) {
|
|
839
|
+
return { property };
|
|
840
|
+
}
|
|
841
|
+
openExternalLink(url) {
|
|
842
|
+
window.open(url, '_blank');
|
|
843
|
+
}
|
|
844
|
+
openInternalLink(url) {
|
|
845
|
+
this.router.navigate([url]);
|
|
846
|
+
}
|
|
847
|
+
redirectBlockedUrl(attempts, blockedUrl) {
|
|
848
|
+
if (attempts === 0 && blockedUrl) {
|
|
849
|
+
this.showExceededAttemptsWarning = false;
|
|
850
|
+
isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
setValuesToProperties(result) {
|
|
854
|
+
if (result) {
|
|
855
|
+
this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
|
|
856
|
+
this.loginErrors = result.error.loginWarnings;
|
|
857
|
+
this.passwordErrors = result.error.passwordWarnings;
|
|
858
|
+
this.blockedUrl = result.error.blockedUrl;
|
|
859
|
+
}
|
|
860
|
+
else {
|
|
861
|
+
this.exceededAttemptsWarning = 0;
|
|
862
|
+
this.loginErrors = [];
|
|
863
|
+
this.passwordErrors = [];
|
|
864
|
+
this.blockedUrl = '';
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
PoPageLoginBaseComponent.ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
|
|
869
|
+
PoPageLoginBaseComponent.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: ["p-background", "background"], logo: ["p-logo", "logo"], loginPattern: ["p-login-pattern", "loginPattern"], passwordPattern: ["p-password-pattern", "passwordPattern"], secondaryLogo: ["p-secondary-logo", "secondaryLogo"], customField: ["p-custom-field", "customField"], contactEmail: ["p-contact-email", "contactEmail"], productName: ["p-product-name", "productName"], environment: ["p-environment", "environment"], exceededAttemptsWarning: ["p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: ["p-hide-remember-user", "hideRememberUser"], literals: ["p-literals", "literals"], loading: ["p-loading", "loading"], login: ["p-login", "login"], loginErrors: ["p-login-errors", "loginErrors"], passwordErrors: ["p-password-errors", "passwordErrors"], recovery: ["p-recovery", "recovery"], registerUrl: ["p-register-url", "registerUrl"], authenticationType: ["p-authentication-type", "authenticationType"], authenticationUrl: ["p-authentication-url", "authenticationUrl"], blockedUrl: ["p-blocked-url", "blockedUrl"], support: ["p-support", "support"], languagesList: ["p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" } });
|
|
870
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
|
|
871
|
+
type: Directive
|
|
872
|
+
}], function () { return [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }]; }, { background: [{
|
|
873
|
+
type: Input,
|
|
874
|
+
args: ['p-background']
|
|
875
|
+
}], logo: [{
|
|
876
|
+
type: Input,
|
|
877
|
+
args: ['p-logo']
|
|
878
|
+
}], loginPattern: [{
|
|
879
|
+
type: Input,
|
|
880
|
+
args: ['p-login-pattern']
|
|
881
|
+
}], passwordPattern: [{
|
|
882
|
+
type: Input,
|
|
883
|
+
args: ['p-password-pattern']
|
|
884
|
+
}], secondaryLogo: [{
|
|
885
|
+
type: Input,
|
|
886
|
+
args: ['p-secondary-logo']
|
|
887
|
+
}], loginChange: [{
|
|
888
|
+
type: Output,
|
|
889
|
+
args: ['p-login-change']
|
|
890
|
+
}], loginSubmit: [{
|
|
891
|
+
type: Output,
|
|
892
|
+
args: ['p-login-submit']
|
|
893
|
+
}], passwordChange: [{
|
|
894
|
+
type: Output,
|
|
895
|
+
args: ['p-password-change']
|
|
896
|
+
}], languageChange: [{
|
|
897
|
+
type: Output,
|
|
898
|
+
args: ['p-language-change']
|
|
899
|
+
}], customField: [{
|
|
900
|
+
type: Input,
|
|
901
|
+
args: ['p-custom-field']
|
|
902
|
+
}], contactEmail: [{
|
|
903
|
+
type: Input,
|
|
904
|
+
args: ['p-contact-email']
|
|
905
|
+
}], productName: [{
|
|
906
|
+
type: Input,
|
|
907
|
+
args: ['p-product-name']
|
|
908
|
+
}], environment: [{
|
|
909
|
+
type: Input,
|
|
910
|
+
args: ['p-environment']
|
|
911
|
+
}], exceededAttemptsWarning: [{
|
|
912
|
+
type: Input,
|
|
913
|
+
args: ['p-exceeded-attempts-warning']
|
|
914
|
+
}], hideRememberUser: [{
|
|
915
|
+
type: Input,
|
|
916
|
+
args: ['p-hide-remember-user']
|
|
917
|
+
}], literals: [{
|
|
918
|
+
type: Input,
|
|
919
|
+
args: ['p-literals']
|
|
920
|
+
}], loading: [{
|
|
921
|
+
type: Input,
|
|
922
|
+
args: ['p-loading']
|
|
923
|
+
}], login: [{
|
|
924
|
+
type: Input,
|
|
925
|
+
args: ['p-login']
|
|
926
|
+
}], loginErrors: [{
|
|
927
|
+
type: Input,
|
|
928
|
+
args: ['p-login-errors']
|
|
929
|
+
}], passwordErrors: [{
|
|
930
|
+
type: Input,
|
|
931
|
+
args: ['p-password-errors']
|
|
932
|
+
}], recovery: [{
|
|
933
|
+
type: Input,
|
|
934
|
+
args: ['p-recovery']
|
|
935
|
+
}], registerUrl: [{
|
|
936
|
+
type: Input,
|
|
937
|
+
args: ['p-register-url']
|
|
938
|
+
}], authenticationType: [{
|
|
939
|
+
type: Input,
|
|
940
|
+
args: ['p-authentication-type']
|
|
941
|
+
}], authenticationUrl: [{
|
|
942
|
+
type: Input,
|
|
943
|
+
args: ['p-authentication-url']
|
|
944
|
+
}], blockedUrl: [{
|
|
945
|
+
type: Input,
|
|
946
|
+
args: ['p-blocked-url']
|
|
947
|
+
}], support: [{
|
|
948
|
+
type: Input,
|
|
949
|
+
args: ['p-support']
|
|
950
|
+
}], languagesList: [{
|
|
951
|
+
type: Input,
|
|
952
|
+
args: ['p-languages']
|
|
953
|
+
}] }); })();
|
|
954
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztR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bUJLLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQWVJLEtBQUs7a0JBQTFCLEtBQUs7bUJBQUMsU0FBUztZQW1CYSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVTLGNBQWM7a0JBQTdDLEtBQUs7bUJBQUMsbUJBQW1CO1lBNkJELFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQXNCVSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXVDYSxrQkFBa0I7a0JBQXJELEtBQUs7bUJBQUMsdUJBQXVCO1lBMkhLLGlCQUFpQjtrQkFBbkQsS0FBSzttQkFBQyxzQkFBc0I7WUFnQkQsVUFBVTtrQkFBckMsS0FBSzttQkFBQyxlQUFlO1lBMEJFLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQXlCUSxhQUFhO2tCQUF0QyxLQUFLO21CQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xlYW4sIGNvbnZlcnRUb0ludCwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UsIGlzRXh0ZXJuYWxMaW5rLCBpc1R5cGVvZiB9IGZyb20gJy4vLi4vLi4vdXRpbHMvdXRpbCc7XG5cbmltcG9ydCB7IFBvTGFuZ3VhZ2VTZXJ2aWNlLCBwb0xvY2FsZURlZmF1bHQsIFBvTGFuZ3VhZ2UsIHBvTGFuZ3VhZ2VEZWZhdWx0IH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW51bXMvcG8tcGFnZS1sb2dpbi1hdXRoZW50aWNhdGlvbi10eXBlLmVudW0nO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5DdXN0b21GaWVsZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLWN1c3RvbS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5MaXRlcmFscyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLWxpdGVyYWxzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpblJlY292ZXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tcmVjb3ZlcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luU2VydmljZSB9IGZyb20gJy4vcG8tcGFnZS1sb2dpbi5zZXJ2aWNlJztcblxuY29uc3QgcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoID0gNDA7XG5cbmV4cG9ydCBjb25zdCBwb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdCA9IHtcbiAgZW46IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ1dlbGNvbWUnLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBMb2dpbicsXG4gICAgbG9naW5IaW50OiBgWW91ciBsb2dpbiB1c2VyIHdhcyBnaXZlbiB0byB5b3UgYXQgeW91ciBmaXJzdCBkYXkuXG4gICAgSWYgeW91IGRvbid0IGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBjb250YWN0IHN1cHBvcnRgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNlcnQgeW91ciBlLW1haWwnLFxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBQYXNzd29yZCcsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydCB5b3VyIHBhc3N3b3JkJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ0ludmFsaWQgdmFsdWUnLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZScsXG4gICAgcmVtZW1iZXJVc2VyOiAnQXV0b21hdGljIGxvZ2luJyxcbiAgICByZW1lbWJlclVzZXJIaW50OiAnWW91IGNhbiBkaXNhYmxlIHRoaXMgb3B0aW9uIGluIHN5c3RlbSBjb25maWd1cmF0aW9uJyxcbiAgICBzdWJtaXRMYWJlbDogJ0VudGVyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0xvYWRpbmcuLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAnRm9yZ290IHlvdXIgUGFzc3dvcmQ/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ05ldyByZWdpc3RlcicsXG4gICAgdGl0bGVQb3BvdmVyOiAnT29wcyEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIHBhc3N3b3JkPycsXG4gICAgaWZZb3VUcnlIYXJkZXI6ICdJZiB5b3UgdHJ5ICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gbW9yZSB0aW1lKHMpICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOlxuICAgICAgJ3dpdGhvdXQgc3VjY2VzcyB5b3VyIHVzZXIgd2lsbCBiZSBibG9ja2VkIGFuZCB5b3Ugd2lsbCBiZSBsZWZ0IDI0IGhvdXJzIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBhY2Nlc3MgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ0JldHRlciBjcmVhdGUgYSBuZXcgcGFzc3dvcmQgbm93ISBZb3Ugd2lsbCBiZSBhYmxlIHRvIGxvZyBpbnRvIHRoZSBzeXN0ZW0gcmlnaHQgYXdheS4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnSSBmb3Jnb3QgbXkgcGFzc3dvcmQnLFxuICAgIHdlbGNvbWU6ICdXZWxjb21lJyxcbiAgICBzdXBwb3J0OiAnU3VwcG9ydCdcbiAgfSxcbiAgZXM6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ0JpZW52ZW5pZG8nLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcbiAgICBsb2dpbkhpbnQ6IGBTdSB1c3VhcmlvIGhhIHNpZG8gZW50cmVnYWRvIHBhcmEgdXN0ZWQgZW4gc3UgcHJpbWVyIGTDrWEuXG4gICAgU2kgbm8gdGllbmUgZXN0YSBpbmZvcm1hY2nDs24sIHDDs25nYXNlIGVuIGNvbnRhY3RvIGNvbiBlbCBzb3BvcnRlIHTDqWNuaWNvYCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBlLW1haWwnLFxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnQ29udHJhc2XDsWEgaW52w6FsaWRhJyxcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBjb250cmFzZcOxYScsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBubyB2w6FsaWRvLicsXG4gICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnRyb2R1emNhIHVuIHZhbG9yJyxcbiAgICByZW1lbWJlclVzZXI6ICdJbmljaW8gZGUgc2VzacOzbiBhdXRvbcOhdGljYW1lbnRlJyxcbiAgICByZW1lbWJlclVzZXJIaW50OiAnUHVlZGUgZGVzaGFiaWxpdGFyIGVzdGEgb3BjacOzbiBlbiBlbCBtZW7DuiBkZWwgc2lzdGVtYS4nLFxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcmdhbmRvLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxuICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgIHJlZ2lzdGVyVXJsOiAnTnVldm8gcmVnaXN0cm8nLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2kgaW50ZW50YSBtw6FzICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6L3ZlY2VzICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2luIMOpeGl0byBzdSB1c3VhcmlvIHNlcmEgYmxvcXVlYWRvIHkgdXN0ZWQgdsOhcyBwZXJtYW5lY2VyIDI0IGhvcmFzIHNpbiBwb2RlciBhY2NlZGVyIGEgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzpcbiAgICAgICfCoU1lam9yIGNyZWFyIHVuYSBudWV2YSBjb250cmFzZcOxYSBhaG9yYSEgVXN0ZWQgcG9kcsOhIGVudHJhciBlbiBlbCBzaXN0ZW1hIGlubWVkaWF0YW1lbnRlIGRlc3B1w6lzLicsXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICdPbHZpZGUgbWkgY29udHJhc2XDsWEnLFxuICAgIHdlbGNvbWU6ICdCaWVudmVuaWRvJyxcbiAgICBzdXBwb3J0OiAnU29wb3J0ZSdcbiAgfSxcbiAgcHQ6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ0JlbS12aW5kbycsXG4gICAgbG9naW5FcnJvclBhdHRlcm46ICdMb2dpbiBpbnbDoWxpZG8nLFxuICAgIGxvZ2luSGludDogYFNldSB1c3XDoXJpbyBmb2kgZW50cmVndWUgYSB2b2PDqiBubyBzZXUgcHJpbWVpcm8gZGlhLlxuICAgIENhc28gbsOjbyB0ZW5oYSBtYWlzIGVzc2EgaW5mb3JtYcOnw6NvIGNvbnRhY3RlIG8gc3Vwb3J0ZWAsXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ1NlbmhhIGludsOhbGlkYScsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEnLFxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnVmFsb3IgaW52w6FsaWRvLicsXG4gICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnNpcmEgdW0gdmFsb3InLFxuICAgIHJlbWVtYmVyVXNlcjogJ0xvZ2FyIGF1dG9tYXRpY2FtZW50ZScsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1ZvY8OqIHBvZGUgZGVzYWJpbGl0YXIgZXNzYSBvcMOnw6NvIG5vIG1lbnUgZG8gc2lzdGVtYScsXG4gICAgc3VibWl0TGFiZWw6ICdFbnRyYXInLFxuICAgIHN1Ym1pdHRlZExhYmVsOiAnQ2FycmVnYW5kby4uLicsXG4gICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcbiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2VtIHN1Y2Vzc28gc2V1IHVzdcOhcmlvIHNlcsOhIGJsb3F1ZWFkbyBlIHZvY8OqIGZpY2EgMjQgaG9yYXMgc2VtIHBvZGVyIGFjZXNzYXIgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnRXNxdWVjaSBtaW5oYSBzZW5oYScsXG4gICAgd2VsY29tZTogJ0JvYXMtdmluZGFzJyxcbiAgICBzdXBwb3J0OiAnU3Vwb3J0ZSdcbiAgfSxcbiAgcnU6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ9CU0L7QsdGA0L4g0L/QvtC20LDQu9C+0LLQsNGC0YwhJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdGL0Lkg0LvQvtCz0LjQvScsXG4gICAgbG9naW5IaW50OiBg0JLQsNGIINC70L7Qs9C40L0g0LHRi9C7INC/0YDQtdC00L7RgdGC0LDQstC70LXQvSDQstCw0Lwg0LIg0L/QtdGA0LLRi9C5INC00LXQvdGMLlxuICAgINCV0YHQu9C4INGDINCy0LDRgSDQvdC10YIg0Y3RgtC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LgsINC+0LHRgNCw0YLQuNGC0LXRgdGMINCyINGB0LvRg9C20LHRgyDQv9C+0LTQtNC10YDQttC60LhgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICfQktGB0YLQsNCy0YzRgtC1INGB0LLQvtC5INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdGL0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAn0JLQstC10LTQuNGC0LUg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdC+0LUg0LfQvdCw0YfQtdC90LjQtS4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LfQvdCw0YfQtdC90LjQtScsXG4gICAgcmVtZW1iZXJVc2VyOiAn0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQstGF0L7QtCcsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ9CS0Ysg0LzQvtC20LXRgtC1INC+0YLQutC70Y7Rh9C40YLRjCDRjdGC0YMg0L7Qv9GG0LjRjiDQsiDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0YHQuNGB0YLQtdC80YsnLFxuICAgIHN1Ym1pdExhYmVsOiAn0JLQvtC50YLQuCcsXG4gICAgc3VibWl0dGVkTGFiZWw6ICcz0LDQs9GA0YPQt9C60LAuLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAn0JfQsNCx0YvQu9C4INC/0LDRgNC+0LvRjD8nLFxuICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgIHJlZ2lzdGVyVXJsOiAn0J3QvtCy0YvQuSDRgNC10LPQuNGB0YLRgCcsXG4gICAgdGl0bGVQb3BvdmVyOiAn0J7QuSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ9CX0LDQsdGL0LvQuCDQv9Cw0YDQvtC70Yw/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ9CV0YHQu9C4INCy0Ysg0LHQtdC30YPRgdC/0LXRiNC90L4g0L/QvtC/0YvRgtCw0LXRgtC10YHRjCDQstC+0LnRgtC4INC10YnQtSAnLFxuICAgIGF0dGVtcHRzOiAnezB9INGA0LDQtyjQsCkgJyxcbiAgICB5b3VyVXNlcldpbGxCZUJsb2NrZWQ6ICfQktCw0Ygg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINCx0YPQtNC10YIg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC9LCDQuCDQktGLINC+0YHRgtCw0L3QtdGC0LXRgdGMINC90LAgMjQg0YfQsNGB0LAg0LHQtdC3INCy0L7Qt9C80L7QttC90L7RgdGC0Lgg0LTQvtGB0YLRg9C/0LAgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ9Cb0YPRh9GI0LUg0YHQvtC30LTQsNC50YLQtSDQvdC+0LLRi9C5INC/0LDRgNC+0LvRjCDRgdC10LnRh9Cw0YEhwqDQktGLINGB0LzQvtC20LXRgtC1INGB0YDQsNC30YMg0LLQvtC50YLQuCDQsiDRgdC40YHRgtC10LzRgy4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAn0K8g0LfQsNCx0YvQuyDRgdCy0L7QuSDQv9Cw0YDQvtC70YwnLFxuICAgIHdlbGNvbWU6ICfQtNC+0LHRgNC+INC/0L7QttCw0LvQvtCy0LDRgtGMJyxcbiAgICBzdXBwb3J0OiAn0J/QvtC00LTQtdGA0LbQutCwJ1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsSW4gPSB7XG4gIGVuOiAnaW4nLFxuICBlczogJ2VuJyxcbiAgcHQ6ICdlbScsXG4gIHJ1OiAn0LInXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gY29tcG9uZW50ZSBgcG8tcGFnZS1sb2dpbmAgw6kgdXRpbGl6YWRvIGNvbW8gdGVtcGxhdGUgcGFyYSB0ZWxhIGRlIGxvZ2luLlxuICogQ29tIGVsZSDDqSBwb3Nzw612ZWwgZGVmaW5pcm1vcyB2YWxvcmVzIHBhcmEgdXN1w6FyaW8sIHNlbmhhIGUgZGVmaW5pciBhw6fDtWVzIHBhcmEgcmVjdXBlcmHDp8OjbyBkZSBzZW5oYSBlIGdyYXZhw6fDo28gZGUgZGFkb3MgZG8gdXN1w6FyaW8uXG4gKiBUYW1iw6ltIMOpIHBvc3PDrXZlbCBpbnNlcmlyIHVtYSBpbWFnZW0gZW0gY29uanVudG8gY29tIHVtIHRleHRvIGRlIGRlc3RhcXVlLlxuICpcbiAqXG4gKiBBIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAgYXV0b21hdGl6YSBhIHJvdGluYSBkbyBjb21wb25lbnRlIGUgc2ltcGxpZmljYSBvIHByb2Nlc3NvIHBhcmEgYXV0ZW50aWNhw6fDo28gZG8gdXN1w6FyaW8sIGJhc3RhbmRvXG4gKiBkZWZpbmlyIHVtYSB1cmwgcGFyYSByZXF1aXNpw6fDo28gZGEgYXV0ZW50aWNhw6fDo28uIEEgZmxleGliaWxpZGFkZSBlIHByYXRpY2lkYWRlIHBvZGVtIGNoZWdhciBhIHVtIG7DrXZlbCBlbSBxdWUgbyBkZXNlbnZvbHZpbWVudG9cbiAqIGRhIGFwbGljYcOnw6NvIG5vICpjbGllbnQgc2lkZSogw6kgZGVzcHJvdmlkYSBkZSBxdWFscXVlciBjw7NkaWdvLWZvbnRlIHJlbGFjaW9uYWRvIMOgIHJvdGluYSBkZSBsb2dpbiBkZSB1c3XDoXJpby5cbiAqIFNldSBkZXRhbGhhbWVudG8gcGFyYSB1c28gcG9kZSBzZXIgdmlzdG8gbG9nbyBhYmFpeG8gZW0gKnByb3ByaWVkYWRlcyouXG4gKiBDYXNvIGp1bGd1ZSBuZWNlc3PDoXJpbywgcG9kZS1zZSB0YW1iw6ltIGRlZmluaXIgbWFudWFsbWVudGUgYSByb3RpbmEgZG8gY29tcG9uZW50ZS5cbiAqXG4gKlxuICogUGFyYSBxdWUgYXMgaW1hZ2VucyBzZWphbSBleGliaWRhcyBjb3JyZXRhbWVudGUsIMOpIG5lY2Vzc8OhcmlvIGluY2x1aXIgbyBjYW1pbmhvIGRlbGFzIGFvIHByb2pldG8uIFBhcmEgaXNzbywgZWRpdGVcbiAqIG8gKmFzc2V0cyogbm8gYXJxdWl2byAqKmFuZ3VsYXIuanNvbioqIGRhIGFwbGljYcOnw6NvIG5hIHNlZ3VpbnRlIG9yZGVtOlxuICogYGBgXG4gKiAgIFwiYXNzZXRzXCI6IFtcbiAqICAgICBcInNyYy9hc3NldHNcIixcbiAqICAgICBcInNyYy9mYXZpY29uLmljb1wiLFxuICogICAgIHtcbiAqICAgICAgIFwiZ2xvYlwiOiBcIioqXFwvKlwiLFxuICogICAgICAgXCJpbnB1dFwiOiBcIm5vZGVfbW9kdWxlcy9AcG8tdWkvc3R5bGUvaW1hZ2VzXCIsXG4gKiAgICAgICBcIm91dHB1dFwiOiBcImFzc2V0cy9pbWFnZXNcIlxuICogICAgIH1cbiAqICAgXVxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvUGFnZUxvZ2luQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBPIGBwLWJhY2tncm91bmRgIHBlcm1pdGUgaW5zZXJpciB1bWEgaW1hZ2VtIGRlIGRlc3RhcXVlIGFvIGxhZG8gZGlyZWl0byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiwgY2FzbyBhIHByb3ByaWVkYWRlXG4gICAqIG7Do28gc2VqYSBwcmVlbmNoaWRhIG8gZm9ybXVsw6FyaW8gc2Vyw6EgY2VudHJhbGl6YWRvIG5vIGVzcGHDp28gZGlzcG9uw612ZWwuXG4gICAqXG4gICAqIEEgZm9udGUgZGEgaW1hZ2VtIHBvZGUgc2VyIGRlIHVtIGNhbWluaG8gbG9jYWwgb3UgdW1hIHVybCBkZSB1bSBzZXJ2aWRvciBleHRlcm5vLlxuICAgKlxuICAgKiBBbMOpbSBkYSBpbWFnZW0sIMOpIHBvc3PDrXZlbCBhZGljaW9uYXIgdW0gdGV4dG8gaW5mb3JtYXRpdm8gcG9yIGNpbWEgZGEgaW1hZ2VtIGRhIGltYWdlbSBkZSBkZXN0YXF1ZSwgcGFyYSBpc3NvIGluZm9ybWVcbiAgICogdW0gdmFsb3IgcGFyYSBhIGxpdGVyYWwgYGhpZ2hsaWdodEluZm9gLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBzb2JyZSBhcyBsaXRlcmFpcyBuYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gKipsb2NhbCoqOiBgLi9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxuICAgKiAtICoqdXJsIGV4dGVybmEqKjogYGh0dHBzOi8vcG8tdWkuaW8vYXNzZXRzL2ltYWdlcy9sb2dpbi1iYWNrZ3JvdW5kLnBuZ2BcbiAgICpcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIMOpIGlnbm9yYWRhIHBhcmEgYXBsaWNhw6fDtWVzIG1vYmlsZS5cbiAgICovXG4gIEBJbnB1dCgncC1iYWNrZ3JvdW5kJykgYmFja2dyb3VuZD86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBuYSBwYXJ0ZSBzdXBlcmlvci5cbiAgICpcbiAgICogPiBDYXNvIHNlamEgaW5kZWZpbmlkYSBvIGVzcGHDp28gc2UgbWFudMOpbSBwcmVzZXJ2YWRvIHBvcsOpbSB2YXppby5cbiAgICovXG4gIEBJbnB1dCgncC1sb2dvJykgbG9nbz86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgbG9naW4sIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmBcbiAgICogc2Vyw6EgZXhpYmlkYS5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSBlbWFpbDogYFtleHByZXNzYW8tcmVndWxhci1lbWFpbF1gXG4gICAqIC0gY3BmOiBgW2V4cHJlc3Nhby1yZWd1bGFyLWNwZl1gXG4gICAqXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmAuXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4tcGF0dGVybicpIGxvZ2luUGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgcGFzc3dvcmQsIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmBcbiAgICogc2Vyw6EgZXhpYmlkYS5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSBBcGVuYXMgbsO6bWVyb3M6IGBcXGQ/YFxuICAgKiAtIExldHJhcyBtw61udXNjdWxhczogYFxcej9gXG4gICAqXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmAuXG4gICAqL1xuICBASW5wdXQoJ3AtcGFzc3dvcmQtcGF0dGVybicpIHBhc3N3b3JkUGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBubyByb2RhcMOpLlxuICAgKi9cbiAgQElucHV0KCdwLXNlY29uZGFyeS1sb2dvJykgc2Vjb25kYXJ5TG9nbz86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFdmVudG8gZGlzcGFyYWRvIHF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYXIgbyBpbnB1dCBkbyBjYW1wbyBsb2dpbi5cbiAgICpcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bWEgdmFyacOhdmVsIGRvIHRpcG8gYHN0cmluZ2AgY29tIG8gdGV4dG8gaW5mb3JtYWRvIG5vIGNhbXBvLlxuICAgKlxuICAgKiA+IEVzdGEgcHJvcHJpZWRhZGUgc2Vyw6EgaWdub3JhZGEgc2UgZm9yIGRlZmluaWRvIHZhbG9yIHBhcmEgYSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi11cmxgLlxuICAgKi9cbiAgQE91dHB1dCgncC1sb2dpbi1jaGFuZ2UnKSBsb2dpbkNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBhbyBzdWJtZXRlciBvIGZvcm11bMOhcmlvIGRlIGxvZ2luIChhcGVydGFuZG8gYEVudGVyYCBkZW50cm8gZG9zIGNhbXBvcyBvdSBwcmVzc2lvbmFuZG8gbyBib3TDo28gZGUgY29uZmlybWHDp8OjbykuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvUGFnZUxvZ2luYCBjb20gb3MgZGFkb3MgaW5mb3JtYWRvcyBubyBmb3JtdWzDoXJpby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtdXJsLXJlY292ZXJ5YC5cbiAgICpcbiAgICogPiBQYXJhIG1haXMgZGV0YWxoZXMgY29uc3VsdGUgYSBkb2N1bWVudGHDp8OjbyBzb2JyZSBhIGludGVyZmFjZSBgUG9QYWdlTG9naW5gIG1haXMgYWJhaXhvLlxuICAgKi9cbiAgQE91dHB1dCgncC1sb2dpbi1zdWJtaXQnKSBsb2dpblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UG9QYWdlTG9naW4+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaW5wdXQgZG8gY2FtcG8gcGFzc3dvcmQuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cbiAgICovXG4gIEBPdXRwdXQoJ3AtcGFzc3dvcmQtY2hhbmdlJykgcGFzc3dvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaWRpb21hIGRhIHDDoWdpbmEuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvTGFuZ3VhZ2VgIGNvbSBhIGxpbmd1YWdlbSBzZWxlY2lvbmFkYS5cbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ3AtbGFuZ3VhZ2UtY2hhbmdlJykgbGFuZ3VhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxQb0xhbmd1YWdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9MYW5ndWFnZT4oKTtcblxuICBhbGxMb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBhbGxQYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjdXN0b21GaWVsZE9iamVjdDogUG9QYWdlTG9naW5DdXN0b21GaWVsZDtcbiAgY3VzdG9tRmllbGRUeXBlOiBzdHJpbmc7XG4gIGxvZ2luU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIHJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZExhbmd1YWdlOiBzdHJpbmc7XG4gIHNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUgPSBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZS5CYXNpYztcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25Vcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBfYmxvY2tlZFVybDogc3RyaW5nO1xuICBwcml2YXRlIF9jb250YWN0RW1haWw6IHN0cmluZztcbiAgcHJpdmF0ZSBfY3VzdG9tRmllbGQ6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQ7XG4gIHByaXZhdGUgX2Vudmlyb25tZW50Pzogc3RyaW5nO1xuICBwcml2YXRlIF9leGNlZWRlZEF0dGVtcHRzV2FybmluZz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaGlkZVJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9saXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscztcbiAgcHJpdmF0ZSBfbG9hZGluZz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9naW46IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9naW5FcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJpdmF0ZSBfcGFzc3dvcmRFcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJpdmF0ZSBfcHJvZHVjdE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVjb3Zlcnk6IHN0cmluZyB8IFBvUGFnZUxvZ2luUmVjb3ZlcnkgfCBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3VwcG9ydDogc3RyaW5nIHwgRnVuY3Rpb247XG4gIHByaXZhdGUgX2xhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+O1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEFvIGluZm9ybWFyIHVtIHZhbG9yIGRvIHRpcG8gYHN0cmluZ2AsIG8gbWVzbW8gc2Vyw6EgYXBsaWNhZG8gY29tbyBhIGNoYXZlIGRvIGNhbXBvIGN1c3RvbWl6YWRvIGUgdXRpbGl6YXLDoVxuICAgKiBvcyB2YWxvcmVzIHBhZHLDtWVzIGNvbnRpZG9zIG5hIHByb3ByaWVkYWRlIGBsaXRlcmFsc2AgY29tbyBgY3VzdG9tRmllbGRFcnJvclBhdHRlcm5gIGUgYGN1c3RvbUZpZWxkUGxhY2Vob2xkZXJgLlxuICAgKlxuICAgKiBFeGlzdGUgYSBwb3NzaWJpbGlkYWRlIGRlIGluZm9ybWFyIHVtIG9iamV0byBxdWUgc2VndWUgYSBkZWZpbmnDp8OjbyBkYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luQ3VzdG9tRmllbGRgLCBvbmRlXG4gICAqIGF0cmF2w6lzIGRvcyBwYXLDom1ldHJvcyBlbnZpYWRvcyBwb2RlIGdlcmFyIHVtIGBwby1pbnB1dGAsIGBwby1jb21ib2AgZXNwZWNpZmljYW1lbnRlIHBhcmEgc2VydmnDp29zXG4gICAqIG91IGBwby1zZWxlY3RgIHBhcmEgdmFsb3JlcyBmaXhvcy5cbiAgICpcbiAgICogQWJhaXhvIHNlZ3VlbSBvcyBleGVtcGxvcyBkZSBjYWRhIHRpcG8gZGUgY2FtcG8uXG4gICAqXG4gICAqIGBwby1pbnB1dGA6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgcGF0dGVybjogJ1thLXpdJyxcbiAgICogICBlcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJ1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgcG8tY29tYm9gOlxuICAgKlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxuICAgKiAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgeW91ciBkb21haW4nLFxuICAgKiAgIHVybDogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS9jb21ib09wdGlvbi9kb21haW5zJyxcbiAgICogICBmaWVsZFZhbHVlOiAnbmlja25hbWUnXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIGBwby1zZWxlY3RgOlxuICAgKlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxuICAgKiAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgeW91ciBkb21haW4nLFxuICAgKiAgIG9wdGlvbnM6IFt7bGFiZWw6ICdEb21haW4gMScsIHZhbHVlOiAnMSd9LCB7bGFiZWw6ICdEb21haW4gMicsIHZhbHVlOiAnMid9XVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBDYXNvIG8gY3VzdG9tRmllbGQgcG9zc3VhIG9wdGlvbnMsIHVybCBlIGZpZWxkVmFsdWUgcHJlZW5jaGlkb3MsIHNlcsOhIHByaW9yaXphZG8gbyBwby1zZWxlY3RcbiAgICogdXRpbGl6YW5kbyBvIG9wdGlvbnMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3AtY3VzdG9tLWZpZWxkJykgc2V0IGN1c3RvbUZpZWxkKHZhbHVlOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIHRoaXMuX2N1c3RvbUZpZWxkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSB0aGlzLmdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVHlwZW9mKHZhbHVlLCAnb2JqZWN0JykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlWydwcm9wZXJ0eSddKSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbUZpZWxkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSA8UG9QYWdlTG9naW5DdXN0b21GaWVsZD52YWx1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tRmllbGRPYmplY3Qub3B0aW9ucyAmJiAhdGhpcy5jdXN0b21GaWVsZE9iamVjdC51cmwpIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXN0b21GaWVsZFR5cGUgPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0Lm9wdGlvbnMgPyAnc2VsZWN0JyA6ICdjb21ibyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY3VzdG9tRmllbGQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBjdXN0b21GaWVsZCgpOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tRmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBQZXJzb25hbGl6YSBvIGUtbWFpbCBxdWUgw6kgZXhpYmlkbyBuYSBtZW5zYWdlbSBkZSBkaWNhIGRlIGxvZ2luIHBhZHLDo28gcGFyYSBjb250YXRvIGRlIHN1cG9ydGUuXG4gICAqL1xuICBASW5wdXQoJ3AtY29udGFjdC1lbWFpbCcpIHNldCBjb250YWN0RW1haWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRhY3RFbWFpbCA9IHZhbHVlO1xuICB9XG4gIGdldCBjb250YWN0RW1haWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhY3RFbWFpbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFRleHRvIGN1c3RvbWl6YWRvIHF1ZSBmaWNhIGVudHJlIGEgbG9nbyBlIGEgbWVuc2FnZW0gZGUgYm9hcy12aW5kYXMuXG4gICAqL1xuICBASW5wdXQoJ3AtcHJvZHVjdC1uYW1lJykgc2V0IHByb2R1Y3ROYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wcm9kdWN0TmFtZSA9IHZhbHVlO1xuICB9XG4gIGdldCBwcm9kdWN0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvZHVjdE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBZGljaW9uYSB1bWEgYHRhZ2AgYWJhaXhvIGRvIHTDrXR1bG8gcXVlIGVzcGVjaWZpY2EgbyBhbWJpZW50ZSBxdWUgbyB1c3XDoXJpbyBlc3TDoSBmYXplbmRvIG8gbG9naW4uXG4gICAqXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSBsaW1pdGEgbyB0ZXh0byBlbSA0MCBjYXJhY3RlcmVzLlxuICAgKi9cbiAgQElucHV0KCdwLWVudmlyb25tZW50Jykgc2V0IGVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQubGVuZ3RoID4gcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50LnN1YnN0cmluZygwLCBwb1BhZ2VMb2dpbkNvbnRlbnRNYXhMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgIH1cbiAgfVxuICBnZXQgZW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Vudmlyb25tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXhpYmUgdW0gYXZpc28gZGUgYmxvcXVlaW8gZGUgYWNvcmRvIGNvbSBhIHF1YW50aWRhZGUgcmVzdGFudGUgZGUgdGVudGF0aXZhcy5cbiAgICogTyBhdmlzbyBzZXLDoSBleGliaWRvIHNvbWVudGUgc2UgYSBxdWFudGlkYWRlIGZvciBtYWlvciBxdWUgemVyby5cbiAgICpcbiAgICogPiBDYXNvIHRlbmhhIGFsZ3VtIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBvIGF0cmlidXRvIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAgZSBvIHJldG9ybm8gZGEgcmVxdWlzacOnw6NvIGVzdGl2ZXIgYXRyaWJ1aW5kbyB2YWxvclxuICAgKiBwYXJhIG8gYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2AsIG8gdmFsb3IgY29uc2lkZXJhZG8gc2Vyw6EgbyBkbyByZXRvcm5vIGRhIHJlcXVpc2nDp8Ojby5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICBASW5wdXQoJ3AtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZycpIHNldCBleGNlZWRlZEF0dGVtcHRzV2FybmluZyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBjb252ZXJ0VG9JbnQodmFsdWUpO1xuICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA+IDA7XG4gIH1cblxuICBnZXQgZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmc7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFc2NvbmRlIGEgZnVuw6fDo28gXCJMZW1icmFyIHVzdcOhcmlvXCIgZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4uXG4gICAqXG4gICAqIFF1YW5kbyBlc3NhIHByb3ByaWVkYWRlIMOpIHNldGFkYSBjb20gYHRydWVgIGEgcHJvcHJpZWRhZGUgYHJlbWVtYmVyVXNlcmAgZW52aWFkYSBubyBldmVudG8gYHAtbG9naW4tc3VibWl0YCBzZXLDoSBzZW1wcmVcbiAgICogYGZhbHNlYC5cbiAgICpcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHJlbWVtYmVyVXNlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCgncC1oaWRlLXJlbWVtYmVyLXVzZXInKSBzZXQgaGlkZVJlbWVtYmVyVXNlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVSZW1lbWJlclVzZXIgPSA8YW55PnZhbHVlID09PSAnJyA/IHRydWUgOiBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9oaWRlUmVtZW1iZXJVc2VyKSB7XG4gICAgICB0aGlzLnJlbWVtYmVyVXNlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBnZXQgaGlkZVJlbWVtYmVyVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZVJlbWVtYmVyVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIE9iamV0byBjb20gYXMgbGl0ZXJhaXMgdXNhZGFzIG5vIGBwby1wYWdlLWxvZ2luYC5cbiAgICpcbiAgICogRXhpc3RlbSBkdWFzIG1hbmVpcmFzIGRlIGN1c3RvbWl6YXIgbyBjb21wb25lbnRlLCBwYXNzYW5kbyB1bSBvYmpldG8gY29tIHRvZGFzIGFzIGxpdGVyYWlzIGRpc3BvbsOtdmVpczpcbiAgICpcbiAgICogYGBgXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcbiAgICogICAgYXR0ZW1wdHM6ICd7MH0gdmV6KGVzKSAnLFxuICAgKiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdNZWxob3IgY3JpYXIgdW1hIHNlbmhhIG5vdmEgYWdvcmEhIFZvY8OqIHZhaSBwb2RlciBlbnRyYXIgbm8gc2lzdGVtYSBsb2dvIGVtIHNlZ3VpZGEuJyxcbiAgICogICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICogICAgZm9yZ290WW91clBhc3N3b3JkOiAnRXNxdWVjZXUgc3VhIHNlbmhhPycsXG4gICAqICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgKiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxuICAgKiAgICBpZllvdVRyeUhhcmRlcjogJ1NlIHRlbnRhciBtYWlzICcsXG4gICAqICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXG4gICAqICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gb2JyaWdhdMOzcmlvJyxcbiAgICogICAgbG9naW5IaW50OiAnQ2FzbyBuw6NvIHBvc3N1YSB1c3XDoXJpbyBlbnRyZSBlbSBjb250YXRvIGNvbSBvIHN1cG9ydGUnLFxuICAgKiAgICBsb2dpbkxhYmVsOiAnSW5zaXJhIHNldSB1c3XDoXJpbycsXG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXG4gICAqICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnU2VuaGEgb2JyaWdhdMOzcmlhJyxcbiAgICogICAgcGFzc3dvcmRMYWJlbDogJ0luc2lyYSBzdWEgc2VuaGEnLFxuICAgKiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zaXJhIHN1YSBzZW5oYSBkZSBhY2Vzc28nLFxuICAgKiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ0NhbXBvIGN1c3RvbWl6YWRvIGludsOhbGlkbycsXG4gICAqICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcbiAgICogICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcbiAgICogICAgcmVtZW1iZXJVc2VyOiAnTGVtYnJhciB1c3XDoXJpbycsXG4gICAqICAgIHJlbWVtYmVyVXNlckhpbnQ6ICdFc3RhIG9ww6fDo28gcG9kZSBzZXIgZGVzYWJpbGl0YWRhIG5hcyBjb25maWd1cmHDp8O1ZXMgZG8gc2lzdGVtYScsXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJyxcbiAgICogICAgc3VibWl0dGVkTGFiZWw6ICdDYXJyZWdhbmRvLi4uJyxcbiAgICogICAgdGl0bGVQb3BvdmVyOiAnT3BhIScsXG4gICAqICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIE91IHBhc3NhbmRvIGFwZW5hcyBhcyBsaXRlcmFpcyBxdWUgZGVzZWphIGN1c3RvbWl6YXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiAgY29uc3QgY3VzdG9tTGl0ZXJhbHM6IFBvUGFnZUxvZ2luTGl0ZXJhbHMgPSB7XG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIEUgcGFyYSBjYXJyZWdhciBhcyBsaXRlcmFpcyBjdXN0b21pemFkYXMsIGJhc3RhIGFwZW5hcyBwYXNzYXIgbyBvYmpldG8gcGFyYSBvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8cG8tcGFnZS1sb2dpblxuICAgKiAgIFtwLWxpdGVyYWxzXT1cImN1c3RvbUxpdGVyYWxzXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqICA+IE8gb2JqZXRvIHBhZHLDo28gZGUgbGl0ZXJhaXMgc2Vyw6EgdHJhZHV6aWRvIGRlIGFjb3JkbyBjb20gbyBpZGlvbWEgZG8gYnJvd3NlciAocHQsIGVuLCBlcykuXG4gICAqICA+IMOJIHRhbWLDqW0gcG9zc8OtdmVsIGFsdGVybmFyIG8gb2JqZXRvIHBhZHLDo28gZGUgbGl0ZXJhaXMgYXRyYXbDqXMgZG8gc2VsZXRvciBkZSBpZGlvbWFzIGxvY2FsaXphZG8gbmEgcGFydGUgaW5mZXJpb3IgZG8gdGVtcGxhdGUsXG4gICAqIG5lc3NlIGNhc28sIGjDoSB0YW1iw6ltIGEgb3DDp8OjbyBkbyBpZGlvbWEgcnVzc28uXG4gICAqL1xuICBASW5wdXQoJ3AtbGl0ZXJhbHMnKSBzZXQgbGl0ZXJhbHModmFsdWU6IFBvUGFnZUxvZ2luTGl0ZXJhbHMpIHtcbiAgICB0aGlzLl9saXRlcmFscyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGxpdGVyYWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXRlcmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEhhYmlsaXRhIHVtIGVzdGFkbyBkZSBjYXJyZWdhbWVudG8gYW8gYm90w6NvIGRlICpsb2dpbiouXG4gICAqXG4gICAqID4gw4kgbmVjZXNzw6FyaW8gYXRyaWJ1aXIgYHRydWVgIMOgIGVzdGEgcHJvcHJpZWRhZGUgbmEgZnVuw6fDo28gZGVmaW5pZGEgZW0gYHAtbG9naW4tc3VibWl0YC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KCdwLWxvYWRpbmcnKSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogVmFsb3IgZG8gbW9kZWxvIGRvIGNhbXBvIGRlIGxvZ2luLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luJykgc2V0IGxvZ2luKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dpbiA9IHZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XG4gICAgICB0aGlzLmxvZ2luQ2hhbmdlLmVtaXQodGhpcy5fbG9naW4pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsb2dpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgdW1hIGxpc3RhIGRlIGVycm9zIGUgZXhpYmUgYWJhaXhvIGRvIGNhbXBvIGRlIGxvZ2luLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luLWVycm9ycycpIHNldCBsb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuX2xvZ2luRXJyb3JzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5zZXRMb2dpbkVycm9ycyh0aGlzLl9sb2dpbkVycm9ycyk7XG4gIH1cbiAgZ2V0IGxvZ2luRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2dpbkVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgdW1hIGxpc3RhIGRlIGVycm9zIGUgZXhpYmUgYWJhaXhvIGRvIGNhbXBvIGRlIHBhc3N3b3JkLlxuICAgKi9cbiAgQElucHV0KCdwLXBhc3N3b3JkLWVycm9ycycpIHNldCBwYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuX3Bhc3N3b3JkRXJyb3JzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5zZXRQYXNzd29yZEVycm9ycyh0aGlzLl9wYXNzd29yZEVycm9ycyk7XG4gIH1cbiAgZ2V0IHBhc3N3b3JkRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXNzd29yZEVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV4aWJlIHVtIGxpbmsgYWJhaXhvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luIHBhcmEgcXVlIG9zIHVzdcOhcmlvcyBkYSBhcGxpY2HDp8OjbyBmYcOnYW0gYSByZWN1cGVyYcOnw6NvIGRvcyBkYWRvcyBkZSBhdXRlbnRpY2HDp8Ojby5cbiAgICpcbiAgICogQSBwcm9wcmllZGFkZSBhY2VpdGEgb3Mgc2VndWludGVzIHRpcG9zOlxuICAgKlxuICAgKiAtICoqU3RyaW5nKio6IGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XG4gICAqIC0gKipGdW5jdGlvbioqOiBwb2RlLXNlIGN1c3RvbWl6YXIgYSBhw6fDo28uIFBhcmEgZXN0YSBwb3NzaWxpZGFkZSBiYXN0YSBhdHJpYnVpcjpcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luPlxuICAgKiAgIFtyZWNvdmVyeV09XCJ0aGlzLm15UmVjb3ZlcnkuYmluZCh0aGlzKVwiPlxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XG4gICAqIGBgYFxuICAgKlxuICAgKiAtICoqUG9QYWdlTG9naW5SZWNvdmVyeSoqOiBjcmlhLXNlIHbDrW5jdWxvIGF1dG9tw6F0aWNvIGNvbSBvIHRlbXBsYXRlICoqcG8tbW9kYWwtcGFzc3dvcmQtcmVjb3ZlcnkqKi5cbiAgICogICBPIG9iamV0byBkZXZlIGNvbnRlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGUgcG9kZS1zZSBkZWZpbmlyIG8gKip0aXBvKiogZGUgbW9kYWwgcGFyYSByZWN1cGVyYcOnw6NvIGRlIHNlbmhhLFxuICAgKiAgICoqZW1haWwqKiBwYXJhIGNvbnRhdG8gZSAqKm3DoXNjYXJhKiogZG8gY2FtcG8gZGUgdGVsZWZvbmUuXG4gICAqL1xuICBASW5wdXQoJ3AtcmVjb3ZlcnknKSBzZXQgcmVjb3ZlcnkodmFsdWU6IHN0cmluZyB8IEZ1bmN0aW9uIHwgUG9QYWdlTG9naW5SZWNvdmVyeSkge1xuICAgIHRoaXMuX3JlY292ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcmVjb3ZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY292ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FzbyBhIGFwbGljYcOnw6NvIHRlbmhhIHVtIGxpbmsgcGFyYSBub3ZvcyBjYWRhc3Ryb3MsIGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGEsIGRlc3NhXG4gICAqIGZvcm1hIHNlcsOhIGV4aWJpZG8gdW0gbGluayBhYmFpeG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gcGFyYSBvcyB1c3XDoXJpb3MgZGEgYXBsaWNhw6fDo28uXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gKipsb2NhbCoqOiBgL2hvbWVgXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pb2BcbiAgICpcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHJlZ2lzdGVyVXJsYC5cbiAgICovXG4gIEBJbnB1dCgncC1yZWdpc3Rlci11cmwnKSBzZXQgcmVnaXN0ZXJVcmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3JlZ2lzdGVyVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSBvIHRpcG8gZGUgZXNxdWVtYSBkYSBhdXRlbnRpY2HDp8Ojbywgc2VuZG8gc3Vwb3J0YWRvcyBhcGVuYXMgb3MgdmFsb3JlcyBgQmFzaWNgIGUgYEJlYXJlcmAuXG4gICAqXG4gICAqID4gQ2FzbyBvIHRpcG8gZGVmaW5pZG8gc2VqYSBgQmFzaWNgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBoZWFkZXJzIHtcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcbiAgICogfVxuICAgKlxuICAgKiBib2R5IHtcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gQ2FzbyBvIHRpcG8gZGVmaW5pZG8gc2VqYSBgQmVhcmVyYCwgbyBjb21wb25lbnRlIGZhcsOhIHVtYSByZXF1aXNpw6fDo28gYFBPU1RgIGNvbnRlbmRvOlxuICAgKlxuICAgKiBgYGBcbiAgICogYm9keSB7XG4gICAqICBsb2dpbjogbG9naW4sXG4gICAqICBwYXNzd29yZDogYmFzZTY0KHBhc3N3b3JkKSxcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBkZWZhdWx0IGBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZS5CYXNpY2BcbiAgICovXG4gIEBJbnB1dCgncC1hdXRoZW50aWNhdGlvbi10eXBlJykgc2V0IGF1dGhlbnRpY2F0aW9uVHlwZSh2YWx1ZTogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblR5cGUgPSAoPGFueT5PYmplY3QpLnZhbHVlcyhQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkuaW5jbHVkZXModmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xuICB9XG5cbiAgZ2V0IGF1dGhlbnRpY2F0aW9uVHlwZSgpOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IHVzYWRvIHBlbG8gdGVtcGxhdGUgcGFyYSByZXF1aXNpw6fDo28gZG8gcmVjdXJzby4gUXVhbmRvIHByZWVuY2hpZG8sIG8gbcOpdG9kbyBgcC1sb2dpbi1zdWJtaXRgIHNlcsOhIGlnbm9yYWRvIGUgb1xuICAgKiBjb21wb25lbnRlIGFkcXVpcmlyw6EgYXV0b21hdGl6YcOnw6NvIHBhcmEgbyBwcm9jZXNzbyBkZSBhdXRlbnRpY2HDp8Ojby5cbiAgICpcbiAgICogIyMjIFByb2Nlc3Nvc1xuICAgKiBBbyBkaWdpdGFyIHVtIHZhbG9yIHbDoWxpZG8gbm8gY2FtcG8gZGUgbG9naW4vcGFzc3dvcmQgZSBwcmVzc2lvbmFyICoqRW50ZXIqKiwgbyBjb21wb25lbnRlIGZhcsOhIHVtYSByZXF1aXNpw6fDo28gYFBPU1RgXG4gICAqIG5hIHVybCBlc3BlY2lmaWNhZGEgbmVzdGEgcHJvcHJpZWRhZGUgcGFzc2FuZG8gbyBvYmpldG8gY29udGVuZG8gbyB2YWxvciBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvOlxuICAgKlxuICAgKiBgYGBcbiAgICogaGVhZGVycyB7XG4gICAqICBBdXRob3JpemF0aW9uOiBCYXNpYyBiYXNlNjQobG9naW46cGFzc3dvcmQpXG4gICAqIH1cbiAgICpcbiAgICogYm9keSB7XG4gICAqICByZW1lbWJlclVzZXI6IHJlbWVtYmVyVXNlclxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBFbSBjYXNvIGRlICoqc3VjZXNzbyoqLCBvIG9iamV0byBkZSByZXRvcm5vIMOpIGFybWF6ZW5hZG8gbm8gYHNlc3Npb25TdG9yYWdlYCBlIG8gdXN1w6FyaW8gw6kgcmVkaXJlY2lvbmFkbyBwYXJhIGEgcMOhZ2luYSBpbmljaWFsIGRhXG4gICAqIGFwbGljYcOnw6NvIGAvYC5cbiAgICpcbiAgICogYGBgXG4gICAqIDIwMDpcbiAgICogIHtcbiAgICogICAgdXNlcjogdXNlclxuICAgKiAgfVxuICAgKiBgYGBcbiAgICpcbiAgICogRW0gY2FzbyBkZSAqKmVycm8qKiBuYSBhdXRlbnRpY2HDp8OjbywgZXNwZXJhLXNlIG8gc2VndWludGUgcmV0b3JubzpcbiAgICpcbiAgICogYGBgXG4gICAqIDQwMC80MDFcbiAgICogIHtcbiAgICogICAgY29kZTogNDAwLzQwMSxcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICogICAgZGV0YWlsZWRNZXNzYWdlOiBkZXRhaWxlZE1lc3NhZ2UsXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IFBvZGUtc2UgYXRyaWJ1aXIgdW1hIHF1YW50aWRhZGUgbcOheGltYSBkZSB0ZW50YXRpdmFzIHJlc3RhbnRlcyAobWF4QXR0ZW1wdHNSZW1haW5pbmcpIHBhcmEgbyBhdHJpYnV0byBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCxcbiAgICogYXNzaW0gY29tbyBvcyBhdmlzb3MgcmVsYWNpb25hZG9zIGFvcyBjYW1wb3MgbG9naW4gZSBwYXNzd29yZCAobG9naW5XYXJuaW5ncywgcGFzc3dvcmRXYXJuaW5ncykgcGFyYSBvcyBhdHJpYnV0b3MgYHAtbG9naW4tZXJyb3JzYCBlXG4gICAqIGBwLXBhc3N3b3JkLWVycm9yc2AgY29uZm9ybWUgcmV0b3JubyBhYmFpeG86XG4gICAqXG4gICAqIGBgYFxuICAgKiA0MDBcbiAgICogIHtcbiAgICogICAgY29kZTogNDAwLzQwMSxcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICogICAgZGV0YWlsZWRNZXNzYWdlOiBkZXRhaWxlZE1lc3NhZ2UsXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsLFxuICAgKiAgICBtYXhBdHRlbXB0c1JlbWFpbmluZz86IG1heEF0dGVtcHRzUmVtYWluaW5nLFxuICAgKiAgICBsb2dpbldhcm5pbmdzPzogW2xvZ2luV2FybmluZ3NdLFxuICAgKiAgICBwYXNzd29yZFdhcm5pbmdzPzogW3Bhc3N3b3JkV2FybmluZ3NdXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybyksIHBvZGVyw6Egc2VyIHBhc3NhZG8gdW0gdmFsb3IgcGFyYSBvXG4gICAqIGF0cmlidXRvIGBwLWJsb2NrZWQtdXJsYCBlIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkbyBwYXJhIHVtYSB0ZWxhIGRlIGJsb3F1ZWlvLlxuICAgKlxuICAgKiAqUHJvY2Vzc28gZmluYWxpemFkby4qXG4gICAqXG4gICAqIF9fX19fX19fX19fX19fX1xuICAgKlxuICAgKiAjIyMjIFByYXRpY2lkYWRlXG4gICAqIEFzIGluZm9ybWHDp8O1ZXMgZG8gc2VydmnDp28gZGUgYXV0ZW50aWNhw6fDo28gdGFtYsOpbSBwb2RlbSBzZXIgdHJhbnNtaXRpZGFzIGRpcmV0YW1lbnRlIHBlbGFzIGNvbmZpZ3VyYcOnw6NvcyBkZSByb3RhIGUsIGRlc3RhIG1hbmVpcmEsXG4gICAqIGRpc3BlbnNhLXNlIHF1YWxxdWVyIG1lbsOnw6NvIGUvb3UgaW1wb3J0YcOnw6NvIGRvIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIG5vIHJlc3RhbnRlIGRhIGFwbGljYcOnw6NvLiBPIGV4ZW1wbG8gYWJhaXhvIGV4ZW1wbGlmaWNhXG4gICAqIGEgZm9ybWEgZGluw6JtaWNhIGNvbSBhIHF1YWwgbyB0ZW1wbGF0ZSBkZSB0ZWxhIGRlIGxvZ2luIHBvZGUgc2VyIGdlcmFkbyBhbyBuYXZlZ2FyIHBhcmEgcm90YSBgL2xvZ2luYCwgZSB0YW1iw6ltIGNvbW8gZWxlIHNlIGNvbXVuaWNhXG4gICAqIGNvbSBvIHNlcnZpw6dvIHBhcmEgZWZldHVhw6fDo28gZG8gcHJvY2Vzc28gZGUgYXV0ZW50aWNhw6fDo28gZG8gdXN1w6FyaW8gZSBzb2xpY2l0YcOnw6NvIGRlIG5vdmEgc2VuaGEuXG4gICAqIEJhc3RhIGRlZmluaXIgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkZSByb3RhOlxuICAgKlxuICAgKlxuICAgKiBgYGBcbiAgICogICBpbXBvcnQgeyBQb1BhZ2VMb2dpbkNvbXBvbmVudCwgUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJ0Bwby11aS9uZy10ZW1wbGF0ZXMnO1xuICAgKlxuICAgKiAgIC4uLlxuICAgKiAgIGNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICAgKiAgICAge1xuICAgKiAgICAgICBwYXRoOiAnbG9naW4nLCBjb21wb25lbnQ6IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBkYXRhOiB7XG4gICAqICAgICAgICAgc2VydmljZUFwaTogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS91c2Vycy9hdXRoZW50aWNhdGlvbicsXG4gICAqICAgICAgICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsXG4gICAqICAgICAgICAgcmVjb3Zlcnk6IHtcbiAgICogICAgICAgICAgIHVybDogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS91c2VycycsXG4gICAqICAgICAgICAgICB0eXBlOiBQb01vZGFsUGFzc3dvcmRSZWNvdmVyeVR5cGUuQWxsLFxuICAgKiAgICAgICAgICAgY29udGFjdE1haWw6ICdkZXYucG9AcG8tdWkuY29tJyxcbiAgICogICAgICAgICAgIHBob25lTWFzazogJzktOTk5LTk5OS05OTk5J1xuICAgKiAgICAgICAgIH0sXG4gICAqICAgICAgICAgcmVnaXN0ZXJVcmw6ICcvbmV3LXBhc3N3b3JkJyxcbiAgICogICAgICAgICBhdXRoZW50aWNhdGlvblR5cGU6IFBvUGFnZUxvZ2luQXRoZW50aWNhdGlvblR5cGUuQmFzaWNcbiAgICogICAgICAgfVxuICAgKiAgICAgfVxuICAgKiAgICAgLi4uXG4gICAqICAgXTtcbiAgICpcbiAgICogICBATmdNb2R1bGUoe1xuICAgKiAgICAgaW1wb3J0czogW1JvdXRlck1vZHVsZS5mb3JSb290KHJvdXRlcyldLFxuICAgKiAgICAgZXhwb3J0czogW1JvdXRlck1vZHVsZV1cbiAgICogICB9KVxuICAgKiAgIGV4cG9ydCBjbGFzcyBBcHBSb3V0aW5nTW9kdWxlIHsgfVxuICAgKiBgYGBcbiAgICpcbiAgICpcbiAgICogTyBtZXRhZGFkbyBgc2VydmljZUFwaWAgZGV2ZSBzZXIgYSAqKnVybCoqIHBhcmEgcmVxdWlzacOnw6NvIGRvcyByZWN1cnNvcyBkZSBhdXRlbnRpY2HDp8OjbywgbyBgZW52aXJvbm1lbnRgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGVcbiAgICogYHAtZW52aXJvbm1lbnRgLCBgcmVjb3ZlcnlgIMOpIGEgaW50ZXJmYWNlIGBQb1BhZ2VMb2dpblJlY292ZXJ5YCByZXNwb25zw6F2ZWwgcGVsYXMgZXNwZWNpZmljYcOnw7VlcyBjb250aWRhcyBuYSBtb2RhbCBkZSByZWN1cGVyYcOnw6NvIGRlXG4gICAqIHNlbmhhLCBgcmVnaXN0ZXJVcmxgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGUgYHAtcmVnaXN0ZXItdXJsYCBlIGBhdXRoZW50aWNhdGlvblR5cGVgIHF1ZSBkZWZpbmUgYSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi10eXBlYC5cbiAgICpcbiAgICogPiDDiSBlc3NlbmNpYWwgcXVlIHNpZ2EgYSBub21lbmNsYXR1cmEgZG9zIGF0cmlidXRvcyBleGVtcGxpZmljYWRvcyBhY2ltYSBwYXJhIHN1YSBlZmV0aXZhIGZ1bmNpb25hbGlkYWRlLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXVybCcpIHNldCBhdXRoZW50aWNhdGlvblVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25VcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYXV0aGVudGljYXRpb25VcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Vcmw7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYXNvIG8gdmFsb3IgYXRyaWJ1w61kbyBwYXJhIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgIHNlamEgaWd1YWwgYSAwKHplcm8pIGUgYSBhcGxpY2HDp8OjbyB0ZW5oYSB1bSBsaW5rIGRlIGJsb3F1ZWlvIGRlIHVzdcOhcmlvLFxuICAgKiBpbmZvcm1lIHVtYSB1cmwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhLCBkZXNzYSBmb3JtYSBlbSBjYXNvIGRlIGJsb3F1ZWlvIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkby5cbiAgICovXG4gIEBJbnB1dCgncC1ibG9ja2VkLXVybCcpIHNldCBibG9ja2VkVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ibG9ja2VkVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IGJsb2NrZWRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmxvY2tlZFVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV4aWJlIHVtIGJvdMOjbyBwYXJhIHN1cG9ydGUuXG4gICAqXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcbiAgICpcbiAgICogLSAqKlN0cmluZyoqOiBVUkwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhO1xuICAgKiAtICoqRnVuY3Rpb24qKjogRnVuw6fDo28gYSBzZXIgZGlzcGFyYWRhIGFvIGNsaWNhciBubyBib3TDo28gZGUgc3Vwb3J0ZTtcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luPlxuICAgKiAgIFtwLXN1cHBvcnRdPVwidGhpcy5teVN1cHBvcnQuYmluZCh0aGlzKVwiPlxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLXN1cHBvcnQnKSBzZXQgc3VwcG9ydCh2YWx1ZTogc3RyaW5nIHwgRnVuY3Rpb24pIHtcbiAgICB0aGlzLl9zdXBwb3J0ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgc3VwcG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENvbGXDp8OjbyBkZSBpZGlvbWFzIHF1ZSBvIGNvbXBvbmVudGUgaXLDoSB0cmF0YXIgZSBkaXNwb25pYmlsaXphcsOhIHBhcmEgbyB1c3XDoXJpbyBlc2NvbGhlci5cbiAgICpcbiAgICogQ2FzbyBlc3NhIHByb3ByaWVkYWRlIG7Do28gc2VqYSB1dGlsaXphZGEgbyBjb21wb25lbnRlIG1vc3RyYXLDoSBubyBjb21ibyBvcyBpZGlvbWFzIHF1ZSBlbGUgc3Vwb3J0YSBwb3IgcGFkcsOjby5cbiAgICpcbiAgICogQ2FzbyBhIGNvbGXDp8OjbyB0ZW5oYSB1bSBpZGlvbWEsIGEgcMOhZ2luYSBlc3RhcsOhIG5lc3NlIGlkaW9tYSBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8uXG4gICAqXG4gICAqIENhc28gc2VqYSBwYXNzYWRvIHVtIGFycmF5IHZhemlvLCBhIHDDoWdpbmEgdGVyw6EgbyBpZGlvbWEgY29uZmlndXJhZG8gbm8gYGkxOG5gIGUgbsOjbyBtb3N0cmFyw6EgbyBjb21ibyBkZSBzZWxlw6fDo28uXG4gICAqXG4gICAqID4gU2UgZm9yIHBhc3NhZG8gdW0gaWRpb21hIG7Do28gc3Vwb3J0YWRvLCBzZXLDoSBwcmVjaXNvIHBhc3NhciBhcyBsaXRlcmFpcyBwZWxhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYC5cbiAgICpcbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1sYW5ndWFnZXMnKSBzZXQgbGFuZ3VhZ2VzTGlzdChsYW5ndWFnZXNMaXN0OiBBcnJheTxQb0xhbmd1YWdlPikge1xuICAgIGlmIChsYW5ndWFnZXNMaXN0KSB7XG4gICAgICBpZiAobGFuZ3VhZ2VzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VzTGlzdCA9IGxhbmd1YWdlc0xpc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXNMaXN0ID0gcG9MYW5ndWFnZURlZmF1bHQuZmlsdGVyKGxhbmd1YWdlID0+IGxhbmd1YWdlLmxhbmd1YWdlID09PSB0aGlzLmxhbmd1YWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbGFuZ3VhZ2VzTGlzdCgpOiBBcnJheTxQb0xhbmd1YWdlPiB7XG4gICAgaWYgKHRoaXMuX2xhbmd1YWdlc0xpc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZXNMaXN0O1xuICAgIH1cbiAgICByZXR1cm4gcG9MYW5ndWFnZURlZmF1bHQ7XG4gIH1cblxuICBnZXQgc2hvd0xhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlc0xpc3QubGVuZ3RoID4gMTtcbiAgfVxuXG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgfHwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIGdldCBwYWdlTG9naW5MaXRlcmFscygpOiBQb1BhZ2VMb2dpbkxpdGVyYWxzIHtcbiAgICBjb25zdCBsb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsID0gdGhpcy5jb250YWN0RW1haWxcbiAgICAgID8gdGhpcy5jb25jYXRlbmF0ZUxvZ2luSGludFdpdGhDb250YWN0RW1haWwodGhpcy5jb250YWN0RW1haWwpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxuICAgICAgLi4ucG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV0sXG4gICAgICAuLi5sb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsLFxuICAgICAgLi4udGhpcy5saXRlcmFsc1xuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxvZ2luU2VydmljZTogUG9QYWdlTG9naW5TZXJ2aWNlLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgcG9MYW5ndWFnZVNlcnZpY2U6IFBvTGFuZ3VhZ2VTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMucG9MYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMubG9naW5TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9naW5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZVBvcG92ZXIoKSB7XG4gICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uTG9naW5TdWJtaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbG9naW5Gb3JtOiBQb1BhZ2VMb2dpbiA9IHtcbiAgICAgIGxvZ2luOiB0aGlzLmxvZ2luLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICByZW1lbWJlclVzZXI6IHRoaXMucmVtZW1iZXJVc2VyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1c3RvbUZpZWxkKSB7XG4gICAgICBsb2dpbkZvcm1bdGhpcy5jdXN0b21GaWVsZE9iamVjdC5wcm9wZXJ0eV0gPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uID0gdGhpcy5sb2dpblNlcnZpY2VcbiAgICAgICAgLm9uTG9naW4odGhpcy5hdXRoZW50aWNhdGlvblVybCwgdGhpcy5hdXRoZW50aWNhdGlvblR5cGUsIGxvZ2luRm9ybSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuSW50ZXJuYWxMaW5rKCcvJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IuY29kZSA9PT0gJzQwMCcgfHwgZXJyb3IuZXJyb3IuY29kZSA9PT0gJzQwMScpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZXNUb1Byb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0QmxvY2tlZFVybCh0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nLCB0aGlzLmJsb2NrZWRVcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dpblN1Ym1pdC5lbWl0KGxvZ2luRm9ybSk7XG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPiAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdEN1c3RvbUZpZWxkT2JqZWN0KHByb3BlcnR5KTogUG9QYWdlTG9naW5DdXN0b21GaWVsZCB7XG4gICAgcmV0dXJuIHsgcHJvcGVydHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkV4dGVybmFsTGluayh1cmw6IHN0cmluZykge1xuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuSW50ZXJuYWxMaW5rKHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdEJsb2NrZWRVcmwoYXR0ZW1wdHM6IG51bWJlciwgYmxvY2tlZFVybDogc3RyaW5nKSB7XG4gICAgaWYgKGF0dGVtcHRzID09PSAwICYmIGJsb2NrZWRVcmwpIHtcbiAgICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XG4gICAgICBpc0V4dGVybmFsTGluayhibG9ja2VkVXJsKSA/IHRoaXMub3BlbkV4dGVybmFsTGluayhibG9ja2VkVXJsKSA6IHRoaXMub3BlbkludGVybmFsTGluayhibG9ja2VkVXJsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlc1RvUHJvcGVydGllcyhyZXN1bHQ/KSB7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHJlc3VsdC5lcnJvci5tYXhBdHRlbXB0c1JlbWFpbmluZztcbiAgICAgIHRoaXMubG9naW5FcnJvcnMgPSByZXN1bHQuZXJyb3IubG9naW5XYXJuaW5ncztcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSByZXN1bHQuZXJyb3IucGFzc3dvcmRXYXJuaW5ncztcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9IHJlc3VsdC5lcnJvci5ibG9ja2VkVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gMDtcbiAgICAgIHRoaXMubG9naW5FcnJvcnMgPSBbXTtcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSBbXTtcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjb25jYXRlbmF0ZUxvZ2luSGludFdpdGhDb250YWN0RW1haWwoY29udGFjdEVtYWlsOiBzdHJpbmcpO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRMb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNldFBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KTogdm9pZDtcbn1cbiJdfQ==
|