UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

181 lines 21 kB
/** * Object that represents a _Unicode_ locale identifier and is inherited from the JavaScript's `Intl.Locale` class */ export class Locale extends Intl.Locale { static get ENGLISH() { return Locale.of("en"); } ; static get FRANCE() { return Locale.of("fr-FR"); } ; static get FRENCH() { return Locale.of("fr"); } ; static get CHINESE() { return Locale.of("zh"); } ; static get SIMPLIFIED_CHINESE() { return Locale.of("zh-CN"); } ; static get TRADITIONAL_CHINESE() { return Locale.of("zh-TW"); } ; static get CHINA() { return Locale.SIMPLIFIED_CHINESE; } ; static get TAIWAN() { return Locale.TRADITIONAL_CHINESE; } ; static get GERMAN() { return Locale.of("de"); } ; static get GERMANY() { return Locale.of("de-DE"); } ; static get ITALIAN() { return Locale.of("it"); } ; static get ITALY() { return Locale.of("it-IT"); } ; static get JAPANESE() { return Locale.of("ja"); } ; static get JAPAN() { return Locale.of("ja-JP"); } ; static get KOREAN() { return Locale.of("ko"); } ; static get KOREA() { return Locale.of("ko-KR"); } ; static get CANADA() { return Locale.of("en-CA"); } ; static get CANADA_FRENCH() { return Locale.of("fr-CA"); } ; static get RPC() { return Locale.SIMPLIFIED_CHINESE; } ; static get RU() { return Locale.of("ru-RU"); } ; static get UK() { return Locale.of("en-GB"); } ; static get US() { return Locale.of("en-US"); } ; /** * @constructor * @param tag * @param options * @throws Error if incorrect locale information provided */ constructor(tag, options) { super(tag ?? Locale.getDefaultLanguage(), options); this._fullName = this.maximize().baseName; } /** * Gets the browser navigator's language tag * @returns Language tag * @static */ static getDefaultLanguage() { return (navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language); } /** * Factory method that returns singleton Locale object * @param tag A language tag * @param options An object with some or all of options of the locale * @returns Locale object * @throws Error if incorrect locale information provided * @static */ static of(tag, options) { return Locale.getLocale(tag, options); } /** * Locale's factory method * @param tag A language tag * @param options An object with some or all of options of the locale * @returns Locale object * @throws Error if incorrect locale information provided * @private * @static */ static getLocale(tag, options) { if (Locale.localeMap === undefined) { Locale.localeMap = new Map(); } const tempLocale = new Locale(tag, options); const name = tempLocale.maximize().toString(); let locale = Locale.localeMap.get(name); if (locale === undefined) { locale = tempLocale; Locale.localeMap.set(name, locale); } return locale; } /** * Gets the character that is used as the decimal point designation * @returns Delimiter character */ get decimalsDelimiter() { const s = (new Intl.NumberFormat(this.toString())).format(0.1); return s.charAt(1); } /** * Gets the character that is used as the thousand groups delimiter * @returns Delimiter character */ get thousandsDelimiter() { const s = (new Intl.NumberFormat(this.toString())).format(1234); const c = s.charAt(1); return (c == '2' ? "" : c); } /** * Gets an expanded locale name in the `language-script-region` format * @returns Expanded locale name * @since 0.5.0 */ get fullName() { return this._fullName; } /** * Makes a clone of the current locale object * @returns A cloned locale object * @since 0.5.0 */ clone() { return new Locale(this.fullName); } /** * Gets a string representing a Locale's extension information * @returns Locale's extension string * @since 0.5.0 */ getExtension() { const str = this.maximize().toString(); const uPos = str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`); if (uPos >= 0) { const xPos = str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`, uPos + 1); if (xPos > 0) { return str.substring(uPos + 3, xPos); } return str.substring(uPos + 3); } return ""; } /** * Gets a string representing a Locale's private use extension information * @returns Locale's private use extension string * @since 0.5.0 */ getPrivateExtension() { const str = this.maximize().toString(); const xPos = str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`); if (xPos >= 0) { const uPos = str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`, xPos + 1); if (uPos > 0) { return str.substring(xPos + 3, uPos); } return str.substring(xPos + 3); } return ""; } /** * Returns _true_ if this Locale has any extensions. * @returns _true_ if this Locale has any extensions * @since 0.5.0 */ hasExtensions() { const str = this.maximize().toString(); return str.indexOf(`-${Locale.PRIVATE_USE_EXTENSION}-`) >= 0 || str.indexOf(`-${Locale.UNICODE_LOCALE_EXTENSION}-`) >= 0; } } /** The key for the private use extension ('...-x-...') */ Locale.PRIVATE_USE_EXTENSION = 'x'; /** The key for Unicode locale extension ('...-u-...') */ Locale.UNICODE_LOCALE_EXTENSION = 'u'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9jYWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvdXRpbC9pMThuL0xvY2FsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxNQUFPLFNBQVEsSUFBSSxDQUFDLE1BQU07SUFHOUIsTUFBTSxLQUFLLE9BQU8sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUN0RCxNQUFNLEtBQUssTUFBTSxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3hELE1BQU0sS0FBSyxNQUFNLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDckQsTUFBTSxLQUFLLE9BQU8sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUN0RCxNQUFNLEtBQUssa0JBQWtCLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDcEUsTUFBTSxLQUFLLG1CQUFtQixLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3JFLE1BQU0sS0FBSyxLQUFLLEtBQVksT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUM5RCxNQUFNLEtBQUssTUFBTSxLQUFZLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDaEUsTUFBTSxLQUFLLE1BQU0sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUNyRCxNQUFNLEtBQUssT0FBTyxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3pELE1BQU0sS0FBSyxPQUFPLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDdEQsTUFBTSxLQUFLLEtBQUssS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUN2RCxNQUFNLEtBQUssUUFBUSxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxLQUFLLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDdkQsTUFBTSxLQUFLLE1BQU0sS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUNyRCxNQUFNLEtBQUssS0FBSyxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxNQUFNLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDeEQsTUFBTSxLQUFLLGFBQWEsS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxLQUFZLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFDNUQsTUFBTSxLQUFLLEVBQUUsS0FBWSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUEsQ0FBQSxDQUFDO0lBQUEsQ0FBQztJQUNwRCxNQUFNLEtBQUssRUFBRSxLQUFZLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3BELE1BQU0sS0FBSyxFQUFFLEtBQVksT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUEsQ0FBQztJQUFBLENBQUM7SUFRM0Q7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQVksRUFBRSxPQUE0QjtRQUNwRCxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVMsQ0FBQztJQUM3QyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxrQkFBa0I7UUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBVyxFQUFFLE9BQTRCO1FBQ2pELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNEOzs7Ozs7OztPQVFHO0lBQ0ssTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBNEI7UUFDaEUsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7U0FDOUI7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUF1QixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxHQUFHLFVBQVUsQ0FBQztZQUNwQixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRDs7O09BR0c7SUFDSCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBRTtRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLElBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxNQUFNLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDYixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDWixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDYixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDWixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsYUFBYTtRQUNYLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLHdCQUF3QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0gsQ0FBQzs7QUFySUQsMERBQTBEO0FBQ25DLDRCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNuRCx5REFBeUQ7QUFDbEMsK0JBQXdCLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvbmVhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZS9DbG9uZWFibGVcIjtcblxuLyoqXG4gKiBPYmplY3QgdGhhdCByZXByZXNlbnRzIGEgX1VuaWNvZGVfIGxvY2FsZSBpZGVudGlmaWVyIGFuZCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgSmF2YVNjcmlwdCdzIGBJbnRsLkxvY2FsZWAgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsZSBleHRlbmRzIEludGwuTG9jYWxlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9jYWxlTWFwOiBNYXA8c3RyaW5nLCBMb2NhbGU+IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVOR0xJU0goKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZW5cIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBGUkFOQ0UoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZnItRlJcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBGUkVOQ0goKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZnJcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBDSElORVNFKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcInpoXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgU0lNUExJRklFRF9DSElORVNFKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcInpoLUNOXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgVFJBRElUSU9OQUxfQ0hJTkVTRSgpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJ6aC1UV1wiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENISU5BKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5TSU1QTElGSUVEX0NISU5FU0V9O1xuICBwdWJsaWMgc3RhdGljIGdldCBUQUlXQU4oKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLlRSQURJVElPTkFMX0NISU5FU0V9O1xuICBwdWJsaWMgc3RhdGljIGdldCBHRVJNQU4oKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiZGVcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBHRVJNQU5ZKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImRlLURFXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgSVRBTElBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJpdFwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IElUQUxZKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcIml0LUlUXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgSkFQQU5FU0UoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwiamFcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBKQVBBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJqYS1KUFwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEtPUkVBTigpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJrb1wiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEtPUkVBKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImtvLUtSXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgQ0FOQURBKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImVuLUNBXCIpfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgQ0FOQURBX0ZSRU5DSCgpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJmci1DQVwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFJQQygpOiBMb2NhbGUge3JldHVybiBMb2NhbGUuU0lNUExJRklFRF9DSElORVNFfTtcbiAgcHVibGljIHN0YXRpYyBnZXQgUlUoKTogTG9jYWxlIHtyZXR1cm4gTG9jYWxlLm9mKFwicnUtUlVcIil9O1xuICBwdWJsaWMgc3RhdGljIGdldCBVSygpOiBMb2NhbGUge3JldHVybiBMb2NhbGUub2YoXCJlbi1HQlwiKX07XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFVTKCk6IExvY2FsZSB7cmV0dXJuIExvY2FsZS5vZihcImVuLVVTXCIpfTtcbiAgLyoqIFRoZSBrZXkgZm9yIHRoZSBwcml2YXRlIHVzZSBleHRlbnNpb24gKCcuLi4teC0uLi4nKSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBSSVZBVEVfVVNFX0VYVEVOU0lPTiA9ICd4JztcbiAgLyoqIFRoZSBrZXkgZm9yIFVuaWNvZGUgbG9jYWxlIGV4dGVuc2lvbiAoJy4uLi11LS4uLicpICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OID0gJ3UnO1xuXG4gIHByaXZhdGUgX2Z1bGxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gdGFnXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgaW5jb3JyZWN0IGxvY2FsZSBpbmZvcm1hdGlvbiBwcm92aWRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodGFnPzogc3RyaW5nLCBvcHRpb25zPzogSW50bC5Mb2NhbGVPcHRpb25zICkge1xuICAgIHN1cGVyKHRhZyA/PyBMb2NhbGUuZ2V0RGVmYXVsdExhbmd1YWdlKCksIG9wdGlvbnMpO1xuICAgIHRoaXMuX2Z1bGxOYW1lID0gdGhpcy5tYXhpbWl6ZSgpLmJhc2VOYW1lITtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgYnJvd3NlciBuYXZpZ2F0b3IncyBsYW5ndWFnZSB0YWdcbiAgICogQHJldHVybnMgTGFuZ3VhZ2UgdGFnXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXREZWZhdWx0TGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGggPyBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIDogbmF2aWdhdG9yLmxhbmd1YWdlKTtcbiAgfVxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIHNpbmdsZXRvbiBMb2NhbGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgQSBsYW5ndWFnZSB0YWdcbiAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IHdpdGggc29tZSBvciBhbGwgb2Ygb3B0aW9ucyBvZiB0aGUgbG9jYWxlXG4gICAqIEByZXR1cm5zIExvY2FsZSBvYmplY3RcbiAgICogQHRocm93cyBFcnJvciBpZiBpbmNvcnJlY3QgbG9jYWxlIGluZm9ybWF0aW9uIHByb3ZpZGVkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBvZih0YWc6IHN0cmluZywgb3B0aW9ucz86IEludGwuTG9jYWxlT3B0aW9ucyk6IExvY2FsZSB7XG4gICAgcmV0dXJuIExvY2FsZS5nZXRMb2NhbGUodGFnLCBvcHRpb25zKTtcbiAgfVxuICAvKipcbiAgICogTG9jYWxlJ3MgZmFjdG9yeSBtZXRob2RcbiAgICogQHBhcmFtIHRhZyBBIGxhbmd1YWdlIHRhZ1xuICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3Qgd2l0aCBzb21lIG9yIGFsbCBvZiBvcHRpb25zIG9mIHRoZSBsb2NhbGVcbiAgICogQHJldHVybnMgTG9jYWxlIG9iamVjdFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGluY29ycmVjdCBsb2NhbGUgaW5mb3JtYXRpb24gcHJvdmlkZWRcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TG9jYWxlKHRhZzogc3RyaW5nLCBvcHRpb25zPzogSW50bC5Mb2NhbGVPcHRpb25zKTogTG9jYWxlIHtcbiAgICBpZiAoTG9jYWxlLmxvY2FsZU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBMb2NhbGUubG9jYWxlTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wTG9jYWxlID0gbmV3IExvY2FsZSh0YWcsIG9wdGlvbnMpO1xuICAgIGNvbnN0IG5hbWUgPSB0ZW1wTG9jYWxlLm1heGltaXplKCkudG9TdHJpbmcoKTtcbiAgICBsZXQgbG9jYWxlOiBMb2NhbGUgfCB1bmRlZmluZWQgPSBMb2NhbGUubG9jYWxlTWFwLmdldChuYW1lKTtcbiAgICBpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsZSA9IHRlbXBMb2NhbGU7XG4gICAgICBMb2NhbGUubG9jYWxlTWFwLnNldChuYW1lLCBsb2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgdGhhdCBpcyB1c2VkIGFzIHRoZSBkZWNpbWFsIHBvaW50IGRlc2lnbmF0aW9uXG4gICAqIEByZXR1cm5zIERlbGltaXRlciBjaGFyYWN0ZXJcbiAgICovXG4gIGdldCBkZWNpbWFsc0RlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHMgPSAobmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMudG9TdHJpbmcoKSkpLmZvcm1hdCgwLjEpO1xuICAgIHJldHVybiBzLmNoYXJBdCgxKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgdXNlZCBhcyB0aGUgdGhvdXNhbmQgZ3JvdXBzIGRlbGltaXRlclxuICAgKiBAcmV0dXJucyBEZWxpbWl0ZXIgY2hhcmFjdGVyXG4gICAqL1xuICBnZXQgdGhvdXNhbmRzRGVsaW1pdGVyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcyA9IChuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy50b1N0cmluZygpKSkuZm9ybWF0KDEyMzQpIDtcbiAgICBjb25zdCBjID0gcy5jaGFyQXQoMSk7XG4gICAgcmV0dXJuIChjPT0nMicgPyBcIlwiIDogYyk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgYW4gZXhwYW5kZWQgbG9jYWxlIG5hbWUgaW4gdGhlIGBsYW5ndWFnZS1zY3JpcHQtcmVnaW9uYCBmb3JtYXRcbiAgICogQHJldHVybnMgRXhwYW5kZWQgbG9jYWxlIG5hbWVcbiAgICogQHNpbmNlIDAuNS4wXG4gICAqL1xuICBnZXQgZnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbE5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2VzIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlIG9iamVjdFxuICAgKiBAcmV0dXJucyBBIGNsb25lZCBsb2NhbGUgb2JqZWN0XG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgY2xvbmUoKTogTG9jYWxlIHtcbiAgICByZXR1cm4gbmV3IExvY2FsZSggdGhpcy5mdWxsTmFtZSApO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIExvY2FsZSdzIGV4dGVuc2lvbiBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJucyBMb2NhbGUncyBleHRlbnNpb24gc3RyaW5nXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyID0gdGhpcy5tYXhpbWl6ZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgdVBvcyA9IHN0ci5pbmRleE9mKGAtJHtMb2NhbGUuVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OfS1gKTtcbiAgICBpZiAodVBvcyA+PSAwKSB7XG4gICAgICBjb25zdCB4UG9zID0gc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5QUklWQVRFX1VTRV9FWFRFTlNJT059LWAsIHVQb3MgKyAxKTtcbiAgICAgIGlmICh4UG9zID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyh1UG9zICsgMywgeFBvcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyh1UG9zICsgMyk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIExvY2FsZSdzIHByaXZhdGUgdXNlIGV4dGVuc2lvbiBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJucyBMb2NhbGUncyBwcml2YXRlIHVzZSBleHRlbnNpb24gc3RyaW5nXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgZ2V0UHJpdmF0ZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMubWF4aW1pemUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHhQb3MgPSBzdHIuaW5kZXhPZihgLSR7TG9jYWxlLlBSSVZBVEVfVVNFX0VYVEVOU0lPTn0tYCk7XG4gICAgaWYgKHhQb3MgPj0gMCkge1xuICAgICAgY29uc3QgdVBvcyA9IHN0ci5pbmRleE9mKGAtJHtMb2NhbGUuVU5JQ09ERV9MT0NBTEVfRVhURU5TSU9OfS1gLCB4UG9zICsgMSk7XG4gICAgICBpZiAodVBvcyA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoeFBvcyArIDMsIHVQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoeFBvcyArIDMpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBMb2NhbGUgaGFzIGFueSBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBMb2NhbGUgaGFzIGFueSBleHRlbnNpb25zXG4gICAqIEBzaW5jZSAwLjUuMFxuICAgKi9cbiAgaGFzRXh0ZW5zaW9ucygpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLm1heGltaXplKCkudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5QUklWQVRFX1VTRV9FWFRFTlNJT059LWApID49IDAgfHwgc3RyLmluZGV4T2YoYC0ke0xvY2FsZS5VTklDT0RFX0xPQ0FMRV9FWFRFTlNJT059LWApID49IDA7XG4gIH1cblxufVxuXG4iXX0=