ng-tailwind 4.0.1 → 4.1.1
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/base/ngt-base-ng-model.d.ts +1 -1
- package/components/ngt-action/ngt-action.component.d.ts +3 -0
- package/components/ngt-action/ngt-action.module.d.ts +8 -0
- package/components/ngt-button/ngt-button.component.d.ts +3 -0
- package/components/ngt-button/ngt-button.module.d.ts +8 -0
- package/components/ngt-checkbox/ngt-checkbox.component.d.ts +3 -0
- package/components/ngt-checkbox/ngt-checkbox.module.d.ts +8 -0
- package/components/ngt-content/ngt-content.component.d.ts +3 -0
- package/components/ngt-content/ngt-content.module.d.ts +6 -0
- package/components/ngt-datatable/ngt-datatable.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-datatable.module.d.ts +22 -0
- package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +3 -0
- package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +3 -0
- package/components/ngt-date/ngt-date.component.d.ts +3 -0
- package/components/ngt-date/ngt-date.module.d.ts +11 -0
- package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +3 -0
- package/components/ngt-dropdown/ngt-dropdown.component.d.ts +3 -0
- package/components/ngt-dropdown/ngt-dropdown.module.d.ts +7 -0
- package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +4 -1
- package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +3 -0
- package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +21 -7
- package/components/ngt-dropzone/ngt-dropzone.component.d.ts +4 -27
- package/components/ngt-dropzone/ngt-dropzone.meta.d.ts +27 -0
- package/components/ngt-dropzone/ngt-dropzone.module.d.ts +15 -0
- package/components/ngt-floating-button/ngt-floating-button.component.d.ts +3 -0
- package/components/ngt-floating-button/ngt-floating-button.module.d.ts +8 -0
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +6 -3
- package/components/ngt-form/ngt-form.component.d.ts +3 -0
- package/components/ngt-form/ngt-form.module.d.ts +7 -0
- package/components/ngt-header-nav/ngt-header-nav.component.d.ts +3 -0
- package/components/ngt-header-nav/ngt-header-nav.module.d.ts +6 -0
- package/components/ngt-helper/ngt-helper.component.d.ts +3 -0
- package/components/ngt-helper/ngt-helper.module.d.ts +8 -0
- package/components/ngt-input/ngt-input.component.d.ts +4 -1
- package/components/ngt-input/ngt-input.module.d.ts +12 -0
- package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +3 -0
- package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +3 -0
- package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +7 -5
- package/components/ngt-modal/ngt-modal.component.d.ts +3 -0
- package/components/ngt-modal/ngt-modal.module.d.ts +9 -0
- package/components/ngt-multi-select/ngt-multi-select.component.d.ts +3 -0
- package/components/ngt-multi-select/ngt-multi-select.module.d.ts +13 -0
- package/components/ngt-pagination/ngt-pagination.component.d.ts +3 -0
- package/components/ngt-pagination/ngt-pagination.module.d.ts +10 -0
- package/components/ngt-popover/ngt-popover.component.d.ts +3 -0
- package/components/ngt-popover/ngt-popover.module.d.ts +7 -0
- package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +3 -0
- package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +3 -0
- package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +3 -0
- package/components/ngt-portlet/ngt-portlet.component.d.ts +3 -0
- package/components/ngt-portlet/ngt-portlet.module.d.ts +11 -0
- package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +3 -0
- package/components/ngt-radio-button/ngt-radio-button.component.d.ts +3 -0
- package/components/ngt-radio-button/ngt-radio-button.module.d.ts +9 -0
- package/components/ngt-section/ngt-section.component.d.ts +3 -0
- package/components/ngt-section/ngt-section.module.d.ts +9 -0
- package/components/ngt-select/ngt-select.component.d.ts +3 -0
- package/components/ngt-select/ngt-select.directive.d.ts +7 -0
- package/components/ngt-select/ngt-select.module.d.ts +14 -0
- package/components/ngt-shining/ngt-shining.component.d.ts +3 -0
- package/components/ngt-shining/ngt-shining.module.d.ts +6 -0
- package/components/ngt-sidenav/ngt-sidenav.component.d.ts +3 -0
- package/components/ngt-sidenav/ngt-sidenav.module.d.ts +6 -0
- package/components/ngt-slider/ngt-slider.component.d.ts +3 -0
- package/components/ngt-slider/ngt-slider.module.d.ts +7 -0
- package/components/ngt-svg/ngt-svg.component.d.ts +3 -0
- package/components/ngt-svg/ngt-svg.module.d.ts +8 -0
- package/components/ngt-tag/ngt-tag.component.d.ts +3 -0
- package/components/ngt-tag/ngt-tag.module.d.ts +7 -0
- package/components/ngt-textarea/ngt-textarea.component.d.ts +3 -0
- package/components/ngt-textarea/ngt-textarea.module.d.ts +11 -0
- package/components/ngt-validation/ngt-validation.component.d.ts +5 -2
- package/components/ngt-validation/ngt-validation.module.d.ts +6 -0
- package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +31 -28
- package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +6 -0
- package/{esm2015/base/ngt-base-ng-model.js → esm2020/base/ngt-base-ng-model.mjs} +4 -4
- package/esm2020/components/ngt-action/ngt-action.component.mjs +54 -0
- package/esm2020/components/ngt-action/ngt-action.module.mjs +28 -0
- package/esm2020/components/ngt-button/ngt-button.component.mjs +115 -0
- package/esm2020/components/ngt-button/ngt-button.module.mjs +28 -0
- package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +175 -0
- package/esm2020/components/ngt-checkbox/ngt-checkbox.module.mjs +28 -0
- package/esm2020/components/ngt-content/ngt-content.component.mjs +32 -0
- package/esm2020/components/ngt-content/ngt-content.module.mjs +20 -0
- package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +431 -0
- package/esm2020/components/ngt-datatable/ngt-datatable.module.mjs +95 -0
- package/esm2020/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +57 -0
- package/esm2020/components/ngt-datatable/ngt-td/ngt-td.component.mjs +62 -0
- package/esm2020/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +113 -0
- package/esm2020/components/ngt-datatable/ngt-th/ngt-th.component.mjs +211 -0
- package/esm2020/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +91 -0
- package/esm2020/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +55 -0
- package/esm2020/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +86 -0
- package/esm2020/components/ngt-date/ngt-date.component.mjs +416 -0
- package/esm2020/components/ngt-date/ngt-date.module.mjs +40 -0
- package/esm2020/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +19 -0
- package/esm2020/components/ngt-dropdown/ngt-dropdown.component.mjs +200 -0
- package/esm2020/components/ngt-dropdown/ngt-dropdown.module.mjs +21 -0
- package/esm2020/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +54 -0
- package/esm2020/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +66 -0
- package/esm2020/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +94 -0
- package/esm2020/components/ngt-dropzone/ngt-dropzone.component.mjs +464 -0
- package/esm2020/components/ngt-dropzone/ngt-dropzone.meta.mjs +24 -0
- package/esm2020/components/ngt-dropzone/ngt-dropzone.module.mjs +55 -0
- package/esm2020/components/ngt-floating-button/ngt-floating-button.component.mjs +119 -0
- package/esm2020/components/ngt-floating-button/ngt-floating-button.module.mjs +28 -0
- package/esm2020/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +22 -0
- package/esm2020/components/ngt-form/ngt-form.component.mjs +193 -0
- package/esm2020/components/ngt-form/ngt-form.module.mjs +29 -0
- package/esm2020/components/ngt-header-nav/ngt-header-nav.component.mjs +39 -0
- package/esm2020/components/ngt-header-nav/ngt-header-nav.module.mjs +20 -0
- package/esm2020/components/ngt-helper/ngt-helper.component.mjs +63 -0
- package/esm2020/components/ngt-helper/ngt-helper.module.mjs +28 -0
- package/esm2020/components/ngt-input/ngt-input.component.mjs +729 -0
- package/esm2020/components/ngt-input/ngt-input.module.mjs +47 -0
- package/esm2020/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +11 -0
- package/esm2020/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +11 -0
- package/esm2020/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +37 -0
- package/esm2020/components/ngt-modal/ngt-modal.component.mjs +91 -0
- package/esm2020/components/ngt-modal/ngt-modal.module.mjs +39 -0
- package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +419 -0
- package/esm2020/components/ngt-multi-select/ngt-multi-select.module.mjs +52 -0
- package/esm2020/components/ngt-pagination/ngt-pagination.component.mjs +162 -0
- package/esm2020/components/ngt-pagination/ngt-pagination.module.mjs +36 -0
- package/esm2020/components/ngt-popover/ngt-popover.component.mjs +85 -0
- package/esm2020/components/ngt-popover/ngt-popover.module.mjs +24 -0
- package/esm2020/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +34 -0
- package/esm2020/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +33 -0
- package/esm2020/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +53 -0
- package/esm2020/components/ngt-portlet/ngt-portlet.component.mjs +74 -0
- package/esm2020/components/ngt-portlet/ngt-portlet.module.mjs +47 -0
- package/esm2020/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +19 -0
- package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +125 -0
- package/esm2020/components/ngt-radio-button/ngt-radio-button.module.mjs +29 -0
- package/esm2020/components/ngt-section/ngt-section.component.mjs +119 -0
- package/esm2020/components/ngt-section/ngt-section.module.mjs +32 -0
- package/esm2020/components/ngt-select/ngt-select.component.mjs +550 -0
- package/esm2020/components/ngt-select/ngt-select.directive.mjs +36 -0
- package/esm2020/components/ngt-select/ngt-select.module.mjs +65 -0
- package/esm2020/components/ngt-shining/ngt-shining.component.mjs +40 -0
- package/esm2020/components/ngt-shining/ngt-shining.module.mjs +20 -0
- package/esm2020/components/ngt-sidenav/ngt-sidenav.component.mjs +132 -0
- package/esm2020/components/ngt-sidenav/ngt-sidenav.module.mjs +20 -0
- package/esm2020/components/ngt-slider/ngt-slider.component.mjs +99 -0
- package/esm2020/components/ngt-slider/ngt-slider.module.mjs +24 -0
- package/esm2020/components/ngt-svg/ngt-svg.component.mjs +53 -0
- package/esm2020/components/ngt-svg/ngt-svg.module.mjs +28 -0
- package/esm2020/components/ngt-tag/ngt-tag.component.mjs +37 -0
- package/esm2020/components/ngt-tag/ngt-tag.module.mjs +24 -0
- package/esm2020/components/ngt-textarea/ngt-textarea.component.mjs +238 -0
- package/esm2020/components/ngt-textarea/ngt-textarea.module.mjs +43 -0
- package/esm2020/components/ngt-validation/ngt-validation.component.mjs +26 -0
- package/esm2020/components/ngt-validation/ngt-validation.module.mjs +20 -0
- package/esm2020/directives/ngt-stylizable/ngt-stylizable.directive.mjs +290 -0
- package/esm2020/directives/ngt-stylizable/ngt-stylizable.module.mjs +20 -0
- package/esm2020/helpers/routing/route.mjs +11 -0
- package/esm2020/ng-tailwind.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
- package/esm2020/services/http/ngt-attachment-http.service.mjs +3 -0
- package/{esm2015/services/http/ngt-http-form.service.js → esm2020/services/http/ngt-http-form.service.mjs} +1 -1
- package/esm2020/services/http/ngt-http.service.mjs +3 -0
- package/{esm2015/services/ngt-stylizable/ngt-stylizable.service.js → esm2020/services/ngt-stylizable/ngt-stylizable.service.mjs} +82 -82
- package/fesm2015/ng-tailwind.mjs +7801 -0
- package/fesm2015/ng-tailwind.mjs.map +1 -0
- package/fesm2020/ng-tailwind.mjs +7668 -0
- package/fesm2020/ng-tailwind.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +27 -16
- package/public-api.d.ts +1 -1
- package/services/ngt-stylizable/ngt-stylizable.service.d.ts +27 -27
- package/bundles/ng-tailwind.umd.js +0 -7961
- package/bundles/ng-tailwind.umd.js.map +0 -1
- package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.d.ts +0 -2
- package/esm2015/components/ngt-action/ngt-action.component.js +0 -49
- package/esm2015/components/ngt-action/ngt-action.module.js +0 -19
- package/esm2015/components/ngt-button/ngt-button.component.js +0 -106
- package/esm2015/components/ngt-button/ngt-button.module.js +0 -19
- package/esm2015/components/ngt-checkbox/ngt-checkbox.component.js +0 -143
- package/esm2015/components/ngt-checkbox/ngt-checkbox.module.js +0 -19
- package/esm2015/components/ngt-content/ngt-content.component.js +0 -33
- package/esm2015/components/ngt-content/ngt-content.module.js +0 -15
- package/esm2015/components/ngt-datatable/ngt-datatable.component.js +0 -418
- package/esm2015/components/ngt-datatable/ngt-datatable.module.js +0 -58
- package/esm2015/components/ngt-datatable/ngt-tbody/ngt-tbody.component.js +0 -58
- package/esm2015/components/ngt-datatable/ngt-td/ngt-td.component.js +0 -63
- package/esm2015/components/ngt-datatable/ngt-td-check/ngt-td-check.component.js +0 -105
- package/esm2015/components/ngt-datatable/ngt-th/ngt-th.component.js +0 -195
- package/esm2015/components/ngt-datatable/ngt-th-check/ngt-th-check.component.js +0 -87
- package/esm2015/components/ngt-datatable/ngt-thead/ngt-thead.component.js +0 -56
- package/esm2015/components/ngt-datatable/ngt-tr/ngt-tr.component.js +0 -76
- package/esm2015/components/ngt-date/ngt-date.component.js +0 -380
- package/esm2015/components/ngt-date/ngt-date.module.js +0 -25
- package/esm2015/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.js +0 -20
- package/esm2015/components/ngt-dropdown/ngt-dropdown.component.js +0 -185
- package/esm2015/components/ngt-dropdown/ngt-dropdown.module.js +0 -16
- package/esm2015/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.js +0 -50
- package/esm2015/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.js +0 -59
- package/esm2015/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.js +0 -67
- package/esm2015/components/ngt-dropzone/ngt-dropzone.component.js +0 -447
- package/esm2015/components/ngt-dropzone/ngt-dropzone.module.js +0 -37
- package/esm2015/components/ngt-floating-button/ngt-floating-button.component.js +0 -94
- package/esm2015/components/ngt-floating-button/ngt-floating-button.module.js +0 -19
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.js +0 -23
- package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.js +0 -15
- package/esm2015/components/ngt-form/ngt-form.component.js +0 -181
- package/esm2015/components/ngt-form/ngt-form.module.js +0 -17
- package/esm2015/components/ngt-header-nav/ngt-header-nav.component.js +0 -38
- package/esm2015/components/ngt-header-nav/ngt-header-nav.module.js +0 -15
- package/esm2015/components/ngt-helper/ngt-helper.component.js +0 -51
- package/esm2015/components/ngt-helper/ngt-helper.module.js +0 -19
- package/esm2015/components/ngt-input/ngt-input.component.js +0 -680
- package/esm2015/components/ngt-input/ngt-input.module.js +0 -28
- package/esm2015/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.js +0 -11
- package/esm2015/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.js +0 -11
- package/esm2015/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.js +0 -40
- package/esm2015/components/ngt-modal/ngt-modal.component.js +0 -79
- package/esm2015/components/ngt-modal/ngt-modal.module.js +0 -28
- package/esm2015/components/ngt-multi-select/ngt-multi-select.component.js +0 -394
- package/esm2015/components/ngt-multi-select/ngt-multi-select.module.js +0 -33
- package/esm2015/components/ngt-pagination/ngt-pagination.component.js +0 -172
- package/esm2015/components/ngt-pagination/ngt-pagination.module.js +0 -23
- package/esm2015/components/ngt-popover/ngt-popover.component.js +0 -73
- package/esm2015/components/ngt-popover/ngt-popover.module.js +0 -17
- package/esm2015/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.js +0 -34
- package/esm2015/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.js +0 -33
- package/esm2015/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.js +0 -47
- package/esm2015/components/ngt-portlet/ngt-portlet.component.js +0 -58
- package/esm2015/components/ngt-portlet/ngt-portlet.module.js +0 -32
- package/esm2015/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.js +0 -19
- package/esm2015/components/ngt-radio-button/ngt-radio-button.component.js +0 -103
- package/esm2015/components/ngt-radio-button/ngt-radio-button.module.js +0 -20
- package/esm2015/components/ngt-section/ngt-section.component.js +0 -101
- package/esm2015/components/ngt-section/ngt-section.module.js +0 -21
- package/esm2015/components/ngt-select/ngt-select.component.js +0 -488
- package/esm2015/components/ngt-select/ngt-select.directive.js +0 -35
- package/esm2015/components/ngt-select/ngt-select.module.js +0 -40
- package/esm2015/components/ngt-shining/ngt-shining.component.js +0 -41
- package/esm2015/components/ngt-shining/ngt-shining.module.js +0 -15
- package/esm2015/components/ngt-sidenav/ngt-sidenav.component.js +0 -123
- package/esm2015/components/ngt-sidenav/ngt-sidenav.module.js +0 -15
- package/esm2015/components/ngt-slider/ngt-slider.component.js +0 -82
- package/esm2015/components/ngt-slider/ngt-slider.module.js +0 -17
- package/esm2015/components/ngt-svg/ngt-svg.component.js +0 -52
- package/esm2015/components/ngt-svg/ngt-svg.module.js +0 -19
- package/esm2015/components/ngt-tag/ngt-tag.component.js +0 -36
- package/esm2015/components/ngt-tag/ngt-tag.module.js +0 -17
- package/esm2015/components/ngt-textarea/ngt-textarea.component.js +0 -210
- package/esm2015/components/ngt-textarea/ngt-textarea.module.js +0 -26
- package/esm2015/components/ngt-validation/ngt-validation.component.js +0 -24
- package/esm2015/components/ngt-validation/ngt-validation.module.js +0 -15
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.directive.js +0 -227
- package/esm2015/directives/ngt-stylizable/ngt-stylizable.module.js +0 -15
- package/esm2015/helpers/routing/route.js +0 -11
- package/esm2015/ng-tailwind.js +0 -11
- package/esm2015/services/http/ngt-attachment-http.service.js +0 -3
- package/esm2015/services/http/ngt-http.service.js +0 -3
- package/fesm2015/ng-tailwind.js +0 -6926
- package/fesm2015/ng-tailwind.js.map +0 -1
- package/ng-tailwind.d.ts +0 -10
- package/ng-tailwind.metadata.json +0 -1
- /package/{esm2015/animations/ngt-angular-animations.js → esm2020/animations/ngt-angular-animations.mjs} +0 -0
- /package/{esm2015/enums/size.enum.js → esm2020/enums/size.enum.mjs} +0 -0
- /package/{esm2015/helpers/enum/enum.js → esm2020/helpers/enum/enum.mjs} +0 -0
- /package/{esm2015/helpers/form/form.js → esm2020/helpers/form/form.mjs} +0 -0
- /package/{esm2015/helpers/uuid.js → esm2020/helpers/uuid.mjs} +0 -0
- /package/{esm2015/services/http/ngt-http-resource.service.js → esm2020/services/http/ngt-http-resource.service.mjs} +0 -0
- /package/{esm2015/services/http/ngt-http-validation.service.js → esm2020/services/http/ngt-http-validation.service.mjs} +0 -0
- /package/{esm2015/services/http/ngt-translate.service.js → esm2020/services/http/ngt-translate.service.mjs} +0 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
import { Component, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, ViewChild, } from '@angular/core';
|
|
2
|
+
import { ControlContainer, NgForm, Validators } from '@angular/forms';
|
|
3
|
+
import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
|
|
4
|
+
import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "../ngt-form/ngt-form.component";
|
|
9
|
+
import * as i4 from "../../services/http/ngt-http-validation.service";
|
|
10
|
+
import * as i5 from "../../services/http/ngt-http-resource.service";
|
|
11
|
+
import * as i6 from "../../services/http/ngt-translate.service";
|
|
12
|
+
import * as i7 from "@angular/common";
|
|
13
|
+
import * as i8 from "../ngt-validation/ngt-validation.component";
|
|
14
|
+
import * as i9 from "../ngt-shining/ngt-shining.component";
|
|
15
|
+
import * as i10 from "../ngt-svg/ngt-svg.component";
|
|
16
|
+
import * as i11 from "../ngt-helper/ngt-helper.component";
|
|
17
|
+
let Inputmask = require('inputmask');
|
|
18
|
+
export var NgtInputMaskEnum;
|
|
19
|
+
(function (NgtInputMaskEnum) {
|
|
20
|
+
NgtInputMaskEnum["CPF"] = "cpf";
|
|
21
|
+
NgtInputMaskEnum["CNPJ"] = "cnpj";
|
|
22
|
+
NgtInputMaskEnum["CPF_CNPJ"] = "cnpj-cpf";
|
|
23
|
+
NgtInputMaskEnum["CPF_CNPJ_RUT"] = "cnpj-cpf-rut";
|
|
24
|
+
NgtInputMaskEnum["DECIMAL"] = "decimal";
|
|
25
|
+
NgtInputMaskEnum["CELLPHONE"] = "cellphone";
|
|
26
|
+
NgtInputMaskEnum["PLATE"] = "plate";
|
|
27
|
+
NgtInputMaskEnum["CEP"] = "cep";
|
|
28
|
+
NgtInputMaskEnum["INTEGER"] = "integer";
|
|
29
|
+
NgtInputMaskEnum["TIME"] = "time";
|
|
30
|
+
NgtInputMaskEnum["INTERNATIONAL_PHONE"] = "international-phone";
|
|
31
|
+
})(NgtInputMaskEnum || (NgtInputMaskEnum = {}));
|
|
32
|
+
export class NgtInputComponent extends NgtBaseNgModel {
|
|
33
|
+
constructor(injector, ngtStylizableDirective, formContainer, ngtFormComponent, renderer, ngtValidationService, ngtResourceService, changeDetector, ngtTranslateService) {
|
|
34
|
+
super();
|
|
35
|
+
this.injector = injector;
|
|
36
|
+
this.ngtStylizableDirective = ngtStylizableDirective;
|
|
37
|
+
this.formContainer = formContainer;
|
|
38
|
+
this.ngtFormComponent = ngtFormComponent;
|
|
39
|
+
this.renderer = renderer;
|
|
40
|
+
this.ngtValidationService = ngtValidationService;
|
|
41
|
+
this.ngtResourceService = ngtResourceService;
|
|
42
|
+
this.changeDetector = changeDetector;
|
|
43
|
+
this.ngtTranslateService = ngtTranslateService;
|
|
44
|
+
this.placeholder = '';
|
|
45
|
+
this.helpTextColor = 'text-green-500';
|
|
46
|
+
this.decimalMaskPrecision = 2;
|
|
47
|
+
this.showCharactersLength = false;
|
|
48
|
+
this.type = 'text';
|
|
49
|
+
this.onClickLeftIcon = new EventEmitter();
|
|
50
|
+
this.onClickRightIcon = new EventEmitter();
|
|
51
|
+
this.validatePhoneResult = new EventEmitter();
|
|
52
|
+
this.inputProperties = {};
|
|
53
|
+
this.subscriptions = [];
|
|
54
|
+
if (this.ngtFormComponent) {
|
|
55
|
+
this.shining = this.ngtFormComponent.isShining();
|
|
56
|
+
this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
|
|
57
|
+
this.shining = shining;
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
if (this.ngtStylizableDirective) {
|
|
61
|
+
this.ngtStyle = this.ngtStylizableDirective.getNgtStylizableService();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.ngtStyle = new NgtStylizableService();
|
|
65
|
+
}
|
|
66
|
+
this.ngtStyle.load(this.injector, 'NgtInput', {
|
|
67
|
+
h: 'h-12',
|
|
68
|
+
rounded: 'rounded',
|
|
69
|
+
text: 'text-sm',
|
|
70
|
+
fontCase: '',
|
|
71
|
+
color: {
|
|
72
|
+
border: 'border-gray-400 focus:border-gray-700',
|
|
73
|
+
bg: 'bg-bg-white focus:bg-white',
|
|
74
|
+
text: 'text-gray-800'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
setFocus() {
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
this.element.nativeElement.focus();
|
|
81
|
+
}, 200);
|
|
82
|
+
}
|
|
83
|
+
hasFocus() {
|
|
84
|
+
return document.activeElement === this.element.nativeElement;
|
|
85
|
+
}
|
|
86
|
+
clearInput(event) {
|
|
87
|
+
if (event) {
|
|
88
|
+
event.stopPropagation();
|
|
89
|
+
}
|
|
90
|
+
this.element.nativeElement.value = '';
|
|
91
|
+
this.value = '';
|
|
92
|
+
this.markAsPristine();
|
|
93
|
+
}
|
|
94
|
+
ngOnChanges(changes) {
|
|
95
|
+
this.setupMasks(changes.mask ? changes.mask.previousValue : null);
|
|
96
|
+
if (changes.match || changes.isRequired || changes.type || changes.mask || changes.minValue) {
|
|
97
|
+
this.updateValidations();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
ngOnDestroy() {
|
|
101
|
+
this.destroySubscriptions();
|
|
102
|
+
}
|
|
103
|
+
change(value) {
|
|
104
|
+
if (value && typeof value === 'string' && this.mask == 'decimal') {
|
|
105
|
+
value = parseFloat(value);
|
|
106
|
+
}
|
|
107
|
+
if (!this.getNativeValue()) {
|
|
108
|
+
this.element.nativeElement.value = value;
|
|
109
|
+
}
|
|
110
|
+
if (!value && value !== 0) {
|
|
111
|
+
this.clearInput();
|
|
112
|
+
}
|
|
113
|
+
let nativeValue = this.getNativeValue();
|
|
114
|
+
if (this.mask) {
|
|
115
|
+
let ngModelValue = this.removeMasks(nativeValue);
|
|
116
|
+
if (nativeValue && ngModelValue != this.value) {
|
|
117
|
+
this.value = ngModelValue;
|
|
118
|
+
}
|
|
119
|
+
if ((this.mask == NgtInputMaskEnum.CELLPHONE || this.mask == NgtInputMaskEnum.INTERNATIONAL_PHONE)
|
|
120
|
+
&& this.allowPhoneValidation && this.value) {
|
|
121
|
+
this.validatePhone();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
let ngModelValue = this.removeMasks(value);
|
|
126
|
+
if (value && ngModelValue != value) {
|
|
127
|
+
this.value = ngModelValue;
|
|
128
|
+
}
|
|
129
|
+
if (this.value != nativeValue) {
|
|
130
|
+
this.element.nativeElement.value = ngModelValue;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (this.componentReady) {
|
|
134
|
+
this.onValueChangeEvent.emit(this.value);
|
|
135
|
+
}
|
|
136
|
+
if (this.ngtResourceService && this.findExistingResource && this.value) {
|
|
137
|
+
this.searchExistingResource();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
ngOnInit() {
|
|
141
|
+
if (!this.formContainer) {
|
|
142
|
+
console.error("The element must be inside a <form #form='ngForm'> tag!", this.element.nativeElement);
|
|
143
|
+
}
|
|
144
|
+
if (!this.name) {
|
|
145
|
+
console.error("The element must contain a name attribute!", this.element.nativeElement);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
setTimeout(() => {
|
|
149
|
+
this.componentReady = true;
|
|
150
|
+
setTimeout(() => {
|
|
151
|
+
this.initComponent();
|
|
152
|
+
if (!this.getElementTitle() || this.getElementTitle() === 'null') {
|
|
153
|
+
this.element.nativeElement.parentElement.parentElement.title = '';
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}, 500);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
getInputPaddings() {
|
|
160
|
+
let paddingClass = '';
|
|
161
|
+
if (this.innerLeftIcon) {
|
|
162
|
+
paddingClass += 'pl-8 pr-4 ';
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
paddingClass += 'px-4 ';
|
|
166
|
+
}
|
|
167
|
+
if (this.innerRightIcon || this.allowClear || this.type == 'password') {
|
|
168
|
+
if (this.allowClear && this.value && (this.innerRightIcon || this.type == 'password')) {
|
|
169
|
+
paddingClass += 'pr-16 ';
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
paddingClass += 'pr-8 ';
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return paddingClass;
|
|
176
|
+
}
|
|
177
|
+
showPassword() {
|
|
178
|
+
this.element.nativeElement.type = 'text';
|
|
179
|
+
this.changeDetector.detectChanges();
|
|
180
|
+
}
|
|
181
|
+
hidePassword() {
|
|
182
|
+
this.element.nativeElement.type = 'password';
|
|
183
|
+
this.changeDetector.detectChanges();
|
|
184
|
+
}
|
|
185
|
+
getRemainingCharacters() {
|
|
186
|
+
if (this.element?.nativeElement?.value?.length) {
|
|
187
|
+
if ((this.maxTotalCharsCount - this.element.nativeElement.value.length) > 0) {
|
|
188
|
+
return this.maxTotalCharsCount - this.element.nativeElement.value.length;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return this.maxTotalCharsCount;
|
|
195
|
+
}
|
|
196
|
+
initComponent() {
|
|
197
|
+
if (this.formContainer && this.formContainer.control && (this.formControl = this.formContainer.control.get(this.name))) {
|
|
198
|
+
if (this.focus) {
|
|
199
|
+
this.setFocus();
|
|
200
|
+
}
|
|
201
|
+
let watch = "change";
|
|
202
|
+
if (this.jit) {
|
|
203
|
+
watch += " keyup keydown keypress";
|
|
204
|
+
}
|
|
205
|
+
watch.split(' ').forEach((evt) => {
|
|
206
|
+
this.renderer.listen(this.element.nativeElement, evt, () => {
|
|
207
|
+
let nativeValue = this.removeMasks(this.getNativeValue());
|
|
208
|
+
if (this.value != nativeValue) {
|
|
209
|
+
this.value = nativeValue;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
this.renderer.listen(this.element.nativeElement, "keydown", (event) => {
|
|
214
|
+
if (this.element.nativeElement && this.element.nativeElement.value && this.element.nativeElement.value.length >= this.maxLength) {
|
|
215
|
+
// Backspace and delete
|
|
216
|
+
if (event.keyCode != 8 && event.keyCode != 46) {
|
|
217
|
+
event.preventDefault();
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
this.maxTotalCharsCount = this.maxLength;
|
|
223
|
+
this.updateValidations();
|
|
224
|
+
if (this.match) {
|
|
225
|
+
this.renderer.listen(this.element.nativeElement, "keypress", () => {
|
|
226
|
+
this.matchValidator();
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if (this.value) {
|
|
230
|
+
this.formControl.markAsDirty();
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
this.formControl.markAsPristine();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
this.setupProperties();
|
|
237
|
+
}
|
|
238
|
+
updateValidations() {
|
|
239
|
+
if (!this.formControl) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const syncValidators = [];
|
|
243
|
+
if (this.type == 'email') {
|
|
244
|
+
syncValidators.push(Validators.email);
|
|
245
|
+
}
|
|
246
|
+
if (this.isRequired) {
|
|
247
|
+
syncValidators.push(Validators.required);
|
|
248
|
+
}
|
|
249
|
+
if (this.maxLength) {
|
|
250
|
+
syncValidators.push(Validators.maxLength(this.maxLength));
|
|
251
|
+
}
|
|
252
|
+
if (this.minLength) {
|
|
253
|
+
syncValidators.push(Validators.minLength(this.minLength));
|
|
254
|
+
}
|
|
255
|
+
if (this.mask == 'cnpj-cpf' || this.mask == 'cnpj-cpf-rut' || this.mask == 'cpf') {
|
|
256
|
+
syncValidators.push(this.cnpjCpfValidator());
|
|
257
|
+
}
|
|
258
|
+
if (this.mask == 'time') {
|
|
259
|
+
syncValidators.push(this.timeValidator());
|
|
260
|
+
}
|
|
261
|
+
if (this.match) {
|
|
262
|
+
syncValidators.push(this.matchValidator());
|
|
263
|
+
}
|
|
264
|
+
if (this.minValue !== undefined) {
|
|
265
|
+
syncValidators.push(this.minValueValidator());
|
|
266
|
+
}
|
|
267
|
+
if (this.multipleOf) {
|
|
268
|
+
syncValidators.push(this.multipleOfValidator());
|
|
269
|
+
}
|
|
270
|
+
if (this.externalServerDependency) {
|
|
271
|
+
syncValidators.push(this.externalServerDependencyValidator());
|
|
272
|
+
}
|
|
273
|
+
setTimeout(() => {
|
|
274
|
+
this.formControl.setValidators(syncValidators);
|
|
275
|
+
const asyncValidators = [];
|
|
276
|
+
if (this.uniqueResource) {
|
|
277
|
+
asyncValidators.push(this.uniqueValidator());
|
|
278
|
+
}
|
|
279
|
+
if (this.type == 'email' && this.hasEmailServiceValidation()) {
|
|
280
|
+
asyncValidators.push(this.emailValidator());
|
|
281
|
+
}
|
|
282
|
+
this.formControl.setAsyncValidators(asyncValidators);
|
|
283
|
+
this.formControl.updateValueAndValidity();
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
setupMasks(previousMask) {
|
|
287
|
+
if (this.mask != previousMask && !this.mask) {
|
|
288
|
+
Inputmask.remove(this.element.nativeElement);
|
|
289
|
+
return this.clearInput();
|
|
290
|
+
}
|
|
291
|
+
let masks = {
|
|
292
|
+
[NgtInputMaskEnum.CPF]: '999.999.999-99',
|
|
293
|
+
[NgtInputMaskEnum.CNPJ]: '99.999.999/9999-99',
|
|
294
|
+
[NgtInputMaskEnum.CPF_CNPJ_RUT]: {
|
|
295
|
+
mask: ['999.999.999-99', '999999999999', '99.999.999/9999-99'],
|
|
296
|
+
keepStatic: true
|
|
297
|
+
},
|
|
298
|
+
[NgtInputMaskEnum.CPF_CNPJ]: {
|
|
299
|
+
mask: ['999.999.999-99', '99.999.999/9999-99'],
|
|
300
|
+
keepStatic: true
|
|
301
|
+
},
|
|
302
|
+
[NgtInputMaskEnum.DECIMAL]: {
|
|
303
|
+
digits: this.decimalMaskPrecision,
|
|
304
|
+
groupSeparator: '.',
|
|
305
|
+
radixPoint: ',',
|
|
306
|
+
autoGroup: true,
|
|
307
|
+
repeat: 16,
|
|
308
|
+
rightAlign: false,
|
|
309
|
+
max: this.maxValue,
|
|
310
|
+
},
|
|
311
|
+
[NgtInputMaskEnum.CELLPHONE]: {
|
|
312
|
+
mask: ['(99) 999-999', '(99) 9999-9999', '(99) 99999-9999'],
|
|
313
|
+
keepStatic: true
|
|
314
|
+
},
|
|
315
|
+
[NgtInputMaskEnum.INTERNATIONAL_PHONE]: {
|
|
316
|
+
mask: ['+999 99 999-999', '+99 (99) 9999-9999', '+99 (99) 99999-9999', '+999 (99) 9999-9999', '+999 (99) 99999-9999'],
|
|
317
|
+
keepStatic: true
|
|
318
|
+
},
|
|
319
|
+
[NgtInputMaskEnum.PLATE]: {
|
|
320
|
+
mask: ['AAA-9999', 'AAA9A99'],
|
|
321
|
+
keepStatic: true
|
|
322
|
+
},
|
|
323
|
+
[NgtInputMaskEnum.CEP]: '99999-999',
|
|
324
|
+
[NgtInputMaskEnum.INTEGER]: {
|
|
325
|
+
max: this.maxValue,
|
|
326
|
+
rightAlign: false
|
|
327
|
+
},
|
|
328
|
+
[NgtInputMaskEnum.TIME]: '99:99',
|
|
329
|
+
};
|
|
330
|
+
if (this.mask == NgtInputMaskEnum.DECIMAL) {
|
|
331
|
+
Inputmask(NgtInputMaskEnum.DECIMAL, masks[this.mask]).mask(this.element.nativeElement);
|
|
332
|
+
}
|
|
333
|
+
else if (this.mask == NgtInputMaskEnum.INTEGER) {
|
|
334
|
+
Inputmask(NgtInputMaskEnum.INTEGER, masks[this.mask]).mask(this.element.nativeElement);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
Inputmask(masks[this.mask]).mask(this.element.nativeElement);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
setupProperties() {
|
|
341
|
+
let props = {
|
|
342
|
+
shortText: {
|
|
343
|
+
htmlType: "text",
|
|
344
|
+
length: 30
|
|
345
|
+
},
|
|
346
|
+
text: {
|
|
347
|
+
htmlType: "text",
|
|
348
|
+
length: 100
|
|
349
|
+
},
|
|
350
|
+
longText: {
|
|
351
|
+
htmlType: "text",
|
|
352
|
+
length: 150
|
|
353
|
+
},
|
|
354
|
+
extraLongText: {
|
|
355
|
+
htmlType: "text",
|
|
356
|
+
length: 300
|
|
357
|
+
},
|
|
358
|
+
password: {
|
|
359
|
+
htmlType: "password",
|
|
360
|
+
length: 150
|
|
361
|
+
},
|
|
362
|
+
email: {
|
|
363
|
+
htmlType: "text",
|
|
364
|
+
length: 100,
|
|
365
|
+
},
|
|
366
|
+
decimal: {
|
|
367
|
+
htmlType: "text",
|
|
368
|
+
length: 9,
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
if (this.type in props) {
|
|
372
|
+
this.inputProperties = props[this.type];
|
|
373
|
+
this.maxLength = this.inputProperties.length;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
console.warn("Type [" + this.type + "] is not a valid tail-form-input type!", this.element.nativeElement);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
minValueValidator() {
|
|
380
|
+
return (control) => parseFloat(control.value) < this.minValue ? { 'minValue': true } : null;
|
|
381
|
+
}
|
|
382
|
+
multipleOfValidator() {
|
|
383
|
+
return (control) => {
|
|
384
|
+
if (control.value) {
|
|
385
|
+
return (control.value % this.multipleOf !== 0) ? { 'multipleOf': true } : null;
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
externalServerDependencyValidator() {
|
|
390
|
+
// TODO: Validar tempo de requisição
|
|
391
|
+
return (control) => !control.value ? { 'externalServerDependency': true } : null;
|
|
392
|
+
}
|
|
393
|
+
timeValidator() {
|
|
394
|
+
const regexExp = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
|
|
395
|
+
return (control) => {
|
|
396
|
+
if (control.value) {
|
|
397
|
+
if (regexExp.test(control.value)) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
return { 'time': true };
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
cnpjCpfValidator() {
|
|
407
|
+
return (control) => {
|
|
408
|
+
if (!control.value) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
if (control.value && control.value.length <= 11) {
|
|
412
|
+
if (this.validatorCPF(control.value)) {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
return { 'cpf': true };
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else if (control.value && control.value.length == 12) {
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
if (control.value && this.validatorCNPJ(control.value)) {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
return { 'cnpj': true };
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
matchValidator() {
|
|
433
|
+
return (control) => {
|
|
434
|
+
if (this.value != this.match) {
|
|
435
|
+
return { 'match': true };
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
emailValidator() {
|
|
443
|
+
if (!this.ngtValidationService) {
|
|
444
|
+
throw new Error("In order to use email validation you must provide a implementation for NgtHttpValidationService class!");
|
|
445
|
+
}
|
|
446
|
+
return (control) => {
|
|
447
|
+
if (this.emailValidatorTimeout) {
|
|
448
|
+
clearTimeout(this.emailValidatorTimeout);
|
|
449
|
+
}
|
|
450
|
+
if (this.value) {
|
|
451
|
+
return new Promise((resolve) => {
|
|
452
|
+
this.emailValidatorTimeout = setTimeout(() => {
|
|
453
|
+
this.loading = true;
|
|
454
|
+
this.ngtValidationService.emailValidation(this.value).then((response) => {
|
|
455
|
+
this.loading = false;
|
|
456
|
+
resolve(response.valid ? null : { 'email': true });
|
|
457
|
+
}).catch(() => {
|
|
458
|
+
this.loading = false;
|
|
459
|
+
resolve(null);
|
|
460
|
+
});
|
|
461
|
+
}, 500);
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
return Promise.resolve(null);
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
async searchExistingResource() {
|
|
468
|
+
if (this.searchExistingResourceTimeout) {
|
|
469
|
+
clearTimeout(this.searchExistingResourceTimeout);
|
|
470
|
+
}
|
|
471
|
+
this.searchExistingResourceTimeout = setTimeout(() => {
|
|
472
|
+
this.loading = true;
|
|
473
|
+
this.findExistingResource.value = this.value;
|
|
474
|
+
this.ngtResourceService.findExisting(this.findExistingResource)
|
|
475
|
+
.then((response) => this.existingResourceId = response.id)
|
|
476
|
+
.catch(() => this.existingResourceId = null)
|
|
477
|
+
.finally(() => this.loading = false);
|
|
478
|
+
}, 500);
|
|
479
|
+
}
|
|
480
|
+
async validatePhone() {
|
|
481
|
+
if (this.phoneValidatorTimeout) {
|
|
482
|
+
clearTimeout(this.phoneValidatorTimeout);
|
|
483
|
+
}
|
|
484
|
+
this.phoneValidatorTimeout = setTimeout(() => {
|
|
485
|
+
this.loading = true;
|
|
486
|
+
this.ngtValidationService.phoneValidation(this.value)
|
|
487
|
+
.then((response) => this.validatePhoneResult.emit(response))
|
|
488
|
+
.finally(() => this.loading = false);
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
uniqueValidator() {
|
|
492
|
+
if (!this.ngtValidationService) {
|
|
493
|
+
throw new Error("In order to use unique validation you must provide a implementation for NgtHttpValidationService class!");
|
|
494
|
+
}
|
|
495
|
+
return (control) => {
|
|
496
|
+
if (this.uniqueValidatorTimeout) {
|
|
497
|
+
clearTimeout(this.uniqueValidatorTimeout);
|
|
498
|
+
}
|
|
499
|
+
if (this.value && this.uniqueResource) {
|
|
500
|
+
return new Promise((resolve) => {
|
|
501
|
+
this.uniqueValidatorTimeout = setTimeout(() => {
|
|
502
|
+
this.loading = true;
|
|
503
|
+
this.ngtValidationService.unique(this.uniqueResource, this.value).then((response) => {
|
|
504
|
+
this.loading = false;
|
|
505
|
+
resolve(response.valid ? null : { 'unique': true });
|
|
506
|
+
}).catch(() => {
|
|
507
|
+
this.loading = false;
|
|
508
|
+
resolve(null);
|
|
509
|
+
});
|
|
510
|
+
}, 500);
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
return Promise.resolve(null);
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
validatorCNPJ(value) {
|
|
517
|
+
let b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
518
|
+
if ((value = value.replace(/[^\d]/g, "")).length != 14) {
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
if (/0{14}/.test(value)) {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
let n = 0;
|
|
525
|
+
for (let i = 0; i < 12; n += value[i] * b[++i]) {
|
|
526
|
+
;
|
|
527
|
+
}
|
|
528
|
+
if (value[12] != (((n %= 11) < 2) ? 0 : 11 - n)) {
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
n = 0;
|
|
532
|
+
for (let i = 0; i <= 12; n += value[i] * b[i++]) {
|
|
533
|
+
;
|
|
534
|
+
}
|
|
535
|
+
if (value[13] != (((n %= 11) < 2) ? 0 : 11 - n)) {
|
|
536
|
+
return false;
|
|
537
|
+
}
|
|
538
|
+
return true;
|
|
539
|
+
}
|
|
540
|
+
;
|
|
541
|
+
validatorCPF(value) {
|
|
542
|
+
let numeros, digitos, soma, i, resultado, digitos_iguais;
|
|
543
|
+
digitos_iguais = 1;
|
|
544
|
+
if (value.length < 11) {
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
for (i = 0; i < value.length - 1; i++) {
|
|
548
|
+
if (value.charAt(i) != value.charAt(i + 1)) {
|
|
549
|
+
digitos_iguais = 0;
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (!digitos_iguais) {
|
|
554
|
+
numeros = value.substring(0, 9);
|
|
555
|
+
digitos = value.substring(9);
|
|
556
|
+
soma = 0;
|
|
557
|
+
for (i = 10; i > 1; i--) {
|
|
558
|
+
soma += numeros.charAt(10 - i) * i;
|
|
559
|
+
}
|
|
560
|
+
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
|
|
561
|
+
if (resultado != digitos.charAt(0)) {
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
numeros = value.substring(0, 10);
|
|
565
|
+
soma = 0;
|
|
566
|
+
for (i = 11; i > 1; i--) {
|
|
567
|
+
soma += numeros.charAt(11 - i) * i;
|
|
568
|
+
}
|
|
569
|
+
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
|
|
570
|
+
if (resultado != digitos.charAt(1)) {
|
|
571
|
+
return false;
|
|
572
|
+
}
|
|
573
|
+
return true;
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
getNativeValue() {
|
|
580
|
+
return this.element.nativeElement.value;
|
|
581
|
+
}
|
|
582
|
+
getElementTitle() {
|
|
583
|
+
return this.element.nativeElement.parentElement.parentElement.title;
|
|
584
|
+
}
|
|
585
|
+
removeMasks(value) {
|
|
586
|
+
if (this.mask == "decimal") {
|
|
587
|
+
value = (value + "")
|
|
588
|
+
.replace(/\./g, '')
|
|
589
|
+
.replace(',', '.');
|
|
590
|
+
}
|
|
591
|
+
else if (this.mask == "cnpj-cpf" || this.mask == "cpf" || this.mask == "cnpj" || this.mask == "cnpj-cpf-rut") {
|
|
592
|
+
value = (value + "")
|
|
593
|
+
.replace('.', '')
|
|
594
|
+
.replace('.', '')
|
|
595
|
+
.replace('-', '')
|
|
596
|
+
.replace('/', '');
|
|
597
|
+
}
|
|
598
|
+
else if (this.mask == NgtInputMaskEnum.CELLPHONE
|
|
599
|
+
|| this.mask == NgtInputMaskEnum.INTERNATIONAL_PHONE) {
|
|
600
|
+
value = (value + "")
|
|
601
|
+
.replace('(', '')
|
|
602
|
+
.replace(')', '')
|
|
603
|
+
.replace(' ', '')
|
|
604
|
+
.replace(' ', '')
|
|
605
|
+
.replace('-', '')
|
|
606
|
+
.replace('+', '');
|
|
607
|
+
}
|
|
608
|
+
return value;
|
|
609
|
+
}
|
|
610
|
+
hasEmailServiceValidation() {
|
|
611
|
+
return typeof this.ngtValidationService.emailValidation === 'function';
|
|
612
|
+
}
|
|
613
|
+
destroySubscriptions() {
|
|
614
|
+
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
615
|
+
this.subscriptions = [];
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
NgtInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgtInputComponent, deps: [{ token: i0.Injector }, { token: i1.NgtStylizableDirective, optional: true, self: true }, { token: i2.ControlContainer, host: true, optional: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i0.Renderer2 }, { token: i4.NgtHttpValidationService, optional: true, skipSelf: true }, { token: i5.NgtHttpResourceService, optional: true, skipSelf: true }, { token: i0.ChangeDetectorRef }, { token: i6.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
619
|
+
NgtInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NgtInputComponent, selector: "ngt-input", inputs: { label: "label", placeholder: "placeholder", shining: "shining", loading: "loading", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText", innerLeftIcon: "innerLeftIcon", innerLeftIconColor: "innerLeftIconColor", innerRightIcon: "innerRightIcon", innerRightIconColor: "innerRightIconColor", decimalMaskPrecision: "decimalMaskPrecision", showCharactersLength: "showCharactersLength", isDisabled: "isDisabled", isReadonly: "isReadonly", showRoundedIcon: "showRoundedIcon", type: "type", name: "name", mask: "mask", focus: "focus", allowClear: "allowClear", jit: "jit", findExistingResource: "findExistingResource", allowPhoneValidation: "allowPhoneValidation", isRequired: "isRequired", uniqueResource: "uniqueResource", minValue: "minValue", maxValue: "maxValue", maxLength: "maxLength", minLength: "minLength", match: "match", multipleOf: "multipleOf", externalServerDependency: "externalServerDependency" }, outputs: { onClickLeftIcon: "onClickLeftIcon", onClickRightIcon: "onClickRightIcon", validatePhoneResult: "validatePhoneResult" }, providers: [
|
|
620
|
+
NgtMakeProvider(NgtInputComponent),
|
|
621
|
+
], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'fontCase']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"isDisabled\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" #element>\n <span *ngIf=\"innerLeftIcon\" class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\n </span>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"allowClear && value && !loading\" class=\"self-center right-0 px-2 text-red-400 cursor-pointer\"\n (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\" class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i9.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i10.NgtSvgComponent, selector: "ngt-svg", inputs: ["src", "class"] }, { kind: "component", type: i11.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize"] }], viewProviders: [
|
|
622
|
+
{ provide: ControlContainer, useExisting: NgForm }
|
|
623
|
+
] });
|
|
624
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgtInputComponent, decorators: [{
|
|
625
|
+
type: Component,
|
|
626
|
+
args: [{ selector: 'ngt-input', providers: [
|
|
627
|
+
NgtMakeProvider(NgtInputComponent),
|
|
628
|
+
], viewProviders: [
|
|
629
|
+
{ provide: ControlContainer, useExisting: NgForm }
|
|
630
|
+
], template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'fontCase']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"isDisabled\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" #element>\n <span *ngIf=\"innerLeftIcon\" class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\n </span>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"allowClear && value && !loading\" class=\"self-center right-0 px-2 text-red-400 cursor-pointer\"\n (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\" class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
631
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NgtStylizableDirective, decorators: [{
|
|
632
|
+
type: Self
|
|
633
|
+
}, {
|
|
634
|
+
type: Optional
|
|
635
|
+
}] }, { type: i2.ControlContainer, decorators: [{
|
|
636
|
+
type: Optional
|
|
637
|
+
}, {
|
|
638
|
+
type: Host
|
|
639
|
+
}] }, { type: i3.NgtFormComponent, decorators: [{
|
|
640
|
+
type: Optional
|
|
641
|
+
}, {
|
|
642
|
+
type: SkipSelf
|
|
643
|
+
}] }, { type: i0.Renderer2 }, { type: i4.NgtHttpValidationService, decorators: [{
|
|
644
|
+
type: Optional
|
|
645
|
+
}, {
|
|
646
|
+
type: SkipSelf
|
|
647
|
+
}] }, { type: i5.NgtHttpResourceService, decorators: [{
|
|
648
|
+
type: Optional
|
|
649
|
+
}, {
|
|
650
|
+
type: SkipSelf
|
|
651
|
+
}] }, { type: i0.ChangeDetectorRef }, { type: i6.NgtTranslateService, decorators: [{
|
|
652
|
+
type: Optional
|
|
653
|
+
}] }]; }, propDecorators: { element: [{
|
|
654
|
+
type: ViewChild,
|
|
655
|
+
args: ["element", { static: true }]
|
|
656
|
+
}], label: [{
|
|
657
|
+
type: Input
|
|
658
|
+
}], placeholder: [{
|
|
659
|
+
type: Input
|
|
660
|
+
}], shining: [{
|
|
661
|
+
type: Input
|
|
662
|
+
}], loading: [{
|
|
663
|
+
type: Input
|
|
664
|
+
}], helpTitle: [{
|
|
665
|
+
type: Input
|
|
666
|
+
}], helpTextColor: [{
|
|
667
|
+
type: Input
|
|
668
|
+
}], helpText: [{
|
|
669
|
+
type: Input
|
|
670
|
+
}], innerLeftIcon: [{
|
|
671
|
+
type: Input
|
|
672
|
+
}], innerLeftIconColor: [{
|
|
673
|
+
type: Input
|
|
674
|
+
}], innerRightIcon: [{
|
|
675
|
+
type: Input
|
|
676
|
+
}], innerRightIconColor: [{
|
|
677
|
+
type: Input
|
|
678
|
+
}], decimalMaskPrecision: [{
|
|
679
|
+
type: Input
|
|
680
|
+
}], showCharactersLength: [{
|
|
681
|
+
type: Input
|
|
682
|
+
}], isDisabled: [{
|
|
683
|
+
type: Input
|
|
684
|
+
}], isReadonly: [{
|
|
685
|
+
type: Input
|
|
686
|
+
}], showRoundedIcon: [{
|
|
687
|
+
type: Input
|
|
688
|
+
}], type: [{
|
|
689
|
+
type: Input
|
|
690
|
+
}], name: [{
|
|
691
|
+
type: Input
|
|
692
|
+
}], mask: [{
|
|
693
|
+
type: Input
|
|
694
|
+
}], focus: [{
|
|
695
|
+
type: Input
|
|
696
|
+
}], allowClear: [{
|
|
697
|
+
type: Input
|
|
698
|
+
}], jit: [{
|
|
699
|
+
type: Input
|
|
700
|
+
}], findExistingResource: [{
|
|
701
|
+
type: Input
|
|
702
|
+
}], allowPhoneValidation: [{
|
|
703
|
+
type: Input
|
|
704
|
+
}], isRequired: [{
|
|
705
|
+
type: Input
|
|
706
|
+
}], uniqueResource: [{
|
|
707
|
+
type: Input
|
|
708
|
+
}], minValue: [{
|
|
709
|
+
type: Input
|
|
710
|
+
}], maxValue: [{
|
|
711
|
+
type: Input
|
|
712
|
+
}], maxLength: [{
|
|
713
|
+
type: Input
|
|
714
|
+
}], minLength: [{
|
|
715
|
+
type: Input
|
|
716
|
+
}], match: [{
|
|
717
|
+
type: Input
|
|
718
|
+
}], multipleOf: [{
|
|
719
|
+
type: Input
|
|
720
|
+
}], externalServerDependency: [{
|
|
721
|
+
type: Input
|
|
722
|
+
}], onClickLeftIcon: [{
|
|
723
|
+
type: Output
|
|
724
|
+
}], onClickRightIcon: [{
|
|
725
|
+
type: Output
|
|
726
|
+
}], validatePhoneResult: [{
|
|
727
|
+
type: Output
|
|
728
|
+
}] } });
|
|
729
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFFBQVEsRUFDUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUc1RixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFckMsTUFBTSxDQUFOLElBQVksZ0JBWVg7QUFaRCxXQUFZLGdCQUFnQjtJQUN4QiwrQkFBVyxDQUFBO0lBQ1gsaUNBQWEsQ0FBQTtJQUNiLHlDQUFxQixDQUFBO0lBQ3JCLGlEQUE2QixDQUFBO0lBQzdCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0lBQ3ZCLG1DQUFlLENBQUE7SUFDZiwrQkFBVyxDQUFBO0lBQ1gsdUNBQW1CLENBQUE7SUFDbkIsaUNBQWEsQ0FBQTtJQUNiLCtEQUEyQyxDQUFBO0FBQy9DLENBQUMsRUFaVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBWTNCO0FBYUQsTUFBTSxPQUFP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VSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxHQUFHO3NCQUFsQixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFFVyxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLGdCQUFnQjtzQkFBaEMsTUFBTTtnQkFDVSxtQkFBbUI7c0JBQW5DLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZUludGVyZmFjZSxcbiAgICBOZ3RIdHRwRmluZEV4aXN0aW5nUmVzb3VyY2VSZXNwb25zZSxcbiAgICBOZ3RIdHRwUmVzb3VyY2VTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSwgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtaHR0cC12YWxpZGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcblxubGV0IElucHV0bWFzayA9IHJlcXVpcmUoJ2lucHV0bWFzaycpO1xuXG5leHBvcnQgZW51bSBOZ3RJbnB1dE1hc2tFbnVtIHtcbiAgICBDUEYgPSAnY3BmJyxcbiAgICBDTlBKID0gJ2NucGonLFxuICAgIENQRl9DTlBKID0gJ2NucGotY3BmJyxcbiAgICBDUEZfQ05QSl9SVVQgPSAnY25wai1jcGYtcnV0JyxcbiAgICBERUNJTUFMID0gJ2RlY2ltYWwnLFxuICAgIENFTExQSE9ORSA9ICdjZWxscGhvbmUnLFxuICAgIFBMQVRFID0gJ3BsYXRlJyxcbiAgICBDRVAgPSAnY2VwJyxcbiAgICBJTlRFR0VSID0gJ2ludGVnZXInLFxuICAgIFRJTUUgPSAndGltZScsXG4gICAgSU5URVJOQVRJT05BTF9QSE9ORSA9ICdpbnRlcm5hdGlvbmFsLXBob25lJ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWlucHV0LmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTmd0TWFrZVByb3ZpZGVyKE5ndElucHV0Q29tcG9uZW50KSxcbiAgICBdLFxuICAgIHZpZXdQcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5ndElucHV0Q29tcG9uZW50IGV4dGVuZHMgTmd0QmFzZU5nTW9kZWwgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQFZpZXdDaGlsZChcImVsZW1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvLyBWaXN1YWxcbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaGluaW5nOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHRDb2xvcjogc3RyaW5nID0gJ3RleHQtZ3JlZW4tNTAwJztcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJMZWZ0SWNvbjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lckxlZnRJY29uQ29sb3I6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJSaWdodEljb246IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJSaWdodEljb25Db2xvcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWNpbWFsTWFza1ByZWNpc2lvbjogbnVtYmVyID0gMjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0NoYXJhY3RlcnNMZW5ndGg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vQmVoYXZpb3JcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZWFkb25seTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1JvdW5kZWRJY29uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSAndGV4dCc7XG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgbWFzazogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmb2N1czogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYWxsb3dDbGVhcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaml0OiBib29sZWFuO1xuXG4gICAgLy9WYWxpZGF0aW9uc1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaW5kRXhpc3RpbmdSZXNvdXJjZTogTmd0SHR0cEZpbmRFeGlzdGluZ1Jlc291cmNlSW50ZXJmYWNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1Bob25lVmFsaWRhdGlvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZXF1aXJlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdW5pcXVlUmVzb3VyY2U6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluVmFsdWU6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4VmFsdWU6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIG1pbkxlbmd0aDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXRjaDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZU9mOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIGV4dGVybmFsU2VydmVyRGVwZW5kZW5jeTogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGlja0xlZnRJY29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGlja1JpZ2h0SWNvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIHZhbGlkYXRlUGhvbmVSZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBwdWJsaWMgbWF4VG90YWxDaGFyc0NvdW50OiBudW1iZXI7XG4gICAgcHVibGljIGV4aXN0aW5nUmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaW5wdXRQcm9wZXJ0aWVzOiB7XG4gICAgICAgIGh0bWxUeXBlPzogc3RyaW5nO1xuICAgICAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgfSA9IHt9O1xuXG4gICAgcHVibGljIG5ndFN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcblxuICAgIHByaXZhdGUgZW1haWxWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBwaG9uZVZhbGlkYXRvclRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHVuaXF1ZVZhbGlkYXRvclRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHByaXZhdGUgbmd0U3R5bGl6YWJsZURpcmVjdGl2ZTogTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKVxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtQ29tcG9uZW50OiBOZ3RGb3JtQ29tcG9uZW50LFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0VmFsaWRhdGlvblNlcnZpY2U6IE5ndEh0dHBWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RSZXNvdXJjZVNlcnZpY2U6IE5ndEh0dHBSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gc2hpbmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSB0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUuZ2V0Tmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmd0U3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0SW5wdXQnLCB7XG4gICAgICAgICAgICBoOiAnaC0xMicsXG4gICAgICAgICAgICByb3VuZGVkOiAncm91bmRlZCcsXG4gICAgICAgICAgICB0ZXh0OiAndGV4dC1zbScsXG4gICAgICAgICAgICBmb250Q2FzZTogJycsXG4gICAgICAgICAgICBjb2xvcjoge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogJ2JvcmRlci1ncmF5LTQwMCBmb2N1czpib3JkZXItZ3JheS03MDAnLFxuICAgICAgICAgICAgICAgIGJnOiAnYmctYmctd2hpdGUgZm9jdXM6Ymctd2hpdGUnLFxuICAgICAgICAgICAgICAgIHRleHQ6ICd0ZXh0LWdyYXktODAwJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9jdXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG5cbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuc2V0dXBNYXNrcyhjaGFuZ2VzLm1hc2sgPyBjaGFuZ2VzLm1hc2sucHJldmlvdXNWYWx1ZSA6IG51bGwpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLm1hdGNoIHx8IGNoYW5nZXMuaXNSZXF1aXJlZCB8fCBjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5tYXNrIHx8IGNoYW5nZXMubWluVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGFuZ2UodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLm1hc2sgPT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmdldE5hdGl2ZVZhbHVlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuYXRpdmVWYWx1ZSA9IHRoaXMuZ2V0TmF0aXZlVmFsdWUoKTtcblxuICAgICAgICBpZiAodGhpcy5tYXNrKSB7XG4gICAgICAgICAgICBsZXQgbmdNb2RlbFZhbHVlID0gdGhpcy5yZW1vdmVNYXNrcyhuYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuYXRpdmVWYWx1ZSAmJiBuZ01vZGVsVmFsdWUgIT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZ01vZGVsVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAodGhpcy5tYXNrID09IE5ndElucHV0TWFza0VudW0uQ0VMTFBIT05FIHx8IHRoaXMubWFzayA9PSBOZ3RJbnB1dE1hc2tFbnVtLklOVEVSTkFUSU9OQUxfUEhPTkUpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5hbGxvd1Bob25lVmFsaWRhdGlvbiAmJiB0aGlzLnZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGhvbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZ01vZGVsVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIG5nTW9kZWxWYWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZ01vZGVsVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG5hdGl2ZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBuZ01vZGVsVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFJlc291cmNlU2VydmljZSAmJiB0aGlzLmZpbmRFeGlzdGluZ1Jlc291cmNlICYmIHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRXhpc3RpbmdSZXNvdXJjZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgYmUgaW5zaWRlIGEgPGZvcm0gI2Zvcm09J25nRm9ybSc+IHRhZyFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZSFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRFbGVtZW50VGl0bGUoKSB8fCB0aGlzLmdldEVsZW1lbnRUaXRsZSgpID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50aXRsZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0UGFkZGluZ3MoKSB7XG4gICAgICAgIGxldCBwYWRkaW5nQ2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIGlmICh0aGlzLmlubmVyTGVmdEljb24pIHtcbiAgICAgICAgICAgIHBhZGRpbmdDbGFzcyArPSAncGwtOCBwci00ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3B4LTQgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMuYWxsb3dDbGVhciB8fCB0aGlzLnR5cGUgPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDbGVhciAmJiB0aGlzLnZhbHVlICYmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMudHlwZSA9PSAncGFzc3dvcmQnKSkge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdDbGFzcyArPSAncHItMTYgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwci04ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFkZGluZ0NsYXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93UGFzc3dvcmQoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnR5cGUgPSAndGV4dCc7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlUGFzc3dvcmQoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ubmF0aXZlRWxlbWVudD8udmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLm1heFRvdGFsQ2hhcnNDb3VudCAtIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4VG90YWxDaGFyc0NvdW50IC0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm1heFRvdGFsQ2hhcnNDb3VudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1Db250YWluZXIgJiYgdGhpcy5mb3JtQ29udGFpbmVyLmNvbnRyb2wgJiYgKHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1cygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgd2F0Y2ggPSBcImNoYW5nZVwiO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5qaXQpIHtcbiAgICAgICAgICAgICAgICB3YXRjaCArPSBcIiBrZXl1cCBrZXlkb3duIGtleXByZXNzXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdhdGNoLnNwbGl0KCcgJykuZm9yRWFjaCgoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGV2dCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmF0aXZlVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKHRoaXMuZ2V0TmF0aXZlVmFsdWUoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbmF0aXZlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuYXRpdmVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50ICYmIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlICYmIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aCA+PSB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrc3BhY2UgYW5kIGRlbGV0ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSA4ICYmIGV2ZW50LmtleUNvZGUgIT0gNDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm1heFRvdGFsQ2hhcnNDb3VudCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBcImtleXByZXNzXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaFZhbGlkYXRvcigpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXR1cFByb3BlcnRpZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN5bmNWYWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnZW1haWwnKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heExlbmd0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMubWluTGVuZ3RoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXNrID09ICdjbnBqLWNwZicgfHwgdGhpcy5tYXNrID09ICdjbnBqLWNwZi1ydXQnIHx8IHRoaXMubWFzayA9PSAnY3BmJykge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmNucGpDcGZWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXNrID09ICd0aW1lJykge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnRpbWVWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXRjaCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLm1hdGNoVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLm1pblZhbHVlVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVPZikge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLm11bHRpcGxlT2ZWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHRlcm5hbFNlcnZlckRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy5leHRlcm5hbFNlcnZlckRlcGVuZGVuY3lWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy51bmlxdWVSZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMudW5pcXVlVmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09ICdlbWFpbCcgJiYgdGhpcy5oYXNFbWFpbFNlcnZpY2VWYWxpZGF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmVtYWlsVmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBNYXNrcyhwcmV2aW91c01hc2s/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubWFzayAhPSBwcmV2aW91c01hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgICAgICAgSW5wdXRtYXNrLnJlbW92ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXNrcyA9IHtcbiAgICAgICAgICAgIFtOZ3RJbnB1dE1hc2tFbnVtLkNQRl06ICc5OTkuOTk5Ljk5OS05OScsXG4gICAgICAgICAgICBbTmd0SW5wdXRNYXNrRW51bS5DTlBKXTogJzk5Ljk5OS45OTkvOTk5OS05OScsXG4gICAgICAgICAgICBbTmd0SW5wdXRNYXNrRW51bS5DUEZfQ05QSl9SVVRdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTkuOTk5Ljk5OS05OScsICc5OTk5OTk5OTk5OTknLCAnOTkuOTk5Ljk5OS85OTk5LTk5J10sXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtOZ3RJbnB1dE1hc2tFbnVtLkNQRl9DTlBKXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5Ljk5OS45OTktOTknLCAnOTkuOTk5Ljk5OS85OTk5LTk5J10sXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtOZ3RJbnB1dE1hc2tFbnVtLkRFQ0lNQUxdOiB7XG4gICAgICAgICAgICAgICAgZGlnaXRzOiB0aGlzLmRlY2ltYWxNYXNrUHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgIGdyb3VwU2VwYXJhdG9yOiAnLicsXG4gICAgICAgICAgICAgICAgcmFkaXhQb2ludDogJywnLFxuICAgICAgICAgICAgICAgIGF1dG9Hcm91cDogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXBlYXQ6IDE2LFxuICAgICAgICAgICAgICAgIHJpZ2h0QWxpZ246IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTmd0SW5wdXRNYXNrRW51bS5DRUxMUEhPTkVdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWycoOTkpIDk5OS05OTknLCAnKDk5KSA5OTk5LTk5OTknLCAnKDk5KSA5OTk5OS05OTk5J10sXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtOZ3RJbnB1dE1hc2tFbnVtLklOVEVSTkFUSU9OQUxfUEhPTkVdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWycrOTk5IDk5IDk5OS05OTknLCAnKzk5ICg5OSkgOTk5OS05OTk5JywgJys5OSAoOTkpIDk5OTk5LTk5OTknLCAnKzk5OSAoOTkpIDk5OTktOTk5OScsICcrOTk5ICg5OSkgOTk5OTktOTk5OSddLFxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTmd0SW5wdXRNYXNrRW51bS5QTEFURV06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJ0FBQS05OTk5JywgJ0FBQTlBOTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW05ndElucHV0TWFza0VudW0uQ0VQXTogJzk5OTk5LTk5OScsXG4gICAgICAgICAgICBbTmd0SW5wdXRNYXNrRW51bS5JTlRFR0VSXToge1xuICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhWYWx1ZSxcbiAgICAgICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtOZ3RJbnB1dE1hc2tFbnVtLlRJTUVdOiAnOTk6OTknLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gTmd0SW5wdXRNYXNrRW51bS5ERUNJTUFMKSB7XG4gICAgICAgICAgICBJbnB1dG1hc2soTmd0SW5wdXRNYXNrRW51bS5ERUNJTUFMLCBtYXNrc1t0aGlzLm1hc2tdKS5tYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc2sgPT0gTmd0SW5wdXRNYXNrRW51bS5JTlRFR0VSKSB7XG4gICAgICAgICAgICBJbnB1dG1hc2soTmd0SW5wdXRNYXNrRW51bS5JTlRFR0VSLCBtYXNrc1t0aGlzLm1hc2tdKS5tYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIElucHV0bWFzayhtYXNrc1t0aGlzLm1hc2tdKS5tYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBQcm9wZXJ0aWVzKCkge1xuICAgICAgICBsZXQgcHJvcHMgPSB7XG4gICAgICAgICAgICBzaG9ydFRleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb25nVGV4dDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE1MFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4dHJhTG9uZ1RleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNTBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEwMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWNpbWFsOiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogOSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy50eXBlIGluIHByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0UHJvcGVydGllcyA9IHByb3BzW3RoaXMudHlwZV07XG4gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IHRoaXMuaW5wdXRQcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlR5cGUgW1wiICsgdGhpcy50eXBlICsgXCJdIGlzIG5vdCBhIHZhbGlkIHRhaWwtZm9ybS1pbnB1dCB0eXBlIVwiLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1pblZhbHVlVmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKSA8IHRoaXMubWluVmFsdWUgPyB7ICdtaW5WYWx1ZSc6IHRydWUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtdWx0aXBsZU9mVmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnRyb2wudmFsdWUgJSB0aGlzLm11bHRpcGxlT2YgIT09IDApID8geyAnbXVsdGlwbGVPZic6IHRydWUgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRlcm5hbFNlcnZlckRlcGVuZGVuY3lWYWxpZGF0b3IoKSB7XG4gICAgICAgIC8vIFRPRE86IFZhbGlkYXIgdGVtcG8gZGUgcmVxdWlzacOnw6NvXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiAhY29udHJvbC52YWx1ZSA/IHsgJ2V4dGVybmFsU2VydmVyRGVwZW5kZW5jeSc6IHRydWUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0aW1lVmFsaWRhdG9yKCkge1xuICAgICAgICBjb25zdCByZWdleEV4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtM10pOlswLTVdWzAtOV0kJyk7XG5cbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2V4RXhwLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJ3RpbWUnOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY25wakNwZlZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA8PSAxMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRvckNQRihjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnY3BmJzogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA9PSAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiB0aGlzLnZhbGlkYXRvckNOUEooY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJ2NucGonOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWF0Y2hWYWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSB0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgJ21hdGNoJzogdHJ1ZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtYWlsVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgICAgICBpZiAoIXRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluIG9yZGVyIHRvIHVzZSBlbWFpbCB2YWxpZGF0aW9uIHlvdSBtdXN0IHByb3ZpZGUgYSBpbXBsZW1lbnRhdGlvbiBmb3IgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIGNsYXNzIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5lbWFpbFZhbGlkYXRpb24odGhpcy52YWx1ZSkudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnZhbGlkID8gbnVsbCA6IHsgJ2VtYWlsJzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoRXhpc3RpbmdSZXNvdXJjZVRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UudmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLm5ndFJlc291cmNlU2VydmljZS5maW5kRXhpc3RpbmcodGhpcy5maW5kRXhpc3RpbmdSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZVJlc3BvbnNlKSA9PiB0aGlzLmV4aXN0aW5nUmVzb3VyY2VJZCA9IHJlc3BvbnNlLmlkKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLmV4aXN0aW5nUmVzb3VyY2VJZCA9IG51bGwpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVQaG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucGhvbmVWYWxpZGF0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UucGhvbmVWYWxpZGF0aW9uKHRoaXMudmFsdWUpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMudmFsaWRhdGVQaG9uZVJlc3VsdC5lbWl0KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5pcXVlVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgICAgICBpZiAoIXRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluIG9yZGVyIHRvIHVzZSB1bmlxdWUgdmFsaWRhdGlvbiB5b3UgbXVzdCBwcm92aWRlIGEgaW1wbGVtZW50YXRpb24gZm9yIE5ndEh0dHBWYWxpZGF0aW9uU2VydmljZSBjbGFzcyFcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVuaXF1ZVZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnVuaXF1ZVJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS51bmlxdWUodGhpcy51bmlxdWVSZXNvdXJjZSwgdGhpcy52YWx1ZSkudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyBudWxsIDogeyAndW5pcXVlJzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JDTlBKKHZhbHVlKSB7XG4gICAgICAgIGxldCBiID0gWzYsIDUsIDQsIDMsIDIsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDJdO1xuXG4gICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0vZywgXCJcIikpLmxlbmd0aCAhPSAxNCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8wezE0fS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBuICs9IHZhbHVlW2ldICogYlsrK2ldKSB7XG4gICAgICAgICAgICA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWVbMTJdICE9ICgoKG4gJT0gMTEpIDwgMikgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTI7IG4gKz0gdmFsdWVbaV0gKiBiW2krK10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZVsxM10gIT0gKCgobiAlPSAxMSkgPCAyKSA/IDAgOiAxMSAtIG4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JDUEYodmFsdWUpIHtcbiAgICAgICAgbGV0IG51bWVyb3MsIGRpZ2l0b3MsIHNvbWEsIGksIHJlc3VsdGFkbywgZGlnaXRvc19pZ3VhaXM7XG5cbiAgICAgICAgZGlnaXRvc19pZ3VhaXMgPSAxO1xuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpKSAhPSB2YWx1ZS5jaGFyQXQoaSArIDEpKSB7XG4gICAgICAgICAgICAgICAgZGlnaXRvc19pZ3VhaXMgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWdpdG9zX2lndWFpcykge1xuICAgICAgICAgICAgbnVtZXJvcyA9IHZhbHVlLnN1YnN0cmluZygwLCA5KTtcbiAgICAgICAgICAgIGRpZ2l0b3MgPSB2YWx1ZS5zdWJzdHJpbmcoOSk7XG4gICAgICAgICAgICBzb21hID0gMDtcblxuICAgICAgICAgICAgZm9yIChpID0gMTA7IGkgPiAxOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBzb21hICs9IG51bWVyb3MuY2hhckF0KDEwIC0gaSkgKiBpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRhZG8gPSBzb21hICUgMTEgPCAyID8gMCA6IDExIC0gc29tYSAlIDExO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0YWRvICE9IGRpZ2l0b3MuY2hhckF0KDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBudW1lcm9zID0gdmFsdWUuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICAgICAgICAgIHNvbWEgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAxMTsgaSA+IDE7IGktLSkge1xuICAgICAgICAgICAgICAgIHNvbWEgKz0gbnVtZXJvcy5jaGFyQXQoMTEgLSBpKSAqIGk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdGFkbyA9IHNvbWEgJSAxMSA8IDIgPyAwIDogMTEgLSBzb21hICUgMTE7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRhZG8gIT0gZGlnaXRvcy5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROYXRpdmVWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RWxlbWVudFRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGl0bGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVNYXNrcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gXCJkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwuL2csICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcsJywgJy4nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc2sgPT0gXCJjbnBqLWNwZlwiIHx8IHRoaXMubWFzayA9PSBcImNwZlwiIHx8IHRoaXMubWFzayA9PSBcImNucGpcIiB8fCB0aGlzLm1hc2sgPT0gXCJjbnBqLWNwZi1ydXRcIikge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcuJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy4nLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnLScsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgJycpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYXNrID09IE5ndElucHV0TWFza0VudW0uQ0VMTFBIT05FXG4gICAgICAgICAgICB8fCB0aGlzLm1hc2sgPT0gTmd0SW5wdXRNYXNrRW51bS5JTlRFUk5BVElPTkFMX1BIT05FXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcoJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyknLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnICcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcgJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy0nLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKycsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5lbWFpbFZhbGlkYXRpb24gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95U3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgfVxufVxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cIm1iLTIgZmxleCB7eyBuZ3RTdHlsZS5jb21waWxlKFsnY29sb3IudGV4dCcsICd0ZXh0JywgJ2ZvbnRDYXNlJ10pIH19XCIgW2hpZGRlbl09J3NoaW5pbmcnPlxuICAgIHt7IGxhYmVsIH19OlxuXG4gICAgPHNwYW4gKm5nSWY9XCJpc1JlcXVpcmVkXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgZm9udC1ib2xkIHRleHQtbWQgbWwtMVwiPio8L3NwYW4+XG5cbiAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIiBjbGFzcz1cIm1sLTFcIj5cbiAgICAgICAge3sgaGVscFRleHQgfX1cbiAgICA8L25ndC1oZWxwZXI+XG48L2xhYmVsPlxuXG48ZGl2IGNsYXNzPVwie3sgc2hpbmluZyA/ICdoaWRkZW4nIDogJ2ZsZXggcmVsYXRpdmUnfX1cIj5cbiAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGJvcmRlciBhcHBlYXJhbmNlLW5vbmUgZm9jdXM6b3V0bGluZS1ub25lIGxlYWRpbmctdGlnaHQgdy1mdWxsIHt7IGdldElucHV0UGFkZGluZ3MoKSB9fSB7eyBuZ3RTdHlsZS5jb21waWxlKFsnaCcsICd0ZXh0JywgJ2NvbG9yLmJvcmRlcicsICdjb2xvci5iZycsICdjb2xvci50ZXh0JywgJ3JvdW5kZWQnLCAnY3Vyc29yJ10pIH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiaXNSZWFkb25seSB8fCBsb2FkaW5nXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpbnB1dC1oYXMtZXJyb3IgYm9yZGVyLXJlZC03MDAnOiBmb3JtQ29udHJvbD8uZXJyb3JzICYmIChmb3JtQ29udHJvbD8uZGlydHkgfHwgKGZvcm1Db250YWluZXIgJiYgZm9ybUNvbnRhaW5lclsnc3VibWl0dGVkJ10pKX1cIlxuICAgICAgICBbYXR0ci50eXBlXT1cImlucHV0UHJvcGVydGllcy5odG1sVHlwZVwiICNlbGVtZW50PlxuICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJMZWZ0SWNvblwiIGNsYXNzPVwiYWJzb2x1dGUgc2VsZi1jZW50ZXIgcHgtMiB7eyBpbm5lckxlZnRJY29uQ29sb3IgfX0ge3sgb25DbGlja0xlZnRJY29uID8gJ2N1cnNvci1wb2ludGVyJyA6ICcnIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwib25DbGlja0xlZnRJY29uLmVtaXQoKVwiPlxuXG4gICAgICAgIDxuZ3Qtc3ZnICpuZ0lmPVwiIXNob3dSb3VuZGVkSWNvblwiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgW3NyY109J2lubmVyTGVmdEljb24nPjwvbmd0LXN2Zz5cbiAgICAgICAgPGltZyAqbmdJZj1cInNob3dSb3VuZGVkSWNvblwiIGNsYXNzPVwicm91bmRlZC1mdWxsIGgtNlwiIFtzcmNdPSdpbm5lckxlZnRJY29uJz5cbiAgICA8L3NwYW4+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBhYnNvbHV0ZSBoLWZ1bGwganVzdGlmeS1lbmQgcmlnaHQtMCB3LWF1dG9cIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhbGxvd0NsZWFyICYmIHZhbHVlICYmICFsb2FkaW5nXCIgY2xhc3M9XCJzZWxmLWNlbnRlciByaWdodC0wIHB4LTIgdGV4dC1yZWQtNDAwIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9J2NsZWFySW5wdXQoJGV2ZW50KSc+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiZmlsbC1jdXJyZW50IHNlbGYtY2VudGVyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE5LjEgMTcuMmwtNS4zLTUuMyA1LjMtNS4zLTEuOC0xLjgtNS4zIDUuNC01LjMtNS4zLTEuOCAxLjcgNS4zIDUuMy01LjMgNS4zTDYuNyAxOWw1LjMtNS4zIDUuMyA1LjMgMS44LTEuOHpcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cInNlbGYtY2VudGVyIHJpZ2h0LTAgcHgtMiB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eXBlID09ICdwYXNzd29yZCcgJiYgdmFsdWVcIiBjbGFzcz1cInNlbGYtY2VudGVyIHB4LTIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT0gJ3Bhc3N3b3JkJ1wiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIChjbGljayk9J3Nob3dQYXNzd29yZCgpJz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTS4yIDEwYTExIDExIDAgMCAxIDE5LjYgMEExMSAxMSAwIDAgMSAuMiAxMHptOS44IDRhNCA0IDAgMSAwIDAtOCA0IDQgMCAwIDAgMCA4em0wLTJhMiAyIDAgMSAxIDAtNCAyIDIgMCAwIDEgMCA0elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImVsZW1lbnQudHlwZSA9PSAndGV4dCdcIiBjbGFzcz1cImZpbGwtY3VycmVudFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiAoY2xpY2spPSdoaWRlUGFzc3dvcmQoKSc+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMi44MSA0LjM2bC0xLjc3IDEuNzhhNCA0IDAgMCAwLTQuOSA0LjlsLTIuNzYgMi43NUMyLjA2IDEyLjc5Ljk2IDExLjQ5LjIgMTBhMTEgMTEgMCAwIDEgMTIuNi01LjY0em0zLjggMS44NWMxLjMzIDEgMi40MyAyLjMgMy4yIDMuNzlhMTEgMTEgMCAwIDEtMTIuNjIgNS42NGwxLjc3LTEuNzhhNCA0IDAgMCAwIDQuOS00LjlsMi43Ni0yLjc1em0tLjI1LTMuOTlsMS40MiAxLjQyTDMuNjQgMTcuNzhsLTEuNDItMS40MkwxNi4zNiAyLjIyelwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJSaWdodEljb24gJiYgdHlwZSAhPSAncGFzc3dvcmQnXCIgY2xhc3M9XCJzZWxmLWNlbnRlciBweC0yIHt7IGlubmVyUmlnaHRJY29uQ29sb3IgfX0gIHt7IG9uQ2xpY2tSaWdodEljb24gPyAnY3Vyc29yLXBvaW50ZXInIDogJycgfX1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja1JpZ2h0SWNvbi5lbWl0KClcIj5cbiAgICAgICAgICAgIDxuZ3Qtc3ZnIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgW3NyY109J2lubmVyUmlnaHRJY29uJz48L25ndC1zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NoYXJhY3RlcnNMZW5ndGggJiYgbWF4VG90YWxDaGFyc0NvdW50ICYmICFzaGluaW5nXCI+XG4gICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIG10LTFcIj5cbiAgICAgICAge3sgbmd0VHJhbnNsYXRlU2VydmljZS5uZ3RUZXh0QXJlYVJlbWFpbmluZ0NoYXJhY3RlcnMgfX06XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7IGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB9fTwvc3Bhbj5cbiAgICA8L3A+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hpbmluZyc+XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwie3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnXSkgfX0gdy1mdWxsXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48aW5wdXQgKm5nSWY9J2NvbXBvbmVudFJlYWR5JyB0eXBlPVwiaGlkZGVuXCIgW25nTW9kZWxdPVwidmFsdWVcIiBbbmFtZV09XCJuYW1lXCIgW3ZhbHVlXT1cInZhbHVlXCI+XG5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPG5ndC12YWxpZGF0aW9uIFtjb250cm9sXT1cImZvcm1Db250cm9sXCIgW2NvbnRhaW5lcl09XCJmb3JtQ29udGFpbmVyXCIgW21pblZhbHVlXT0nbWluVmFsdWUnIFttaW5MZW5ndGhdPSdtaW5MZW5ndGgnPlxuPC9uZ3QtdmFsaWRhdGlvbj5cbiJdfQ==
|