UNPKG

angular-cc-library

Version:
267 lines 29.7 kB
const defaultFormat = /(\d{1,4})/g; const cards = [ { type: 'maestro', patterns: [5018, 502, 503, 506, 56, 58, 639, 6220, 67], format: defaultFormat, length: [12, 13, 14, 15, 16, 17, 18, 19], cvvLength: [3], luhn: true, }, { type: 'forbrugsforeningen', patterns: [600], format: defaultFormat, length: [16], cvvLength: [3], luhn: true, }, { type: 'dankort', patterns: [5019], format: defaultFormat, length: [16], cvvLength: [3], luhn: true, }, { type: 'visa', patterns: [4], format: defaultFormat, length: [13, 16, 19], cvvLength: [3], luhn: true, }, { type: 'mastercard', patterns: [51, 52, 53, 54, 55, 22, 23, 24, 25, 26, 27], format: defaultFormat, length: [16], cvvLength: [3], luhn: true, }, { type: 'amex', patterns: [34, 37], format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/, length: [15], cvvLength: [3, 4], luhn: true, }, { type: 'dinersclub', patterns: [30, 36, 38, 39], format: /(\d{1,4})(\d{1,6})?(\d{1,4})?/, length: [14], cvvLength: [3], luhn: true, }, { type: 'discover', patterns: [60, 64, 65, 622], format: defaultFormat, length: [16], cvvLength: [3], luhn: true, }, { type: 'unionpay', patterns: [62, 88], format: defaultFormat, length: [16, 17, 18, 19], cvvLength: [3], luhn: false, }, { type: 'jcb', patterns: [35], format: defaultFormat, length: [16, 19], cvvLength: [3], luhn: true, }, ]; // @dynamic export class CreditCard { static cards() { return cards; } static cardFromNumber(num) { num = (num + '').replace(/\D/g, ''); for (let i = 0, len = cards.length; i < len; i++) { const card = cards[i]; const ref = card.patterns; for (let j = 0, len1 = ref.length; j < len1; j++) { const pattern = ref[j]; const p = pattern + ''; if (num.substr(0, p.length) === p) { return card; } } } } static restrictNumeric(e) { if (e.metaKey || e.ctrlKey) { return true; } if (e.which === 32) { return false; } if (e.which === 0) { return true; } if (e.which < 33) { return true; } const input = String.fromCharCode(e.which); return !!/[\d\s]/.test(input); } static hasTextSelected(target) { return target.selectionStart !== null && target.selectionStart !== target.selectionEnd; } static cardType(num) { if (!num) { return num; } const card = this.cardFromNumber(num); if (card !== null && typeof card !== 'undefined') { return card.type; } else { return null; } } static formatCardNumber(num) { num = num.replace(/\D/g, ''); const card = this.cardFromNumber(num); if (!card) { return num; } const upperLength = card.length[card.length.length - 1]; num = num.slice(0, upperLength); if (card.format.global) { const matches = num.match(card.format); if (matches != null) { return matches.join(' '); } } else { const groups = card.format.exec(num); if (groups == null) { return; } groups.shift(); return groups.filter(Boolean).join(' '); } } static safeVal(value, target, updateValue) { let cursor = null; const last = target.value; let result = null; try { cursor = target.selectionStart; } catch (error) { // do nothing } updateValue(value); if (cursor !== null && target === document.activeElement) { if (cursor === last.length) { cursor = value.length; } if (last !== value) { const prevPair = last.slice(cursor - 1, +cursor + 1 || 9e9); const currPair = value.slice(cursor - 1, +cursor + 1 || 9e9); const digit = value[cursor]; if (/\d/.test(digit) && prevPair === (`${digit} `) && currPair === (` ${digit}`)) { cursor = cursor + 1; } } result = cursor; } return result; } static isCardNumber(key, target) { const digit = String.fromCharCode(key); if (!/^\d+$/.test(digit)) { return false; } if (CreditCard.hasTextSelected(target)) { return true; } const value = (target.value + digit).replace(/\D/g, ''); const card = CreditCard.cardFromNumber(value); if (card) { return value.length <= card.length[card.length.length - 1]; } else { return value.length <= 16; } } static restrictExpiry(key, target) { const digit = String.fromCharCode(key); if (!/^\d+$/.test(digit) || this.hasTextSelected(target)) { return false; } const value = `${target.value}${digit}`.replace(/\D/g, ''); return value.length > 6; } static replaceFullWidthChars(str) { if (str === null) { str = ''; } const fullWidth = '\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19'; const halfWidth = '0123456789'; let value = ''; const chars = str.split(''); for (let i = 0; i < chars.length; i++) { let chr = chars[i]; const idx = fullWidth.indexOf(chr); if (idx > -1) { chr = halfWidth[idx]; } value += chr; } return value; } static formatExpiry(expiry) { const parts = expiry.match(/^\D*(\d{1,2})(\D+)?(\d{1,4})?/); if (!parts) { return ''; } let mon = parts[1] || ''; let sep = parts[2] || ''; const year = parts[3] || ''; if (year.length > 0) { sep = ' / '; } else if (sep === ' /') { mon = mon.substring(0, 1); sep = ''; } else if (mon.length === 2 || sep.length > 0) { sep = ' / '; } else if (mon.length === 1 && (mon !== '0' && mon !== '1')) { mon = `0${mon}`; sep = ' / '; } return `${mon}${sep}${year}`; } static restrictCvc(key, target) { const digit = String.fromCharCode(key); if (!/^\d+$/.test(digit) || this.hasTextSelected(target)) { return false; } const val = `${target.value}${digit}`; return val.length <= 4; } static luhnCheck(num) { const digits = num.split('').reverse(); let odd = true; let sum = 0; for (let i = 0; i < digits.length; i++) { let digit = parseInt(digits[i], 10); if ((odd = !odd)) { digit *= 2; } if (digit > 9) { digit -= 9; } sum += digit; } return sum % 10 === 0; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGl0LWNhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNjLWxpYnJhcnkvc3JjL2xpYi9jcmVkaXQtY2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUM7QUFXbkMsTUFBTSxLQUFLLEdBQXFCO0lBQzlCO1FBQ0UsSUFBSSxFQUFFLFNBQVM7UUFDZixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEVBQUUsYUFBYTtRQUNyQixNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNkLElBQUksRUFBRSxJQUFJO0tBQ1gsRUFBRTtRQUNELElBQUksRUFBRSxvQkFBb0I7UUFDMUIsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ2YsTUFBTSxFQUFFLGFBQWE7UUFDckIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDWCxFQUFFO1FBQ0QsSUFBSSxFQUFFLFNBQVM7UUFDZixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDaEIsTUFBTSxFQUFFLGFBQWE7UUFDckIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDWCxFQUFFO1FBQ0QsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7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QU8sR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVmYXVsdEZvcm1hdCA9IC8oXFxkezEsNH0pL2c7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZERlZmluaXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG4gIHBhdHRlcm5zOiBudW1iZXJbXTtcbiAgZm9ybWF0OiBSZWdFeHA7XG4gIGxlbmd0aDogbnVtYmVyW107XG4gIGN2dkxlbmd0aDogbnVtYmVyW107XG4gIGx1aG46IGJvb2xlYW47XG59XG5cbmNvbnN0IGNhcmRzOiBDYXJkRGVmaW5pdGlvbltdID0gW1xuICB7XG4gICAgdHlwZTogJ21hZXN0cm8nLFxuICAgIHBhdHRlcm5zOiBbNTAxOCwgNTAyLCA1MDMsIDUwNiwgNTYsIDU4LCA2MzksIDYyMjAsIDY3XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5XSxcbiAgICBjdnZMZW5ndGg6IFszXSxcbiAgICBsdWhuOiB0cnVlLFxuICB9LCB7XG4gICAgdHlwZTogJ2ZvcmJydWdzZm9yZW5pbmdlbicsXG4gICAgcGF0dGVybnM6IFs2MDBdLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxNl0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICdkYW5rb3J0JyxcbiAgICBwYXR0ZXJuczogWzUwMTldLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxNl0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICd2aXNhJyxcbiAgICBwYXR0ZXJuczogWzRdLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxMywgMTYsIDE5XSxcbiAgICBjdnZMZW5ndGg6IFszXSxcbiAgICBsdWhuOiB0cnVlLFxuICB9LCB7XG4gICAgdHlwZTogJ21hc3RlcmNhcmQnLFxuICAgIHBhdHRlcm5zOiBbNTEsIDUyLCA1MywgNTQsIDU1LCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTZdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAnYW1leCcsXG4gICAgcGF0dGVybnM6IFszNCwgMzddLFxuICAgIGZvcm1hdDogLyhcXGR7MSw0fSkoXFxkezEsNn0pPyhcXGR7MSw1fSk/LyxcbiAgICBsZW5ndGg6IFsxNV0sXG4gICAgY3Z2TGVuZ3RoOiBbMywgNF0sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICdkaW5lcnNjbHViJyxcbiAgICBwYXR0ZXJuczogWzMwLCAzNiwgMzgsIDM5XSxcbiAgICBmb3JtYXQ6IC8oXFxkezEsNH0pKFxcZHsxLDZ9KT8oXFxkezEsNH0pPy8sXG4gICAgbGVuZ3RoOiBbMTRdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAnZGlzY292ZXInLFxuICAgIHBhdHRlcm5zOiBbNjAsIDY0LCA2NSwgNjIyXSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTZdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAndW5pb25wYXknLFxuICAgIHBhdHRlcm5zOiBbNjIsIDg4XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTYsIDE3LCAxOCwgMTldLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IGZhbHNlLFxuICB9LCB7XG4gICAgdHlwZTogJ2pjYicsXG4gICAgcGF0dGVybnM6IFszNV0sXG4gICAgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0LFxuICAgIGxlbmd0aDogWzE2LCAxOV0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSxcbl07XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgQ3JlZGl0Q2FyZCB7XG5cbiAgcHVibGljIHN0YXRpYyBjYXJkcygpIHtcbiAgICByZXR1cm4gY2FyZHM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNhcmRGcm9tTnVtYmVyKG51bTogc3RyaW5nKTogQ2FyZERlZmluaXRpb24ge1xuICAgIG51bSA9IChudW0gKyAnJykucmVwbGFjZSgvXFxEL2csICcnKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjYXJkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgY2FyZCA9IGNhcmRzW2ldO1xuICAgICAgY29uc3QgcmVmID0gY2FyZC5wYXR0ZXJucztcblxuICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbjEgPSByZWYubGVuZ3RoOyBqIDwgbGVuMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSByZWZbal07XG4gICAgICAgIGNvbnN0IHAgPSBwYXR0ZXJuICsgJyc7XG5cbiAgICAgICAgaWYgKG51bS5zdWJzdHIoMCwgcC5sZW5ndGgpID09PSBwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0TnVtZXJpYyhlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZS53aGljaCA9PT0gMzIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUud2hpY2ggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZS53aGljaCA8IDMzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpO1xuICAgIHJldHVybiAhIS9bXFxkXFxzXS8udGVzdChpbnB1dCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhc1RleHRTZWxlY3RlZCh0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICE9PSBudWxsICYmIHRhcmdldC5zZWxlY3Rpb25TdGFydCAhPT0gdGFyZ2V0LnNlbGVjdGlvbkVuZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2FyZFR5cGUobnVtOiBzdHJpbmcpIHtcbiAgICBpZiAoIW51bSkge1xuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG5cbiAgICBjb25zdCBjYXJkID0gdGhpcy5jYXJkRnJvbU51bWJlcihudW0pO1xuXG4gICAgaWYgKGNhcmQgIT09IG51bGwgJiYgdHlwZW9mIGNhcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gY2FyZC50eXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdENhcmROdW1iZXIobnVtOiBzdHJpbmcpIHtcbiAgICBudW0gPSBudW0ucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBjb25zdCBjYXJkID0gdGhpcy5jYXJkRnJvbU51bWJlcihudW0pO1xuXG4gICAgaWYgKCFjYXJkKSB7XG4gICAgICByZXR1cm4gbnVtO1xuICAgIH1cblxuICAgIGNvbnN0IHVwcGVyTGVuZ3RoID0gY2FyZC5sZW5ndGhbY2FyZC5sZW5ndGgubGVuZ3RoIC0gMV07XG4gICAgbnVtID0gbnVtLnNsaWNlKDAsIHVwcGVyTGVuZ3RoKTtcblxuICAgIGlmIChjYXJkLmZvcm1hdC5nbG9iYWwpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBudW0ubWF0Y2goY2FyZC5mb3JtYXQpO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5qb2luKCcgJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IGNhcmQuZm9ybWF0LmV4ZWMobnVtKTtcbiAgICAgIGlmIChncm91cHMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBncm91cHMuc2hpZnQoKTtcbiAgICAgIHJldHVybiBncm91cHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNhZmVWYWwodmFsdWU6IHN0cmluZywgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50LCB1cGRhdGVWYWx1ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiBudW1iZXIge1xuICAgIGxldCBjdXJzb3I6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGxhc3QgPSB0YXJnZXQudmFsdWU7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBjdXJzb3IgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICB1cGRhdGVWYWx1ZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3Vyc29yICE9PSBudWxsICYmIHRhcmdldCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKGN1cnNvciA9PT0gbGFzdC5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yID0gdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAhPT0gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcHJldlBhaXIgPSBsYXN0LnNsaWNlKGN1cnNvciAtIDEsICtjdXJzb3IgKyAxIHx8IDllOSk7XG4gICAgICAgIGNvbnN0IGN1cnJQYWlyID0gdmFsdWUuc2xpY2UoY3Vyc29yIC0gMSwgK2N1cnNvciArIDEgfHwgOWU5KTtcbiAgICAgICAgY29uc3QgZGlnaXQgPSB2YWx1ZVtjdXJzb3JdO1xuXG4gICAgICAgIGlmICgvXFxkLy50ZXN0KGRpZ2l0KSAmJiBwcmV2UGFpciA9PT0gKGAke2RpZ2l0fSBgKSAmJiBjdXJyUGFpciA9PT0gKGAgJHtkaWdpdH1gKSkge1xuICAgICAgICAgIGN1cnNvciA9IGN1cnNvciArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gY3Vyc29yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NhcmROdW1iZXIoa2V5OiBudW1iZXIsIHRhcmdldDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpZ2l0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuICAgIGlmICghL15cXGQrJC8udGVzdChkaWdpdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKENyZWRpdENhcmQuaGFzVGV4dFNlbGVjdGVkKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQudmFsdWUgKyBkaWdpdCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBjb25zdCBjYXJkID0gQ3JlZGl0Q2FyZC5jYXJkRnJvbU51bWJlcih2YWx1ZSk7XG5cbiAgICBpZiAoY2FyZCkge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSBjYXJkLmxlbmd0aFtjYXJkLmxlbmd0aC5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSAxNjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0RXhwaXJ5KGtleTogbnVtYmVyLCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBjb25zdCBkaWdpdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5KTtcbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZGlnaXQpIHx8IHRoaXMuaGFzVGV4dFNlbGVjdGVkKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBgJHt0YXJnZXQudmFsdWV9JHtkaWdpdH1gLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gNjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmVwbGFjZUZ1bGxXaWR0aENoYXJzKHN0cjogc3RyaW5nKSB7XG4gICAgaWYgKHN0ciA9PT0gbnVsbCkge1xuICAgICAgc3RyID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFdpZHRoID0gJ1xcdWZmMTBcXHVmZjExXFx1ZmYxMlxcdWZmMTNcXHVmZjE0XFx1ZmYxNVxcdWZmMTZcXHVmZjE3XFx1ZmYxOFxcdWZmMTknO1xuICAgIGNvbnN0IGhhbGZXaWR0aCA9ICcwMTIzNDU2Nzg5JztcbiAgICBsZXQgdmFsdWUgPSAnJztcbiAgICBjb25zdCBjaGFycyA9IHN0ci5zcGxpdCgnJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hyID0gY2hhcnNbaV07XG4gICAgICBjb25zdCBpZHggPSBmdWxsV2lkdGguaW5kZXhPZihjaHIpO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIGNociA9IGhhbGZXaWR0aFtpZHhdO1xuICAgICAgfVxuICAgICAgdmFsdWUgKz0gY2hyO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdEV4cGlyeShleHBpcnk6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcnRzID0gZXhwaXJ5Lm1hdGNoKC9eXFxEKihcXGR7MSwyfSkoXFxEKyk/KFxcZHsxLDR9KT8vKTtcblxuICAgIGlmICghcGFydHMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBsZXQgbW9uICA9IHBhcnRzWzFdIHx8ICcnO1xuICAgIGxldCBzZXAgID0gcGFydHNbMl0gfHwgJyc7XG4gICAgY29uc3QgeWVhciA9IHBhcnRzWzNdIHx8ICcnO1xuXG4gICAgaWYgKHllYXIubGVuZ3RoID4gMCkge1xuICAgICAgc2VwID0gJyAvICc7XG4gICAgfSBlbHNlIGlmIChzZXAgPT09ICcgLycpIHtcbiAgICAgIG1vbiA9IG1vbi5zdWJzdHJpbmcoMCwgMSk7XG4gICAgICBzZXAgPSAnJztcbiAgICB9IGVsc2UgaWYgKG1vbi5sZW5ndGggPT09IDIgfHwgc2VwLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcCA9ICcgLyAnO1xuICAgIH0gZWxzZSBpZiAobW9uLmxlbmd0aCA9PT0gMSAmJiAobW9uICE9PSAnMCcgJiYgbW9uICE9PSAnMScpKSB7XG4gICAgICBtb24gPSBgMCR7bW9ufWA7XG4gICAgICBzZXAgPSAnIC8gJztcbiAgICB9XG4gICAgcmV0dXJuIGAke21vbn0ke3NlcH0ke3llYXJ9YDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmVzdHJpY3RDdmMoa2V5OiBudW1iZXIsIHRhcmdldDogSFRNTElucHV0RWxlbWVudCkge1xuICAgIGNvbnN0IGRpZ2l0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuICAgIGlmICghL15cXGQrJC8udGVzdChkaWdpdCkgfHwgdGhpcy5oYXNUZXh0U2VsZWN0ZWQodGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBgJHt0YXJnZXQudmFsdWV9JHtkaWdpdH1gO1xuICAgIHJldHVybiB2YWwubGVuZ3RoIDw9IDQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGx1aG5DaGVjayhudW06IHN0cmluZykge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG51bS5zcGxpdCgnJykucmV2ZXJzZSgpO1xuICAgIGxldCBvZGQgPSB0cnVlO1xuICAgIGxldCBzdW0gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBkaWdpdCA9IHBhcnNlSW50KGRpZ2l0c1tpXSwgMTApO1xuICAgICAgaWYgKChvZGQgPSAhb2RkKSkge1xuICAgICAgICBkaWdpdCAqPSAyO1xuICAgICAgfVxuICAgICAgaWYgKGRpZ2l0ID4gOSkge1xuICAgICAgICBkaWdpdCAtPSA5O1xuICAgICAgfVxuICAgICAgc3VtICs9IGRpZ2l0O1xuICAgIH1cblxuICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgfVxufVxuIl19