ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
120 lines • 16.3 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { formatDate } from '@angular/common';
import { Inject, Injectable, Optional, inject } from '@angular/core';
import { format as fnsFormat, getISOWeek as fnsGetISOWeek, getQuarter, parse as fnsParse } from 'date-fns';
import { ɵNgTimeParser } from 'ng-zorro-antd/core/time';
import { NZ_DATE_CONFIG, mergeDateConfig } from './date-config';
import { NzI18nService } from './nz-i18n.service';
import * as i0 from "@angular/core";
import * as i1 from "./nz-i18n.service";
export function DATE_HELPER_SERVICE_FACTORY() {
const i18n = inject(NzI18nService);
const config = inject(NZ_DATE_CONFIG, { optional: true });
return i18n.getDateLocale() ? new DateHelperByDateFns(i18n, config) : new DateHelperByDatePipe(i18n, config);
}
/**
* Abstract DateHelperService(Token via Class)
* Compatibility: compact for original usage by default which using DatePipe
*/
export class DateHelperService {
constructor(i18n, config) {
this.i18n = i18n;
this.config = mergeDateConfig(config);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateHelperService, deps: [{ token: i1.NzI18nService }, { token: NZ_DATE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateHelperService, providedIn: 'root', useFactory: DATE_HELPER_SERVICE_FACTORY }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateHelperService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
useFactory: DATE_HELPER_SERVICE_FACTORY
}]
}], ctorParameters: () => [{ type: i1.NzI18nService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NZ_DATE_CONFIG]
}] }] });
/**
* DateHelper that handles date formats with date-fns
*/
export class DateHelperByDateFns extends DateHelperService {
getISOWeek(date) {
return fnsGetISOWeek(date);
}
// Use date-fns's "weekStartsOn" to support different locale when "config.firstDayOfWeek" is null
// https://github.com/date-fns/date-fns/blob/v2.0.0-alpha.27/src/locale/en-US/index.js#L23
getFirstDayOfWeek() {
let defaultWeekStartsOn;
try {
defaultWeekStartsOn = this.i18n.getDateLocale().options.weekStartsOn;
}
catch (e) {
defaultWeekStartsOn = 1;
}
return this.config.firstDayOfWeek == null ? defaultWeekStartsOn : this.config.firstDayOfWeek;
}
/**
* Format a date
*
* @see https://date-fns.org/docs/format#description
* @param date Date
* @param formatStr format string
*/
format(date, formatStr) {
return date ? fnsFormat(date, formatStr, { locale: this.i18n.getDateLocale() }) : '';
}
parseDate(text, formatStr) {
return fnsParse(text, formatStr, new Date(), {
locale: this.i18n.getDateLocale(),
weekStartsOn: this.getFirstDayOfWeek()
});
}
parseTime(text, formatStr) {
return this.parseDate(text, formatStr);
}
}
/**
* DateHelper that handles date formats with angular's date-pipe
*
* @see https://github.com/NG-ZORRO/ng-zorro-antd/issues/2406 - DatePipe may cause non-standard week bug, see:
*
*/
export class DateHelperByDatePipe extends DateHelperService {
getISOWeek(date) {
return +this.format(date, 'w');
}
getFirstDayOfWeek() {
if (this.config.firstDayOfWeek === undefined) {
const locale = this.i18n.getLocaleId();
return locale && ['zh-cn', 'zh-tw'].indexOf(locale.toLowerCase()) > -1 ? 1 : 0;
}
return this.config.firstDayOfWeek;
}
format(date, formatStr) {
// angular formatDate does not support the quarter format parameter. This is to be compatible with the quarter format "Q" of date-fns.
return date ? this.replaceQuarter(formatDate(date, formatStr, this.i18n.getLocaleId()), date) : '';
}
parseDate(text) {
return new Date(text);
}
parseTime(text, formatStr) {
const parser = new ɵNgTimeParser(formatStr, this.i18n.getLocaleId());
return parser.toDate(text);
}
replaceQuarter(dateStr, date) {
const quarter = getQuarter(date).toString();
const record = { Q: quarter, QQ: `0${quarter}`, QQQ: `Q${quarter}` };
// Q Pattern format compatible with date-fns (quarter).
return (dateStr
// Match Q+ outside of brackets, then replace it with the specified quarterly format
.replace(/Q+(?![^\[]*])/g, match => record[match] ?? quarter)
// Match the Q+ surrounded by bracket, then remove bracket.
.replace(/\[(Q+)]/g, '$1'));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvaTE4bi9kYXRlLWhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJFLE9BQU8sRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLFVBQVUsSUFBSSxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssSUFBSSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFM0csT0FBTyxFQUFnQixhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsY0FBYyxFQUFnQixlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFbEQsTUFBTSxVQUFVLDJCQUEyQjtJQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0csQ0FBQztBQUVEOzs7R0FHRztBQUtILE1BQU0sT0FBZ0IsaUJBQWlCO0lBR3JDLFlBQ1ksSUFBbUIsRUFDTyxNQUEyQjtRQURyRCxTQUFJLEdBQUosSUFBSSxDQUFlO1FB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QUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEcsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ3BCLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZLEVBQUUsU0FBaUI7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGNBQWMsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNoRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdGLHVEQUF1RDtRQUN2RCxPQUFPLENBQ0wsT0FBTztZQUNMLG9GQUFvRjthQUNuRixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDO1lBQzdELDJEQUEyRDthQUMxRCxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUM3QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IGFzIGZuc0Zvcm1hdCwgZ2V0SVNPV2VlayBhcyBmbnNHZXRJU09XZWVrLCBnZXRRdWFydGVyLCBwYXJzZSBhcyBmbnNQYXJzZSB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgV2Vla0RheUluZGV4LCDJtU5nVGltZVBhcnNlciB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90aW1lJztcblxuaW1wb3J0IHsgTlpfREFURV9DT05GSUcsIE56RGF0ZUNvbmZpZywgbWVyZ2VEYXRlQ29uZmlnIH0gZnJvbSAnLi9kYXRlLWNvbmZpZyc7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9uei1pMThuLnNlcnZpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gREFURV9IRUxQRVJfU0VSVklDRV9GQUNUT1JZKCk6IERhdGVIZWxwZXJTZXJ2aWNlIHtcbiAgY29uc3QgaTE4biA9IGluamVjdChOekkxOG5TZXJ2aWNlKTtcbiAgY29uc3QgY29uZmlnID0gaW5qZWN0KE5aX0RBVEVfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICByZXR1cm4gaTE4bi5nZXREYXRlTG9jYWxlKCkgPyBuZXcgRGF0ZUhlbHBlckJ5RGF0ZUZucyhpMThuLCBjb25maWcpIDogbmV3IERhdGVIZWxwZXJCeURhdGVQaXBlKGkxOG4sIGNvbmZpZyk7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgRGF0ZUhlbHBlclNlcnZpY2UoVG9rZW4gdmlhIENsYXNzKVxuICogQ29tcGF0aWJpbGl0eTogY29tcGFjdCBmb3Igb3JpZ2luYWwgdXNhZ2UgYnkgZGVmYXVsdCB3aGljaCB1c2luZyBEYXRlUGlwZVxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgdXNlRmFjdG9yeTogREFURV9IRUxQRVJfU0VSVklDRV9GQUNUT1JZXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGVIZWxwZXJTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIGNvbmZpZzogTnpEYXRlQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpMThuOiBOekkxOG5TZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTlpfREFURV9DT05GSUcpIGNvbmZpZzogTnpEYXRlQ29uZmlnIHwgbnVsbFxuICApIHtcbiAgICB0aGlzLmNvbmZpZyA9IG1lcmdlRGF0ZUNvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0SVNPV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyO1xuICBhYnN0cmFjdCBnZXRGaXJzdERheU9mV2VlaygpOiBXZWVrRGF5SW5kZXg7XG4gIGFic3RyYWN0IGZvcm1hdChkYXRlOiBEYXRlIHwgbnVsbCwgZm9ybWF0U3RyOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHBhcnNlRGF0ZSh0ZXh0OiBzdHJpbmcsIGZvcm1hdFN0cj86IHN0cmluZyk6IERhdGU7XG4gIGFic3RyYWN0IHBhcnNlVGltZSh0ZXh0OiBzdHJpbmcsIGZvcm1hdFN0cj86IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGF0ZUhlbHBlciB0aGF0IGhhbmRsZXMgZGF0ZSBmb3JtYXRzIHdpdGggZGF0ZS1mbnNcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGVIZWxwZXJCeURhdGVGbnMgZXh0ZW5kcyBEYXRlSGVscGVyU2VydmljZSB7XG4gIGdldElTT1dlZWsoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGZuc0dldElTT1dlZWsoZGF0ZSk7XG4gIH1cblxuICAvLyBVc2UgZGF0ZS1mbnMncyBcIndlZWtTdGFydHNPblwiIHRvIHN1cHBvcnQgZGlmZmVyZW50IGxvY2FsZSB3aGVuIFwiY29uZmlnLmZpcnN0RGF5T2ZXZWVrXCIgaXMgbnVsbFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi92Mi4wLjAtYWxwaGEuMjcvc3JjL2xvY2FsZS9lbi1VUy9pbmRleC5qcyNMMjNcbiAgZ2V0Rmlyc3REYXlPZldlZWsoKTogV2Vla0RheUluZGV4IHtcbiAgICBsZXQgZGVmYXVsdFdlZWtTdGFydHNPbjogV2Vla0RheUluZGV4O1xuICAgIHRyeSB7XG4gICAgICBkZWZhdWx0V2Vla1N0YXJ0c09uID0gdGhpcy5pMThuLmdldERhdGVMb2NhbGUoKS5vcHRpb25zIS53ZWVrU3RhcnRzT24hO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnRzT24gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZmlyc3REYXlPZldlZWsgPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0aGlzLmNvbmZpZy5maXJzdERheU9mV2VlaztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBkYXRlXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9mb3JtYXQjZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIGRhdGUgRGF0ZVxuICAgKiBAcGFyYW0gZm9ybWF0U3RyIGZvcm1hdCBzdHJpbmdcbiAgICovXG4gIGZvcm1hdChkYXRlOiBEYXRlLCBmb3JtYXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUgPyBmbnNGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyLCB7IGxvY2FsZTogdGhpcy5pMThuLmdldERhdGVMb2NhbGUoKSB9KSA6ICcnO1xuICB9XG5cbiAgcGFyc2VEYXRlKHRleHQ6IHN0cmluZywgZm9ybWF0U3RyOiBzdHJpbmcpOiBEYXRlIHtcbiAgICByZXR1cm4gZm5zUGFyc2UodGV4dCwgZm9ybWF0U3RyLCBuZXcgRGF0ZSgpLCB7XG4gICAgICBsb2NhbGU6IHRoaXMuaTE4bi5nZXREYXRlTG9jYWxlKCksXG4gICAgICB3ZWVrU3RhcnRzT246IHRoaXMuZ2V0Rmlyc3REYXlPZldlZWsoKVxuICAgIH0pO1xuICB9XG5cbiAgcGFyc2VUaW1lKHRleHQ6IHN0cmluZywgZm9ybWF0U3RyOiBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodGV4dCwgZm9ybWF0U3RyKTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGVIZWxwZXIgdGhhdCBoYW5kbGVzIGRhdGUgZm9ybWF0cyB3aXRoIGFuZ3VsYXIncyBkYXRlLXBpcGVcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2lzc3Vlcy8yNDA2IC0gRGF0ZVBpcGUgbWF5IGNhdXNlIG5vbi1zdGFuZGFyZCB3ZWVrIGJ1Zywgc2VlOlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGVIZWxwZXJCeURhdGVQaXBlIGV4dGVuZHMgRGF0ZUhlbHBlclNlcnZpY2Uge1xuICBnZXRJU09XZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiArdGhpcy5mb3JtYXQoZGF0ZSwgJ3cnKTtcbiAgfVxuXG4gIGdldEZpcnN0RGF5T2ZXZWVrKCk6IFdlZWtEYXlJbmRleCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuaTE4bi5nZXRMb2NhbGVJZCgpO1xuICAgICAgcmV0dXJuIGxvY2FsZSAmJiBbJ3poLWNuJywgJ3poLXR3J10uaW5kZXhPZihsb2NhbGUudG9Mb3dlckNhc2UoKSkgPiAtMSA/IDEgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZmlyc3REYXlPZldlZWs7XG4gIH1cblxuICBmb3JtYXQoZGF0ZTogRGF0ZSB8IG51bGwsIGZvcm1hdFN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBhbmd1bGFyIGZvcm1hdERhdGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcXVhcnRlciBmb3JtYXQgcGFyYW1ldGVyLiBUaGlzIGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcXVhcnRlciBmb3JtYXQgXCJRXCIgb2YgZGF0ZS1mbnMuXG4gICAgcmV0dXJuIGRhdGUgPyB0aGlzLnJlcGxhY2VRdWFydGVyKGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0U3RyLCB0aGlzLmkxOG4uZ2V0TG9jYWxlSWQoKSkhLCBkYXRlKSA6ICcnO1xuICB9XG5cbiAgcGFyc2VEYXRlKHRleHQ6IHN0cmluZyk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0ZXh0KTtcbiAgfVxuXG4gIHBhcnNlVGltZSh0ZXh0OiBzdHJpbmcsIGZvcm1hdFN0cjogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IMm1TmdUaW1lUGFyc2VyKGZvcm1hdFN0ciwgdGhpcy5pMThuLmdldExvY2FsZUlkKCkpO1xuICAgIHJldHVybiBwYXJzZXIudG9EYXRlKHRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlUXVhcnRlcihkYXRlU3RyOiBzdHJpbmcsIGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHF1YXJ0ZXIgPSBnZXRRdWFydGVyKGRhdGUpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBROiBxdWFydGVyLCBRUTogYDAke3F1YXJ0ZXJ9YCwgUVFROiBgUSR7cXVhcnRlcn1gIH07XG4gICAgLy8gUSBQYXR0ZXJuIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggZGF0ZS1mbnMgKHF1YXJ0ZXIpLlxuICAgIHJldHVybiAoXG4gICAgICBkYXRlU3RyXG4gICAgICAgIC8vIE1hdGNoIFErIG91dHNpZGUgb2YgYnJhY2tldHMsIHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgcXVhcnRlcmx5IGZvcm1hdFxuICAgICAgICAucmVwbGFjZSgvUSsoPyFbXlxcW10qXSkvZywgbWF0Y2ggPT4gcmVjb3JkW21hdGNoXSA/PyBxdWFydGVyKVxuICAgICAgICAvLyBNYXRjaCB0aGUgUSsgc3Vycm91bmRlZCBieSBicmFja2V0LCB0aGVuIHJlbW92ZSBicmFja2V0LlxuICAgICAgICAucmVwbGFjZSgvXFxbKFErKV0vZywgJyQxJylcbiAgICApO1xuICB9XG59XG4iXX0=