UNPKG

ontimize-web-ngx

Version:
155 lines 20.7 kB
import { Util } from '../util/util'; import * as lpn from 'google-libphonenumber'; const EMAIL_REGEXP = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/; const DNI_PATTERN = '^(([0-9]{8})([-]?)([a-zA-Z]{1}))$'; const NIE_PATTERN = '^(([x-zX-Z]{1})([-]?)([0-9]{7})([-]?)([a-zA-Z]{1}))$'; const DNI_CHECK = 'TRWAGMYFPDXBNJZSQVHLCKET'; const NUMBERS = '0123456789'; export const TWELVE_HOUR_FORMAT_PATTERN = '^(([0-9]|([01]?[0-9])):([0-9]|([0-5][0-9])) *([AaPp][Mm])*)$'; export const TWENTY_FOUR_HOUR_FORMAT_PATTERN = '^([0-9]|([01]?[0-9]|2[0-3])):[0-9]|([0-5][0-9])$'; export class OValidators { static twelveHourFormatValidator(control) { const regExp = new RegExp(TWELVE_HOUR_FORMAT_PATTERN); if (control.value && typeof control.value === 'string' && !regExp.test(control.value)) { return { invalidFormatHour: true }; } return {}; } static twentyFourHourFormatValidator(control) { const regExp = new RegExp(TWENTY_FOUR_HOUR_FORMAT_PATTERN); if (control.value && typeof control.value === 'string' && !regExp.test(control.value)) { return { invalidFormatHour: true }; } return {}; } static emailValidator(control) { if (control.value && control.value.length > 0 && !EMAIL_REGEXP.test(control.value)) { return { invalidEmailAddress: true }; } return {}; } static phoneValidator(control, countryCode) { if (!control || !control.value) { return {}; } const phoneNumberUtilInstance = lpn.PhoneNumberUtil.getInstance(); const error = { validatePhoneNumber: { valid: false } }; let number; let isValidForRegion = false; try { number = phoneNumberUtilInstance.parse(control.value, countryCode); if (number) { isValidForRegion = phoneNumberUtilInstance.isValidNumberForRegion(number, countryCode); } } catch (e) { return error; } if (control.value && (!number || !isValidForRegion)) { return error; } return {}; } static nifValidator(control) { const newValue = control.value; const regExp = new RegExp(DNI_PATTERN + '|' + NIE_PATTERN); let valueWithoutDashes = ''; for (const i in newValue) { if (newValue[i] !== '-') { valueWithoutDashes = valueWithoutDashes + newValue[i]; } } if (valueWithoutDashes.length > 1) { const firstChar = valueWithoutDashes.charAt(0); if (NUMBERS.indexOf(firstChar) !== -1) { const number = valueWithoutDashes.substring(0, valueWithoutDashes.length - 1); const pos = parseInt(number, 10) % 23; const expectedLetter = DNI_CHECK.substring(pos, pos + 1); const letter = valueWithoutDashes.charAt(valueWithoutDashes.length - 1); const dniLetterError = (expectedLetter !== letter.toUpperCase()); if (dniLetterError) { return { invalidNIFLetter: true }; } else { if (!regExp.test(valueWithoutDashes)) { return { invalidNIF: true }; } } } else { if (!regExp.test(valueWithoutDashes)) { return { invalidNIF: true }; } } } return undefined; } static patternValidator(regex, key) { if (!Util.isDefined(regex)) { console.warn('Regex param must be defined in patternValidator '); } if (!Util.isDefined(key)) { console.warn('Validation key param must be defined in patternValidator '); } let validator = (control) => { if (!Util.isDefined(regex) || !Util.isDefined(key) || !control.value) { return undefined; } const valid = regex.test(control.value); let result = {}; if (valid) { result = undefined; } else { result[key] = !valid; } return result; }; return validator; } static createMinValidator(min) { const validator = (control) => { let val = control.value; if (typeof (control.value) !== 'number') { try { val = parseInt(control.value, 10); } catch (e) { val = control.value; } } if (val < min) { return { min: { requiredMin: min } }; } return {}; }; return validator; } static createMaxValidator(max) { const validator = (control) => { let val = control.value; if (typeof (control.value) !== 'number') { try { val = parseInt(control.value, 10); } catch (e) { val = control.value; } } if (max < val) { return { max: { requiredMax: max } }; } return {}; }; return validator; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby12YWxpZGF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3ZhbGlkYXRvcnMvby12YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUU3QyxNQUFNLFlBQVksR0FBRyxpS0FBaUssQ0FBQztBQUd2TCxNQUFNLFdBQVcsR0FBRyxtQ0FBbUMsQ0FBQztBQUN4RCxNQUFNLFdBQVcsR0FBRyxzREFBc0QsQ0FBQztBQUMzRSxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztBQUM3QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsOERBQThELENBQUM7QUFDekcsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsa0RBQWtELENBQUM7QUFFbEcsTUFBTSxPQUFPLFdBQVc7SUFLZixNQUFNLENBQUMseUJBQXlCLENBQUMsT0FBMkI7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNwQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUtNLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxPQUEyQjtRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzNELElBQUksT0FBTyxD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Q0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUN2QyxJQUFJO29CQUNGLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDbkM7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7aUJBQ3JCO2FBQ0Y7WUFDRCxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7Z0JBQ2IsT0FBTztvQkFDTCxHQUFHLEVBQUU7d0JBQ0gsV0FBVyxFQUFFLEdBQUc7cUJBQ2pCO2lCQUNGLENBQUM7YUFDSDtZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFBO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0ICogYXMgbHBuIGZyb20gJ2dvb2dsZS1saWJwaG9uZW51bWJlcic7XG5cbmNvbnN0IEVNQUlMX1JFR0VYUCA9IC9eW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSk/XFwuKStbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSk/JC87XG5cbi8vIE5JRiBSZWd1bGFyIEV4cHJlc3Npb25zXG5jb25zdCBETklfUEFUVEVSTiA9ICdeKChbMC05XXs4fSkoWy1dPykoW2EtekEtWl17MX0pKSQnO1xuY29uc3QgTklFX1BBVFRFUk4gPSAnXigoW3gtelgtWl17MX0pKFstXT8pKFswLTldezd9KShbLV0/KShbYS16QS1aXXsxfSkpJCc7XG5jb25zdCBETklfQ0hFQ0sgPSAnVFJXQUdNWUZQRFhCTkpaU1FWSExDS0VUJztcbmNvbnN0IE5VTUJFUlMgPSAnMDEyMzQ1Njc4OSc7XG5leHBvcnQgY29uc3QgVFdFTFZFX0hPVVJfRk9STUFUX1BBVFRFUk4gPSAnXigoWzAtOV18KFswMV0/WzAtOV0pKTooWzAtOV18KFswLTVdWzAtOV0pKSAqKFtBYVBwXVtNbV0pKikkJztcbmV4cG9ydCBjb25zdCBUV0VOVFlfRk9VUl9IT1VSX0ZPUk1BVF9QQVRURVJOID0gJ14oWzAtOV18KFswMV0/WzAtOV18MlswLTNdKSk6WzAtOV18KFswLTVdWzAtOV0pJCc7XG5cbmV4cG9ydCBjbGFzcyBPVmFsaWRhdG9ycyB7XG5cbiAgLyoqXG4gICAqIEhvdXIgdmFsaWRhdG9yIGhoOm1tIGFtL3BtIGZvcm1hdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0d2VsdmVIb3VyRm9ybWF0VmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoVFdFTFZFX0hPVVJfRk9STUFUX1BBVFRFUk4pO1xuICAgIGlmIChjb250cm9sLnZhbHVlICYmIHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhcmVnRXhwLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGludmFsaWRGb3JtYXRIb3VyOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3VyIHZhbGlkYXRvciBISDptbSBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHdlbnR5Rm91ckhvdXJGb3JtYXRWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChUV0VOVFlfRk9VUl9IT1VSX0ZPUk1BVF9QQVRURVJOKTtcbiAgICBpZiAoY29udHJvbC52YWx1ZSAmJiB0eXBlb2YgY29udHJvbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXJlZ0V4cC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBpbnZhbGlkRm9ybWF0SG91cjogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVtYWlsVmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoID4gMCAmJiAhRU1BSUxfUkVHRVhQLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGludmFsaWRFbWFpbEFkZHJlc3M6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBob25lIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwaG9uZVZhbGlkYXRvcihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsIGNvdW50cnlDb2RlPzogYW55KTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgaWYgKCFjb250cm9sIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBob25lTnVtYmVyVXRpbEluc3RhbmNlID0gbHBuLlBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGVycm9yID0geyB2YWxpZGF0ZVBob25lTnVtYmVyOiB7IHZhbGlkOiBmYWxzZSB9IH07XG5cbiAgICBsZXQgbnVtYmVyOiBscG4uUGhvbmVOdW1iZXI7XG4gICAgbGV0IGlzVmFsaWRGb3JSZWdpb246IGJvb2xlYW4gPSBmYWxzZVxuICAgIHRyeSB7XG4gICAgICBudW1iZXIgPSBwaG9uZU51bWJlclV0aWxJbnN0YW5jZS5wYXJzZShcbiAgICAgICAgY29udHJvbC52YWx1ZSxcbiAgICAgICAgY291bnRyeUNvZGVcbiAgICAgICk7XG4gICAgICBpZiAobnVtYmVyKSB7XG4gICAgICAgIGlzVmFsaWRGb3JSZWdpb24gPSBwaG9uZU51bWJlclV0aWxJbnN0YW5jZS5pc1ZhbGlkTnVtYmVyRm9yUmVnaW9uKFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICBjb3VudHJ5Q29kZVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICBpZiAoY29udHJvbC52YWx1ZSAmJiAoIW51bWJlciB8fCAhaXNWYWxpZEZvclJlZ2lvbikpIHtcbiAgICAgIHJldHVybiBlcnJvclxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogTklGIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBuaWZWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoRE5JX1BBVFRFUk4gKyAnfCcgKyBOSUVfUEFUVEVSTik7XG5cbiAgICAvLyByZW1vdmluZyBkYXNoZXNcbiAgICBsZXQgdmFsdWVXaXRob3V0RGFzaGVzID0gJyc7XG4gICAgZm9yIChjb25zdCBpIGluIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAobmV3VmFsdWVbaV0gIT09ICctJykge1xuICAgICAgICB2YWx1ZVdpdGhvdXREYXNoZXMgPSB2YWx1ZVdpdGhvdXREYXNoZXMgKyBuZXdWYWx1ZVtpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlV2l0aG91dERhc2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBmaXJzdENoYXIgPSB2YWx1ZVdpdGhvdXREYXNoZXMuY2hhckF0KDApO1xuICAgICAgaWYgKE5VTUJFUlMuaW5kZXhPZihmaXJzdENoYXIpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBudW1iZXIgPSB2YWx1ZVdpdGhvdXREYXNoZXMuc3Vic3RyaW5nKDAsIHZhbHVlV2l0aG91dERhc2hlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcG9zID0gcGFyc2VJbnQobnVtYmVyLCAxMCkgJSAyMztcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRMZXR0ZXIgPSBETklfQ0hFQ0suc3Vic3RyaW5nKHBvcywgcG9zICsgMSk7XG4gICAgICAgIGNvbnN0IGxldHRlciA9IHZhbHVlV2l0aG91dERhc2hlcy5jaGFyQXQodmFsdWVXaXRob3V0RGFzaGVzLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBkbmlMZXR0ZXJFcnJvciA9IChleHBlY3RlZExldHRlciAhPT0gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICBpZiAoZG5pTGV0dGVyRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4geyBpbnZhbGlkTklGTGV0dGVyOiB0cnVlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFyZWdFeHAudGVzdCh2YWx1ZVdpdGhvdXREYXNoZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpbnZhbGlkTklGOiB0cnVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXJlZ0V4cC50ZXN0KHZhbHVlV2l0aG91dERhc2hlcykpIHtcbiAgICAgICAgICByZXR1cm4geyBpbnZhbGlkTklGOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXR0ZXJucyB2YWxpZGF0b3JcbiAgICogQHBhcmFtIHJlZ2V4XG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMgdmFsaWRhdG9yXG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBhdHRlcm5WYWxpZGF0b3IocmVnZXg6IFJlZ0V4cCwga2V5OiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChyZWdleCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignUmVnZXggcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGluIHBhdHRlcm5WYWxpZGF0b3IgJylcbiAgICB9XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGtleSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignVmFsaWRhdGlvbiBrZXkgcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGluIHBhdHRlcm5WYWxpZGF0b3IgJylcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQocmVnZXgpIHx8ICFVdGlsLmlzRGVmaW5lZChrZXkpIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgIC8vIGlmIHJlZ2V4IGlzIG5vdCBkZWZpbmVkIG9yIGtleSBpcyBub3QgZGVmaW5lZCBvciBjb250cm9sIGlzIGVtcHR5IHJldHVybiBubyBlcnJvclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyB0ZXN0IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhZ2FpbnN0IHRoZSByZWdleHAgc3VwcGxpZWRcbiAgICAgIGNvbnN0IHZhbGlkID0gcmVnZXgudGVzdChjb250cm9sLnZhbHVlKTtcblxuICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAvLyBpZiB0cnVlLCByZXR1cm4gbm8gZXJyb3IgKG5vIGVycm9yKSwgZWxzZSByZXR1cm4gZXJyb3IgcGFzc2VkIGluIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSAhdmFsaWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcblxuICB9XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFZhbGlkYXRvci5taW5gIGluc3RlYWRcbiAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZU1pblZhbGlkYXRvcihtaW46IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCkgPT4ge1xuICAgICAgbGV0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBpZiAodHlwZW9mIChjb250cm9sLnZhbHVlKSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWwgPSBwYXJzZUludChjb250cm9sLnZhbHVlLCAxMCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB2YWwgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsIDwgbWluKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWluOiB7XG4gICAgICAgICAgICByZXF1aXJlZE1pbjogbWluXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG4gIC8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBWYWxpZGF0b3IubWF4YCBpbnN0ZWFkXG4gKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVNYXhWYWxpZGF0b3IobWF4OiBudW1iZXIpOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpID0+IHtcbiAgICAgIGxldCB2YWwgPSBjb250cm9sLnZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiAoY29udHJvbC52YWx1ZSkgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsID0gcGFyc2VJbnQoY29udHJvbC52YWx1ZSwgMTApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdmFsID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1heCA8IHZhbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1heDoge1xuICAgICAgICAgICAgcmVxdWlyZWRNYXg6IG1heFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxufVxuIl19