@po-ui/ng-templates 18.22.0 → 19.0.0-next.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/fesm2022/po-ui-ng-templates.mjs +139 -122
- package/fesm2022/po-ui-ng-templates.mjs.map +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login-base.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login.service.d.ts +1 -1
- package/package.json +13 -15
- package/po-ui-ng-templates-19.0.0-next.0.tgz +0 -0
- package/schematics/ng-add/index.js +2 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js +1 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js.map +1 -1
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-change-password/index.js +1 -1
- package/schematics/ng-generate/po-page-change-password/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js.map +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js.map +1 -1
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-login/index.js +1 -1
- package/schematics/ng-generate/po-page-login/index.js.map +1 -1
- package/esm2022/lib/components/components.module.mjs +0 -84
- package/esm2022/lib/components/index.mjs +0 -12
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/index.mjs +0 -8
- package/esm2022/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +0 -119
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +0 -293
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +0 -34
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +0 -451
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +0 -29
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +0 -18
- package/esm2022/lib/components/po-page-background/index.mjs +0 -3
- package/esm2022/lib/components/po-page-background/po-page-background.component.mjs +0 -191
- package/esm2022/lib/components/po-page-background/po-page-background.module.mjs +0 -27
- package/esm2022/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +0 -17
- package/esm2022/lib/components/po-page-blocked-user/index.mjs +0 -8
- package/esm2022/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +0 -78
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +0 -197
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +0 -105
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +0 -107
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +0 -108
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +0 -29
- package/esm2022/lib/components/po-page-change-password/index.mjs +0 -7
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +0 -79
- package/esm2022/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +0 -300
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.component.mjs +0 -401
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.module.mjs +0 -30
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.service.mjs +0 -18
- package/esm2022/lib/components/po-page-dynamic-detail/index.mjs +0 -10
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +0 -546
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +0 -54
- package/esm2022/lib/components/po-page-dynamic-edit/index.mjs +0 -11
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +0 -889
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +0 -60
- package/esm2022/lib/components/po-page-dynamic-search/index.mjs +0 -7
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +0 -133
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +0 -76
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +0 -365
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +0 -349
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +0 -52
- package/esm2022/lib/components/po-page-dynamic-table/index.mjs +0 -16
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +0 -271
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +0 -59
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +0 -63
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +0 -1257
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +0 -50
- package/esm2022/lib/components/po-page-job-scheduler/index.mjs +0 -6
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +0 -302
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +0 -393
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +0 -13
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +0 -195
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +0 -22
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.mjs +0 -92
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +0 -79
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/po-job-scheduler-summary-template.directive.mjs +0 -44
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +0 -211
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +0 -418
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +0 -85
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +0 -224
- package/esm2022/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +0 -15
- package/esm2022/lib/components/po-page-login/index.mjs +0 -8
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/po-page-login-base.component.mjs +0 -1099
- package/esm2022/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +0 -137
- package/esm2022/lib/components/po-page-login/po-page-login.component.mjs +0 -483
- package/esm2022/lib/components/po-page-login/po-page-login.module.mjs +0 -31
- package/esm2022/lib/components/po-page-login/po-page-login.service.mjs +0 -32
- package/esm2022/lib/index.mjs +0 -4
- package/esm2022/lib/po-templates.module.mjs +0 -18
- package/esm2022/lib/services/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/po-page-customization.module.mjs +0 -23
- package/esm2022/lib/services/po-page-customization/po-page-customization.service.mjs +0 -86
- package/esm2022/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/index.mjs +0 -3
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +0 -23
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +0 -106
- package/esm2022/lib/services/services.module.mjs +0 -18
- package/esm2022/lib/utils/util.mjs +0 -428
- package/esm2022/po-ui-ng-templates.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
- package/po-ui-ng-templates-18.22.0.tgz +0 -0
|
@@ -1,1099 +0,0 @@
|
|
|
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
|
-
loginService;
|
|
157
|
-
router;
|
|
158
|
-
poLanguageService;
|
|
159
|
-
/**
|
|
160
|
-
* O `p-background` permite inserir uma imagem de destaque ao lado direito do formulário de login, caso a propriedade
|
|
161
|
-
* não seja preenchida o formulário será centralizado no espaço disponível.
|
|
162
|
-
*
|
|
163
|
-
* A fonte da imagem pode ser de um caminho local ou uma url de um servidor externo.
|
|
164
|
-
*
|
|
165
|
-
* Além da imagem, é possível adicionar um texto informativo por cima da imagem da imagem de destaque, para isso informe
|
|
166
|
-
* um valor para a literal `highlightInfo`.
|
|
167
|
-
*
|
|
168
|
-
* > Veja mais sobre as literais na propriedade `p-literals`.
|
|
169
|
-
*
|
|
170
|
-
* Exemplos de valores válidos:
|
|
171
|
-
* - **local**: `./assets/images/login-background.png`
|
|
172
|
-
* - **url externa**: `https://po-ui.io/assets/images/login-background.png`
|
|
173
|
-
*
|
|
174
|
-
* > Essa propriedade é ignorada para aplicações mobile.
|
|
175
|
-
*/
|
|
176
|
-
background;
|
|
177
|
-
/**
|
|
178
|
-
* @optional
|
|
179
|
-
*
|
|
180
|
-
* @description
|
|
181
|
-
*
|
|
182
|
-
* Caminho para a logomarca localizada na parte superior.
|
|
183
|
-
*
|
|
184
|
-
* > Caso seja indefinida o espaço se mantém preservado porém vazio.
|
|
185
|
-
*/
|
|
186
|
-
logo;
|
|
187
|
-
/**
|
|
188
|
-
* @optional
|
|
189
|
-
*
|
|
190
|
-
* @description
|
|
191
|
-
*
|
|
192
|
-
* Expressão regular para validar o campo de login, caso a expressão não seja atentida, a literal `loginErrorPattern`
|
|
193
|
-
* será exibida.
|
|
194
|
-
*
|
|
195
|
-
* Exemplos de valores válidos:
|
|
196
|
-
* - email: `[expressao-regular-email]`
|
|
197
|
-
* - cpf: `[expressao-regular-cpf]`
|
|
198
|
-
*
|
|
199
|
-
* > Veja a propriedade `p-literals` para customizar a literal `loginErrorPattern`.
|
|
200
|
-
*/
|
|
201
|
-
loginPattern;
|
|
202
|
-
/**
|
|
203
|
-
* @optional
|
|
204
|
-
*
|
|
205
|
-
* @description
|
|
206
|
-
*
|
|
207
|
-
* Expressão regular para validar o campo de password, caso a expressão não seja atentida, a literal `passwordErrorPattern`
|
|
208
|
-
* será exibida.
|
|
209
|
-
*
|
|
210
|
-
* Exemplos de valores válidos:
|
|
211
|
-
* - Apenas números: `\d?`
|
|
212
|
-
* - Letras mínusculas: `\z?`
|
|
213
|
-
*
|
|
214
|
-
* > Veja a propriedade `p-literals` para customizar a literal `passwordErrorPattern`.
|
|
215
|
-
*/
|
|
216
|
-
passwordPattern;
|
|
217
|
-
/**
|
|
218
|
-
* @optional
|
|
219
|
-
*
|
|
220
|
-
* @description
|
|
221
|
-
*
|
|
222
|
-
* Caminho para a logomarca localizada no rodapé.
|
|
223
|
-
*/
|
|
224
|
-
secondaryLogo;
|
|
225
|
-
/**
|
|
226
|
-
* @optional
|
|
227
|
-
*
|
|
228
|
-
* @description
|
|
229
|
-
*
|
|
230
|
-
* Evento disparado quando o usuário alterar o input do campo login.
|
|
231
|
-
*
|
|
232
|
-
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
233
|
-
*
|
|
234
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
235
|
-
*/
|
|
236
|
-
loginChange = new EventEmitter();
|
|
237
|
-
/**
|
|
238
|
-
* Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
|
|
239
|
-
*
|
|
240
|
-
* Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
|
|
241
|
-
*
|
|
242
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
|
|
243
|
-
*
|
|
244
|
-
* > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
|
|
245
|
-
*/
|
|
246
|
-
loginSubmit = new EventEmitter();
|
|
247
|
-
/**
|
|
248
|
-
* @optional
|
|
249
|
-
*
|
|
250
|
-
* @description
|
|
251
|
-
*
|
|
252
|
-
* Evento disparado quando o usuário alterar o input do campo password.
|
|
253
|
-
*
|
|
254
|
-
* Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
|
|
255
|
-
*
|
|
256
|
-
* > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
|
|
257
|
-
*/
|
|
258
|
-
passwordChange = new EventEmitter();
|
|
259
|
-
/**
|
|
260
|
-
* @optional
|
|
261
|
-
*
|
|
262
|
-
* @description
|
|
263
|
-
*
|
|
264
|
-
* Evento disparado quando o usuário alterar o idioma da página.
|
|
265
|
-
*
|
|
266
|
-
* Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
|
|
267
|
-
*
|
|
268
|
-
*/
|
|
269
|
-
languageChange = new EventEmitter();
|
|
270
|
-
/**
|
|
271
|
-
* @optional
|
|
272
|
-
*
|
|
273
|
-
* @description
|
|
274
|
-
*
|
|
275
|
-
* Define a propriedade nativa `autocomplete` do campo como `off`.
|
|
276
|
-
*
|
|
277
|
-
* @default `true`
|
|
278
|
-
*/
|
|
279
|
-
noAutocompleteLogin = true;
|
|
280
|
-
/**
|
|
281
|
-
* @optional
|
|
282
|
-
*
|
|
283
|
-
* @description
|
|
284
|
-
*
|
|
285
|
-
* Define a propriedade nativa `autocomplete` do campo como `off`.
|
|
286
|
-
*
|
|
287
|
-
* > No componente `po-password` será definido como `new-password`.
|
|
288
|
-
*
|
|
289
|
-
* @default `true`
|
|
290
|
-
*/
|
|
291
|
-
noAutocompletePassword = true;
|
|
292
|
-
/**
|
|
293
|
-
* @optional
|
|
294
|
-
*
|
|
295
|
-
* @description
|
|
296
|
-
*
|
|
297
|
-
* Indica se o status do `model` do switch de lembrar o usuário será escondido visualmente.
|
|
298
|
-
*
|
|
299
|
-
* > Por padrão será atribuído `false`.
|
|
300
|
-
* @default `false`
|
|
301
|
-
*/
|
|
302
|
-
hideLabelStatus = false;
|
|
303
|
-
/**
|
|
304
|
-
* @optional
|
|
305
|
-
*
|
|
306
|
-
* @description
|
|
307
|
-
*
|
|
308
|
-
* Permite esconder a função de espiar a senha digitada.
|
|
309
|
-
*
|
|
310
|
-
* @default `false`
|
|
311
|
-
*/
|
|
312
|
-
hidePasswordPeek;
|
|
313
|
-
allLoginErrors = [];
|
|
314
|
-
allPasswordErrors = [];
|
|
315
|
-
customFieldObject;
|
|
316
|
-
customFieldType;
|
|
317
|
-
loginSubscription;
|
|
318
|
-
password;
|
|
319
|
-
rememberUser = false;
|
|
320
|
-
selectedLanguage;
|
|
321
|
-
showExceededAttemptsWarning = false;
|
|
322
|
-
_authenticationType = PoPageLoginAuthenticationType.Basic;
|
|
323
|
-
_authenticationUrl;
|
|
324
|
-
_blockedUrl;
|
|
325
|
-
_contactEmail;
|
|
326
|
-
_customField;
|
|
327
|
-
_environment;
|
|
328
|
-
_exceededAttemptsWarning;
|
|
329
|
-
_hideRememberUser = false;
|
|
330
|
-
_literals;
|
|
331
|
-
_loading = false;
|
|
332
|
-
_login;
|
|
333
|
-
_loginErrors = [];
|
|
334
|
-
_passwordErrors = [];
|
|
335
|
-
_productName;
|
|
336
|
-
_recovery;
|
|
337
|
-
_registerUrl;
|
|
338
|
-
_support;
|
|
339
|
-
_languagesList;
|
|
340
|
-
/**
|
|
341
|
-
* @optional
|
|
342
|
-
*
|
|
343
|
-
* @description
|
|
344
|
-
*
|
|
345
|
-
* Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
|
|
346
|
-
* os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
|
|
347
|
-
*
|
|
348
|
-
* Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
|
|
349
|
-
* através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
|
|
350
|
-
* ou `po-select` para valores fixos.
|
|
351
|
-
*
|
|
352
|
-
* Abaixo seguem os exemplos de cada tipo de campo.
|
|
353
|
-
*
|
|
354
|
-
* `po-input`:
|
|
355
|
-
*
|
|
356
|
-
* ```
|
|
357
|
-
* {
|
|
358
|
-
* property: 'domain',
|
|
359
|
-
* value: 'jv01',
|
|
360
|
-
* placeholder: 'Enter your domain',
|
|
361
|
-
* pattern: '[a-z]',
|
|
362
|
-
* errorPattern: 'Invalid value'
|
|
363
|
-
* }
|
|
364
|
-
* ```
|
|
365
|
-
*
|
|
366
|
-
* `po-combo`:
|
|
367
|
-
*
|
|
368
|
-
* ```
|
|
369
|
-
* {
|
|
370
|
-
* property: 'domain',
|
|
371
|
-
* value: 'jv01',
|
|
372
|
-
* placeholder: 'Enter your domain',
|
|
373
|
-
* url: 'https://po-ui.io/sample/api/comboOption/domains',
|
|
374
|
-
* fieldValue: 'nickname'
|
|
375
|
-
* }
|
|
376
|
-
* ```
|
|
377
|
-
*
|
|
378
|
-
* `po-select`:
|
|
379
|
-
*
|
|
380
|
-
* ```
|
|
381
|
-
* {
|
|
382
|
-
* property: 'domain',
|
|
383
|
-
* value: 'jv01',
|
|
384
|
-
* placeholder: 'Enter your domain',
|
|
385
|
-
* options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
|
|
386
|
-
* }
|
|
387
|
-
* ```
|
|
388
|
-
*
|
|
389
|
-
* Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
|
|
390
|
-
* utilizando o options.
|
|
391
|
-
*
|
|
392
|
-
*/
|
|
393
|
-
set customField(value) {
|
|
394
|
-
if (value) {
|
|
395
|
-
if (isTypeof(value, 'string')) {
|
|
396
|
-
this.customFieldType = 'input';
|
|
397
|
-
this._customField = value;
|
|
398
|
-
this.customFieldObject = this.getDefaultCustomFieldObject(value);
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
|
|
402
|
-
this._customField = value;
|
|
403
|
-
this.customFieldObject = value;
|
|
404
|
-
if (!this.customFieldObject.options && !this.customFieldObject.url) {
|
|
405
|
-
this.customFieldType = 'input';
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
|
|
409
|
-
}
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
this._customField = undefined;
|
|
414
|
-
this.customFieldObject = undefined;
|
|
415
|
-
}
|
|
416
|
-
get customField() {
|
|
417
|
-
return this._customField;
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* @optional
|
|
421
|
-
*
|
|
422
|
-
* @description
|
|
423
|
-
*
|
|
424
|
-
* Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
|
|
425
|
-
*/
|
|
426
|
-
set contactEmail(value) {
|
|
427
|
-
this._contactEmail = value;
|
|
428
|
-
}
|
|
429
|
-
get contactEmail() {
|
|
430
|
-
return this._contactEmail;
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* @optional
|
|
434
|
-
*
|
|
435
|
-
* @description
|
|
436
|
-
*
|
|
437
|
-
* Texto customizado que fica entre a logo e a mensagem de boas-vindas.
|
|
438
|
-
*/
|
|
439
|
-
set productName(value) {
|
|
440
|
-
this._productName = value;
|
|
441
|
-
}
|
|
442
|
-
get productName() {
|
|
443
|
-
return this._productName;
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* @optional
|
|
447
|
-
*
|
|
448
|
-
* @description
|
|
449
|
-
* Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
|
|
450
|
-
*
|
|
451
|
-
* > Essa propriedade limita o texto em 40 caracteres.
|
|
452
|
-
*/
|
|
453
|
-
set environment(environment) {
|
|
454
|
-
if (environment && environment.length > poPageLoginContentMaxLength) {
|
|
455
|
-
this._environment = environment.substring(0, poPageLoginContentMaxLength);
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
this._environment = environment;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
get environment() {
|
|
462
|
-
return this._environment;
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* @optional
|
|
466
|
-
*
|
|
467
|
-
* @description
|
|
468
|
-
* Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
|
|
469
|
-
* O aviso será exibido somente se a quantidade for maior que zero.
|
|
470
|
-
*
|
|
471
|
-
* > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
|
|
472
|
-
* para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
|
|
473
|
-
*
|
|
474
|
-
* @default `0`
|
|
475
|
-
*/
|
|
476
|
-
set exceededAttemptsWarning(value) {
|
|
477
|
-
this._exceededAttemptsWarning = convertToInt(value);
|
|
478
|
-
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
479
|
-
}
|
|
480
|
-
get exceededAttemptsWarning() {
|
|
481
|
-
return this._exceededAttemptsWarning;
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* @optional
|
|
485
|
-
*
|
|
486
|
-
* @description
|
|
487
|
-
*
|
|
488
|
-
* Esconde a função "Lembrar usuário" do formulário de login.
|
|
489
|
-
*
|
|
490
|
-
* Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
|
|
491
|
-
* `false`.
|
|
492
|
-
*
|
|
493
|
-
* > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
|
|
494
|
-
*
|
|
495
|
-
* @default `false`
|
|
496
|
-
*/
|
|
497
|
-
set hideRememberUser(value) {
|
|
498
|
-
this._hideRememberUser = value === '' ? true : convertToBoolean(value);
|
|
499
|
-
if (this._hideRememberUser) {
|
|
500
|
-
this.rememberUser = false;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
get hideRememberUser() {
|
|
504
|
-
return this._hideRememberUser;
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* @optional
|
|
508
|
-
*
|
|
509
|
-
* @description
|
|
510
|
-
*
|
|
511
|
-
* Objeto com as literais usadas no `po-page-login`.
|
|
512
|
-
*
|
|
513
|
-
* Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
|
|
514
|
-
*
|
|
515
|
-
* ```
|
|
516
|
-
* const customLiterals: PoPageLoginLiterals = {
|
|
517
|
-
* attempts: '{0} vez(es) ',
|
|
518
|
-
* createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
|
|
519
|
-
* forgotPassword: 'Esqueceu sua senha?',
|
|
520
|
-
* forgotYourPassword: 'Esqueceu sua senha?',
|
|
521
|
-
* highlightInfo: '',
|
|
522
|
-
* iForgotMyPassword: 'Esqueci minha senha',
|
|
523
|
-
* ifYouTryHarder: 'Se tentar mais ',
|
|
524
|
-
* welcome: 'Boas-vindas',
|
|
525
|
-
* loginErrorPattern: 'Login obrigatório',
|
|
526
|
-
* loginHint: 'Caso não possua usuário entre em contato com o suporte',
|
|
527
|
-
* loginLabel: 'Insira seu usuário',
|
|
528
|
-
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
529
|
-
* passwordErrorPattern: 'Senha obrigatória',
|
|
530
|
-
* passwordLabel: 'Insira sua senha',
|
|
531
|
-
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
532
|
-
* customFieldErrorPattern: 'Campo customizado inválido',
|
|
533
|
-
* customFieldPlaceholder: 'Por favor insira um valor',
|
|
534
|
-
* registerUrl: 'Novo registro',
|
|
535
|
-
* rememberUser: 'Lembrar usuário',
|
|
536
|
-
* rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
|
|
537
|
-
* submitLabel: 'Acessar sistema',
|
|
538
|
-
* submittedLabel: 'Carregando...',
|
|
539
|
-
* titlePopover: 'Opa!',
|
|
540
|
-
* yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
|
|
541
|
-
* };
|
|
542
|
-
* ```
|
|
543
|
-
*
|
|
544
|
-
* Ou passando apenas as literais que deseja customizar:
|
|
545
|
-
*
|
|
546
|
-
* ```
|
|
547
|
-
* const customLiterals: PoPageLoginLiterals = {
|
|
548
|
-
* loginPlaceholder: 'Insira seu usuário de acesso',
|
|
549
|
-
* passwordPlaceholder: 'Insira sua senha de acesso',
|
|
550
|
-
* submitLabel: 'Acessar sistema'
|
|
551
|
-
* };
|
|
552
|
-
* ```
|
|
553
|
-
*
|
|
554
|
-
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
|
|
555
|
-
*
|
|
556
|
-
* ```
|
|
557
|
-
* <po-page-login
|
|
558
|
-
* [p-literals]="customLiterals">
|
|
559
|
-
* </po-page-login>
|
|
560
|
-
* ```
|
|
561
|
-
*
|
|
562
|
-
* > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
|
|
563
|
-
* > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
|
|
564
|
-
* nesse caso, há também a opção do idioma russo.
|
|
565
|
-
*/
|
|
566
|
-
set literals(value) {
|
|
567
|
-
this._literals = value;
|
|
568
|
-
}
|
|
569
|
-
get literals() {
|
|
570
|
-
return this._literals;
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* @optional
|
|
574
|
-
*
|
|
575
|
-
* @description
|
|
576
|
-
*
|
|
577
|
-
* Habilita um estado de carregamento ao botão de *login*.
|
|
578
|
-
*
|
|
579
|
-
* > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
|
|
580
|
-
*
|
|
581
|
-
* @default `false`
|
|
582
|
-
*/
|
|
583
|
-
set loading(value) {
|
|
584
|
-
this._loading = convertToBoolean(value);
|
|
585
|
-
}
|
|
586
|
-
get loading() {
|
|
587
|
-
return this._loading;
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* @optional
|
|
591
|
-
*
|
|
592
|
-
* @description
|
|
593
|
-
*
|
|
594
|
-
* Valor do modelo do campo de login.
|
|
595
|
-
*/
|
|
596
|
-
set login(value) {
|
|
597
|
-
this._login = value;
|
|
598
|
-
if (!this.authenticationUrl) {
|
|
599
|
-
this.loginChange.emit(this._login);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
get login() {
|
|
603
|
-
return this._login;
|
|
604
|
-
}
|
|
605
|
-
/**
|
|
606
|
-
* @optional
|
|
607
|
-
*
|
|
608
|
-
* @description
|
|
609
|
-
*
|
|
610
|
-
* Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
|
|
611
|
-
*/
|
|
612
|
-
set loginErrors(value) {
|
|
613
|
-
this._loginErrors = value || [];
|
|
614
|
-
this.setLoginErrors(this._loginErrors);
|
|
615
|
-
}
|
|
616
|
-
get loginErrors() {
|
|
617
|
-
return this._loginErrors;
|
|
618
|
-
}
|
|
619
|
-
/**
|
|
620
|
-
* @optional
|
|
621
|
-
*
|
|
622
|
-
* @description
|
|
623
|
-
*
|
|
624
|
-
* Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
|
|
625
|
-
*/
|
|
626
|
-
set passwordErrors(value) {
|
|
627
|
-
this._passwordErrors = value || [];
|
|
628
|
-
this.setPasswordErrors(this._passwordErrors);
|
|
629
|
-
}
|
|
630
|
-
get passwordErrors() {
|
|
631
|
-
return this._passwordErrors;
|
|
632
|
-
}
|
|
633
|
-
/**
|
|
634
|
-
* @optional
|
|
635
|
-
*
|
|
636
|
-
* @description
|
|
637
|
-
*
|
|
638
|
-
* 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.
|
|
639
|
-
*
|
|
640
|
-
* A propriedade aceita os seguintes tipos:
|
|
641
|
-
*
|
|
642
|
-
* - **String**: informe uma url externa ou uma rota válida;
|
|
643
|
-
* - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
|
|
644
|
-
* ```
|
|
645
|
-
* <po-page-login>
|
|
646
|
-
* [recovery]="this.myRecovery.bind(this)">
|
|
647
|
-
* </po-page-login>
|
|
648
|
-
* ```
|
|
649
|
-
*
|
|
650
|
-
* - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
|
|
651
|
-
* O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
|
|
652
|
-
* **email** para contato e **máscara** do campo de telefone.
|
|
653
|
-
*/
|
|
654
|
-
set recovery(value) {
|
|
655
|
-
this._recovery = value;
|
|
656
|
-
}
|
|
657
|
-
get recovery() {
|
|
658
|
-
return this._recovery;
|
|
659
|
-
}
|
|
660
|
-
/**
|
|
661
|
-
* @optional
|
|
662
|
-
*
|
|
663
|
-
* @description
|
|
664
|
-
*
|
|
665
|
-
* Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
|
|
666
|
-
* forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
|
|
667
|
-
*
|
|
668
|
-
* Exemplos de valores válidos:
|
|
669
|
-
* - **local**: `/home`
|
|
670
|
-
* - **url externa**: `https://po-ui.io`
|
|
671
|
-
*
|
|
672
|
-
* > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
|
|
673
|
-
*/
|
|
674
|
-
set registerUrl(value) {
|
|
675
|
-
this._registerUrl = isTypeof(value, 'string') ? value : undefined;
|
|
676
|
-
}
|
|
677
|
-
get registerUrl() {
|
|
678
|
-
return this._registerUrl;
|
|
679
|
-
}
|
|
680
|
-
/**
|
|
681
|
-
* @optional
|
|
682
|
-
*
|
|
683
|
-
* @description
|
|
684
|
-
*
|
|
685
|
-
* Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
|
|
686
|
-
*
|
|
687
|
-
* > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
|
|
688
|
-
*
|
|
689
|
-
* ```
|
|
690
|
-
* headers {
|
|
691
|
-
* Authorization: Basic base64(login:password)
|
|
692
|
-
* }
|
|
693
|
-
*
|
|
694
|
-
* body {
|
|
695
|
-
* rememberUser: rememberUser
|
|
696
|
-
* }
|
|
697
|
-
* ```
|
|
698
|
-
*
|
|
699
|
-
* > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
|
|
700
|
-
*
|
|
701
|
-
* ```
|
|
702
|
-
* body {
|
|
703
|
-
* login: login,
|
|
704
|
-
* password: base64(password),
|
|
705
|
-
* rememberUser: rememberUser
|
|
706
|
-
* }
|
|
707
|
-
* ```
|
|
708
|
-
*
|
|
709
|
-
* @default `PoPageLoginAuthenticationType.Basic`
|
|
710
|
-
*/
|
|
711
|
-
set authenticationType(value) {
|
|
712
|
-
this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
|
|
713
|
-
? value
|
|
714
|
-
: PoPageLoginAuthenticationType.Basic;
|
|
715
|
-
}
|
|
716
|
-
get authenticationType() {
|
|
717
|
-
return this._authenticationType;
|
|
718
|
-
}
|
|
719
|
-
/**
|
|
720
|
-
* @optional
|
|
721
|
-
*
|
|
722
|
-
* @description
|
|
723
|
-
*
|
|
724
|
-
* Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
|
|
725
|
-
* componente adquirirá automatização para o processo de autenticação.
|
|
726
|
-
*
|
|
727
|
-
* ### Processos
|
|
728
|
-
* Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
|
|
729
|
-
* na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
|
|
730
|
-
*
|
|
731
|
-
* ```
|
|
732
|
-
* headers {
|
|
733
|
-
* Authorization: Basic base64(login:password)
|
|
734
|
-
* }
|
|
735
|
-
*
|
|
736
|
-
* body {
|
|
737
|
-
* rememberUser: rememberUser
|
|
738
|
-
* }
|
|
739
|
-
* ```
|
|
740
|
-
*
|
|
741
|
-
* Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
|
|
742
|
-
* aplicação `/`.
|
|
743
|
-
*
|
|
744
|
-
* ```
|
|
745
|
-
* 200:
|
|
746
|
-
* {
|
|
747
|
-
* user: user
|
|
748
|
-
* }
|
|
749
|
-
* ```
|
|
750
|
-
*
|
|
751
|
-
* Em caso de **erro** na autenticação, espera-se o seguinte retorno:
|
|
752
|
-
*
|
|
753
|
-
* ```
|
|
754
|
-
* 400/401
|
|
755
|
-
* {
|
|
756
|
-
* code: 400/401,
|
|
757
|
-
* message: message,
|
|
758
|
-
* detailedMessage: detailedMessage,
|
|
759
|
-
* helpUrl?: helpUrl
|
|
760
|
-
* }
|
|
761
|
-
* ```
|
|
762
|
-
*
|
|
763
|
-
* > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
|
|
764
|
-
* assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
|
|
765
|
-
* `p-password-errors` conforme retorno abaixo:
|
|
766
|
-
*
|
|
767
|
-
* ```
|
|
768
|
-
* 400
|
|
769
|
-
* {
|
|
770
|
-
* code: 400/401,
|
|
771
|
-
* message: message,
|
|
772
|
-
* detailedMessage: detailedMessage,
|
|
773
|
-
* helpUrl?: helpUrl,
|
|
774
|
-
* maxAttemptsRemaining?: maxAttemptsRemaining,
|
|
775
|
-
* loginWarnings?: [loginWarnings],
|
|
776
|
-
* passwordWarnings?: [passwordWarnings]
|
|
777
|
-
* }
|
|
778
|
-
* ```
|
|
779
|
-
*
|
|
780
|
-
* > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
|
|
781
|
-
* atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
|
|
782
|
-
*
|
|
783
|
-
* *Processo finalizado.*
|
|
784
|
-
*
|
|
785
|
-
* _______________
|
|
786
|
-
*
|
|
787
|
-
* #### Praticidade
|
|
788
|
-
* As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
|
|
789
|
-
* dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
|
|
790
|
-
* 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
|
|
791
|
-
* com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
|
|
792
|
-
* Basta definir nas configurações de rota:
|
|
793
|
-
*
|
|
794
|
-
*
|
|
795
|
-
* ```
|
|
796
|
-
* import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
|
|
797
|
-
*
|
|
798
|
-
* ...
|
|
799
|
-
* const routes: Routes = [
|
|
800
|
-
* {
|
|
801
|
-
* path: 'login', component: PoPageLoginComponent, data: {
|
|
802
|
-
* serviceApi: 'https://po-ui.io/sample/api/users/authentication',
|
|
803
|
-
* environment: 'development',
|
|
804
|
-
* recovery: {
|
|
805
|
-
* url: 'https://po-ui.io/sample/api/users',
|
|
806
|
-
* type: PoModalPasswordRecoveryType.All,
|
|
807
|
-
* contactMail: 'dev.po@po-ui.com',
|
|
808
|
-
* phoneMask: '9-999-999-9999'
|
|
809
|
-
* },
|
|
810
|
-
* registerUrl: '/new-password',
|
|
811
|
-
* authenticationType: PoPageLoginAthenticationType.Basic
|
|
812
|
-
* }
|
|
813
|
-
* }
|
|
814
|
-
* ...
|
|
815
|
-
* ];
|
|
816
|
-
*
|
|
817
|
-
* @NgModule({
|
|
818
|
-
* imports: [RouterModule.forRoot(routes)],
|
|
819
|
-
* exports: [RouterModule]
|
|
820
|
-
* })
|
|
821
|
-
* export class AppRoutingModule { }
|
|
822
|
-
* ```
|
|
823
|
-
*
|
|
824
|
-
*
|
|
825
|
-
* O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
|
|
826
|
-
* `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
|
|
827
|
-
* senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
|
|
828
|
-
*
|
|
829
|
-
* > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
|
|
830
|
-
*
|
|
831
|
-
*/
|
|
832
|
-
set authenticationUrl(value) {
|
|
833
|
-
this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
|
|
834
|
-
}
|
|
835
|
-
get authenticationUrl() {
|
|
836
|
-
return this._authenticationUrl;
|
|
837
|
-
}
|
|
838
|
-
/**
|
|
839
|
-
* @optional
|
|
840
|
-
*
|
|
841
|
-
* @description
|
|
842
|
-
*
|
|
843
|
-
* 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,
|
|
844
|
-
* informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
|
|
845
|
-
*/
|
|
846
|
-
set blockedUrl(value) {
|
|
847
|
-
this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
|
|
848
|
-
}
|
|
849
|
-
get blockedUrl() {
|
|
850
|
-
return this._blockedUrl;
|
|
851
|
-
}
|
|
852
|
-
/**
|
|
853
|
-
* @optional
|
|
854
|
-
*
|
|
855
|
-
* @description
|
|
856
|
-
*
|
|
857
|
-
* Exibe um botão para suporte.
|
|
858
|
-
*
|
|
859
|
-
* A propriedade aceita os seguintes tipos:
|
|
860
|
-
*
|
|
861
|
-
* - **String**: URL externa ou uma rota válida;
|
|
862
|
-
* - **Function**: Função a ser disparada ao clicar no botão de suporte;
|
|
863
|
-
* ```
|
|
864
|
-
* <po-page-login>
|
|
865
|
-
* [p-support]="this.mySupport.bind(this)">
|
|
866
|
-
* </po-page-login>
|
|
867
|
-
* ```
|
|
868
|
-
*
|
|
869
|
-
*/
|
|
870
|
-
set support(value) {
|
|
871
|
-
this._support = value;
|
|
872
|
-
}
|
|
873
|
-
get support() {
|
|
874
|
-
return this._support;
|
|
875
|
-
}
|
|
876
|
-
/**
|
|
877
|
-
* @optional
|
|
878
|
-
*
|
|
879
|
-
* @description
|
|
880
|
-
*
|
|
881
|
-
* Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
|
|
882
|
-
*
|
|
883
|
-
* Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
|
|
884
|
-
*
|
|
885
|
-
* Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
|
|
886
|
-
*
|
|
887
|
-
* Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
|
|
888
|
-
*
|
|
889
|
-
* > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
|
|
890
|
-
*
|
|
891
|
-
*
|
|
892
|
-
*/
|
|
893
|
-
set languagesList(languagesList) {
|
|
894
|
-
if (languagesList) {
|
|
895
|
-
if (languagesList.length) {
|
|
896
|
-
this._languagesList = languagesList;
|
|
897
|
-
}
|
|
898
|
-
else {
|
|
899
|
-
this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
get languagesList() {
|
|
904
|
-
if (this._languagesList) {
|
|
905
|
-
return this._languagesList;
|
|
906
|
-
}
|
|
907
|
-
return poLanguageDefault;
|
|
908
|
-
}
|
|
909
|
-
get showLanguage() {
|
|
910
|
-
return this.languagesList.length > 1;
|
|
911
|
-
}
|
|
912
|
-
get language() {
|
|
913
|
-
return this.selectedLanguage || getShortBrowserLanguage();
|
|
914
|
-
}
|
|
915
|
-
get pageLoginLiterals() {
|
|
916
|
-
const loginHintWithContactEmail = this.contactEmail
|
|
917
|
-
? this.concatenateLoginHintWithContactEmail(this.contactEmail)
|
|
918
|
-
: undefined;
|
|
919
|
-
return {
|
|
920
|
-
...poPageLoginLiteralsDefault[poLocaleDefault],
|
|
921
|
-
...poPageLoginLiteralsDefault[this.language],
|
|
922
|
-
...loginHintWithContactEmail,
|
|
923
|
-
...this.literals
|
|
924
|
-
};
|
|
925
|
-
}
|
|
926
|
-
constructor(loginService, router, poLanguageService) {
|
|
927
|
-
this.loginService = loginService;
|
|
928
|
-
this.router = router;
|
|
929
|
-
this.poLanguageService = poLanguageService;
|
|
930
|
-
this.selectedLanguage = this.poLanguageService.getShortLanguage();
|
|
931
|
-
}
|
|
932
|
-
ngOnDestroy() {
|
|
933
|
-
if (this.loginSubscription) {
|
|
934
|
-
this.loginSubscription.unsubscribe();
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
closePopover() {
|
|
938
|
-
this.showExceededAttemptsWarning = false;
|
|
939
|
-
}
|
|
940
|
-
onLoginSubmit() {
|
|
941
|
-
const loginForm = {
|
|
942
|
-
login: this.login,
|
|
943
|
-
password: this.password,
|
|
944
|
-
rememberUser: this.rememberUser
|
|
945
|
-
};
|
|
946
|
-
if (this.customField) {
|
|
947
|
-
loginForm[this.customFieldObject.property] = this.customFieldObject.value;
|
|
948
|
-
}
|
|
949
|
-
if (this.authenticationUrl) {
|
|
950
|
-
this.loading = true;
|
|
951
|
-
this.loginSubscription = this.loginService
|
|
952
|
-
.onLogin(this.authenticationUrl, this.authenticationType, loginForm)
|
|
953
|
-
.subscribe(data => {
|
|
954
|
-
this.setValuesToProperties();
|
|
955
|
-
sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
|
|
956
|
-
this.openInternalLink('/');
|
|
957
|
-
this.loading = false;
|
|
958
|
-
}, error => {
|
|
959
|
-
if (error.error.code === '400' || error.error.code === '401') {
|
|
960
|
-
this.setValuesToProperties(error);
|
|
961
|
-
this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
|
|
962
|
-
}
|
|
963
|
-
this.loading = false;
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
else {
|
|
967
|
-
this.loginSubmit.emit(loginForm);
|
|
968
|
-
this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
getDefaultCustomFieldObject(property) {
|
|
972
|
-
return { property };
|
|
973
|
-
}
|
|
974
|
-
openExternalLink(url) {
|
|
975
|
-
window.open(url, '_blank');
|
|
976
|
-
}
|
|
977
|
-
openInternalLink(url) {
|
|
978
|
-
this.router.navigate([url]);
|
|
979
|
-
}
|
|
980
|
-
redirectBlockedUrl(attempts, blockedUrl) {
|
|
981
|
-
if (attempts === 0 && blockedUrl) {
|
|
982
|
-
this.showExceededAttemptsWarning = false;
|
|
983
|
-
isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
setValuesToProperties(result) {
|
|
987
|
-
if (result) {
|
|
988
|
-
this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
|
|
989
|
-
this.loginErrors = result.error.loginWarnings;
|
|
990
|
-
this.passwordErrors = result.error.passwordWarnings;
|
|
991
|
-
this.blockedUrl = result.error.blockedUrl;
|
|
992
|
-
}
|
|
993
|
-
else {
|
|
994
|
-
this.exceededAttemptsWarning = 0;
|
|
995
|
-
this.loginErrors = [];
|
|
996
|
-
this.passwordErrors = [];
|
|
997
|
-
this.blockedUrl = '';
|
|
998
|
-
}
|
|
999
|
-
}
|
|
1000
|
-
static ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
|
|
1001
|
-
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: [0, "p-background", "background"], logo: [0, "p-logo", "logo"], loginPattern: [0, "p-login-pattern", "loginPattern"], passwordPattern: [0, "p-password-pattern", "passwordPattern"], secondaryLogo: [0, "p-secondary-logo", "secondaryLogo"], noAutocompleteLogin: [0, "p-no-autocomplete-login", "noAutocompleteLogin"], noAutocompletePassword: [0, "p-no-autocomplete-password", "noAutocompletePassword"], hideLabelStatus: [2, "p-hide-label-status", "hideLabelStatus", convertToBoolean], hidePasswordPeek: [0, "p-hide-password-peek", "hidePasswordPeek"], customField: [0, "p-custom-field", "customField"], contactEmail: [0, "p-contact-email", "contactEmail"], productName: [0, "p-product-name", "productName"], environment: [0, "p-environment", "environment"], exceededAttemptsWarning: [0, "p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: [0, "p-hide-remember-user", "hideRememberUser"], literals: [0, "p-literals", "literals"], loading: [0, "p-loading", "loading"], login: [0, "p-login", "login"], loginErrors: [0, "p-login-errors", "loginErrors"], passwordErrors: [0, "p-password-errors", "passwordErrors"], recovery: [0, "p-recovery", "recovery"], registerUrl: [0, "p-register-url", "registerUrl"], authenticationType: [0, "p-authentication-type", "authenticationType"], authenticationUrl: [0, "p-authentication-url", "authenticationUrl"], blockedUrl: [0, "p-blocked-url", "blockedUrl"], support: [0, "p-support", "support"], languagesList: [0, "p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" }, features: [i0.ɵɵInputTransformsFeature] });
|
|
1002
|
-
}
|
|
1003
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
|
|
1004
|
-
type: Directive
|
|
1005
|
-
}], () => [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }], { background: [{
|
|
1006
|
-
type: Input,
|
|
1007
|
-
args: ['p-background']
|
|
1008
|
-
}], logo: [{
|
|
1009
|
-
type: Input,
|
|
1010
|
-
args: ['p-logo']
|
|
1011
|
-
}], loginPattern: [{
|
|
1012
|
-
type: Input,
|
|
1013
|
-
args: ['p-login-pattern']
|
|
1014
|
-
}], passwordPattern: [{
|
|
1015
|
-
type: Input,
|
|
1016
|
-
args: ['p-password-pattern']
|
|
1017
|
-
}], secondaryLogo: [{
|
|
1018
|
-
type: Input,
|
|
1019
|
-
args: ['p-secondary-logo']
|
|
1020
|
-
}], loginChange: [{
|
|
1021
|
-
type: Output,
|
|
1022
|
-
args: ['p-login-change']
|
|
1023
|
-
}], loginSubmit: [{
|
|
1024
|
-
type: Output,
|
|
1025
|
-
args: ['p-login-submit']
|
|
1026
|
-
}], passwordChange: [{
|
|
1027
|
-
type: Output,
|
|
1028
|
-
args: ['p-password-change']
|
|
1029
|
-
}], languageChange: [{
|
|
1030
|
-
type: Output,
|
|
1031
|
-
args: ['p-language-change']
|
|
1032
|
-
}], noAutocompleteLogin: [{
|
|
1033
|
-
type: Input,
|
|
1034
|
-
args: ['p-no-autocomplete-login']
|
|
1035
|
-
}], noAutocompletePassword: [{
|
|
1036
|
-
type: Input,
|
|
1037
|
-
args: ['p-no-autocomplete-password']
|
|
1038
|
-
}], hideLabelStatus: [{
|
|
1039
|
-
type: Input,
|
|
1040
|
-
args: [{ alias: 'p-hide-label-status', transform: convertToBoolean }]
|
|
1041
|
-
}], hidePasswordPeek: [{
|
|
1042
|
-
type: Input,
|
|
1043
|
-
args: ['p-hide-password-peek']
|
|
1044
|
-
}], customField: [{
|
|
1045
|
-
type: Input,
|
|
1046
|
-
args: ['p-custom-field']
|
|
1047
|
-
}], contactEmail: [{
|
|
1048
|
-
type: Input,
|
|
1049
|
-
args: ['p-contact-email']
|
|
1050
|
-
}], productName: [{
|
|
1051
|
-
type: Input,
|
|
1052
|
-
args: ['p-product-name']
|
|
1053
|
-
}], environment: [{
|
|
1054
|
-
type: Input,
|
|
1055
|
-
args: ['p-environment']
|
|
1056
|
-
}], exceededAttemptsWarning: [{
|
|
1057
|
-
type: Input,
|
|
1058
|
-
args: ['p-exceeded-attempts-warning']
|
|
1059
|
-
}], hideRememberUser: [{
|
|
1060
|
-
type: Input,
|
|
1061
|
-
args: ['p-hide-remember-user']
|
|
1062
|
-
}], literals: [{
|
|
1063
|
-
type: Input,
|
|
1064
|
-
args: ['p-literals']
|
|
1065
|
-
}], loading: [{
|
|
1066
|
-
type: Input,
|
|
1067
|
-
args: ['p-loading']
|
|
1068
|
-
}], login: [{
|
|
1069
|
-
type: Input,
|
|
1070
|
-
args: ['p-login']
|
|
1071
|
-
}], loginErrors: [{
|
|
1072
|
-
type: Input,
|
|
1073
|
-
args: ['p-login-errors']
|
|
1074
|
-
}], passwordErrors: [{
|
|
1075
|
-
type: Input,
|
|
1076
|
-
args: ['p-password-errors']
|
|
1077
|
-
}], recovery: [{
|
|
1078
|
-
type: Input,
|
|
1079
|
-
args: ['p-recovery']
|
|
1080
|
-
}], registerUrl: [{
|
|
1081
|
-
type: Input,
|
|
1082
|
-
args: ['p-register-url']
|
|
1083
|
-
}], authenticationType: [{
|
|
1084
|
-
type: Input,
|
|
1085
|
-
args: ['p-authentication-type']
|
|
1086
|
-
}], authenticationUrl: [{
|
|
1087
|
-
type: Input,
|
|
1088
|
-
args: ['p-authentication-url']
|
|
1089
|
-
}], blockedUrl: [{
|
|
1090
|
-
type: Input,
|
|
1091
|
-
args: ['p-blocked-url']
|
|
1092
|
-
}], support: [{
|
|
1093
|
-
type: Input,
|
|
1094
|
-
args: ['p-support']
|
|
1095
|
-
}], languagesList: [{
|
|
1096
|
-
type: Input,
|
|
1097
|
-
args: ['p-languages']
|
|
1098
|
-
}] }); })();
|
|
1099
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztR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O1lBV3JDLGdCQUFnQjtrQkFBOUMsS0FBSzttQkFBQyxzQkFBc0I7WUFvRkEsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUFzQ08sWUFBWTtrQkFBekMsS0FBSzttQkFBQyxpQkFBaUI7WUFjSyxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVLLFdBQVc7a0JBQXRDLEtBQUs7bUJBQUMsZUFBZTtZQXVCb0IsdUJBQXVCO2tCQUFoRSxLQUFLO21CQUFDLDZCQUE2QjtZQXVCRCxnQkFBZ0I7a0JBQWxELEtBQUs7bUJBQUMsc0JBQXNCO1lBdUVKLFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQW1CSyxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUFlSSxLQUFLO2tCQUExQixLQUFLO21CQUFDLFNBQVM7WUFtQmEsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUFlUyxjQUFjO2tCQUE3QyxLQUFLO21CQUFDLG1CQUFtQjtZQTZCRCxRQUFRO2tCQUFoQyxLQUFLO21CQUFDLFlBQVk7WUFzQlUsV0FBVztrQkFBdkMsS0FBSzttQkFBQyxnQkFBZ0I7WUF1Q2Esa0JBQWtCO2tCQUFyRCxLQUFLO21CQUFDLHVCQUF1QjtZQTJISyxpQkFBaUI7a0JBQW5ELEtBQUs7bUJBQUMsc0JBQXNCO1lBZ0JELFVBQVU7a0JBQXJDLEtBQUs7bUJBQUMsZUFBZTtZQTBCRSxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUF5QlEsYUFBYTtrQkFBdEMsS0FBSzttQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBjb252ZXJ0VG9Cb29sZWFuLCBjb252ZXJ0VG9JbnQsIGdldFNob3J0QnJvd3Nlckxhbmd1YWdlLCBpc0V4dGVybmFsTGluaywgaXNUeXBlb2YgfSBmcm9tICcuLy4uLy4uL3V0aWxzL3V0aWwnO1xuXG5pbXBvcnQgeyBQb0xhbmd1YWdlU2VydmljZSwgcG9Mb2NhbGVEZWZhdWx0LCBQb0xhbmd1YWdlLCBwb0xhbmd1YWdlRGVmYXVsdCB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcblxuaW1wb3J0IHsgUG9QYWdlTG9naW4gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUgfSBmcm9tICcuL2VudW1zL3BvLXBhZ2UtbG9naW4tYXV0aGVudGljYXRpb24tdHlwZS5lbnVtJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1jdXN0b20tZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luTGl0ZXJhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1saXRlcmFscy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5SZWNvdmVyeSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLXJlY292ZXJ5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpblNlcnZpY2UgfSBmcm9tICcuL3BvLXBhZ2UtbG9naW4uc2VydmljZSc7XG5cbmNvbnN0IHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCA9IDQwO1xuXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHQgPSB7XG4gIGVuOiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdXZWxjb21lJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0ludmFsaWQgTG9naW4nLFxuICAgIGxvZ2luSGludDogYFlvdXIgbG9naW4gdXNlciB3YXMgZ2l2ZW4gdG8geW91IGF0IHlvdXIgZmlyc3QgZGF5LlxuICAgIElmIHlvdSBkb24ndCBoYXZlIHRoaXMgaW5mb3JtYXRpb24gY29udGFjdCBzdXBwb3J0YCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ0ludmFsaWQgUGFzc3dvcmQnLFxuICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNlcnQgeW91ciBwYXNzd29yZCcsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJyxcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnLFxuICAgIHJlbWVtYmVyVXNlcjogJ0F1dG9tYXRpYyBsb2dpbicsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1lvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiBzeXN0ZW0gY29uZmlndXJhdGlvbicsXG4gICAgc3VibWl0TGFiZWw6ICdFbnRlcicsXG4gICAgc3VibWl0dGVkTGFiZWw6ICdMb2FkaW5nLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIFBhc3N3b3JkPycsXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAgcmVnaXN0ZXJVcmw6ICdOZXcgcmVnaXN0ZXInLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09vcHMhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdGb3Jnb3QgeW91ciBwYXNzd29yZD8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnSWYgeW91IHRyeSAnLFxuICAgIGF0dGVtcHRzOiAnezB9IG1vcmUgdGltZShzKSAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDpcbiAgICAgICd3aXRob3V0IHN1Y2Nlc3MgeW91ciB1c2VyIHdpbGwgYmUgYmxvY2tlZCBhbmQgeW91IHdpbGwgYmUgbGVmdCAyNCBob3VycyB3aXRob3V0IGJlaW5nIGFibGUgdG8gYWNjZXNzIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdCZXR0ZXIgY3JlYXRlIGEgbmV3IHBhc3N3b3JkIG5vdyEgWW91IHdpbGwgYmUgYWJsZSB0byBsb2cgaW50byB0aGUgc3lzdGVtIHJpZ2h0IGF3YXkuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0kgZm9yZ290IG15IHBhc3N3b3JkJyxcbiAgICB3ZWxjb21lOiAnV2VsY29tZScsXG4gICAgc3VwcG9ydDogJ1N1cHBvcnQnXG4gIH0sXG4gIGVzOiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdCaWVudmVuaWRvJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0xvZ2luIGludsOhbGlkbycsXG4gICAgbG9naW5IaW50OiBgU3UgdXN1YXJpbyBoYSBzaWRvIGVudHJlZ2FkbyBwYXJhIHVzdGVkIGVuIHN1IHByaW1lciBkw61hLlxuICAgIFNpIG5vIHRpZW5lIGVzdGEgaW5mb3JtYWNpw7NuLCBww7NuZ2FzZSBlbiBjb250YWN0byBjb24gZWwgc29wb3J0ZSB0w6ljbmljb2AsXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ0NvbnRyYXNlw7FhIGludsOhbGlkYScsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgY29udHJhc2XDsWEnLFxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnVmFsb3Igbm8gdsOhbGlkby4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW50cm9kdXpjYSB1biB2YWxvcicsXG4gICAgcmVtZW1iZXJVc2VyOiAnSW5pY2lvIGRlIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZScsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1B1ZWRlIGRlc2hhYmlsaXRhciBlc3RhIG9wY2nDs24gZW4gZWwgbWVuw7ogZGVsIHNpc3RlbWEuJyxcbiAgICBzdWJtaXRMYWJlbDogJ0VudHJhcicsXG4gICAgc3VibWl0dGVkTGFiZWw6ICdDYXJnYW5kby4uLicsXG4gICAgZm9yZ290UGFzc3dvcmQ6ICdPbHZpZGFzdGUgdHUgY29udHJhc2XDsWE/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ051ZXZvIHJlZ2lzdHJvJyxcbiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdPbHZpZGFzdGUgdHUgY29udHJhc2XDsWE/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NpIGludGVudGEgbcOhcyAnLFxuICAgIGF0dGVtcHRzOiAnezB9IHZlei92ZWNlcyAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NpbiDDqXhpdG8gc3UgdXN1YXJpbyBzZXJhIGJsb3F1ZWFkbyB5IHVzdGVkIHbDoXMgcGVybWFuZWNlciAyNCBob3JhcyBzaW4gcG9kZXIgYWNjZWRlciBhIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6XG4gICAgICAnwqFNZWpvciBjcmVhciB1bmEgbnVldmEgY29udHJhc2XDsWEgYWhvcmEhIFVzdGVkIHBvZHLDoSBlbnRyYXIgZW4gZWwgc2lzdGVtYSBpbm1lZGlhdGFtZW50ZSBkZXNwdcOpcy4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnT2x2aWRlIG1pIGNvbnRyYXNlw7FhJyxcbiAgICB3ZWxjb21lOiAnQmllbnZlbmlkbycsXG4gICAgc3VwcG9ydDogJ1NvcG9ydGUnXG4gIH0sXG4gIHB0OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICdCZW0tdmluZG8nLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcbiAgICBsb2dpbkhpbnQ6IGBTZXUgdXN1w6FyaW8gZm9pIGVudHJlZ3VlIGEgdm9jw6ogbm8gc2V1IHByaW1laXJvIGRpYS5cbiAgICBDYXNvIG7Do28gdGVuaGEgbWFpcyBlc3NhIGluZm9ybWHDp8OjbyBjb250YWN0ZSBvIHN1cG9ydGVgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IGUtbWFpbCcsXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBpbnbDoWxpZGEnLFxuICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ1ZhbG9yIGludsOhbGlkby4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcbiAgICByZW1lbWJlclVzZXI6ICdMb2dhciBhdXRvbWF0aWNhbWVudGUnLFxuICAgIHJlbWVtYmVyVXNlckhpbnQ6ICdWb2PDqiBwb2RlIGRlc2FiaWxpdGFyIGVzc2Egb3DDp8OjbyBubyBtZW51IGRvIHNpc3RlbWEnLFxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAnRXNxdWVjZXUgc3VhIHNlbmhhPycsXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcbiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NlIHRlbnRhciBtYWlzICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6KGVzKSAnLFxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdNZWxob3IgY3JpYXIgdW1hIHNlbmhhIG5vdmEgYWdvcmEhIFZvY8OqIHZhaSBwb2RlciBlbnRyYXIgbm8gc2lzdGVtYSBsb2dvIGVtIHNlZ3VpZGEuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxuICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXG4gICAgc3VwcG9ydDogJ1N1cG9ydGUnXG4gIH0sXG4gIHJ1OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XG4gICAgdGl0bGU6ICfQlNC+0LHRgNC+INC/0L7QttCw0LvQvtCy0LDRgtGMIScsXG4gICAgbG9naW5FcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC70L7Qs9C40L0nLFxuICAgIGxvZ2luSGludDogYNCS0LDRiCDQu9C+0LPQuNC9INCx0YvQuyDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0LLQsNC8INCyINC/0LXRgNCy0YvQuSDQtNC10L3RjC5cbiAgICDQldGB0LvQuCDRgyDQstCw0YEg0L3QtdGCINGN0YLQvtC5INC40L3RhNC+0YDQvNCw0YbQuNC4LCDQvtCx0YDQsNGC0LjRgtC10YHRjCDQsiDRgdC70YPQttCx0YMg0L/QvtC00LTQtdGA0LbQutC4YCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAn0JLRgdGC0LDQstGM0YLQtSDRgdCy0L7QuSDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiycsXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC/0LDRgNC+0LvRjCcsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ9CS0LLQtdC00LjRgtC1INGB0LLQvtC5INC/0LDRgNC+0LvRjCcsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3QvtC1INC30L3QsNGH0LXQvdC40LUuJyxcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC30L3QsNGH0LXQvdC40LUnLFxuICAgIHJlbWVtYmVyVXNlcjogJ9CQ0LLRgtC+0LzQsNGC0LjRh9C10YHQutC40Lkg0LLRhdC+0LQnLFxuICAgIHJlbWVtYmVyVXNlckhpbnQ6ICfQktGLINC80L7QttC10YLQtSDQvtGC0LrQu9GO0YfQuNGC0Ywg0Y3RgtGDINC+0L/RhtC40Y4g0LIg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC4INGB0LjRgdGC0LXQvNGLJyxcbiAgICBzdWJtaXRMYWJlbDogJ9CS0L7QudGC0LgnLFxuICAgIHN1Ym1pdHRlZExhYmVsOiAnM9Cw0LPRgNGD0LfQutCwLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ9CX0LDQsdGL0LvQuCDQv9Cw0YDQvtC70Yw/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ9Cd0L7QstGL0Lkg0YDQtdCz0LjRgdGC0YAnLFxuICAgIHRpdGxlUG9wb3ZlcjogJ9Ce0LkhJyxcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXG4gICAgaWZZb3VUcnlIYXJkZXI6ICfQldGB0LvQuCDQstGLINCx0LXQt9GD0YHQv9C10YjQvdC+INC/0L7Qv9GL0YLQsNC10YLQtdGB0Ywg0LLQvtC50YLQuCDQtdGJ0LUgJyxcbiAgICBhdHRlbXB0czogJ3swfSDRgNCw0Lco0LApICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAn0JLQsNGIINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQsdGD0LTQtdGCINC30LDQsdC70L7QutC40YDQvtCy0LDQvSwg0Lgg0JLRiyDQvtGB0YLQsNC90LXRgtC10YHRjCDQvdCwIDI0INGH0LDRgdCwINCx0LXQtyDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC00L7RgdGC0YPQv9CwIDooJyxcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICfQm9GD0YfRiNC1INGB0L7Qt9C00LDQudGC0LUg0L3QvtCy0YvQuSDQv9Cw0YDQvtC70Ywg0YHQtdC50YfQsNGBIcKg0JLRiyDRgdC80L7QttC10YLQtSDRgdGA0LDQt9GDINCy0L7QudGC0Lgg0LIg0YHQuNGB0YLQtdC80YMuJyxcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ9CvINC30LDQsdGL0Lsg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICB3ZWxjb21lOiAn0LTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCcsXG4gICAgc3VwcG9ydDogJ9Cf0L7QtNC00LXRgNC20LrQsCdcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBvUGFnZUxvZ2luTGl0ZXJhbEluID0ge1xuICBlbjogJ2luJyxcbiAgZXM6ICdlbicsXG4gIHB0OiAnZW0nLFxuICBydTogJ9CyJ1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIMOpIHV0aWxpemFkbyBjb21vIHRlbXBsYXRlIHBhcmEgdGVsYSBkZSBsb2dpbi5cbiAqIENvbSBlbGUgw6kgcG9zc8OtdmVsIGRlZmluaXJtb3MgdmFsb3JlcyBwYXJhIHVzdcOhcmlvLCBzZW5oYSBlIGRlZmluaXIgYcOnw7VlcyBwYXJhIHJlY3VwZXJhw6fDo28gZGUgc2VuaGEgZSBncmF2YcOnw6NvIGRlIGRhZG9zIGRvIHVzdcOhcmlvLlxuICogVGFtYsOpbSDDqSBwb3Nzw612ZWwgaW5zZXJpciB1bWEgaW1hZ2VtIGVtIGNvbmp1bnRvIGNvbSB1bSB0ZXh0byBkZSBkZXN0YXF1ZS5cbiAqXG4gKlxuICogQSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi11cmxgIGF1dG9tYXRpemEgYSByb3RpbmEgZG8gY29tcG9uZW50ZSBlIHNpbXBsaWZpY2EgbyBwcm9jZXNzbyBwYXJhIGF1dGVudGljYcOnw6NvIGRvIHVzdcOhcmlvLCBiYXN0YW5kb1xuICogZGVmaW5pciB1bWEgdXJsIHBhcmEgcmVxdWlzacOnw6NvIGRhIGF1dGVudGljYcOnw6NvLiBBIGZsZXhpYmlsaWRhZGUgZSBwcmF0aWNpZGFkZSBwb2RlbSBjaGVnYXIgYSB1bSBuw612ZWwgZW0gcXVlIG8gZGVzZW52b2x2aW1lbnRvXG4gKiBkYSBhcGxpY2HDp8OjbyBubyAqY2xpZW50IHNpZGUqIMOpIGRlc3Byb3ZpZGEgZGUgcXVhbHF1ZXIgY8OzZGlnby1mb250ZSByZWxhY2lvbmFkbyDDoCByb3RpbmEgZGUgbG9naW4gZGUgdXN1w6FyaW8uXG4gKiBTZXUgZGV0YWxoYW1lbnRvIHBhcmEgdXNvIHBvZGUgc2VyIHZpc3RvIGxvZ28gYWJhaXhvIGVtICpwcm9wcmllZGFkZXMqLlxuICogQ2FzbyBqdWxndWUgbmVjZXNzw6FyaW8sIHBvZGUtc2UgdGFtYsOpbSBkZWZpbmlyIG1hbnVhbG1lbnRlIGEgcm90aW5hIGRvIGNvbXBvbmVudGUuXG4gKlxuICpcbiAqIFBhcmEgcXVlIGFzIGltYWdlbnMgc2VqYW0gZXhpYmlkYXMgY29ycmV0YW1lbnRlLCDDqSBuZWNlc3PDoXJpbyBpbmNsdWlyIG8gY2FtaW5obyBkZWxhcyBhbyBwcm9qZXRvLiBQYXJhIGlzc28sIGVkaXRlXG4gKiBvICphc3NldHMqIG5vIGFycXVpdm8gKiphbmd1bGFyLmpzb24qKiBkYSBhcGxpY2HDp8OjbyBuYSBzZWd1aW50ZSBvcmRlbTpcbiAqIGBgYFxuICogICBcImFzc2V0c1wiOiBbXG4gKiAgICAgXCJzcmMvYXNzZXRzXCIsXG4gKiAgICAgXCJzcmMvZmF2aWNvbi5pY29cIixcbiAqICAgICB7XG4gKiAgICAgICBcImdsb2JcIjogXCIqKlxcLypcIixcbiAqICAgICAgIFwiaW5wdXRcIjogXCJub2RlX21vZHVsZXMvQHBvLXVpL3N0eWxlL2ltYWdlc1wiLFxuICogICAgICAgXCJvdXRwdXRcIjogXCJhc3NldHMvaW1hZ2VzXCJcbiAqICAgICB9XG4gKiAgIF1cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb1BhZ2VMb2dpbkJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogTyBgcC1iYWNrZ3JvdW5kYCBwZXJtaXRlIGluc2VyaXIgdW1hIGltYWdlbSBkZSBkZXN0YXF1ZSBhbyBsYWRvIGRpcmVpdG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4sIGNhc28gYSBwcm9wcmllZGFkZVxuICAgKiBuw6NvIHNlamEgcHJlZW5jaGlkYSBvIGZvcm11bMOhcmlvIHNlcsOhIGNlbnRyYWxpemFkbyBubyBlc3Bhw6dvIGRpc3BvbsOtdmVsLlxuICAgKlxuICAgKiBBIGZvbnRlIGRhIGltYWdlbSBwb2RlIHNlciBkZSB1bSBjYW1pbmhvIGxvY2FsIG91IHVtYSB1cmwgZGUgdW0gc2Vydmlkb3IgZXh0ZXJuby5cbiAgICpcbiAgICogQWzDqW0gZGEgaW1hZ2VtLCDDqSBwb3Nzw612ZWwgYWRpY2lvbmFyIHVtIHRleHRvIGluZm9ybWF0aXZvIHBvciBjaW1hIGRhIGltYWdlbSBkYSBpbWFnZW0gZGUgZGVzdGFxdWUsIHBhcmEgaXNzbyBpbmZvcm1lXG4gICAqIHVtIHZhbG9yIHBhcmEgYSBsaXRlcmFsIGBoaWdobGlnaHRJbmZvYC5cbiAgICpcbiAgICogPiBWZWphIG1haXMgc29icmUgYXMgbGl0ZXJhaXMgbmEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxuICAgKlxuICAgKiBFeGVtcGxvcyBkZSB2YWxvcmVzIHbDoWxpZG9zOlxuICAgKiAtICoqbG9jYWwqKjogYC4vYXNzZXRzL2ltYWdlcy9sb2dpbi1iYWNrZ3JvdW5kLnBuZ2BcbiAgICogLSAqKnVybCBleHRlcm5hKio6IGBodHRwczovL3BvLXVpLmlvL2Fzc2V0cy9pbWFnZXMvbG9naW4tYmFja2dyb3VuZC5wbmdgXG4gICAqXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSDDqSBpZ25vcmFkYSBwYXJhIGFwbGljYcOnw7VlcyBtb2JpbGUuXG4gICAqL1xuICBASW5wdXQoJ3AtYmFja2dyb3VuZCcpIGJhY2tncm91bmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FtaW5obyBwYXJhIGEgbG9nb21hcmNhIGxvY2FsaXphZGEgbmEgcGFydGUgc3VwZXJpb3IuXG4gICAqXG4gICAqID4gQ2FzbyBzZWphIGluZGVmaW5pZGEgbyBlc3Bhw6dvIHNlIG1hbnTDqW0gcHJlc2VydmFkbyBwb3LDqW0gdmF6aW8uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9nbycpIGxvZ28/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIGxvZ2luLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gXG4gICAqIHNlcsOhIGV4aWJpZGEuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gZW1haWw6IGBbZXhwcmVzc2FvLXJlZ3VsYXItZW1haWxdYFxuICAgKiAtIGNwZjogYFtleHByZXNzYW8tcmVndWxhci1jcGZdYFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luLXBhdHRlcm4nKSBsb2dpblBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIHBhc3N3b3JkLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgcGFzc3dvcmRFcnJvclBhdHRlcm5gXG4gICAqIHNlcsOhIGV4aWJpZGEuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gQXBlbmFzIG7Dum1lcm9zOiBgXFxkP2BcbiAgICogLSBMZXRyYXMgbcOtbnVzY3VsYXM6IGBcXHo/YFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcGFzc3dvcmRFcnJvclBhdHRlcm5gLlxuICAgKi9cbiAgQElucHV0KCdwLXBhc3N3b3JkLXBhdHRlcm4nKSBwYXNzd29yZFBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FtaW5obyBwYXJhIGEgbG9nb21hcmNhIGxvY2FsaXphZGEgbm8gcm9kYXDDqS5cbiAgICovXG4gIEBJbnB1dCgncC1zZWNvbmRhcnktbG9nbycpIHNlY29uZGFyeUxvZ28/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaW5wdXQgZG8gY2FtcG8gbG9naW4uXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cbiAgICovXG4gIEBPdXRwdXQoJ3AtbG9naW4tY2hhbmdlJykgbG9naW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gYW8gc3VibWV0ZXIgbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiAoYXBlcnRhbmRvIGBFbnRlcmAgZGVudHJvIGRvcyBjYW1wb3Mgb3UgcHJlc3Npb25hbmRvIG8gYm90w6NvIGRlIGNvbmZpcm1hw6fDo28pLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtIG9iamV0byBkbyB0aXBvIGBQb1BhZ2VMb2dpbmAgY29tIG9zIGRhZG9zIGluZm9ybWFkb3Mgbm8gZm9ybXVsw6FyaW8uXG4gICAqXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLXVybC1yZWNvdmVyeWAuXG4gICAqXG4gICAqID4gUGFyYSBtYWlzIGRldGFsaGVzIGNvbnN1bHRlIGEgZG9jdW1lbnRhw6fDo28gc29icmUgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luYCBtYWlzIGFiYWl4by5cbiAgICovXG4gIEBPdXRwdXQoJ3AtbG9naW4tc3VibWl0JykgbG9naW5TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFBvUGFnZUxvZ2luPigpO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlucHV0IGRvIGNhbXBvIHBhc3N3b3JkLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtYSB2YXJpw6F2ZWwgZG8gdGlwbyBgc3RyaW5nYCBjb20gbyB0ZXh0byBpbmZvcm1hZG8gbm8gY2FtcG8uXG4gICAqXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAuXG4gICAqL1xuICBAT3V0cHV0KCdwLXBhc3N3b3JkLWNoYW5nZScpIHBhc3N3b3JkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlkaW9tYSBkYSBww6FnaW5hLlxuICAgKlxuICAgKiBFc3NlIGV2ZW50byByZWNlYmVyw6EgY29tbyBwYXLDom1ldHJvIHVtIG9iamV0byBkbyB0aXBvIGBQb0xhbmd1YWdlYCBjb20gYSBsaW5ndWFnZW0gc2VsZWNpb25hZGEuXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdwLWxhbmd1YWdlLWNoYW5nZScpIGxhbmd1YWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UG9MYW5ndWFnZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvTGFuZ3VhZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRGVmaW5lIGEgcHJvcHJpZWRhZGUgbmF0aXZhIGBhdXRvY29tcGxldGVgIGRvIGNhbXBvIGNvbW8gYG9mZmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgQElucHV0KCdwLW5vLWF1dG9jb21wbGV0ZS1sb2dpbicpIG5vQXV0b2NvbXBsZXRlTG9naW46IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIERlZmluZSBhIHByb3ByaWVkYWRlIG5hdGl2YSBgYXV0b2NvbXBsZXRlYCBkbyBjYW1wbyBjb21vIGBvZmZgLlxuICAgKlxuICAgKiA+IE5vIGNvbXBvbmVudGUgYHBvLXBhc3N3b3JkYCBzZXLDoSBkZWZpbmlkbyBjb21vIGBuZXctcGFzc3dvcmRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIEBJbnB1dCgncC1uby1hdXRvY29tcGxldGUtcGFzc3dvcmQnKSBub0F1dG9jb21wbGV0ZVBhc3N3b3JkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJbmRpY2Egc2UgbyBzdGF0dXMgZG8gYG1vZGVsYCBkbyBzd2l0Y2ggZGUgbGVtYnJhciBvIHVzdcOhcmlvIHNlcsOhIGVzY29uZGlkbyB2aXN1YWxtZW50ZS5cbiAgICpcbiAgICogPiBQb3IgcGFkcsOjbyBzZXLDoSBhdHJpYnXDrWRvIGBmYWxzZWAuXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAncC1oaWRlLWxhYmVsLXN0YXR1cycsIHRyYW5zZm9ybTogY29udmVydFRvQm9vbGVhbiB9KSBoaWRlTGFiZWxTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBQZXJtaXRlIGVzY29uZGVyIGEgZnVuw6fDo28gZGUgZXNwaWFyIGEgc2VuaGEgZGlnaXRhZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCgncC1oaWRlLXBhc3N3b3JkLXBlZWsnKSBoaWRlUGFzc3dvcmRQZWVrOiBib29sZWFuO1xuXG4gIGFsbExvZ2luRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGFsbFBhc3N3b3JkRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGN1c3RvbUZpZWxkT2JqZWN0OiBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkO1xuICBjdXN0b21GaWVsZFR5cGU6IHN0cmluZztcbiAgbG9naW5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgcmVtZW1iZXJVc2VyOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZztcbiAgc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25UeXBlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSA9IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xuICBwcml2YXRlIF9hdXRoZW50aWNhdGlvblVybDogc3RyaW5nO1xuICBwcml2YXRlIF9ibG9ja2VkVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRhY3RFbWFpbDogc3RyaW5nO1xuICBwcml2YXRlIF9jdXN0b21GaWVsZDogc3RyaW5nIHwgUG9QYWdlTG9naW5DdXN0b21GaWVsZDtcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nPzogbnVtYmVyO1xuICBwcml2YXRlIF9oaWRlUmVtZW1iZXJVc2VyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2xpdGVyYWxzOiBQb1BhZ2VMb2dpbkxpdGVyYWxzO1xuICBwcml2YXRlIF9sb2FkaW5nPzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dpbjogc3RyaW5nO1xuICBwcml2YXRlIF9sb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcml2YXRlIF9wYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwcml2YXRlIF9wcm9kdWN0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9yZWNvdmVyeTogc3RyaW5nIHwgUG9QYWdlTG9naW5SZWNvdmVyeSB8IEZ1bmN0aW9uO1xuICBwcml2YXRlIF9yZWdpc3RlclVybDogc3RyaW5nO1xuICBwcml2YXRlIF9zdXBwb3J0OiBzdHJpbmcgfCBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VzTGlzdDogQXJyYXk8UG9MYW5ndWFnZT47XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQW8gaW5mb3JtYXIgdW0gdmFsb3IgZG8gdGlwbyBgc3RyaW5nYCwgbyBtZXNtbyBzZXLDoSBhcGxpY2FkbyBjb21vIGEgY2hhdmUgZG8gY2FtcG8gY3VzdG9taXphZG8gZSB1dGlsaXphcsOhXG4gICAqIG9zIHZhbG9yZXMgcGFkcsO1ZXMgY29udGlkb3MgbmEgcHJvcHJpZWRhZGUgYGxpdGVyYWxzYCBjb21vIGBjdXN0b21GaWVsZEVycm9yUGF0dGVybmAgZSBgY3VzdG9tRmllbGRQbGFjZWhvbGRlcmAuXG4gICAqXG4gICAqIEV4aXN0ZSBhIHBvc3NpYmlsaWRhZGUgZGUgaW5mb3JtYXIgdW0gb2JqZXRvIHF1ZSBzZWd1ZSBhIGRlZmluacOnw6NvIGRhIGludGVyZmFjZSBgUG9QYWdlTG9naW5DdXN0b21GaWVsZGAsIG9uZGVcbiAgICogYXRyYXbDqXMgZG9zIHBhcsOibWV0cm9zIGVudmlhZG9zIHBvZGUgZ2VyYXIgdW0gYHBvLWlucHV0YCwgYHBvLWNvbWJvYCBlc3BlY2lmaWNhbWVudGUgcGFyYSBzZXJ2acOnb3NcbiAgICogb3UgYHBvLXNlbGVjdGAgcGFyYSB2YWxvcmVzIGZpeG9zLlxuICAgKlxuICAgKiBBYmFpeG8gc2VndWVtIG9zIGV4ZW1wbG9zIGRlIGNhZGEgdGlwbyBkZSBjYW1wby5cbiAgICpcbiAgICogYHBvLWlucHV0YDpcbiAgICpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXG4gICAqICAgdmFsdWU6ICdqdjAxJyxcbiAgICogICBwbGFjZWhvbGRlcjogJ0VudGVyIHlvdXIgZG9tYWluJyxcbiAgICogICBwYXR0ZXJuOiAnW2Etel0nLFxuICAgKiAgIGVycm9yUGF0dGVybjogJ0ludmFsaWQgdmFsdWUnXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIGBwby1jb21ib2A6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL2NvbWJvT3B0aW9uL2RvbWFpbnMnLFxuICAgKiAgIGZpZWxkVmFsdWU6ICduaWNrbmFtZSdcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogYHBvLXNlbGVjdGA6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgb3B0aW9uczogW3tsYWJlbDogJ0RvbWFpbiAxJywgdmFsdWU6ICcxJ30sIHtsYWJlbDogJ0RvbWFpbiAyJywgdmFsdWU6ICcyJ31dXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIENhc28gbyBjdXN0b21GaWVsZCBwb3NzdWEgb3B0aW9ucywgdXJsIGUgZmllbGRWYWx1ZSBwcmVlbmNoaWRvcywgc2Vyw6EgcHJpb3JpemFkbyBvIHBvLXNlbGVjdFxuICAgKiB1dGlsaXphbmRvIG8gb3B0aW9ucy5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1jdXN0b20tZmllbGQnKSBzZXQgY3VzdG9tRmllbGQodmFsdWU6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmIChpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcbiAgICAgICAgdGhpcy5fY3VzdG9tRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IHRoaXMuZ2V0RGVmYXVsdEN1c3RvbUZpZWxkT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdvYmplY3QnKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3Byb3BlcnR5J10pIHtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmllbGQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IDxQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkPnZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5jdXN0b21GaWVsZE9iamVjdC5vcHRpb25zICYmICF0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnVybCkge1xuICAgICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9IHRoaXMuY3VzdG9tRmllbGRPYmplY3Qub3B0aW9ucyA/ICdzZWxlY3QnIDogJ2NvbWJvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IGN1c3RvbUZpZWxkKCk6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21GaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFBlcnNvbmFsaXphIG8gZS1tYWlsIHF1ZSDDqSBleGliaWRvIG5hIG1lbnNhZ2VtIGRlIGRpY2EgZGUgbG9naW4gcGFkcsOjbyBwYXJhIGNvbnRhdG8gZGUgc3Vwb3J0ZS5cbiAgICovXG4gIEBJbnB1dCgncC1jb250YWN0LWVtYWlsJykgc2V0IGNvbnRhY3RFbWFpbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGFjdEVtYWlsID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNvbnRhY3RFbWFpbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFjdEVtYWlsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogVGV4dG8gY3VzdG9taXphZG8gcXVlIGZpY2EgZW50cmUgYSBsb2dvIGUgYSBtZW5zYWdlbSBkZSBib2FzLXZpbmRhcy5cbiAgICovXG4gIEBJbnB1dCgncC1wcm9kdWN0LW5hbWUnKSBzZXQgcHJvZHVjdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb2R1Y3ROYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHByb2R1Y3ROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9kdWN0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkaWNpb25hIHVtYSBgdGFnYCBhYmFpeG8gZG8gdMOtdHVsbyBxdWUgZXNwZWNpZmljYSBvIGFtYmllbnRlIHF1ZSBvIHVzdcOhcmlvIGVzdMOhIGZhemVuZG8gbyBsb2dpbi5cbiAgICpcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIGxpbWl0YSBvIHRleHRvIGVtIDQwIGNhcmFjdGVyZXMuXG4gICAqL1xuICBASW5wdXQoJ3AtZW52aXJvbm1lbnQnKSBzZXQgZW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IHN0cmluZykge1xuICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5sZW5ndGggPiBwb1BhZ2VMb2dpbkNvbnRlbnRNYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQuc3Vic3RyaW5nKDAsIHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XG4gICAgfVxuICB9XG4gIGdldCBlbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeGliZSB1bSBhdmlzbyBkZSBibG9xdWVpbyBkZSBhY29yZG8gY29tIGEgcXVhbnRpZGFkZSByZXN0YW50ZSBkZSB0ZW50YXRpdmFzLlxuICAgKiBPIGF2aXNvIHNlcsOhIGV4aWJpZG8gc29tZW50ZSBzZSBhIHF1YW50aWRhZGUgZm9yIG1haW9yIHF1ZSB6ZXJvLlxuICAgKlxuICAgKiA+IENhc28gdGVuaGEgYWxndW0gdmFsb3IgYXRyaWJ1w61kbyBwYXJhIG8gYXRyaWJ1dG8gYHAtYXV0aGVudGljYXRpb24tdXJsYCBlIG8gcmV0b3JubyBkYSByZXF1aXNpw6fDo28gZXN0aXZlciBhdHJpYnVpbmRvIHZhbG9yXG4gICAqIHBhcmEgbyBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCwgbyB2YWxvciBjb25zaWRlcmFkbyBzZXLDoSBvIGRvIHJldG9ybm8gZGEgcmVxdWlzacOnw6NvLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIEBJbnB1dCgncC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nJykgc2V0IGV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGNvbnZlcnRUb0ludCh2YWx1ZSk7XG4gICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID4gMDtcbiAgfVxuXG4gIGdldCBleGNlZWRlZEF0dGVtcHRzV2FybmluZygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEVzY29uZGUgYSBmdW7Dp8OjbyBcIkxlbWJyYXIgdXN1w6FyaW9cIiBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbi5cbiAgICpcbiAgICogUXVhbmRvIGVzc2EgcHJvcHJpZWRhZGUgw6kgc2V0YWRhIGNvbSBgdHJ1ZWAgYSBwcm9wcmllZGFkZSBgcmVtZW1iZXJVc2VyYCBlbnZpYWRhIG5vIGV2ZW50byBgcC1sb2dpbi1zdWJtaXRgIHNlcsOhIHNlbXByZVxuICAgKiBgZmFsc2VgLlxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcmVtZW1iZXJVc2VyYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KCdwLWhpZGUtcmVtZW1iZXItdXNlcicpIHNldCBoaWRlUmVtZW1iZXJVc2VyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlkZVJlbWVtYmVyVXNlciA9IDxhbnk+dmFsdWUgPT09ICcnID8gdHJ1ZSA6IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuX2hpZGVSZW1lbWJlclVzZXIpIHtcbiAgICAgIHRoaXMucmVtZW1iZXJVc2VyID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGdldCBoaWRlUmVtZW1iZXJVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oaWRlUmVtZW1iZXJVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogT2JqZXRvIGNvbSBhcyBsaXRlcmFpcyB1c2FkYXMgbm8gYHBvLXBhZ2UtbG9naW5gLlxuICAgKlxuICAgKiBFeGlzdGVtIGR1YXMgbWFuZWlyYXMgZGUgY3VzdG9taXphciBvIGNvbXBvbmVudGUsIHBhc3NhbmRvIHVtIG9iamV0byBjb20gdG9kYXMgYXMgbGl0ZXJhaXMgZGlzcG9uw612ZWlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VMb2dpbkxpdGVyYWxzID0ge1xuICAgKiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXG4gICAqICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxuICAgKiAgICBmb3Jnb3RQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxuICAgKiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICogICAgaGlnaGxpZ2h0SW5mbzogJycsXG4gICAqICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnRXNxdWVjaSBtaW5oYSBzZW5oYScsXG4gICAqICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcbiAgICogICAgd2VsY29tZTogJ0JvYXMtdmluZGFzJyxcbiAgICogICAgbG9naW5FcnJvclBhdHRlcm46ICdMb2dpbiBvYnJpZ2F0w7NyaW8nLFxuICAgKiAgICBsb2dpbkhpbnQ6ICdDYXNvIG7Do28gcG9zc3VhIHVzdcOhcmlvIGVudHJlIGVtIGNvbnRhdG8gY29tIG8gc3Vwb3J0ZScsXG4gICAqICAgIGxvZ2luTGFiZWw6ICdJbnNpcmEgc2V1IHVzdcOhcmlvJyxcbiAgICogICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgdXN1w6FyaW8gZGUgYWNlc3NvJyxcbiAgICogICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBvYnJpZ2F0w7NyaWEnLFxuICAgKiAgICBwYXNzd29yZExhYmVsOiAnSW5zaXJhIHN1YSBzZW5oYScsXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXG4gICAqICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnQ2FtcG8gY3VzdG9taXphZG8gaW52w6FsaWRvJyxcbiAgICogICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnNpcmEgdW0gdmFsb3InLFxuICAgKiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxuICAgKiAgICByZW1lbWJlclVzZXI6ICdMZW1icmFyIHVzdcOhcmlvJyxcbiAgICogICAgcmVtZW1iZXJVc2VySGludDogJ0VzdGEgb3DDp8OjbyBwb2RlIHNlciBkZXNhYmlsaXRhZGEgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkbyBzaXN0ZW1hJyxcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnLFxuICAgKiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxuICAgKiAgICB0aXRsZVBvcG92ZXI6ICdPcGEhJyxcbiAgICogICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2VtIHN1Y2Vzc28gc2V1IHVzdcOhcmlvIHNlcsOhIGJsb3F1ZWFkbyBlIHZvY8OqIGZpY2EgMjQgaG9yYXMgc2VtIHBvZGVyIGFjZXNzYXIgOignXG4gICAqICB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogT3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphcjpcbiAgICpcbiAgICogYGBgXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcbiAgICogICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgdXN1w6FyaW8gZGUgYWNlc3NvJyxcbiAgICogICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEgZGUgYWNlc3NvJyxcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnXG4gICAqICB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogRSBwYXJhIGNhcnJlZ2FyIGFzIGxpdGVyYWlzIGN1c3RvbWl6YWRhcywgYmFzdGEgYXBlbmFzIHBhc3NhciBvIG9iamV0byBwYXJhIG8gY29tcG9uZW50ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luXG4gICAqICAgW3AtbGl0ZXJhbHNdPVwiY3VzdG9tTGl0ZXJhbHNcIj5cbiAgICogPC9wby1wYWdlLWxvZ2luPlxuICAgKiBgYGBcbiAgICpcbiAgICogID4gTyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBkbyBicm93c2VyIChwdCwgZW4sIGVzKS5cbiAgICogID4gw4kgdGFtYsOpbSBwb3Nzw612ZWwgYWx0ZXJuYXIgbyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBhdHJhdsOpcyBkbyBzZWxldG9yIGRlIGlkaW9tYXMgbG9jYWxpemFkbyBuYSBwYXJ0ZSBpbmZlcmlvciBkbyB0ZW1wbGF0ZSxcbiAgICogbmVzc2UgY2FzbywgaMOhIHRhbWLDqW0gYSBvcMOnw6NvIGRvIGlkaW9tYSBydXNzby5cbiAgICovXG4gIEBJbnB1dCgncC1saXRlcmFscycpIHNldCBsaXRlcmFscyh2YWx1ZTogUG9QYWdlTG9naW5MaXRlcmFscykge1xuICAgIHRoaXMuX2xpdGVyYWxzID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbGl0ZXJhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpdGVyYWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogSGFiaWxpdGEgdW0gZXN0YWRvIGRlIGNhcnJlZ2FtZW50byBhbyBib3TDo28gZGUgKmxvZ2luKi5cbiAgICpcbiAgICogPiDDiSBuZWNlc3PDoXJpbyBhdHJpYnVpciBgdHJ1ZWAgw6AgZXN0YSBwcm9wcmllZGFkZSBuYSBmdW7Dp8OjbyBkZWZpbmlkYSBlbSBgcC1sb2dpbi1zdWJtaXRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoJ3AtbG9hZGluZycpIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBWYWxvciBkbyBtb2RlbG8gZG8gY2FtcG8gZGUgbG9naW4uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4nKSBzZXQgbG9naW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2luID0gdmFsdWU7XG5cbiAgICBpZiAoIXRoaXMuYXV0aGVudGljYXRpb25VcmwpIHtcbiAgICAgIHRoaXMubG9naW5DaGFuZ2UuZW1pdCh0aGlzLl9sb2dpbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxvZ2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSB1bWEgbGlzdGEgZGUgZXJyb3MgZSBleGliZSBhYmFpeG8gZG8gY2FtcG8gZGUgbG9naW4uXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4tZXJyb3JzJykgc2V0IGxvZ2luRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5fbG9naW5FcnJvcnMgPSB2YWx1ZSB8fCBbXTtcbiAgICB0aGlzLnNldExvZ2luRXJyb3JzKHRoaXMuX2xvZ2luRXJyb3JzKTtcbiAgfVxuICBnZXQgbG9naW5FcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luRXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSB1bWEgbGlzdGEgZGUgZXJyb3MgZSBleGliZSBhYmFpeG8gZG8gY2FtcG8gZGUgcGFzc3dvcmQuXG4gICAqL1xuICBASW5wdXQoJ3AtcGFzc3dvcmQtZXJyb3JzJykgc2V0IHBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5fcGFzc3dvcmRFcnJvcnMgPSB2YWx1ZSB8fCBbXTtcbiAgICB0aGlzLnNldFBhc3N3b3JkRXJyb3JzKHRoaXMuX3Bhc3N3b3JkRXJyb3JzKTtcbiAgfVxuICBnZXQgcGFzc3dvcmRFcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkRXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhpYmUgdW0gbGluayBhYmFpeG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gcGFyYSBxdWUgb3MgdXN1w6FyaW9zIGRhIGFwbGljYcOnw6NvIGZhw6dhbSBhIHJlY3VwZXJhw6fDo28gZG9zIGRhZG9zIGRlIGF1dGVudGljYcOnw6NvLlxuICAgKlxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XG4gICAqXG4gICAqIC0gKipTdHJpbmcqKjogaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYTtcbiAgICogLSAqKkZ1bmN0aW9uKio6IHBvZGUtc2UgY3VzdG9taXphciBhIGHDp8Ojby4gUGFyYSBlc3RhIHBvc3NpbGlkYWRlIGJhc3RhIGF0cmlidWlyOlxuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtbG9naW4+XG4gICAqICAgW3JlY292ZXJ5XT1cInRoaXMubXlSZWNvdmVyeS5iaW5kKHRoaXMpXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqIC0gKipQb1BhZ2VMb2dpblJlY292ZXJ5Kio6IGNyaWEtc2UgdsOtbmN1bG8gYXV0b23DoXRpY28gY29tIG8gdGVtcGxhdGUgKipwby1tb2RhbC1wYXNzd29yZC1yZWNvdmVyeSoqLlxuICAgKiAgIE8gb2JqZXRvIGRldmUgY29udGVyIGEgKip1cmwqKiBwYXJhIHJlcXVpc2nDp8OjbyBkb3MgcmVjdXJzb3MgZSBwb2RlLXNlIGRlZmluaXIgbyAqKnRpcG8qKiBkZSBtb2RhbCBwYXJhIHJlY3VwZXJhw6fDo28gZGUgc2VuaGEsXG4gICAqICAgKiplbWFpbCoqIHBhcmEgY29udGF0byBlICoqbcOhc2NhcmEqKiBkbyBjYW1wbyBkZSB0ZWxlZm9uZS5cbiAgICovXG4gIEBJbnB1dCgncC1yZWNvdmVyeScpIHNldCByZWNvdmVyeSh2YWx1ZTogc3RyaW5nIHwgRnVuY3Rpb24gfCBQb1BhZ2VMb2dpblJlY292ZXJ5KSB7XG4gICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCByZWNvdmVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Zlcnk7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYXNvIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBwYXJhIG5vdm9zIGNhZGFzdHJvcywgaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYSwgZGVzc2FcbiAgICogZm9ybWEgc2Vyw6EgZXhpYmlkbyB1bSBsaW5rIGFiYWl4byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiBwYXJhIG9zIHVzdcOhcmlvcyBkYSBhcGxpY2HDp8Ojby5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSAqKmxvY2FsKio6IGAvaG9tZWBcbiAgICogLSAqKnVybCBleHRlcm5hKio6IGBodHRwczovL3BvLXVpLmlvYFxuICAgKlxuICAgKiA+IFZlamEgYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AgcGFyYSBjdXN0b21pemFyIGEgbGl0ZXJhbCBgcmVnaXN0ZXJVcmxgLlxuICAgKi9cbiAgQElucHV0KCdwLXJlZ2lzdGVyLXVybCcpIHNldCByZWdpc3RlclVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXJVcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgcmVnaXN0ZXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJVcmw7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIG8gdGlwbyBkZSBlc3F1ZW1hIGRhIGF1dGVudGljYcOnw6NvLCBzZW5kbyBzdXBvcnRhZG9zIGFwZW5hcyBvcyB2YWxvcmVzIGBCYXNpY2AgZSBgQmVhcmVyYC5cbiAgICpcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCYXNpY2AsIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYCBjb250ZW5kbzpcbiAgICpcbiAgICogYGBgXG4gICAqIGhlYWRlcnMge1xuICAgKiAgQXV0aG9yaXphdGlvbjogQmFzaWMgYmFzZTY0KGxvZ2luOnBhc3N3b3JkKVxuICAgKiB9XG4gICAqXG4gICAqIGJvZHkge1xuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCZWFyZXJgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBib2R5IHtcbiAgICogIGxvZ2luOiBsb2dpbixcbiAgICogIHBhc3N3b3JkOiBiYXNlNjQocGFzc3dvcmQpLFxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGRlZmF1bHQgYFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljYFxuICAgKi9cbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXR5cGUnKSBzZXQgYXV0aGVudGljYXRpb25UeXBlKHZhbHVlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uVHlwZSA9ICg8YW55Pk9iamVjdCkudmFsdWVzKFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlKS5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWM7XG4gIH1cblxuICBnZXQgYXV0aGVudGljYXRpb25UeXBlKCk6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvLiBRdWFuZG8gcHJlZW5jaGlkbywgbyBtw6l0b2RvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6EgaWdub3JhZG8gZSBvXG4gICAqIGNvbXBvbmVudGUgYWRxdWlyaXLDoSBhdXRvbWF0aXphw6fDo28gcGFyYSBvIHByb2Nlc3NvIGRlIGF1dGVudGljYcOnw6NvLlxuICAgKlxuICAgKiAjIyMgUHJvY2Vzc29zXG4gICAqIEFvIGRpZ2l0YXIgdW0gdmFsb3IgdsOhbGlkbyBubyBjYW1wbyBkZSBsb2dpbi9wYXNzd29yZCBlIHByZXNzaW9uYXIgKipFbnRlcioqLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGBcbiAgICogbmEgdXJsIGVzcGVjaWZpY2FkYSBuZXN0YSBwcm9wcmllZGFkZSBwYXNzYW5kbyBvIG9iamV0byBjb250ZW5kbyBvIHZhbG9yIGRlZmluaWRvIHBlbG8gdXN1w6FyaW86XG4gICAqXG4gICAqIGBgYFxuICAgKiBoZWFkZXJzIHtcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcbiAgICogfVxuICAgKlxuICAgKiBib2R5IHtcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEVtIGNhc28gZGUgKipzdWNlc3NvKiosIG8gb2JqZXRvIGRlIHJldG9ybm8gw6kgYXJtYXplbmFkbyBubyBgc2Vzc2lvblN0b3JhZ2VgIGUgbyB1c3XDoXJpbyDDqSByZWRpcmVjaW9uYWRvIHBhcmEgYSBww6FnaW5hIGluaWNpYWwgZGFcbiAgICogYXBsaWNhw6fDo28gYC9gLlxuICAgKlxuICAgKiBgYGBcbiAgICogMjAwOlxuICAgKiAge1xuICAgKiAgICB1c2VyOiB1c2VyXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBFbSBjYXNvIGRlICoqZXJybyoqIG5hIGF1dGVudGljYcOnw6NvLCBlc3BlcmEtc2UgbyBzZWd1aW50ZSByZXRvcm5vOlxuICAgKlxuICAgKiBgYGBcbiAgICogNDAwLzQwMVxuICAgKiAge1xuICAgKiAgICBjb2RlOiA0MDAvNDAxLFxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcbiAgICogICAgaGVscFVybD86IGhlbHBVcmxcbiAgICogIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gUG9kZS1zZSBhdHJpYnVpciB1bWEgcXVhbnRpZGFkZSBtw6F4aW1hIGRlIHRlbnRhdGl2YXMgcmVzdGFudGVzIChtYXhBdHRlbXB0c1JlbWFpbmluZykgcGFyYSBvIGF0cmlidXRvIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgLFxuICAgKiBhc3NpbSBjb21vIG9zIGF2aXNvcyByZWxhY2lvbmFkb3MgYW9zIGNhbXBvcyBsb2dpbiBlIHBhc3N3b3JkIChsb2dpbldhcm5pbmdzLCBwYXNzd29yZFdhcm5pbmdzKSBwYXJhIG9zIGF0cmlidXRvcyBgcC1sb2dpbi1lcnJvcnNgIGVcbiAgICogYHAtcGFzc3dvcmQtZXJyb3JzYCBjb25mb3JtZSByZXRvcm5vIGFiYWl4bzpcbiAgICpcbiAgICogYGBgXG4gICAqIDQwMFxuICAgKiAge1xuICAgKiAgICBjb2RlOiA0MDAvNDAxLFxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcbiAgICogICAgaGVscFVybD86IGhlbHBVcmwsXG4gICAqICAgIG1heEF0dGVtcHRzUmVtYWluaW5nPzogbWF4QXR0ZW1wdHNSZW1haW5pbmcsXG4gICAqICAgIGxvZ2luV2FybmluZ3M/OiBbbG9naW5XYXJuaW5nc10sXG4gICAqICAgIHBhc3N3b3JkV2FybmluZ3M/OiBbcGFzc3dvcmRXYXJuaW5nc11cbiAgICogIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gQ2FzbyBvIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCBzZWphIGlndWFsIGEgMCh6ZXJvKSwgcG9kZXLDoSBzZXIgcGFzc2FkbyB1bSB2YWxvciBwYXJhIG9cbiAgICogYXRyaWJ1dG8gYHAtYmxvY2tlZC11cmxgIGUgbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvIHBhcmEgdW1hIHRlbGEgZGUgYmxvcXVlaW8uXG4gICAqXG4gICAqICpQcm9jZXNzbyBmaW5hbGl6YWRvLipcbiAgICpcbiAgICogX19fX19fX19fX19fX19fXG4gICAqXG4gICAqICMjIyMgUHJhdGljaWRhZGVcbiAgICogQXMgaW5mb3JtYcOnw7VlcyBkbyBzZXJ2acOnbyBkZSBhdXRlbnRpY2HDp8OjbyB0YW1iw6ltIHBvZGVtIHNlciB0cmFuc21pdGlkYXMgZGlyZXRhbWVudGUgcGVsYXMgY29uZmlndXJhw6fDo29zIGRlIHJvdGEgZSwgZGVzdGEgbWFuZWlyYSxcbiAgICogZGlzcGVuc2Etc2UgcXVhbHF1ZXIgbWVuw6fDo28gZS9vdSBpbXBvcnRhw6fDo28gZG8gY29tcG9uZW50ZSBgcG8tcGFnZS1sb2dpbmAgbm8gcmVzdGFudGUgZGEgYXBsaWNhw6fDo28uIE8gZXhlbXBsbyBhYmFpeG8gZXhlbXBsaWZpY2FcbiAgICogYSBmb3JtYSBkaW7Dom1pY2EgY29tIGEgcXVhbCBvIHRlbXBsYXRlIGRlIHRlbGEgZGUgbG9naW4gcG9kZSBzZXIgZ2VyYWRvIGFvIG5hdmVnYXIgcGFyYSByb3RhIGAvbG9naW5gLCBlIHRhbWLDqW0gY29tbyBlbGUgc2UgY29tdW5pY2FcbiAgICogY29tIG8gc2VydmnDp28gcGFyYSBlZmV0dWHDp8OjbyBkbyBwcm9jZXNzbyBkZSBhdXRlbnRpY2HDp8OjbyBkbyB1c3XDoXJpbyBlIHNvbGljaXRhw6fDo28gZGUgbm92YSBzZW5oYS5cbiAgICogQmFzdGEgZGVmaW5pciBuYXMgY29uZmlndXJhw6fDtWVzIGRlIHJvdGE6XG4gICAqXG4gICAqXG4gICAqIGBgYFxuICAgKiAgIGltcG9ydCB7IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBQb1BhZ2VMb2dpbkF0aGVudGljYXRpb25UeXBlIH0gZnJvbSAnQHBvLXVpL25nLXRlbXBsYXRlcyc7XG4gICAqXG4gICAqICAgLi4uXG4gICAqICAgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gICAqICAgICB7XG4gICAqICAgICAgIHBhdGg6ICdsb2dpbicsIGNvbXBvbmVudDogUG9QYWdlTG9naW5Db21wb25lbnQsIGRhdGE6IHtcbiAgICogICAgICAgICBzZXJ2aWNlQXBpOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzL2F1dGhlbnRpY2F0aW9uJyxcbiAgICogICAgICAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyxcbiAgICogICAgICAgICByZWNvdmVyeToge1xuICAgKiAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzJyxcbiAgICogICAgICAgICAgIHR5cGU6IFBvTW9kYWxQYXNzd29yZFJlY292ZXJ5VHlwZS5BbGwsXG4gICAqICAgICAgICAgICBjb250YWN0TWFpbDogJ2Rldi5wb0Bwby11aS5jb20nLFxuICAgKiAgICAgICAgICAgcGhvbmVNYXNrOiAnOS05OTktOTk5LTk5OTknXG4gICAqICAgICAgICAgfSxcbiAgICogICAgICAgICByZWdpc3RlclVybDogJy9uZXctcGFzc3dvcmQnLFxuICAgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZS5CYXNpY1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgICAuLi5cbiAgICogICBdO1xuICAgKlxuICAgKiAgIEBOZ01vZHVsZSh7XG4gICAqICAgICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvclJvb3Qocm91dGVzKV0sXG4gICAqICAgICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXVxuICAgKiAgIH0pXG4gICAqICAgZXhwb3J0IGNsYXNzIEFwcFJvdXRpbmdNb2R1bGUgeyB9XG4gICAqIGBgYFxuICAgKlxuICAgKlxuICAgKiBPIG1ldGFkYWRvIGBzZXJ2aWNlQXBpYCBkZXZlIHNlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGRlIGF1dGVudGljYcOnw6NvLCBvIGBlbnZpcm9ubWVudGAgYWxpbWVudGEgYSBwcm9wcmllZGFkZVxuICAgKiBgcC1lbnZpcm9ubWVudGAsIGByZWNvdmVyeWAgw6kgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luUmVjb3ZlcnlgIHJlc3BvbnPDoXZlbCBwZWxhcyBlc3BlY2lmaWNhw6fDtWVzIGNvbnRpZGFzIG5hIG1vZGFsIGRlIHJlY3VwZXJhw6fDo28gZGVcbiAgICogc2VuaGEsIGByZWdpc3RlclVybGAgYWxpbWVudGEgYSBwcm9wcmllZGFkZSBgcC1yZWdpc3Rlci11cmxgIGUgYGF1dGhlbnRpY2F0aW9uVHlwZWAgcXVlIGRlZmluZSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXR5cGVgLlxuICAgKlxuICAgKiA+IMOJIGVzc2VuY2lhbCBxdWUgc2lnYSBhIG5vbWVuY2xhdHVyYSBkb3MgYXRyaWJ1dG9zIGV4ZW1wbGlmaWNhZG9zIGFjaW1hIHBhcmEgc3VhIGVmZXRpdmEgZnVuY2lvbmFsaWRhZGUuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3AtYXV0aGVudGljYXRpb24tdXJsJykgc2V0IGF1dGhlbnRpY2F0aW9uVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblVybCA9IGlzVHlwZW9mKHZhbHVlLCAnc3RyaW5nJykgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBhdXRoZW50aWNhdGlvblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvblVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybykgZSBhIGFwbGljYcOnw6NvIHRlbmhhIHVtIGxpbmsgZGUgYmxvcXVlaW8gZGUgdXN1w6FyaW8sXG4gICAqIGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGEsIGRlc3NhIGZvcm1hIGVtIGNhc28gZGUgYmxvcXVlaW8gbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvLlxuICAgKi9cbiAgQElucHV0KCdwLWJsb2NrZWQtdXJsJykgc2V0IGJsb2NrZWRVcmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Jsb2NrZWRVcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYmxvY2tlZFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ibG9ja2VkVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXhpYmUgdW0gYm90w6NvIHBhcmEgc3Vwb3J0ZS5cbiAgICpcbiAgICogQSBwcm9wcmllZGFkZSBhY2VpdGEgb3Mgc2VndWludGVzIHRpcG9zOlxuICAgKlxuICAgKiAtICoqU3RyaW5nKio6IFVSTCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XG4gICAqIC0gKipGdW5jdGlvbioqOiBGdW7Dp8OjbyBhIHNlciBkaXNwYXJhZGEgYW8gY2xpY2FyIG5vIGJvdMOjbyBkZSBzdXBvcnRlO1xuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtbG9naW4+XG4gICAqICAgW3Atc3VwcG9ydF09XCJ0aGlzLm15U3VwcG9ydC5iaW5kKHRoaXMpXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3Atc3VwcG9ydCcpIHNldCBzdXBwb3J0KHZhbHVlOiBzdHJpbmcgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuX3N1cHBvcnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdXBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ29sZcOnw6NvIGRlIGlkaW9tYXMgcXVlIG8gY29tcG9uZW50ZSBpcsOhIHRyYXRhciBlIGRpc3BvbmliaWxpemFyw6EgcGFyYSBvIHVzdcOhcmlvIGVzY29saGVyLlxuICAgKlxuICAgKiBDYXNvIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBzZWphIHV0aWxpemFkYSBvIGNvbXBvbmVudGUgbW9zdHJhcsOhIG5vIGNvbWJvIG9zIGlkaW9tYXMgcXVlIGVsZSBzdXBvcnRhIHBvciBwYWRyw6NvLlxuICAgKlxuICAgKiBDYXNvIGEgY29sZcOnw6NvIHRlbmhhIHVtIGlkaW9tYSwgYSBww6FnaW5hIGVzdGFyw6EgbmVzc2UgaWRpb21hIGUgbsOjbyBtb3N0cmFyw6EgbyBjb21iby5cbiAgICpcbiAgICogQ2FzbyBzZWphIHBhc3NhZG8gdW0gYXJyYXkgdmF6aW8sIGEgcMOhZ2luYSB0ZXLDoSBvIGlkaW9tYSBjb25maWd1cmFkbyBubyBgaTE4bmAgZSBuw6NvIG1vc3RyYXLDoSBvIGNvbWJvIGRlIHNlbGXDp8Ojby5cbiAgICpcbiAgICogPiBTZSBmb3IgcGFzc2FkbyB1bSBpZGlvbWEgbsOjbyBzdXBvcnRhZG8sIHNlcsOhIHByZWNpc28gcGFzc2FyIGFzIGxpdGVyYWlzIHBlbGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxuICAgKlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLWxhbmd1YWdlcycpIHNldCBsYW5ndWFnZXNMaXN0KGxhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+KSB7XG4gICAgaWYgKGxhbmd1YWdlc0xpc3QpIHtcbiAgICAgIGlmIChsYW5ndWFnZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXNMaXN0ID0gbGFuZ3VhZ2VzTGlzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBwb0xhbmd1YWdlRGVmYXVsdC5maWx0ZXIobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2UubGFuZ3VhZ2UgPT09IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ndWFnZXNMaXN0KCk6IEFycmF5PFBvTGFuZ3VhZ2U+IHtcbiAgICBpZiAodGhpcy5fbGFuZ3VhZ2VzTGlzdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlc0xpc3Q7XG4gICAgfVxuICAgIHJldHVybiBwb0xhbmd1YWdlRGVmYXVsdDtcbiAgfVxuXG4gIGdldCBzaG93TGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VzTGlzdC5sZW5ndGggPiAxO1xuICB9XG5cbiAgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSB8fCBnZXRTaG9ydEJyb3dzZXJMYW5ndWFnZSgpO1xuICB9XG5cbiAgZ2V0IHBhZ2VMb2dpbkxpdGVyYWxzKCk6IFBvUGFnZUxvZ2luTGl0ZXJhbHMge1xuICAgIGNvbnN0IGxvZ2luSGludFdpdGhDb250YWN0RW1haWwgPSB0aGlzLmNvbnRhY3RFbWFpbFxuICAgICAgPyB0aGlzLmNvbmNhdGVuYXRlTG9naW5IaW50V2l0aENvbnRhY3RFbWFpbCh0aGlzLmNvbnRhY3RFbWFpbClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBvUGFnZUxvZ2luTGl0ZXJhbHNEZWZhdWx0W3BvTG9jYWxlRGVmYXVsdF0sXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFt0aGlzLmxhbmd1YWdlXSxcbiAgICAgIC4uLmxvZ2luSGludFdpdGhDb250YWN0RW1haWwsXG4gICAgICAuLi50aGlzLmxpdGVyYWxzXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbG9naW5TZXJ2aWNlOiBQb1BhZ2VMb2dpblNlcnZpY2UsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHB1YmxpYyBwb0xhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gdGhpcy5wb0xhbmd1YWdlU2VydmljZS5nZXRTaG9ydExhbmd1YWdlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5sb2dpblN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2dpblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlUG9wb3ZlcigpIHtcbiAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25Mb2dpblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dpbkZvcm06IFBvUGFnZUxvZ2luID0ge1xuICAgICAgbG9naW46IHRoaXMubG9naW4sXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcbiAgICAgIHJlbWVtYmVyVXNlcjogdGhpcy5yZW1lbWJlclVzZXJcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY3VzdG9tRmllbGQpIHtcbiAgICAgIGxvZ2luRm9ybVt0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnByb3BlcnR5XSA9IHRoaXMuY3VzdG9tRmllbGRPYmplY3QudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRpb25VcmwpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uID0gdGhpcy5sb2dpblNlcnZpY2VcbiAgICAgICAgLm9uTG9naW4odGhpcy5hdXRoZW50aWNhdGlvblVybCwgdGhpcy5hdXRoZW50aWNhdGlvblR5cGUsIGxvZ2luRm9ybSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuSW50ZXJuYWxMaW5rKCcvJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5jb2RlID09PSAnNDAwJyB8fCBlcnJvci5lcnJvci5jb2RlID09PSAnNDAxJykge1xuICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlc1RvUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RCbG9ja2VkVXJsKHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcsIHRoaXMuYmxvY2tlZFVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChsb2dpbkZvcm0pO1xuICAgICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID4gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdChwcm9wZXJ0eSk6IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xuICAgIHJldHVybiB7IHByb3BlcnR5IH07XG4gIH1cblxuICBwcml2YXRlIG9wZW5FeHRlcm5hbExpbmsodXJsOiBzdHJpbmcpIHtcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkludGVybmFsTGluayh1cmw6IHN0cmluZykge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkaXJlY3RCbG9ja2VkVXJsKGF0dGVtcHRzOiBudW1iZXIsIGJsb2NrZWRVcmw6IHN0cmluZykge1xuICAgIGlmIChhdHRlbXB0cyA9PT0gMCAmJiBibG9ja2VkVXJsKSB7XG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuICAgICAgaXNFeHRlcm5hbExpbmsoYmxvY2tlZFVybCkgPyB0aGlzLm9wZW5FeHRlcm5hbExpbmsoYmxvY2tlZFVybCkgOiB0aGlzLm9wZW5JbnRlcm5hbExpbmsoYmxvY2tlZFVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZXNUb1Byb3BlcnRpZXMocmVzdWx0Pykge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSByZXN1bHQuZXJyb3IubWF4QXR0ZW1wdHNSZW1haW5pbmc7XG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gcmVzdWx0LmVycm9yLmxvZ2luV2FybmluZ3M7XG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gcmVzdWx0LmVycm9yLnBhc3N3b3JkV2FybmluZ3M7XG4gICAgICB0aGlzLmJsb2NrZWRVcmwgPSByZXN1bHQuZXJyb3IuYmxvY2tlZFVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IDA7XG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gW107XG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gW107XG4gICAgICB0aGlzLmJsb2NrZWRVcmwgPSAnJztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY29uY2F0ZW5hdGVMb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsKGNvbnRhY3RFbWFpbDogc3RyaW5nKTtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0TG9naW5FcnJvcnModmFsdWU6IEFycmF5PHN0cmluZz4pOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRQYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XG59XG4iXX0=
|