@messaia/cdk 17.1.0-rc15 → 17.1.0-rc16
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/esm2022/lib/form-validators/abstract/typed-form.mjs +10 -1
- package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +25 -7
- package/esm2022/lib/form-validators/const/app-validators.const.mjs +2 -2
- package/esm2022/lib/form-validators/const/app.const.mjs +49 -1
- package/esm2022/lib/form-validators/const/config-names.const.mjs +25 -1
- package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +26 -2
- package/esm2022/lib/form-validators/const/events.const.mjs +40 -1
- package/esm2022/lib/form-validators/const/html-elements.const.mjs +19 -1
- package/esm2022/lib/form-validators/const/validator.const.mjs +22 -1
- package/esm2022/lib/form-validators/core/{validator.static.mjs → annotation-types.mjs} +1 -1
- package/esm2022/lib/form-validators/core/default-container.mjs +493 -0
- package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +3 -3
- package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +3 -3
- package/esm2022/lib/form-validators/decorators/and.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/async.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/date.decorator.mjs +3 -3
- package/esm2022/lib/form-validators/decorators/different.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/email.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/even.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/file.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/image.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/json.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/model.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/not.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/or.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/password.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/port.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/range.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/required.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/time.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/decorators/url.decorator.mjs +2 -2
- package/esm2022/lib/form-validators/directives/base-directive.mjs +34 -3
- package/esm2022/lib/form-validators/directives/control-host.directive.mjs +18 -1
- package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +15 -1
- package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +108 -14
- package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +2 -4
- package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +17 -7
- package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +22 -8
- package/esm2022/lib/form-validators/domain/disable-provider.mjs +107 -4
- package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +67 -7
- package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +4 -3
- package/esm2022/lib/form-validators/domain/form-data.mjs +53 -7
- package/esm2022/lib/form-validators/models/control-info.mjs +2 -0
- package/esm2022/lib/form-validators/models/data-sanitizer.mjs +2 -0
- package/esm2022/lib/form-validators/models/decorator-configuration.mjs +2 -0
- package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +35 -13
- package/esm2022/lib/form-validators/models/instance-container.mjs +2 -0
- package/esm2022/lib/form-validators/models/password-validation.model.mjs +1 -1
- package/esm2022/lib/form-validators/models/prop-validation-config.mjs +1 -1
- package/esm2022/lib/form-validators/models/property-info.mjs +2 -0
- package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +2 -2
- package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +2 -2
- package/esm2022/lib/form-validators/services/base-form-builder.mjs +105 -6
- package/esm2022/lib/form-validators/services/form-control.mjs +2 -2
- package/esm2022/lib/form-validators/services/reactive-form.module.mjs +2 -2
- package/esm2022/lib/form-validators/services/rx-form-builder.mjs +479 -39
- package/esm2022/lib/form-validators/services/rx-form-group.mjs +197 -52
- package/esm2022/lib/form-validators/util/date-checker.function.mjs +2 -2
- package/esm2022/lib/form-validators/util/instance-provider.function.mjs +2 -2
- package/esm2022/lib/form-validators/util/relational-checker.function.mjs +2 -2
- package/esm2022/lib/form-validators/util/time-checker.function.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +2 -2
- package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +4 -4
- package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +28 -1
- package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +17 -1
- package/fesm2022/messaia-cdk.mjs +1777 -203
- package/fesm2022/messaia-cdk.mjs.map +1 -1
- package/lib/form-validators/abstract/typed-form.d.ts +9 -0
- package/lib/form-validators/algorithm/luhn-algorithm.d.ts +7 -0
- package/lib/form-validators/const/app.const.d.ts +48 -0
- package/lib/form-validators/const/config-names.const.d.ts +24 -0
- package/lib/form-validators/const/config-required-fields.const.d.ts +3 -0
- package/lib/form-validators/const/events.const.d.ts +39 -0
- package/lib/form-validators/const/html-elements.const.d.ts +18 -0
- package/lib/form-validators/const/validator.const.d.ts +21 -0
- package/lib/form-validators/core/default-container.d.ts +153 -0
- package/lib/form-validators/directives/base-directive.d.ts +17 -0
- package/lib/form-validators/directives/control-host.directive.d.ts +17 -0
- package/lib/form-validators/directives/html-control-template.directive.d.ts +13 -0
- package/lib/form-validators/directives/rx-form.directive.d.ts +34 -3
- package/lib/form-validators/directives/template-validations/async-validation.directive.d.ts +1 -3
- package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +15 -5
- package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +19 -8
- package/lib/form-validators/domain/disable-provider.d.ts +54 -0
- package/lib/form-validators/domain/element-processor/decimal.provider.d.ts +36 -1
- package/lib/form-validators/domain/form-data.d.ts +21 -0
- package/lib/form-validators/models/control-info.d.ts +25 -0
- package/lib/form-validators/models/data-sanitizer.d.ts +13 -0
- package/lib/form-validators/models/decorator-configuration.d.ts +37 -0
- package/lib/form-validators/models/form-builder-configuration.d.ts +33 -0
- package/lib/form-validators/models/instance-container.d.ts +47 -0
- package/lib/form-validators/models/password-validation.model.d.ts +54 -0
- package/lib/form-validators/models/prop-validation-config.d.ts +156 -0
- package/lib/form-validators/models/property-info.d.ts +49 -0
- package/lib/form-validators/services/base-form-builder.d.ts +59 -2
- package/lib/form-validators/services/form-control.d.ts +1 -1
- package/lib/form-validators/services/rx-form-builder.d.ts +197 -1
- package/lib/form-validators/services/rx-form-group.d.ts +121 -0
- package/lib/form-validators/util/instance-provider.function.d.ts +1 -1
- package/lib/form-validators/validators-extension/allOf-validator.extension.d.ts +1 -1
- package/lib/form-validators/validators-extension/alpha-validator.extension.d.ts +1 -1
- package/lib/form-validators/validators-extension/iban-validator.extension.d.ts +1 -1
- package/lib/form-validators/validators-extension/maxLength-validator.extension.d.ts +1 -1
- package/lib/form-validators/validators-function/alpha-validation.function.d.ts +7 -0
- package/lib/form-validators/validators-function/regex-validation.function.d.ts +16 -0
- package/package.json +1 -1
- package/esm2022/lib/form-validators/core/defaultContainer.mjs +0 -257
- package/esm2022/lib/form-validators/core/validator.interface.mjs +0 -2
- package/lib/form-validators/core/defaultContainer.d.ts +0 -18
- package/lib/form-validators/core/validator.interface.d.ts +0 -62
- /package/lib/form-validators/core/{validator.static.d.ts → annotation-types.d.ts} +0 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import { ARRAY_PROPERTY, OBJECT_PROPERTY, PROPERTY, RXCODE } from "../const";
|
|
2
|
+
import { DECORATORS } from "../const/decorators.const";
|
|
3
|
+
import { Linq } from "../util/linq";
|
|
4
|
+
import { AnnotationTypes } from "./annotation-types";
|
|
5
|
+
/**
|
|
6
|
+
* Represents a default container for managing instance configurations.
|
|
7
|
+
*
|
|
8
|
+
* Manages the configuration and instantiation of validation decorators, sanitizers, and other properties for classes.
|
|
9
|
+
* This class serves as a container for managing instance-related configurations and properties.
|
|
10
|
+
*/
|
|
11
|
+
export class DefaultContainer {
|
|
12
|
+
/**
|
|
13
|
+
* Represents whether the container is operating in experimental mode.
|
|
14
|
+
* Experimental mode may introduce features that are still under development or testing.
|
|
15
|
+
*/
|
|
16
|
+
isExperimental = false;
|
|
17
|
+
/**
|
|
18
|
+
* Array containing instances and their configurations.
|
|
19
|
+
* Each element represents an instance of the application with associated properties and decorators.
|
|
20
|
+
*/
|
|
21
|
+
instances = [];
|
|
22
|
+
/**
|
|
23
|
+
* Counter used for generating unique identifiers for model instances.
|
|
24
|
+
* This counter is incremented each time a new model instance is added to the container.
|
|
25
|
+
*/
|
|
26
|
+
modelIncrementCount = 0;
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves an instance container based on the provided instance function.
|
|
29
|
+
* @param instanceFunc The instance function.
|
|
30
|
+
* @returns The instance container.
|
|
31
|
+
*/
|
|
32
|
+
get(instanceFunc) {
|
|
33
|
+
return this.instances.filter(instance => instance.instance === instanceFunc)[0];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves or creates an instance container based on the provided parameters.
|
|
37
|
+
* @param target The target.
|
|
38
|
+
* @param parameterIndex The parameter index.
|
|
39
|
+
* @param propertyKey The property key.
|
|
40
|
+
* @param decoratorType The decorator type.
|
|
41
|
+
* @returns The instance container.
|
|
42
|
+
*/
|
|
43
|
+
getInstance(target, parameterIndex, propertyKey, decoratorType) {
|
|
44
|
+
/* Determine if the property key is defined */
|
|
45
|
+
let isPropertyKey = (propertyKey != undefined);
|
|
46
|
+
/* Get the instance function based on whether the property key is defined */
|
|
47
|
+
let instanceFunc = !isPropertyKey ? target : target.constructor;
|
|
48
|
+
/* Filter instances to find the one matching the instance function */
|
|
49
|
+
let instance = this.instances.filter(instance => instance.instance === instanceFunc)[0];
|
|
50
|
+
/* If no instance is found, create a new instance container */
|
|
51
|
+
if (!instance) {
|
|
52
|
+
instance = this.addInstanceContainer(instanceFunc);
|
|
53
|
+
}
|
|
54
|
+
/* Return the instance container */
|
|
55
|
+
return instance;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Adds property configurations to the instance container.
|
|
59
|
+
* @param target The target.
|
|
60
|
+
* @param configs The configurations.
|
|
61
|
+
*/
|
|
62
|
+
addPropsConfig(target, configs) {
|
|
63
|
+
/* Find the instance container associated with the target */
|
|
64
|
+
let instanceContainer = this.instances.find(instance => instance.instance === target);
|
|
65
|
+
/* Check if the instance container exists */
|
|
66
|
+
if (instanceContainer) {
|
|
67
|
+
/* Iterate through the provided configurations or an empty array if none are provided */
|
|
68
|
+
for (let config of configs ?? []) {
|
|
69
|
+
/* Iterate through the property names in the configuration */
|
|
70
|
+
for (let prop of config.propNames) {
|
|
71
|
+
/* Find the property info in the instance container's properties */
|
|
72
|
+
let propertyInfo = instanceContainer.properties?.find(t => t.name == prop && (t.propertyType !== OBJECT_PROPERTY && t.propertyType !== ARRAY_PROPERTY));
|
|
73
|
+
/* If the property info exists, add property configuration */
|
|
74
|
+
if (propertyInfo) {
|
|
75
|
+
this.addPropConfig(target, [propertyInfo], config);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
/* If the property name is ':all:', add property configuration for all properties */
|
|
79
|
+
if (prop === ":all:") {
|
|
80
|
+
this.addPropConfig(target, instanceContainer.properties?.filter(t => t.propertyType !== OBJECT_PROPERTY && t.propertyType !== ARRAY_PROPERTY), config);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (configs === undefined) {
|
|
87
|
+
/* If the instance container does not exist and no configurations are provided, create a new instance container */
|
|
88
|
+
this.addInstanceContainer(target);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Adds a property configuration to the instance container.
|
|
93
|
+
* @param target The target.
|
|
94
|
+
* @param properties The properties.
|
|
95
|
+
* @param config The configuration.
|
|
96
|
+
*/
|
|
97
|
+
addPropConfig(target, properties, config) {
|
|
98
|
+
/* Iterates through the provided properties and applies configurations based on the provided config object */
|
|
99
|
+
for (var propertyInfo of properties) {
|
|
100
|
+
let excludeProp = false;
|
|
101
|
+
/* Check if excludePropNames exist in the config */
|
|
102
|
+
if (config.excludePropNames) {
|
|
103
|
+
/* Check if the current property should be excluded based on its name */
|
|
104
|
+
excludeProp = config.excludePropNames.find(t => t == propertyInfo.name) !== undefined;
|
|
105
|
+
}
|
|
106
|
+
/* If the property should not be excluded */
|
|
107
|
+
if (!excludeProp) {
|
|
108
|
+
/* Apply validation configurations */
|
|
109
|
+
if (config.validationConfig) {
|
|
110
|
+
/* Iterate through the validation configurations */
|
|
111
|
+
for (let typeName in config.validationConfig) {
|
|
112
|
+
/* Initialize validation for the property */
|
|
113
|
+
this.init({ constructor: target }, 0, propertyInfo.name, typeName, config.validationConfig[typeName] === true ? undefined : config.validationConfig[typeName], false);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/* Apply error decorator configuration */
|
|
117
|
+
if (config.error) {
|
|
118
|
+
this.addDecoratorConfig({ constructor: target }, 0, propertyInfo.name, config.error, DECORATORS.error);
|
|
119
|
+
}
|
|
120
|
+
/* Apply disable decorator configuration */
|
|
121
|
+
if (config.disable) {
|
|
122
|
+
this.addDecoratorConfig({ constructor: target }, 0, propertyInfo.name, config.disable, DECORATORS.disabled);
|
|
123
|
+
}
|
|
124
|
+
/* Apply elementClass decorator configuration */
|
|
125
|
+
if (config.elementClass) {
|
|
126
|
+
this.addDecoratorConfig({ constructor: target }, 0, propertyInfo.name, config.elementClass, DECORATORS.elementClass);
|
|
127
|
+
}
|
|
128
|
+
/* Apply ignore configuration */
|
|
129
|
+
if (config.ignore) {
|
|
130
|
+
propertyInfo.ignore = config.ignore;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Adds a sanitizer to the instance container.
|
|
137
|
+
* @param target The target.
|
|
138
|
+
* @param parameterIndex The parameter index.
|
|
139
|
+
* @param propertyKey The property key.
|
|
140
|
+
* @param decoratorType The decorator type.
|
|
141
|
+
* @param value The value.
|
|
142
|
+
*/
|
|
143
|
+
addSanitizer(target, parameterIndex, propertyKey, decoratorType, value) {
|
|
144
|
+
/* Retrieves the instance container based on the provided parameters and adds a sanitizer configuration to it */
|
|
145
|
+
let instance = this.getInstance(target, parameterIndex, propertyKey, decoratorType);
|
|
146
|
+
if (instance) {
|
|
147
|
+
/* Check if the sanitizers object for the property exists */
|
|
148
|
+
if (!instance.sanitizers[propertyKey]) {
|
|
149
|
+
instance.sanitizers[propertyKey] = [];
|
|
150
|
+
}
|
|
151
|
+
/* Push the sanitizer configuration to the sanitizers object */
|
|
152
|
+
instance.sanitizers[propertyKey].push({ name: decoratorType, config: value });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Adds a decorator configuration to the instance container.
|
|
157
|
+
* @param target The target.
|
|
158
|
+
* @param parameterIndex The parameter index.
|
|
159
|
+
* @param propertyKey The property key.
|
|
160
|
+
* @param config The configuration.
|
|
161
|
+
* @param decoratorType The decorator type.
|
|
162
|
+
*/
|
|
163
|
+
addDecoratorConfig(target, parameterIndex, propertyKey, config, decoratorType) {
|
|
164
|
+
/* Determine if the property key is defined */
|
|
165
|
+
let isPropertyKey = (propertyKey != undefined);
|
|
166
|
+
/* Determine the function or constructor to be used as instanceFunc */
|
|
167
|
+
let instanceFunc = !isPropertyKey ? target : target.constructor;
|
|
168
|
+
/* Find the instance container based on instanceFunc */
|
|
169
|
+
let instance = this.instances.find(instance => instance.instance === instanceFunc);
|
|
170
|
+
/* If the instance container doesn't exist, create a new one */
|
|
171
|
+
if (!instance) {
|
|
172
|
+
instance = this.addInstanceContainer(instanceFunc);
|
|
173
|
+
}
|
|
174
|
+
/* Add conditional expressions to the non-validation decorators of the instance container */
|
|
175
|
+
(instance?.nonValidationDecorators)[decoratorType].conditionalExpressions[propertyKey] = config.conditionalExpression;
|
|
176
|
+
/* Extract columns from the conditional expression */
|
|
177
|
+
let columns = Linq.expressionColumns(config.conditionalExpression, true);
|
|
178
|
+
/* Iterate over each column */
|
|
179
|
+
columns.forEach(column => {
|
|
180
|
+
if (column.argumentIndex !== -1) {
|
|
181
|
+
/* Construct the column name based on whether objectPropName is defined */
|
|
182
|
+
let columnName = (!column.objectPropName) ? `${column.propName}${RXCODE}${column.argumentIndex}` : `${column.objectPropName}.${column.propName}${RXCODE}${column.argumentIndex}`;
|
|
183
|
+
/* Check if the column exists in changeDetection and initialize it if necessary */
|
|
184
|
+
if (!(instance?.nonValidationDecorators)[decoratorType].changeDetection[columnName]) {
|
|
185
|
+
(instance?.nonValidationDecorators)[decoratorType].changeDetection[columnName] = [];
|
|
186
|
+
}
|
|
187
|
+
/* Add the property key to the changeDetection column */
|
|
188
|
+
let disabledColumns = (instance?.nonValidationDecorators)[decoratorType].changeDetection[columnName];
|
|
189
|
+
if (disabledColumns.indexOf(columnName) === -1) {
|
|
190
|
+
disabledColumns.push(propertyKey);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
/* Handle the controlProp if argumentIndex is -1 */
|
|
195
|
+
if (!(instance?.nonValidationDecorators)[decoratorType].controlProp[propertyKey]) {
|
|
196
|
+
(instance?.nonValidationDecorators)[decoratorType].controlProp[propertyKey] = {};
|
|
197
|
+
}
|
|
198
|
+
/* Set the column name to true in controlProp */
|
|
199
|
+
(instance?.nonValidationDecorators)[decoratorType].controlProp[propertyKey][column.propName.replace(";", "")] = true;
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Initializes a decorator configuration.
|
|
205
|
+
* @param target The target.
|
|
206
|
+
* @param parameterIndex The parameter index.
|
|
207
|
+
* @param propertyKey The property key.
|
|
208
|
+
* @param annotationType The annotation type.
|
|
209
|
+
* @param config The configuration.
|
|
210
|
+
* @param isAsync Indicates whether it's an asynchronous operation.
|
|
211
|
+
*/
|
|
212
|
+
init(target, parameterIndex, propertyKey, annotationType, config, isAsync) {
|
|
213
|
+
/* Define the decorator configuration */
|
|
214
|
+
var decoratorConfiguration = {
|
|
215
|
+
propertyIndex: parameterIndex,
|
|
216
|
+
propertyName: propertyKey,
|
|
217
|
+
annotationType: annotationType,
|
|
218
|
+
config: config,
|
|
219
|
+
isAsync: isAsync,
|
|
220
|
+
isValidator: annotationType !== "updateOn"
|
|
221
|
+
};
|
|
222
|
+
/* Determine if the property key is defined */
|
|
223
|
+
let isPropertyKey = (propertyKey != undefined);
|
|
224
|
+
/* Determine the function or constructor to be used as instanceFunc */
|
|
225
|
+
this.addAnnotation(!isPropertyKey ? target : target.constructor, decoratorConfiguration);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Initializes a property object.
|
|
229
|
+
* @param name The name.
|
|
230
|
+
* @param propertyType The property type.
|
|
231
|
+
* @param entity The entity.
|
|
232
|
+
* @param target The target.
|
|
233
|
+
* @param config The configuration.
|
|
234
|
+
*/
|
|
235
|
+
initPropertyObject(name, propertyType, entity, target, config) {
|
|
236
|
+
/* Define the property information */
|
|
237
|
+
var propertyInfo = {
|
|
238
|
+
name: name,
|
|
239
|
+
propertyType: propertyType,
|
|
240
|
+
entity: entity,
|
|
241
|
+
dataPropertyName: config ? config.name : undefined,
|
|
242
|
+
entityProvider: config ? config.entityProvider : undefined
|
|
243
|
+
};
|
|
244
|
+
/* Add the property to the target's constructor */
|
|
245
|
+
this.addProperty(target.constructor, propertyInfo);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Adds an instance container to the list of instances.
|
|
249
|
+
* @param instanceFunc The instance function.
|
|
250
|
+
* @returns The added instance container.
|
|
251
|
+
*/
|
|
252
|
+
addInstanceContainer(instanceFunc) {
|
|
253
|
+
/* Define an instance container */
|
|
254
|
+
let instanceContainer = {
|
|
255
|
+
instance: instanceFunc,
|
|
256
|
+
propertyAnnotations: [],
|
|
257
|
+
properties: [],
|
|
258
|
+
nonValidationDecorators: {
|
|
259
|
+
/* Disabled decorators */
|
|
260
|
+
disabled: {
|
|
261
|
+
conditionalExpressions: {},
|
|
262
|
+
changeDetection: {},
|
|
263
|
+
controlProp: {} /* Control properties for disabled decorators */
|
|
264
|
+
},
|
|
265
|
+
/* Error decorators */
|
|
266
|
+
error: {
|
|
267
|
+
conditionalExpressions: {},
|
|
268
|
+
changeDetection: {},
|
|
269
|
+
controlProp: {} /* Control properties for error decorators */
|
|
270
|
+
},
|
|
271
|
+
/* Element class decorators */
|
|
272
|
+
elementClass: {
|
|
273
|
+
conditionalExpressions: {},
|
|
274
|
+
changeDetection: {},
|
|
275
|
+
controlProp: {} /* Control properties for element class decorators */
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
/* Sanitizers associated with the instance */
|
|
279
|
+
sanitizers: {}
|
|
280
|
+
};
|
|
281
|
+
/* Add the instance container to the instances array */
|
|
282
|
+
this.instances.push(instanceContainer);
|
|
283
|
+
/* Return the created instance container */
|
|
284
|
+
return instanceContainer;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Adds a property to the instance container.
|
|
288
|
+
* @param instanceFunc The instance function.
|
|
289
|
+
* @param propertyInfo The property information.
|
|
290
|
+
* @param isFromAnnotation Indicates whether it's added from an annotation.
|
|
291
|
+
*/
|
|
292
|
+
addProperty(instanceFunc, propertyInfo, isFromAnnotation = false) {
|
|
293
|
+
/* Find the instance in the instances array */
|
|
294
|
+
let instance = this.instances.find(instance => instance.instance === instanceFunc);
|
|
295
|
+
/* Check if the instance exists */
|
|
296
|
+
if (instance) {
|
|
297
|
+
/* Add property information to the existing instance */
|
|
298
|
+
this.addPropertyInfo(instance, propertyInfo, !isFromAnnotation);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
/* Create a new instance container if it doesn't exist */
|
|
302
|
+
instance = this.addInstanceContainer(instanceFunc);
|
|
303
|
+
/* Add property information to the newly created instance */
|
|
304
|
+
this.addPropertyInfo(instance, propertyInfo);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Adds property information to the instance container.
|
|
309
|
+
* @param instance The instance container.
|
|
310
|
+
* @param propertyInfo The property information.
|
|
311
|
+
* @param isAddProperty Indicates whether it's added as a new property.
|
|
312
|
+
*/
|
|
313
|
+
addPropertyInfo(instance, propertyInfo, isAddProperty = false) {
|
|
314
|
+
/* Find the property with the same name in the instance's properties */
|
|
315
|
+
var property = instance.properties?.find(t => t.name == propertyInfo.name);
|
|
316
|
+
/* Check if the property doesn't already exist */
|
|
317
|
+
if (!property) {
|
|
318
|
+
/* Add the property information to the instance's properties */
|
|
319
|
+
instance.properties?.push(propertyInfo);
|
|
320
|
+
}
|
|
321
|
+
else if (isAddProperty) {
|
|
322
|
+
/* Update property information if requested */
|
|
323
|
+
property.dataPropertyName = propertyInfo.dataPropertyName;
|
|
324
|
+
property.defaultValue = propertyInfo.defaultValue;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Adds an annotation to the instance container.
|
|
329
|
+
* @param instanceFunc The instance function.
|
|
330
|
+
* @param decoratorConfiguration The decorator configuration.
|
|
331
|
+
*/
|
|
332
|
+
addAnnotation(instanceFunc, decoratorConfiguration) {
|
|
333
|
+
/* Add property information to the instance */
|
|
334
|
+
this.addProperty(instanceFunc, { propertyType: PROPERTY, name: decoratorConfiguration.propertyName }, true);
|
|
335
|
+
/* Find or create the instance in the instances array */
|
|
336
|
+
let instance = this.instances.find(instance => instance.instance === instanceFunc);
|
|
337
|
+
if (instance) {
|
|
338
|
+
/* Add the decorator configuration to the instance's property annotations */
|
|
339
|
+
instance.propertyAnnotations.push(decoratorConfiguration);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
instance = this.addInstanceContainer(instanceFunc);
|
|
343
|
+
instance.propertyAnnotations.push(decoratorConfiguration);
|
|
344
|
+
}
|
|
345
|
+
/* Add change validation based on the provided configuration */
|
|
346
|
+
if (decoratorConfiguration.config && decoratorConfiguration.config.conditionalExpression) {
|
|
347
|
+
let columns = Linq.expressionColumns(decoratorConfiguration.config.conditionalExpression);
|
|
348
|
+
this.addChangeValidation(instance, decoratorConfiguration.propertyName, columns);
|
|
349
|
+
}
|
|
350
|
+
/* Add dynamic configuration and validation */
|
|
351
|
+
if (decoratorConfiguration.config && decoratorConfiguration.config.dynamicConfig) {
|
|
352
|
+
let columns = Linq.dynamicConfigParser(decoratorConfiguration.config.dynamicConfig, decoratorConfiguration.propertyName);
|
|
353
|
+
this.addChangeValidation(instance, decoratorConfiguration.propertyName, columns);
|
|
354
|
+
}
|
|
355
|
+
/* Set conditional columns based on the decorator configuration */
|
|
356
|
+
this.setConditionalColumns(instance, decoratorConfiguration);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Sets conditional columns based on the decorator configuration.
|
|
360
|
+
* @param instance The instance container.
|
|
361
|
+
* @param decoratorConfiguration The decorator configuration.
|
|
362
|
+
*/
|
|
363
|
+
setConditionalColumns(instance, decoratorConfiguration) {
|
|
364
|
+
/* Checks if there is an instance and decorator configuration present */
|
|
365
|
+
if (instance && decoratorConfiguration.config) {
|
|
366
|
+
/* Handles logical annotations (AND, OR, NOT) */
|
|
367
|
+
if (decoratorConfiguration.annotationType == AnnotationTypes.and ||
|
|
368
|
+
decoratorConfiguration.annotationType == AnnotationTypes.or ||
|
|
369
|
+
decoratorConfiguration.annotationType == AnnotationTypes.not) {
|
|
370
|
+
/* Iterates over validation configurations */
|
|
371
|
+
Object.keys(decoratorConfiguration.config.validation).forEach(t => {
|
|
372
|
+
/* Checks if the validation configuration is not a boolean */
|
|
373
|
+
if (typeof decoratorConfiguration.config.validation[t] !== "boolean") {
|
|
374
|
+
/* Sets logical conditional based on the validation configuration */
|
|
375
|
+
this.setLogicalConditional(instance, t, decoratorConfiguration.config.validation[t].fieldName, decoratorConfiguration.propertyName);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
/* Sets logical conditional for non-logical annotations */
|
|
381
|
+
this.setLogicalConditional(instance, decoratorConfiguration.annotationType, decoratorConfiguration.config.fieldName, decoratorConfiguration.propertyName);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Sets logical conditionals based on the decorator configuration.
|
|
387
|
+
* @param instance The instance container.
|
|
388
|
+
* @param annotationType The annotation type.
|
|
389
|
+
* @param fieldName The field name.
|
|
390
|
+
* @param propertyName The property name.
|
|
391
|
+
*/
|
|
392
|
+
setLogicalConditional(instance, annotationType, fieldName, propertyName) {
|
|
393
|
+
/*
|
|
394
|
+
* Checks if there is an instance and annotation type with applicable conditions
|
|
395
|
+
* for setting conditional value properties.
|
|
396
|
+
*/
|
|
397
|
+
if (instance && ((annotationType == AnnotationTypes.compare ||
|
|
398
|
+
annotationType == AnnotationTypes.greaterThan ||
|
|
399
|
+
annotationType == AnnotationTypes.greaterThanEqualTo ||
|
|
400
|
+
annotationType == AnnotationTypes.lessThan ||
|
|
401
|
+
annotationType == AnnotationTypes.lessThanEqualTo ||
|
|
402
|
+
annotationType == AnnotationTypes.different ||
|
|
403
|
+
annotationType == AnnotationTypes.factor ||
|
|
404
|
+
annotationType == AnnotationTypes.minTime ||
|
|
405
|
+
annotationType == AnnotationTypes.maxTime) ||
|
|
406
|
+
(annotationType == AnnotationTypes.creditCard && fieldName) ||
|
|
407
|
+
((annotationType == AnnotationTypes.minDate || annotationType == AnnotationTypes.maxDate) && fieldName))) {
|
|
408
|
+
/* Sets conditional value property based on the conditions */
|
|
409
|
+
this.setConditionalValueProp(instance, fieldName, propertyName);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Sets conditional value properties based on the decorator configuration.
|
|
414
|
+
* @param instance The instance container.
|
|
415
|
+
* @param propertyName The property name.
|
|
416
|
+
* @param refPropertyName The reference property name.
|
|
417
|
+
*/
|
|
418
|
+
setConditionalValueProp(instance, propertyName, refPropertyName) {
|
|
419
|
+
/* Checks if propName exists */
|
|
420
|
+
if (propertyName) {
|
|
421
|
+
/* Splits propName into individual properties */
|
|
422
|
+
let splitProps = propertyName.split ? propertyName.split('.') : '';
|
|
423
|
+
/* Checks if the length of splitProps is less than 2 */
|
|
424
|
+
if (splitProps.length < 2) {
|
|
425
|
+
/* Initializes conditionalValidationProps if it does not exist */
|
|
426
|
+
if (!instance.conditionalValidationProps) {
|
|
427
|
+
instance.conditionalValidationProps = {};
|
|
428
|
+
}
|
|
429
|
+
/* Initializes conditionalValidationProps[propName] if it does not exist */
|
|
430
|
+
if (!instance.conditionalValidationProps[propertyName]) {
|
|
431
|
+
instance.conditionalValidationProps[propertyName] = [];
|
|
432
|
+
}
|
|
433
|
+
/* Pushes refPropName into conditionalValidationProps[propName] if it does not exist */
|
|
434
|
+
if (instance.conditionalValidationProps[propertyName].indexOf(refPropertyName) == -1) {
|
|
435
|
+
instance.conditionalValidationProps[propertyName].push(refPropertyName);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
/* Adds change validation for complex properties */
|
|
440
|
+
this.addChangeValidation(instance, refPropertyName, [{ argumentIndex: 1, objectPropName: splitProps[0], propName: splitProps[1], referencePropName: refPropertyName }]);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Adds change validation based on the columns.
|
|
446
|
+
* @param instance The instance container.
|
|
447
|
+
* @param propertyName The property name.
|
|
448
|
+
* @param columns The columns.
|
|
449
|
+
*/
|
|
450
|
+
addChangeValidation(instance, propertyName, columns) {
|
|
451
|
+
/* Checks if instance exists. */
|
|
452
|
+
if (instance) {
|
|
453
|
+
/* Initializes conditionalValidationProps if it does not exist. */
|
|
454
|
+
if (!instance.conditionalValidationProps) {
|
|
455
|
+
instance.conditionalValidationProps = {};
|
|
456
|
+
}
|
|
457
|
+
/* Iterates through columns. */
|
|
458
|
+
columns.forEach(t => {
|
|
459
|
+
/* Checks if propName exists and objectPropName does not exist. */
|
|
460
|
+
if (t.propName && !t.objectPropName) {
|
|
461
|
+
/* Initializes conditionalValidationProps[t.propName] if it does not exist. */
|
|
462
|
+
if (!instance.conditionalValidationProps[t.propName]) {
|
|
463
|
+
instance.conditionalValidationProps[t.propName] = [];
|
|
464
|
+
}
|
|
465
|
+
/* Pushes propertyName into conditionalValidationProps[t.propName] if it does not exist. */
|
|
466
|
+
if (instance.conditionalValidationProps[t.propName].indexOf(propertyName) == -1) {
|
|
467
|
+
instance.conditionalValidationProps[t.propName].push(propertyName);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
/* Checks if propName and objectPropName exist. */
|
|
472
|
+
if (t.propName && t.objectPropName) {
|
|
473
|
+
/* Initializes conditionalObjectProps if it does not exist. */
|
|
474
|
+
if (!instance.conditionalObjectProps) {
|
|
475
|
+
instance.conditionalObjectProps = [];
|
|
476
|
+
}
|
|
477
|
+
/* Sets referencePropName and adds it to conditionalObjectProps. */
|
|
478
|
+
t.referencePropName = propertyName;
|
|
479
|
+
instance.conditionalObjectProps.push(t);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Represents a default container for managing instance configurations.
|
|
488
|
+
*
|
|
489
|
+
* Manages the configuration and instantiation of validation decorators, sanitizers, and other properties for classes.
|
|
490
|
+
* This class serves as a container for managing instance-related configurations and properties.
|
|
491
|
+
*/
|
|
492
|
+
export const defaultContainer = new DefaultContainer();
|
|
493
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1jb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9mb3JtLXZhbGlkYXRvcnMvY29yZS9kZWZhdWx0LWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUt2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDekI7OztJQUdBO0lBQ08sY0FBYyxHQUFZLEtBQUssQ0FBQztJQUV2Qzs7O09BR0c7SUFDSyxTQUFTLEdBQXdCLEVBQUUsQ0FBQztJQUU1Qzs7O09BR0c7SUFDSSxtQkFBbUIsR0FBVyxDQUFDLENBQUM7SUFFdkM7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBSSxZQUFpQjtRQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFdBQVcsQ0FBQyxNQUFXLEVBQUUsY0FBbUIsRUFBRSxXQUFtQixFQUFFLGFBQXFCO1FBQzNGLDhDQUE4QztRQUM5QyxJQUFJLGFBQWEsR0FBRyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQztRQUUvQyw0RUFBNEU7UUFDNUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFB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QkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzNDO2lCQUNKO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Q0FDSjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVJSQVlfUFJPUEVSVFksIE9CSkVDVF9QUk9QRVJUWSwgUFJPUEVSVFksIFJYQ09ERSB9IGZyb20gXCIuLi9jb25zdFwiO1xyXG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4uL2NvbnN0L2RlY29yYXRvcnMuY29uc3RcIjtcclxuaW1wb3J0IHsgUHJvcHNDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy9wcm9wcy1jb25maWdcIjtcclxuaW1wb3J0IHsgRGVjb3JhdG9yQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvZGVjb3JhdG9yLWNvbmZpZ3VyYXRpb25cIjtcclxuaW1wb3J0IHsgSW5zdGFuY2VDb250YWluZXIgfSBmcm9tIFwiLi4vbW9kZWxzL2luc3RhbmNlLWNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwiLi4vbW9kZWxzL3Byb3BlcnR5LWluZm9cIjtcclxuaW1wb3J0IHsgTGlucSB9IGZyb20gXCIuLi91dGlsL2xpbnFcIjtcclxuaW1wb3J0IHsgQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIi4vYW5ub3RhdGlvbi10eXBlc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBkZWZhdWx0IGNvbnRhaW5lciBmb3IgbWFuYWdpbmcgaW5zdGFuY2UgY29uZmlndXJhdGlvbnMuXHJcbiAqIFxyXG4gKiBNYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9uIGFuZCBpbnN0YW50aWF0aW9uIG9mIHZhbGlkYXRpb24gZGVjb3JhdG9ycywgc2FuaXRpemVycywgYW5kIG90aGVyIHByb3BlcnRpZXMgZm9yIGNsYXNzZXMuXHJcbiAqIFRoaXMgY2xhc3Mgc2VydmVzIGFzIGEgY29udGFpbmVyIGZvciBtYW5hZ2luZyBpbnN0YW5jZS1yZWxhdGVkIGNvbmZpZ3VyYXRpb25zIGFuZCBwcm9wZXJ0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERlZmF1bHRDb250YWluZXIge1xyXG4gICAgLyoqXHJcbiAgKiBSZXByZXNlbnRzIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBvcGVyYXRpbmcgaW4gZXhwZXJpbWVudGFsIG1vZGUuXHJcbiAgKiBFeHBlcmltZW50YWwgbW9kZSBtYXkgaW50cm9kdWNlIGZlYXR1cmVzIHRoYXQgYXJlIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IG9yIHRlc3RpbmcuXHJcbiAgKi9cclxuICAgIHB1YmxpYyBpc0V4cGVyaW1lbnRhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgY29udGFpbmluZyBpbnN0YW5jZXMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb25zLlxyXG4gICAgICogRWFjaCBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHdpdGggYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFuZCBkZWNvcmF0b3JzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluc3RhbmNlczogSW5zdGFuY2VDb250YWluZXJbXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ291bnRlciB1c2VkIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgbW9kZWwgaW5zdGFuY2VzLlxyXG4gICAgICogVGhpcyBjb3VudGVyIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldyBtb2RlbCBpbnN0YW5jZSBpcyBhZGRlZCB0byB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kZWxJbmNyZW1lbnRDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhbiBpbnN0YW5jZSBjb250YWluZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGluc3RhbmNlIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlRnVuYyBUaGUgaW5zdGFuY2UgZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0PFQ+KGluc3RhbmNlRnVuYzogYW55KTogSW5zdGFuY2VDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5maWx0ZXIoaW5zdGFuY2UgPT4gaW5zdGFuY2UuaW5zdGFuY2UgPT09IGluc3RhbmNlRnVuYylbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBjb250YWluZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXggVGhlIHBhcmFtZXRlciBpbmRleC5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSBUaGUgcHJvcGVydHkga2V5LlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvclR5cGUgVGhlIGRlY29yYXRvciB0eXBlLlxyXG4gICAgICogQHJldHVybnMgVGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEluc3RhbmNlKHRhcmdldDogYW55LCBwYXJhbWV0ZXJJbmRleDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZWNvcmF0b3JUeXBlOiBzdHJpbmcpIHtcclxuICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIHByb3BlcnR5IGtleSBpcyBkZWZpbmVkICovXHJcbiAgICAgICAgbGV0IGlzUHJvcGVydHlLZXkgPSAocHJvcGVydHlLZXkgIT0gdW5kZWZpbmVkKTtcclxuXHJcbiAgICAgICAgLyogR2V0IHRoZSBpbnN0YW5jZSBmdW5jdGlvbiBiYXNlZCBvbiB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBrZXkgaXMgZGVmaW5lZCAqL1xyXG4gICAgICAgIGxldCBpbnN0YW5jZUZ1bmMgPSAhaXNQcm9wZXJ0eUtleSA/IHRhcmdldCA6IHRhcmdldC5jb25zdHJ1Y3RvcjtcclxuXHJcbiAgICAgICAgLyogRmlsdGVyIGluc3RhbmNlcyB0byBmaW5kIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIGluc3RhbmNlIGZ1bmN0aW9uICovXHJcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZmlsdGVyKGluc3RhbmNlID0+IGluc3RhbmNlLmluc3RhbmNlID09PSBpbnN0YW5jZUZ1bmMpWzBdO1xyXG5cclxuICAgICAgICAvKiBJZiBubyBpbnN0YW5jZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGNvbnRhaW5lciAqL1xyXG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmFkZEluc3RhbmNlQ29udGFpbmVyKGluc3RhbmNlRnVuYyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBSZXR1cm4gdGhlIGluc3RhbmNlIGNvbnRhaW5lciAqL1xyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgcHJvcGVydHkgY29uZmlndXJhdGlvbnMgdG8gdGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldC5cclxuICAgICAqIEBwYXJhbSBjb25maWdzIFRoZSBjb25maWd1cmF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb3BzQ29uZmlnKHRhcmdldDogYW55LCBjb25maWdzPzogUHJvcHNDb25maWdbXSkge1xyXG4gICAgICAgIC8qIEZpbmQgdGhlIGluc3RhbmNlIGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCAqL1xyXG4gICAgICAgIGxldCBpbnN0YW5jZUNvbnRhaW5lciA9IHRoaXMuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2UgPT4gaW5zdGFuY2UuaW5zdGFuY2UgPT09IHRhcmdldCk7XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBpbnN0YW5jZSBjb250YWluZXIgZXhpc3RzICovXHJcbiAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbnMgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSBhcmUgcHJvdmlkZWQgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MgPz8gW10pIHtcclxuICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydHkgbmFtZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3Agb2YgY29uZmlnLnByb3BOYW1lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIHByb3BlcnR5IGluZm8gaW4gdGhlIGluc3RhbmNlIGNvbnRhaW5lcidzIHByb3BlcnRpZXMgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlJbmZvID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcz8uZmluZCh0ID0+IHQubmFtZSA9PSBwcm9wICYmICh0LnByb3BlcnR5VHlwZSAhPT0gT0JKRUNUX1BST1BFUlRZICYmIHQucHJvcGVydHlUeXBlICE9PSBBUlJBWV9QUk9QRVJUWSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgcHJvcGVydHkgaW5mbyBleGlzdHMsIGFkZCBwcm9wZXJ0eSBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5mbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFByb3BDb25maWcodGFyZ2V0LCBbcHJvcGVydHlJbmZvXSwgY29uZmlnKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGlzICc6YWxsOicsIGFkZCBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciBhbGwgcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCI6YWxsOlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFByb3BDb25maWcodGFyZ2V0LCBpbnN0YW5jZUNvbnRhaW5lci5wcm9wZXJ0aWVzPy5maWx0ZXIodCA9PiB0LnByb3BlcnR5VHlwZSAhPT0gT0JKRUNUX1BST1BFUlRZICYmIHQucHJvcGVydHlUeXBlICE9PSBBUlJBWV9QUk9QRVJUWSkhLCBjb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLyogSWYgdGhlIGluc3RhbmNlIGNvbnRhaW5lciBkb2VzIG5vdCBleGlzdCBhbmQgbm8gY29uZmlndXJhdGlvbnMgYXJlIHByb3ZpZGVkLCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgY29udGFpbmVyICovXHJcbiAgICAgICAgICAgIHRoaXMuYWRkSW5zdGFuY2VDb250YWluZXIodGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcHJvcGVydHkgY29uZmlndXJhdGlvbiB0byB0aGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0LlxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMuXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUHJvcENvbmZpZyh0YXJnZXQ6IGFueSwgcHJvcGVydGllczogUHJvcGVydHlJbmZvW10sIGNvbmZpZzogUHJvcHNDb25maWcpIHtcclxuICAgICAgICAvKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb25maWcgb2JqZWN0ICovXHJcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHlJbmZvIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgbGV0IGV4Y2x1ZGVQcm9wOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvKiBDaGVjayBpZiBleGNsdWRlUHJvcE5hbWVzIGV4aXN0IGluIHRoZSBjb25maWcgKi9cclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5leGNsdWRlUHJvcE5hbWVzKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBzaG91bGQgYmUgZXhjbHVkZWQgYmFzZWQgb24gaXRzIG5hbWUgKi9cclxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVQcm9wID0gY29uZmlnLmV4Y2x1ZGVQcm9wTmFtZXMuZmluZCh0ID0+IHQgPT0gcHJvcGVydHlJbmZvLm5hbWUpICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGV4Y2x1ZGVkICovXHJcbiAgICAgICAgICAgIGlmICghZXhjbHVkZVByb3ApIHtcclxuICAgICAgICAgICAgICAgIC8qIEFwcGx5IHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMgKi9cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGlvbkNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9ucyAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR5cGVOYW1lIGluIGNvbmZpZy52YWxpZGF0aW9uQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdmFsaWRhdGlvbiBmb3IgdGhlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCh7IGNvbnN0cnVjdG9yOiB0YXJnZXQgfSwgMCwgcHJvcGVydHlJbmZvLm5hbWUsIHR5cGVOYW1lLCAoY29uZmlnLnZhbGlkYXRpb25Db25maWcgYXMgYW55KVt0eXBlTmFtZV0gPT09IHRydWUgPyB1bmRlZmluZWQgOiAoY29uZmlnLnZhbGlkYXRpb25Db25maWcgYXMgYW55KVt0eXBlTmFtZV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQXBwbHkgZXJyb3IgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlY29yYXRvckNvbmZpZyh7IGNvbnN0cnVjdG9yOiB0YXJnZXQgfSwgMCwgcHJvcGVydHlJbmZvLm5hbWUsIGNvbmZpZy5lcnJvciwgREVDT1JBVE9SUy5lcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiBBcHBseSBkaXNhYmxlIGRlY29yYXRvciBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRpc2FibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlY29yYXRvckNvbmZpZyh7IGNvbnN0cnVjdG9yOiB0YXJnZXQgfSwgMCwgcHJvcGVydHlJbmZvLm5hbWUsIGNvbmZpZy5kaXNhYmxlLCBERUNPUkFUT1JTLmRpc2FibGVkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEFwcGx5IGVsZW1lbnRDbGFzcyBkZWNvcmF0b3IgY29uZmlndXJhdGlvbiAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbGVtZW50Q2xhc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlY29yYXRvckNvbmZpZyh7IGNvbnN0cnVjdG9yOiB0YXJnZXQgfSwgMCwgcHJvcGVydHlJbmZvLm5hbWUsIGNvbmZpZy5lbGVtZW50Q2xhc3MsIERFQ09SQVRPUlMuZWxlbWVudENsYXNzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEFwcGx5IGlnbm9yZSBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlnbm9yZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mby5pZ25vcmUgPSBjb25maWcuaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgc2FuaXRpemVyIHRvIHRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXggVGhlIHBhcmFtZXRlciBpbmRleC5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSBUaGUgcHJvcGVydHkga2V5LlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvclR5cGUgVGhlIGRlY29yYXRvciB0eXBlLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFNhbml0aXplcih0YXJnZXQ6IGFueSwgcGFyYW1ldGVySW5kZXg6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVjb3JhdG9yVHlwZTogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xyXG4gICAgICAgIC8qIFJldHJpZXZlcyB0aGUgaW5zdGFuY2UgY29udGFpbmVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzIGFuZCBhZGRzIGEgc2FuaXRpemVyIGNvbmZpZ3VyYXRpb24gdG8gaXQgKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLmdldEluc3RhbmNlKHRhcmdldCwgcGFyYW1ldGVySW5kZXgsIHByb3BlcnR5S2V5LCBkZWNvcmF0b3JUeXBlKTtcclxuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHNhbml0aXplcnMgb2JqZWN0IGZvciB0aGUgcHJvcGVydHkgZXhpc3RzICovXHJcbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlLnNhbml0aXplcnMgYXMgYW55KVtwcm9wZXJ0eUtleV0pIHtcclxuICAgICAgICAgICAgICAgIChpbnN0YW5jZS5zYW5pdGl6ZXJzIGFzIGFueSlbcHJvcGVydHlLZXldID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIFB1c2ggdGhlIHNhbml0aXplciBjb25maWd1cmF0aW9uIHRvIHRoZSBzYW5pdGl6ZXJzIG9iamVjdCAqL1xyXG4gICAgICAgICAgICAoaW5zdGFuY2Uuc2FuaXRpemVycyBhcyBhbnkpW3Byb3BlcnR5S2V5XS5wdXNoKHsgbmFtZTogZGVjb3JhdG9yVHlwZSwgY29uZmlnOiB2YWx1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldC5cclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCBUaGUgcGFyYW1ldGVyIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IFRoZSBwcm9wZXJ0eSBrZXkuXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBjb25maWd1cmF0aW9uLlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvclR5cGUgVGhlIGRlY29yYXRvciB0eXBlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkRGVjb3JhdG9yQ29uZmlnKHRhcmdldDogYW55LCBwYXJhbWV0ZXJJbmRleDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBjb25maWc6IGFueSwgZGVjb3JhdG9yVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBwcm9wZXJ0eSBrZXkgaXMgZGVmaW5lZCAqL1xyXG4gICAgICAgIGxldCBpc1Byb3BlcnR5S2V5ID0gKHByb3BlcnR5S2V5ICE9IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgIC8qIERldGVybWluZSB0aGUgZnVuY3Rpb24gb3IgY29uc3RydWN0b3IgdG8gYmUgdXNlZCBhcyBpbnN0YW5jZUZ1bmMgKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2VGdW5jID0gIWlzUHJvcGVydHlLZXkgPyB0YXJnZXQgOiB0YXJnZXQuY29uc3RydWN0b3I7XHJcblxyXG4gICAgICAgIC8qIEZpbmQgdGhlIGluc3RhbmNlIGNvbnRhaW5lciBiYXNlZCBvbiBpbnN0YW5jZUZ1bmMgKi9cclxuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5maW5kKGluc3RhbmNlID0+IGluc3RhbmNlLmluc3RhbmNlID09PSBpbnN0YW5jZUZ1bmMpO1xyXG5cclxuICAgICAgICAvKiBJZiB0aGUgaW5zdGFuY2UgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBvbmUgKi9cclxuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5hZGRJbnN0YW5jZUNvbnRhaW5lcihpbnN0YW5jZUZ1bmMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogQWRkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHRvIHRoZSBub24tdmFsaWRhdGlvbiBkZWNvcmF0b3JzIG9mIHRoZSBpbnN0YW5jZSBjb250YWluZXIgKi9cclxuICAgICAgICAoaW5zdGFuY2U/Lm5vblZhbGlkYXRpb25EZWNvcmF0b3JzIGFzIGFueSlbZGVjb3JhdG9yVHlwZV0uY29uZGl0aW9uYWxFeHByZXNzaW9uc1twcm9wZXJ0eUtleV0gPSBjb25maWcuY29uZGl0aW9uYWxFeHByZXNzaW9uO1xyXG5cclxuICAgICAgICAvKiBFeHRyYWN0IGNvbHVtbnMgZnJvbSB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAqL1xyXG4gICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucyhjb25maWcuY29uZGl0aW9uYWxFeHByZXNzaW9uLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uICovXHJcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uYXJndW1lbnRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgY29sdW1uIG5hbWUgYmFzZWQgb24gd2hldGhlciBvYmplY3RQcm9wTmFtZSBpcyBkZWZpbmVkICovXHJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uTmFtZSA9ICghY29sdW1uLm9iamVjdFByb3BOYW1lKSA/IGAke2NvbHVtbi5wcm9wTmFtZX0ke1JYQ09ERX0ke2NvbHVtbi5hcmd1bWVudEluZGV4fWAgOiBgJHtjb2x1bW4ub2JqZWN0UHJvcE5hbWV9LiR7Y29sdW1uLnByb3BOYW1lfSR7UlhDT0RFfSR7Y29sdW1uLmFyZ3VtZW50SW5kZXh9YDtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY29sdW1uIGV4aXN0cyBpbiBjaGFuZ2VEZXRlY3Rpb24gYW5kIGluaXRpYWxpemUgaXQgaWYgbmVjZXNzYXJ5ICovXHJcbiAgICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZT8ubm9uVmFsaWRhdGlvbkRlY29yYXRvcnMgYXMgYW55KVtkZWNvcmF0b3JUeXBlXS5jaGFuZ2VEZXRlY3Rpb25bY29sdW1uTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2U/Lm5vblZhbGlkYXRpb25EZWNvcmF0b3JzIGFzIGFueSlbZGVjb3JhdG9yVHlwZV0uY2hhbmdlRGV0ZWN0aW9uW2NvbHVtbk5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyogQWRkIHRoZSBwcm9wZXJ0eSBrZXkgdG8gdGhlIGNoYW5nZURldGVjdGlvbiBjb2x1bW4gKi9cclxuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZENvbHVtbnMgPSAoaW5zdGFuY2U/Lm5vblZhbGlkYXRpb25EZWNvcmF0b3JzIGFzIGFueSlbZGVjb3JhdG9yVHlwZV0uY2hhbmdlRGV0ZWN0aW9uW2NvbHVtbk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkQ29sdW1ucy5pbmRleE9mKGNvbHVtbk5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkQ29sdW1ucy5wdXNoKHByb3BlcnR5S2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8qIEhhbmRsZSB0aGUgY29udHJvbFByb3AgaWYgYXJndW1lbnRJbmRleCBpcyAtMSAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2U/Lm5vblZhbGlkYXRpb25EZWNvcmF0b3JzIGFzIGFueSlbZGVjb3JhdG9yVHlwZV0uY29udHJvbFByb3BbcHJvcGVydHlLZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKGluc3RhbmNlPy5ub25WYWxpZGF0aW9uRGVjb3JhdG9ycyBhcyBhbnkpW2RlY29yYXRvclR5cGVdLmNvbnRyb2xQcm9wW3Byb3BlcnR5S2V5XSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgY29sdW1uIG5hbWUgdG8gdHJ1ZSBpbiBjb250cm9sUHJvcCAqL1xyXG4gICAgICAgICAgICAgICAgKGluc3RhbmNlPy5ub25WYWxpZGF0aW9uRGVjb3JhdG9ycyBhcyBhbnkpW2RlY29yYXRvclR5cGVdLmNvbnRyb2xQcm9wW3Byb3BlcnR5S2V5XVtjb2x1bW4ucHJvcE5hbWUucmVwbGFjZShcIjtcIiwgXCJcIildID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgYSBkZWNvcmF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldC5cclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCBUaGUgcGFyYW1ldGVyIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IFRoZSBwcm9wZXJ0eSBrZXkuXHJcbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUgVGhlIGFubm90YXRpb24gdHlwZS5cclxuICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gaXNBc3luYyBJbmRpY2F0ZXMgd2hldGhlciBpdCdzIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0KHRhcmdldDogYW55LCBwYXJhbWV0ZXJJbmRleDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBhbm5vdGF0aW9uVHlwZTogc3RyaW5nLCBjb25maWc6IGFueSwgaXNBc3luYzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIC8qIERlZmluZSB0aGUgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICB2YXIgZGVjb3JhdG9yQ29uZmlndXJhdGlvbjogRGVjb3JhdG9yQ29uZmlndXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgcHJvcGVydHlJbmRleDogcGFyYW1ldGVySW5kZXgsXHJcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlLZXksXHJcbiAgICAgICAgICAgIGFubm90YXRpb25UeXBlOiBhbm5vdGF0aW9uVHlwZSxcclxuICAgICAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIGlzQXN5bmM6IGlzQXN5bmMsXHJcbiAgICAgICAgICAgIGlzVmFsaWRhdG9yOiBhbm5vdGF0aW9uVHlwZSAhPT0gXCJ1cGRhdGVPblwiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIHByb3BlcnR5IGtleSBpcyBkZWZpbmVkICovXHJcbiAgICAgICAgbGV0IGlzUHJvcGVydHlLZXkgPSAocHJvcGVydHlLZXkgIT0gdW5kZWZpbmVkKTtcclxuXHJcbiAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBmdW5jdGlvbiBvciBjb25zdHJ1Y3RvciB0byBiZSB1c2VkIGFzIGluc3RhbmNlRnVuYyAqL1xyXG4gICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbighaXNQcm9wZXJ0eUtleSA/IHRhcmdldCA6IHRhcmdldC5jb25zdHJ1Y3RvciwgZGVjb3JhdG9yQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIHByb3BlcnR5IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5VHlwZSBUaGUgcHJvcGVydHkgdHlwZS5cclxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eS5cclxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldC5cclxuICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0UHJvcGVydHlPYmplY3QobmFtZTogc3RyaW5nLCBwcm9wZXJ0eVR5cGU6IHN0cmluZywgZW50aXR5OiBhbnksIHRhcmdldDogYW55LCBjb25maWc/OiBhbnkpIHtcclxuICAgICAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGluZm9ybWF0aW9uICovXHJcbiAgICAgICAgdmFyIHByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eVR5cGU6IHByb3BlcnR5VHlwZSxcclxuICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXHJcbiAgICAgICAgICAgIGRhdGFQcm9wZXJ0eU5hbWU6IGNvbmZpZyA/IGNvbmZpZy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBlbnRpdHlQcm92aWRlcjogY29uZmlnID8gY29uZmlnLmVudGl0eVByb3ZpZGVyIDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSB0YXJnZXQncyBjb25zdHJ1Y3RvciAqL1xyXG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkodGFyZ2V0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eUluZm8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBpbnN0YW5jZSBjb250YWluZXIgdG8gdGhlIGxpc3Qgb2YgaW5zdGFuY2VzLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlRnVuYyBUaGUgaW5zdGFuY2UgZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWRkZWQgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkSW5zdGFuY2VDb250YWluZXIoaW5zdGFuY2VGdW5jOiBhbnkpOiBJbnN0YW5jZUNvbnRhaW5lciB7XHJcbiAgICAgICAgLyogRGVmaW5lIGFuIGluc3RhbmNlIGNvbnRhaW5lciAqL1xyXG4gICAgICAgIGxldCBpbnN0YW5jZUNvbnRhaW5lcjogSW5zdGFuY2VDb250YWluZXIgPSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZUZ1bmMsICAgICAvKiBJbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lciAqL1xyXG4gICAgICAgICAgICBwcm9wZXJ0eUFubm90YXRpb25zOiBbXSwgICAgLyogQW5ub3RhdGlvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLCAgICAgICAgICAgICAvKiBQcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGFuY2UgKi9cclxuICAgICAgICAgICAgbm9uVmFsaWRhdGlvbkRlY29yYXRvcnM6IHtcclxuICAgICAgICAgICAgICAgIC8qIERpc2FibGVkIGRlY29yYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uczoge30sIC8qIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGZvciBkaXNhYmxlZCBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiB7fSwgICAgICAgIC8qIENoYW5nZSBkZXRlY3Rpb24gZm9yIGRpc2FibGVkIGRlY29yYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sUHJvcDoge30gICAgICAgICAgICAgLyogQ29udHJvbCBwcm9wZXJ0aWVzIGZvciBkaXNhYmxlZCBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEVycm9yIGRlY29yYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgIGVycm9yOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uczoge30sIC8qIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGZvciBlcnJvciBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiB7fSwgICAgICAgIC8qIENoYW5nZSBkZXRlY3Rpb24gZm9yIGVycm9yIGRlY29yYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sUHJvcDoge30gICAgICAgICAgICAgLyogQ29udHJvbCBwcm9wZXJ0aWVzIGZvciBlcnJvciBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgY2xhc3MgZGVjb3JhdG9ycyAqL1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudENsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uczoge30sIC8qIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGZvciBlbGVtZW50IGNsYXNzIGRlY29yYXRvcnMgKi9cclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHt9LCAgICAgICAgLyogQ2hhbmdlIGRldGVjdGlvbiBmb3IgZWxlbWVudCBjbGFzcyBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFByb3A6IHt9ICAgICAgICAgICAgIC8qIENvbnRyb2wgcHJvcGVydGllcyBmb3IgZWxlbWVudCBjbGFzcyBkZWNvcmF0b3JzICovXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvKiBTYW5pdGl6ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGFuY2UgKi9cclxuICAgICAgICAgICAgc2FuaXRpemVyczoge31cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiBBZGQgdGhlIGluc3RhbmNlIGNvbnRhaW5lciB0byB0aGUgaW5zdGFuY2VzIGFycmF5ICovXHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZUNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIC8qIFJldHVybiB0aGUgY3JlYXRlZCBpbnN0YW5jZSBjb250YWluZXIgKi9cclxuICAgICAgICByZXR1cm4gaW5zdGFuY2VDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcHJvcGVydHkgdG8gdGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUZ1bmMgVGhlIGluc3RhbmNlIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5SW5mbyBUaGUgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gaXNGcm9tQW5ub3RhdGlvbiBJbmRpY2F0ZXMgd2hldGhlciBpdCdzIGFkZGVkIGZyb20gYW4gYW5ub3RhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb3BlcnR5KGluc3RhbmNlRnVuYzogYW55LCBwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mbywgaXNGcm9tQW5ub3RhdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLyogRmluZCB0aGUgaW5zdGFuY2UgaW4gdGhlIGluc3RhbmNlcyBhcnJheSAqL1xyXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2UgPT4gaW5zdGFuY2UuaW5zdGFuY2UgPT09IGluc3RhbmNlRnVuYyk7XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBpbnN0YW5jZSBleGlzdHMgKi9cclxuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgLyogQWRkIHByb3BlcnR5IGluZm9ybWF0aW9uIHRvIHRoZSBleGlzdGluZyBpbnN0YW5jZSAqL1xyXG4gICAgICAgICAgICB0aGlzLmFkZFByb3BlcnR5SW5mbyhpbnN0YW5jZSwgcHJvcGVydHlJbmZvLCAhaXNGcm9tQW5ub3RhdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGNvbnRhaW5lciBpZiBpdCBkb2Vzbid0IGV4aXN0ICovXHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5hZGRJbnN0YW5jZUNvbnRhaW5lcihpbnN0YW5jZUZ1bmMpO1xyXG5cclxuICAgICAgICAgICAgLyogQWRkIHByb3BlcnR5IGluZm9ybWF0aW9uIHRvIHRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlICovXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUHJvcGVydHlJbmZvKGluc3RhbmNlLCBwcm9wZXJ0eUluZm8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgcHJvcGVydHkgaW5mb3JtYXRpb24gdG8gdGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHByb3BlcnR5SW5mbyBUaGUgcHJvcGVydHkgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gaXNBZGRQcm9wZXJ0eSBJbmRpY2F0ZXMgd2hldGhlciBpdCdzIGFkZGVkIGFzIGEgbmV3IHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUHJvcGVydHlJbmZvKGluc3RhbmNlOiBJbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHlJbmZvOiBQcm9wZXJ0eUluZm8sIGlzQWRkUHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8qIEZpbmQgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgaW5zdGFuY2UncyBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gaW5zdGFuY2UucHJvcGVydGllcz8uZmluZCh0ID0+IHQubmFtZSA9PSBwcm9wZXJ0eUluZm8ubmFtZSk7XHJcblxyXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi9cclxuICAgICAgICBpZiAoIXByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgIC8qIEFkZCB0aGUgcHJvcGVydHkgaW5mb3JtYXRpb24gdG8gdGhlIGluc3RhbmNlJ3MgcHJvcGVydGllcyAqL1xyXG4gICAgICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0aWVzPy5wdXNoKHByb3BlcnR5SW5mbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0FkZFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgIC8qIFVwZGF0ZSBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBpZiByZXF1ZXN0ZWQgKi9cclxuICAgICAgICAgICAgcHJvcGVydHkuZGF0YVByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5kYXRhUHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgICBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eUluZm8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gYW5ub3RhdGlvbiB0byB0aGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlRnVuYyBUaGUgaW5zdGFuY2UgZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yQ29uZmlndXJhdGlvbiBUaGUgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRBbm5vdGF0aW9uKGluc3RhbmNlRnVuYzogYW55LCBkZWNvcmF0b3JDb25maWd1cmF0aW9uOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgLyogQWRkIHByb3BlcnR5IGluZm9ybWF0aW9uIHRvIHRoZSBpbnN0YW5jZSAqL1xyXG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkoaW5zdGFuY2VGdW5jLCB7IHByb3BlcnR5VHlwZTogUFJPUEVSVFksIG5hbWU6IGRlY29yYXRvckNvbmZpZ3VyYXRpb24ucHJvcGVydHlOYW1lIH0sIHRydWUpO1xyXG5cclxuICAgICAgICAvKiBGaW5kIG9yIGNyZWF0ZSB0aGUgaW5zdGFuY2UgaW4gdGhlIGluc3RhbmNlcyBhcnJheSAqL1xyXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2UgPT4gaW5zdGFuY2UuaW5zdGFuY2UgPT09IGluc3RhbmNlRnVuYyk7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIC8qIEFkZCB0aGUgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGluc3RhbmNlJ3MgcHJvcGVydHkgYW5ub3RhdGlvbnMgKi9cclxuICAgICAgICAgICAgaW5zdGFuY2UucHJvcGVydHlBbm5vdGF0aW9ucy5wdXNoKGRlY29yYXRvckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5hZGRJbnN0YW5jZUNvbnRhaW5lcihpbnN0YW5jZUZ1bmMpO1xyXG4gICAgICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0eUFubm90YXRpb25zLnB1c2goZGVjb3JhdG9yQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBBZGQgY2hhbmdlIHZhbGlkYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICBpZiAoZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcgJiYgZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcuY29uZGl0aW9uYWxFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucyhkZWNvcmF0b3JDb25maWd1cmF0aW9uLmNvbmZpZy5jb25kaXRpb25hbEV4cHJlc3Npb24pO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoYW5nZVZhbGlkYXRpb24oaW5zdGFuY2UsIGRlY29yYXRvckNvbmZpZ3VyYXRpb24ucHJvcGVydHlOYW1lLCBjb2x1bW5zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEFkZCBkeW5hbWljIGNvbmZpZ3VyYXRpb24gYW5kIHZhbGlkYXRpb24gKi9cclxuICAgICAgICBpZiAoZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcgJiYgZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcuZHluYW1pY0NvbmZpZykge1xyXG4gICAgICAgICAgICBsZXQgY29sdW1ucyA9IExpbnEuZHluYW1pY0NvbmZpZ1BhcnNlcihkZWNvcmF0b3JDb25maWd1cmF0aW9uLmNvbmZpZy5keW5hbWljQ29uZmlnLCBkZWNvcmF0b3JDb25maWd1cmF0aW9uLnByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hhbmdlVmFsaWRhdGlvbihpbnN0YW5jZSwgZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5wcm9wZXJ0eU5hbWUsIGNvbHVtbnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogU2V0IGNvbmRpdGlvbmFsIGNvbHVtbnMgYmFzZWQgb24gdGhlIGRlY29yYXRvciBjb25maWd1cmF0aW9uICovXHJcbiAgICAgICAgdGhpcy5zZXRDb25kaXRpb25hbENvbHVtbnMoaW5zdGFuY2UsIGRlY29yYXRvckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBjb25kaXRpb25hbCBjb2x1bW5zIGJhc2VkIG9uIHRoZSBkZWNvcmF0b3IgY29uZmlndXJhdGlvbi5cclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIGRlY29yYXRvckNvbmZpZ3VyYXRpb24gVGhlIGRlY29yYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q29uZGl0aW9uYWxDb2x1bW5zKGluc3RhbmNlOiBhbnksIGRlY29yYXRvckNvbmZpZ3VyYXRpb246IERlY29yYXRvckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICAvKiBDaGVja3MgaWYgdGhlcmUgaXMgYW4gaW5zdGFuY2UgYW5kIGRlY29yYXRvciBjb25maWd1cmF0aW9uIHByZXNlbnQgKi9cclxuICAgICAgICBpZiAoaW5zdGFuY2UgJiYgZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcpIHtcclxuICAgICAgICAgICAgLyogSGFuZGxlcyBsb2dpY2FsIGFubm90YXRpb25zIChBTkQsIE9SLCBOT1QpICovXHJcbiAgICAgICAgICAgIGlmIChkZWNvcmF0b3JDb25maWd1cmF0aW9uLmFubm90YXRpb25UeXBlID09IEFubm90YXRpb25UeXBlcy5hbmQgfHxcclxuICAgICAgICAgICAgICAgIGRlY29yYXRvckNvbmZpZ3VyYXRpb24uYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLm9yIHx8XHJcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JDb25maWd1cmF0aW9uLmFubm90YXRpb25UeXBlID09IEFubm90YXRpb25UeXBlcy5ub3RcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvKiBJdGVyYXRlcyBvdmVyIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbnMgKi9cclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlY29yYXRvckNvbmZpZ3VyYXRpb24uY29uZmlnLnZhbGlkYXRpb24pLmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2tzIGlmIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gaXMgbm90IGEgYm9vbGVhbiAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVjb3JhdG9yQ29uZmlndXJhdGlvbi5jb25maWcudmFsaWRhdGlvblt0XSAhPT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0cyBsb2dpY2FsIGNvbmRpdGlvbmFsIGJhc2VkIG9uIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2dpY2FsQ29uZGl0aW9uYWwoaW5zdGFuY2UsIHQsIGRlY29yYXRvckNvbmZpZ3VyYXRpb24uY29uZmlnLnZhbGlkYXRpb25bdF0uZmllbGROYW1lLCBkZWNvcmF0b3JDb25maWd1cmF0aW9uLnByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8qIFNldHMgbG9naWNhbCBjb25kaXRpb25hbCBmb3Igbm9uLWxvZ2ljYWwgYW5ub3RhdGlvbnMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9naWNhbENvbmRpdGlvbmFsKGluc3RhbmNlLCBkZWNvcmF0b3JDb25maWd1cmF0aW9uLmFubm90YXRpb25UeXBlLCBkZWNvcmF0b3JDb25maWd1cmF0aW9uLmNvbmZpZy5maWVsZE5hbWUsIGRlY29yYXRvckNvbmZpZ3VyYXRpb24ucHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgbG9naWNhbCBjb25kaXRpb25hbHMgYmFzZWQgb24gdGhlIGRlY29yYXRvciBjb25maWd1cmF0aW9uLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUgVGhlIGFubm90YXRpb24gdHlwZS5cclxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIGZpZWxkIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TG9naWNhbENvbmRpdGlvbmFsKGluc3RhbmNlOiBhbnksIGFubm90YXRpb25UeXBlOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIC8qIFxyXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbiBpbnN0YW5jZSBhbmQgYW5ub3RhdGlvbiB0eXBlIHdpdGggYXBwbGljYWJsZSBjb25kaXRpb25zXHJcbiAgICAgICAgICogZm9yIHNldHRpbmcgY29uZGl0aW9uYWwgdmFsdWUgcHJvcGVydGllcy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5zdGFuY2UgJiYgKFxyXG4gICAgICAgICAgICAoYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLmNvbXBhcmUgfHxcclxuICAgICAgICAgICAgICAgIGFubm90YXRpb25UeXBlID09IEFubm90YXRpb25UeXBlcy5ncmVhdGVyVGhhbiB8fFxyXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLmdyZWF0ZXJUaGFuRXF1YWxUbyB8fFxyXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLmxlc3NUaGFuIHx8XHJcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSA9PSBBbm5vdGF0aW9uVHlwZXMubGVzc1RoYW5FcXVhbFRvIHx8XHJcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSA9PSBBbm5vdGF0aW9uVHlwZXMuZGlmZmVyZW50IHx8XHJcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSA9PSBBbm5vdGF0aW9uVHlwZXMuZmFjdG9yIHx8XHJcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSA9PSBBbm5vdGF0aW9uVHlwZXMubWluVGltZSB8fFxyXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLm1heFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChhbm5vdGF0aW9uVHlwZSA9PSBBbm5vdGF0aW9uVHlwZXMuY3JlZGl0Q2FyZCAmJiBmaWVsZE5hbWUpIHx8XHJcbiAgICAgICAgICAgICgoYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLm1pbkRhdGUgfHwgYW5ub3RhdGlvblR5cGUgPT0gQW5ub3RhdGlvblR5cGVzLm1heERhdGUpICYmIGZpZWxkTmFtZSlcclxuICAgICAgICApKSB7XHJcbiAgICAgICAgICAgIC8qIFNldHMgY29uZGl0aW9uYWwgdmFsdWUgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbmRpdGlvbnMgKi9cclxuICAgICAgICAgICAgdGhpcy5zZXRDb25kaXRpb25hbFZhbHVlUHJvcChpbnN0YW5jZSwgZmllbGROYW1lLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29uZGl0aW9uYWwgdmFsdWUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgZGVjb3JhdG9yIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIGluc3RhbmNlIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gcmVmUHJvcGVydHlOYW1lIFRoZSByZWZlcmVuY2UgcHJvcGVydHkgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENvbmRpdGlvbmFsVmFsdWVQcm9wKGluc3RhbmNlOiBJbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHJlZlByb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIHByb3BOYW1lIGV4aXN0cyAqL1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgLyogU3BsaXRzIHByb3BOYW1lIGludG8gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzICovXHJcbiAgICAgICAgICAgIGxldCBzcGxpdFByb3BzID0gcHJvcGVydHlOYW1lLnNwbGl0ID8gcHJvcGVydHlOYW1lLnNwbGl0KCcuJykgOiAnJztcclxuXHJcbiAgICAgICAgICAgIC8qIENoZWNrcyBpZiB0aGUgbGVuZ3RoIG9mIHNwbGl0UHJvcHMgaXMgbGVzcyB0aGFuIDIgKi9cclxuICAgICAgICAgICAgaWYgKHNwbGl0UHJvcHMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgaWYgaXQgZG9lcyBub3QgZXhpc3QgKi9cclxuICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemVzIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BOYW1lXSBpZiBpdCBkb2VzIG5vdCBleGlzdCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHlOYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qIFB1c2hlcyByZWZQcm9wTmFtZSBpbnRvIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BOYW1lXSBpZiBpdCBkb2VzIG5vdCBleGlzdCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5TmFtZV0uaW5kZXhPZihyZWZQcm9wZXJ0eU5hbWUpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHlOYW1lXS5wdXNoKHJlZlByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKiBBZGRzIGNoYW5nZSB2YWxpZGF0aW9uIGZvciBjb21wbGV4IHByb3BlcnRpZXMgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hhbmdlVmFsaWRhdGlvbihpbnN0YW5jZSwgcmVmUHJvcGVydHlOYW1lLCBbeyBhcmd1bWVudEluZGV4OiAxLCBvYmplY3RQcm9wTmFtZTogc3BsaXRQcm9wc1swXSwgcHJvcE5hbWU6IHNwbGl0UHJvcHNbMV0sIHJlZmVyZW5jZVByb3BOYW1lOiByZWZQcm9wZXJ0eU5hbWUgfV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGNoYW5nZSB2YWxpZGF0aW9uIGJhc2VkIG9uIHRoZSBjb2x1bW5zLlxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBjb250YWluZXIuXHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICogQHBhcmFtIGNvbHVtbnMgVGhlIGNvbHVtbnMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRDaGFuZ2VWYWxpZGF0aW9uKGluc3RhbmNlOiBJbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgLyogQ2hlY2tzIGlmIGluc3RhbmNlIGV4aXN0cy4gKi9cclxuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgaWYgaXQgZG9lcyBub3QgZXhpc3QuICovXHJcbiAgICAgICAgICAgIGlmICghaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzID0ge307XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIEl0ZXJhdGVzIHRocm91Z2ggY29sdW1ucy4gKi9cclxuICAgICAgICAgICAgY29sdW1ucy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgLyogQ2hlY2tzIGlmIHByb3BOYW1lIGV4aXN0cyBhbmQgb2JqZWN0UHJvcE5hbWUgZG9lcyBub3QgZXhpc3QuICovXHJcbiAgICAgICAgICAgICAgICBpZiAodC5wcm9wTmFtZSAmJiAhdC5vYmplY3RQcm9wTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemVzIGNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3QucHJvcE5hbWVdIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFzIGFueSlbdC5wcm9wTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFzIGFueSlbdC5wcm9wTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qIFB1c2hlcyBwcm9wZXJ0eU5hbWUgaW50byBjb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1t0LnByb3BOYW1lXSBpZiBpdCBkb2VzIG5vdCBleGlzdC4gKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzIGFzIGFueSlbdC5wcm9wTmFtZV0uaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyBhcyBhbnkpW3QucHJvcE5hbWVdLnB1c2gocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrcyBpZiBwcm9wTmFtZSBhbmQgb2JqZWN0UHJvcE5hbWUgZXhpc3QuICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvcE5hbWUgJiYgdC5vYmplY3RQcm9wTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplcyBjb25kaXRpb25hbE9iamVjdFByb3BzIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0cyByZWZlcmVuY2VQcm9wTmFtZSBhbmQgYWRkcyBpdCB0byBjb25kaXRpb25hbE9iamVjdFByb3BzLiAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0LnJlZmVyZW5jZVByb3BOYW1lID0gcHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgZGVmYXVsdCBjb250YWluZXIgZm9yIG1hbmFnaW5nIGluc3RhbmNlIGNvbmZpZ3VyYXRpb25zLlxyXG4gKiBcclxuICogTWFuYWdlcyB0aGUgY29uZmlndXJhdGlvbiBhbmQgaW5zdGFudGlhdGlvbiBvZiB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIHNhbml0aXplcnMsIGFuZCBvdGhlciBwcm9wZXJ0aWVzIGZvciBjbGFzc2VzLlxyXG4gKiBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIGNvbnRhaW5lciBmb3IgbWFuYWdpbmcgaW5zdGFuY2UtcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhbmQgcHJvcGVydGllcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29udGFpbmVyID0gbmV3IERlZmF1bHRDb250YWluZXIoKTsiXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnnotationTypes } from '../core/
|
|
1
|
+
import { AnnotationTypes } from '../core/annotation-types';
|
|
2
2
|
import { baseAsyncValidator } from "../reactive-form-validators/async/base.async.validator";
|
|
3
3
|
import { baseDecoratorFunction } from "./base-decorator.function";
|
|
4
4
|
export function allOf(config) {
|
|
@@ -7,4 +7,4 @@ export function allOf(config) {
|
|
|
7
7
|
export function allOfAsync(config) {
|
|
8
8
|
return baseDecoratorFunction(AnnotationTypes.allOf, [baseAsyncValidator(config, AnnotationTypes.allOf)], true);
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsT2YuZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL2RlY29yYXRvcnMvYWxsT2YuZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUM1RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRSxNQUFNLFVBQVUsS0FBSyxDQUFDLE1BQW9CO0lBQ3RDLE9BQU8scUJBQXFCLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFvQjtJQUMzQyxPQUFPLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UeXBlcyB9IGZyb20gJy4uL2NvcmUvYW5ub3RhdGlvbi10eXBlcyc7XHJcbmltcG9ydCB7IEFycmF5Q29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcvYXJyYXktY29uZmlnXCI7XHJcbmltcG9ydCB7IGJhc2VBc3luY1ZhbGlkYXRvciB9IGZyb20gXCIuLi9yZWFjdGl2ZS1mb3JtLXZhbGlkYXRvcnMvYXN5bmMvYmFzZS5hc3luYy52YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgYmFzZURlY29yYXRvckZ1bmN0aW9uIH0gZnJvbSBcIi4vYmFzZS1kZWNvcmF0b3IuZnVuY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGxPZihjb25maWc/OiBBcnJheUNvbmZpZykge1xyXG4gICAgcmV0dXJuIGJhc2VEZWNvcmF0b3JGdW5jdGlvbihBbm5vdGF0aW9uVHlwZXMuYWxsT2YsIGNvbmZpZyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGxPZkFzeW5jKGNvbmZpZz86IEFycmF5Q29uZmlnKSB7XHJcbiAgICByZXR1cm4gYmFzZURlY29yYXRvckZ1bmN0aW9uKEFubm90YXRpb25UeXBlcy5hbGxPZiwgW2Jhc2VBc3luY1ZhbGlkYXRvcihjb25maWcsIEFubm90YXRpb25UeXBlcy5hbGxPZildLCB0cnVlKTtcclxufSJdfQ==
|