UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

117 lines 16.5 kB
import { DateUtils } from '../../shared/utils/date-utils'; export const DATE_ERROR = { INVALID_FORMAT: 'err_invalid_format', INVALID_DAY: 'err_invalid_day', INVALID_MONTH: 'err_invalid_month', INVALID_DATE: 'err_invalid_date', REQUIRED: 'err_required', }; /** * Cette classe représente les valeurs saisies par un utilisateur sur 3 champs distincts, jour, mois année. * 🔥 Bien que ces propriétés soient en théorie des nombres, à l'exécution, on reçoit des strings. * - Chaque valeur est initialisée à `undefined` mais peut aussi avoir la valeur "" (chaine vide). * 👆 Par défaut la date est une date UTC. * L'objectif de la classe est de : * - Gérer des dates saisies par l'utilisateur, potentiellement avec des valeurs `undefined` ou "" * - Manipuler les mois de 1 à 12 (et non de 0 à 11) * - D'encapsuler l'api [Date](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Date) et plus tard l'API Temporal */ export class DateModel { constructor(fullYear, monthNum, dayNum) { this.isDateUtc = true; this.fullYear = fullYear; this.monthNum = monthNum; this.dayNum = dayNum; // Les valeurs de 0 à 99 correspondent aux années 1900 à 1999 [MDN](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Date/Date) if (this.fullYear && 0 <= this.fullYear && this.fullYear < 100) this.fullYear += 1900; } get month() { return this.monthNum ? this.monthNum - 1 : -1; } /** * @param value : 3 formes basiques pour utiliser la méthode * - string : Une chaîne de caractères qui représente une date, selon le format reconnu par la méthode `Date.parse()` * - number : Une valeur entière qui représente le nombre de millisecondes depuis le premier janvier 1970 */ static of(value, loggerService) { const date = DateUtils.dateUtcOf(value); if (!date && typeof value === 'string') loggerService.warn(`La date '${value}' n'est pas valide`); return !date ? new DateModel() : new DateModel(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()); } isValid() { return this.toDate() !== undefined; } toDate() { let date = undefined; let fullYear = Number(this.fullYear); let monthNum = Number(this.monthNum); let dayNum = Number(this.dayNum); // on vérifie quand même qu'on a bien affaire à des nombres if (fullYear && monthNum && dayNum && !isNaN(fullYear) && !isNaN(monthNum) && !isNaN(dayNum) && 1 <= monthNum && monthNum <= 12 && 1 <= dayNum && dayNum <= 31) { date = this.isDateUtc ? new Date(Date.UTC(fullYear, this.month, dayNum)) : new Date(fullYear, this.month, dayNum); // Date inexistante if (date.getFullYear() !== fullYear || date.getMonth() !== this.month || date.getDate() !== dayNum) date = undefined; } return date; } /** * Valide le model. * @param required indique si la date est requise ou non * @return une liste de codes d'erreur ou tableau vide */ validate(required = false) { const errors = []; const dayNum = this.dayNum; const monthNum = this.monthNum; const fullYear = this.fullYear; // Format if (!this.isNumber(dayNum) || !this.isNumber(monthNum) || !this.isNumber(fullYear)) { errors.push(DATE_ERROR.INVALID_FORMAT); } // Erreur sur le jour, le mois else { if (dayNum && (dayNum < 1 || dayNum > 31)) errors.push(DATE_ERROR.INVALID_DAY); if (monthNum && (monthNum < 1 || monthNum > 12)) errors.push(DATE_ERROR.INVALID_MONTH); } // All touched : erreur sur la date elle-même if (errors.length === 0 && this.allTouched()) { // Tous les champs sont remplis, on vérifie la date if (this.allFilled()) { const value = this.toDate(); if (!value) errors.push(DATE_ERROR.INVALID_DATE); } // Au moins 1 champ n'est pas rempli else { if (required) errors.push(DATE_ERROR.REQUIRED); } } return errors; } allTouched() { return this.fullYear !== undefined && this.monthNum !== undefined && this.dayNum !== undefined; } allFilled() { return !!this.dayNum && !!this.monthNum && !!this.fullYear; } /** @return true si undefined ou number */ isNumber(value) { return value === undefined || !isNaN(value); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYXR0ZXJucy9kYXRlL2RhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixjQUFjLEVBQUUsb0JBQW9CO0lBQ3BDLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsYUFBYSxFQUFFLG1CQUFtQjtJQUNsQyxZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFFBQVEsRUFBRSxjQUFjO0NBQ3pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQVFwQixZQUFZLFFBQWlCLEVBQUUsUUFBaUIsRUFBRSxNQUFlO1FBRnpELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFHdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIsNEpBQTRKO1FBQzVKLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUc7WUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztJQUN4RixDQUFDO0lBRUQsSUFBWSxLQUFLO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWdELEVBQUUsYUFBNEI7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QUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsNkNBQTZDO1FBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzVDLG1EQUFtRDtZQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSztvQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsRDtZQUNELG9DQUFvQztpQkFDL0I7Z0JBQ0gsSUFBSSxRQUFRO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQTBDO0lBQ2xDLFFBQVEsQ0FBQyxLQUFVO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kYXRlLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IERBVEVfRVJST1IgPSB7XG4gIElOVkFMSURfRk9STUFUOiAnZXJyX2ludmFsaWRfZm9ybWF0JyxcbiAgSU5WQUxJRF9EQVk6ICdlcnJfaW52YWxpZF9kYXknLFxuICBJTlZBTElEX01PTlRIOiAnZXJyX2ludmFsaWRfbW9udGgnLFxuICBJTlZBTElEX0RBVEU6ICdlcnJfaW52YWxpZF9kYXRlJyxcbiAgUkVRVUlSRUQ6ICdlcnJfcmVxdWlyZWQnLFxufTtcblxuLyoqXG4gKiBDZXR0ZSBjbGFzc2UgcmVwcsOpc2VudGUgbGVzIHZhbGV1cnMgc2Fpc2llcyBwYXIgdW4gdXRpbGlzYXRldXIgc3VyIDMgY2hhbXBzIGRpc3RpbmN0cywgam91ciwgbW9pcyBhbm7DqWUuXG4gKiDwn5SlIEJpZW4gcXVlIGNlcyBwcm9wcmnDqXTDqXMgc29pZW50IGVuIHRow6lvcmllIGRlcyBub21icmVzLCDDoCBsJ2V4w6ljdXRpb24sIG9uIHJlw6dvaXQgZGVzIHN0cmluZ3MuXG4gKiAtIENoYXF1ZSB2YWxldXIgZXN0IGluaXRpYWxpc8OpZSDDoCBgdW5kZWZpbmVkYCBtYWlzIHBldXQgYXVzc2kgYXZvaXIgbGEgdmFsZXVyIFwiXCIgKGNoYWluZSB2aWRlKS5cbiAqIPCfkYYgUGFyIGTDqWZhdXQgbGEgZGF0ZSBlc3QgdW5lIGRhdGUgVVRDLlxuICogTCdvYmplY3RpZiBkZSBsYSBjbGFzc2UgZXN0IGRlIDpcbiAqIC0gR8OpcmVyIGRlcyBkYXRlcyBzYWlzaWVzIHBhciBsJ3V0aWxpc2F0ZXVyLCBwb3RlbnRpZWxsZW1lbnQgYXZlYyBkZXMgdmFsZXVycyBgdW5kZWZpbmVkYCBvdSBcIlwiXG4gKiAtIE1hbmlwdWxlciBsZXMgbW9pcyBkZSAxIMOgIDEyIChldCBub24gZGUgMCDDoCAxMSlcbiAqIC0gRCdlbmNhcHN1bGVyIGwnYXBpIFtEYXRlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlKSBldCBwbHVzIHRhcmQgbCdBUEkgVGVtcG9yYWxcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGVNb2RlbCB7XG4gIC8vIFVuZSBkYXRlIGVzdCBsZSBub21icmUgZGUgbWlsbGlzZWNvbmRlcyDDqWNvdWzDqWVzIGRlcHVpcyBsZSBwcmVtaWVyIGphbnZpZXIgMTk3MCBzdXIgbCfDqWNoZWxsZSBVVEMgKGlkZW0gZXBvY2ggVU5JWClcbiAgLy8gT24gZGlzdGluZ3VlIGxlcyBkYXRlcyByZWxhdGl2ZXMgYXUgdGVtcHMgdW5pdmVyc2FsIGNvb3Jkb25uw6kgKFVUQykgZHUgdGVtcHMgZGUgbGEgbWFjaGluZSBkZSBsJ3V0aWxpc2F0ZXVyLlxuICBmdWxsWWVhcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBtb250aE51bTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkYXlOdW06IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc0RhdGVVdGMgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKGZ1bGxZZWFyPzogbnVtYmVyLCBtb250aE51bT86IG51bWJlciwgZGF5TnVtPzogbnVtYmVyKSB7XG4gICAgdGhpcy5mdWxsWWVhciA9IGZ1bGxZZWFyO1xuICAgIHRoaXMubW9udGhOdW0gPSBtb250aE51bTtcbiAgICB0aGlzLmRheU51bSA9IGRheU51bTtcblxuICAgIC8vIExlcyB2YWxldXJzIGRlIDAgw6AgOTkgY29ycmVzcG9uZGVudCBhdXggYW5uw6llcyAxOTAwIMOgIDE5OTkgW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS9EYXRlKVxuICAgIGlmICh0aGlzLmZ1bGxZZWFyICYmIDAgPD0gdGhpcy5mdWxsWWVhciAmJiB0aGlzLmZ1bGxZZWFyIDwgMTAwKSB0aGlzLmZ1bGxZZWFyICs9IDE5MDA7XG4gIH1cblxuICBwcml2YXRlIGdldCBtb250aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vbnRoTnVtID8gdGhpcy5tb250aE51bSAtIDEgOiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWUgOiAzIGZvcm1lcyBiYXNpcXVlcyBwb3VyIHV0aWxpc2VyIGxhIG3DqXRob2RlXG4gICAqIC0gc3RyaW5nIDogVW5lIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMgcXVpIHJlcHLDqXNlbnRlIHVuZSBkYXRlLCBzZWxvbiBsZSBmb3JtYXQgcmVjb25udSBwYXIgbGEgbcOpdGhvZGUgYERhdGUucGFyc2UoKWBcbiAgICogLSBudW1iZXIgOiBVbmUgdmFsZXVyIGVudGnDqHJlIHF1aSByZXByw6lzZW50ZSBsZSBub21icmUgZGUgbWlsbGlzZWNvbmRlcyBkZXB1aXMgbGUgcHJlbWllciBqYW52aWVyIDE5NzBcbiAgICovXG4gIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwsIGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2UpOiBEYXRlTW9kZWwge1xuICAgIGNvbnN0IGRhdGUgPSBEYXRlVXRpbHMuZGF0ZVV0Y09mKHZhbHVlKTtcbiAgICBpZiAoIWRhdGUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgbG9nZ2VyU2VydmljZS53YXJuKGBMYSBkYXRlICcke3ZhbHVlfScgbidlc3QgcGFzIHZhbGlkZWApO1xuICAgIHJldHVybiAhZGF0ZSA/IG5ldyBEYXRlTW9kZWwoKSA6IG5ldyBEYXRlTW9kZWwoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCBkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCBkYXRlLmdldFVUQ0RhdGUoKSk7XG4gIH1cblxuICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICB0b0RhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGZ1bGxZZWFyID0gTnVtYmVyKHRoaXMuZnVsbFllYXIpO1xuICAgIGxldCBtb250aE51bSA9IE51bWJlcih0aGlzLm1vbnRoTnVtKTtcbiAgICBsZXQgZGF5TnVtID0gTnVtYmVyKHRoaXMuZGF5TnVtKTtcbiAgICAvLyBvbiB2w6lyaWZpZSBxdWFuZCBtw6ptZSBxdSdvbiBhIGJpZW4gYWZmYWlyZSDDoCBkZXMgbm9tYnJlc1xuICAgIGlmIChcbiAgICAgIGZ1bGxZZWFyICYmXG4gICAgICBtb250aE51bSAmJlxuICAgICAgZGF5TnVtICYmXG4gICAgICAhaXNOYU4oZnVsbFllYXIpICYmXG4gICAgICAhaXNOYU4obW9udGhOdW0pICYmXG4gICAgICAhaXNOYU4oZGF5TnVtKSAmJlxuICAgICAgMSA8PSBtb250aE51bSAmJlxuICAgICAgbW9udGhOdW0gPD0gMTIgJiZcbiAgICAgIDEgPD0gZGF5TnVtICYmXG4gICAgICBkYXlOdW0gPD0gMzFcbiAgICApIHtcbiAgICAgIGRhdGUgPSB0aGlzLmlzRGF0ZVV0YyA/IG5ldyBEYXRlKERhdGUuVVRDKGZ1bGxZZWFyLCB0aGlzLm1vbnRoLCBkYXlOdW0pKSA6IG5ldyBEYXRlKGZ1bGxZZWFyLCB0aGlzLm1vbnRoLCBkYXlOdW0pO1xuXG4gICAgICAvLyBEYXRlIGluZXhpc3RhbnRlXG4gICAgICBpZiAoZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBmdWxsWWVhciB8fCBkYXRlLmdldE1vbnRoKCkgIT09IHRoaXMubW9udGggfHwgZGF0ZS5nZXREYXRlKCkgIT09IGRheU51bSlcbiAgICAgICAgZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRlIGxlIG1vZGVsLlxuICAgKiBAcGFyYW0gcmVxdWlyZWQgaW5kaXF1ZSBzaSBsYSBkYXRlIGVzdCByZXF1aXNlIG91IG5vblxuICAgKiBAcmV0dXJuIHVuZSBsaXN0ZSBkZSBjb2RlcyBkJ2VycmV1ciBvdSB0YWJsZWF1IHZpZGVcbiAgICovXG4gIHZhbGlkYXRlKHJlcXVpcmVkID0gZmFsc2UpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgY29uc3QgZGF5TnVtID0gdGhpcy5kYXlOdW07XG4gICAgY29uc3QgbW9udGhOdW0gPSB0aGlzLm1vbnRoTnVtO1xuICAgIGNvbnN0IGZ1bGxZZWFyID0gdGhpcy5mdWxsWWVhcjtcblxuICAgIC8vIEZvcm1hdFxuICAgIGlmICghdGhpcy5pc051bWJlcihkYXlOdW0pIHx8ICF0aGlzLmlzTnVtYmVyKG1vbnRoTnVtKSB8fCAhdGhpcy5pc051bWJlcihmdWxsWWVhcikpIHtcbiAgICAgIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9GT1JNQVQpO1xuICAgIH1cblxuICAgIC8vIEVycmV1ciBzdXIgbGUgam91ciwgbGUgbW9pc1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGRheU51bSAmJiAoZGF5TnVtIDwgMSB8fCBkYXlOdW0gPiAzMSkpIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9EQVkpO1xuICAgICAgaWYgKG1vbnRoTnVtICYmIChtb250aE51bSA8IDEgfHwgbW9udGhOdW0gPiAxMikpIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9NT05USCk7XG4gICAgfVxuXG4gICAgLy8gQWxsIHRvdWNoZWQgOiBlcnJldXIgc3VyIGxhIGRhdGUgZWxsZS1tw6ptZVxuICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwICYmIHRoaXMuYWxsVG91Y2hlZCgpKSB7XG4gICAgICAvLyBUb3VzIGxlcyBjaGFtcHMgc29udCByZW1wbGlzLCBvbiB2w6lyaWZpZSBsYSBkYXRlXG4gICAgICBpZiAodGhpcy5hbGxGaWxsZWQoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudG9EYXRlKCk7XG4gICAgICAgIGlmICghdmFsdWUpIGVycm9ycy5wdXNoKERBVEVfRVJST1IuSU5WQUxJRF9EQVRFKTtcbiAgICAgIH1cbiAgICAgIC8vIEF1IG1vaW5zIDEgY2hhbXAgbidlc3QgcGFzIHJlbXBsaVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChyZXF1aXJlZCkgZXJyb3JzLnB1c2goREFURV9FUlJPUi5SRVFVSVJFRCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgYWxsVG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsWWVhciAhPT0gdW5kZWZpbmVkICYmIHRoaXMubW9udGhOdW0gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmRheU51bSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxGaWxsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXlOdW0gJiYgISF0aGlzLm1vbnRoTnVtICYmICEhdGhpcy5mdWxsWWVhcjtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHRydWUgc2kgdW5kZWZpbmVkIG91IG51bWJlciAqL1xuICBwcml2YXRlIGlzTnVtYmVyKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXNOYU4odmFsdWUpO1xuICB9XG59XG4iXX0=