@universis/common
Version:
Universis - common directives and services
201 lines • 24.6 kB
JavaScript
import { Injectable, Pipe } from '@angular/core';
import { AngularDataContext } from '@themost/angular';
import { DecimalPipe } from '@angular/common';
import { ConfigurationService } from './configuration.service';
import * as i0 from "@angular/core";
import * as i1 from "@themost/angular";
import * as i2 from "./configuration.service";
export function round(x, n) {
if (typeof x !== 'number') {
return 0;
}
if (n) {
return parseFloat(x.toFixed(n));
}
return Math.round(x);
}
export class GradeScale {
constructor(_locale, scale = null) {
this._locale = _locale;
this.scale = scale;
this.formatPrecision = 2;
this.scalePrecision = 2;
// init decimal pipe
this._formatter = new DecimalPipe(this._locale);
// get decimal separator regular expression
// @ts-ignore
this._decimalCharRegExp = new RegExp('\\' + this._formatter.transform(0.1, '1.1-1').substr(1, 1), 'ig');
if (scale) {
this.id = scale['id'];
this.name = scale['name'];
this.scaleType = scale['scaleType'];
this.scaleFactor = scale['scaleFactor'];
this.scaleBase = scale['scaleBase'];
this.formatPrecision = scale['formatPrecision'];
this.scalePrecision = scale['scalePrecision'];
this.values = scale['values'];
}
}
/**
* Formats the specified based on this grade scale and returns the formatted value
* @param {number} grade
* @returns string
*/
format(grade) {
if (this.scaleType === 0) {
if (typeof this.scaleFactor !== 'number') {
throw new TypeError('Grade scale factor must be a number.');
}
if (this.scaleFactor <= 0) {
throw new TypeError('Grade scale factor must greater than zero.');
}
// arithmetic grade scale
if (typeof grade === 'number') {
// get final grade by applying rounding
const finalGrade = round((grade / this.scaleFactor), this.formatPrecision);
// return formatted value based on the current locale
const result = this._formatter.transform(finalGrade, `1.${this.formatPrecision}-${this.formatPrecision}`);
if (result != null) {
return result;
}
}
return '';
}
else if (this.scaleType === 1 || this.scaleType === 3) {
let finalValue = round(grade, this.scalePrecision);
if (this.values != null) {
let findValue = this.values.find(x => {
return finalValue >= x.valueFrom && finalValue <= x.valueTo;
});
if (findValue) {
return findValue.name;
}
}
throw new RangeError('Out of range value for grade');
}
throw new Error('Not yet implemented');
}
/**
* Converts the given grade to the equivalent grade value base on this grade scale
* @param grade
*/
convert(grade) {
if (this.scaleType === 0) {
let finalGrade;
// if grade is a number
if (typeof grade === 'undefined' || grade === null) {
return;
}
else if (typeof grade === 'number') {
finalGrade = grade;
}
else if (typeof grade === 'string') {
// try to convert the given grade
finalGrade = parseFloat(grade.replace(this._decimalCharRegExp, '.'));
if (isNaN(finalGrade)) {
return;
}
}
if (typeof this.scaleFactor !== 'number') {
throw new TypeError('Grade scale factor must be a number.');
}
if (this.scaleFactor <= 0) {
throw new TypeError('Grade scale factor must greater than zero.');
}
// validate grade
const res = round((finalGrade * this.scaleFactor), this.formatPrecision + 1);
// throw error if result is greater than 1
if (res < 0 || res > 1) {
throw new Error('Grade is out of range. It must be between 0 to 1.');
}
return res;
}
else if (this.scaleType === 1 || this.scaleType === 3) {
if (this.values) {
let findValue = this.values.find(x => {
return x.name === grade || x.alternateName === grade;
});
if (findValue) {
return findValue.exactValue;
}
}
throw new RangeError('Out of range value for grade');
}
throw new Error('Not yet implemented');
}
}
export class GradeScaleService {
constructor(_context, _configurationService) {
this._context = _context;
this._configurationService = _configurationService;
//
}
/**
* Gets all the available grade scales
*/
getGradeScales() {
if (this._gradeScales) {
return Promise.resolve(this._gradeScales);
}
return this._context.model('GradeScales').getItems().then(result => {
const locale = this._configurationService.currentLocale;
this._gradeScales = result.map(x => {
return Object.assign(new GradeScale(locale), x);
});
return Promise.resolve(this._gradeScales);
}, (err) => {
console.log(err);
return null;
});
}
/**
* Gets a grade scale based on the given identifier
* @param {*} id
*/
getGradeScale(id) {
if (this._gradeScales) {
return Promise.resolve(this._gradeScales.find(value => {
return value.id === id;
}));
}
return this.getGradeScales().then(res => {
if (res == null) {
return;
}
return Promise.resolve(res.find(value => {
return value.id === id;
}));
});
}
}
GradeScaleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GradeScaleService, deps: [{ token: i1.AngularDataContext }, { token: i2.ConfigurationService }], target: i0.ɵɵFactoryTarget.Injectable });
GradeScaleService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GradeScaleService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GradeScaleService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.AngularDataContext }, { type: i2.ConfigurationService }]; } });
export class GradePipe {
constructor(_gradeScaleService) {
this._gradeScaleService = _gradeScaleService;
//
}
transform(value, gradeScale) {
if (gradeScale instanceof GradeScale) {
return Promise.resolve(gradeScale.format(value));
}
return this._gradeScaleService.getGradeScale(gradeScale).then(result => {
if (typeof result === 'undefined') {
return Promise.reject(new Error('The specified grade scale cannot be found or is inaccessible'));
}
return Promise.resolve(result.format(value));
});
}
}
GradePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GradePipe, deps: [{ token: GradeScaleService }], target: i0.ɵɵFactoryTarget.Pipe });
GradePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: GradePipe, name: "grade" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GradePipe, decorators: [{
type: Pipe,
args: [{
name: 'grade'
}]
}], ctorParameters: function () { return [{ type: GradeScaleService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhZGUtc2NhbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvZ3JhZGUtc2NhbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDOzs7O0FBRTdELE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBTSxFQUFFLENBQVU7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDdkIsT0FBTyxDQUFDLENBQUM7S0FDWjtJQUNELElBQUksQ0FBQyxFQUFFO1FBQ0gsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25DO0lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLE9BQU8sVUFBVTtJQWNyQixZQUFvQixPQUFlLEVBQVUsUUFBYSxJQUFJO1FBQTFDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBUHZELG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBT3hCLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCwyQ0FBMkM7UUFDM0MsYUFBYTtRQUNiLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFB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QyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ3RFLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO2FBQ2xHO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O3VHQWhCVSxTQUFTO3FHQUFULFNBQVM7NEZBQVQsU0FBUztrQkFIckIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsT0FBTztpQkFDZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFBpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbmd1bGFyRGF0YUNvbnRleHR9IGZyb20gJ0B0aGVtb3N0L2FuZ3VsYXInO1xuaW1wb3J0IHtEZWNpbWFsUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKHg6IGFueSwgbj86IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgeCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChuKSB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdCh4LnRvRml4ZWQobikpO1xuICB9XG4gIHJldHVybiBNYXRoLnJvdW5kKHgpO1xufVxuXG5leHBvcnQgY2xhc3MgR3JhZGVTY2FsZSB7XG5cbiAgcHVibGljIGlkPzogbnVtYmVyO1xuICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgcHVibGljIHNjYWxlVHlwZT86IG51bWJlcjtcbiAgcHVibGljIHNjYWxlRmFjdG9yPzogbnVtYmVyO1xuICBwdWJsaWMgc2NhbGVCYXNlPzogbnVtYmVyO1xuICBwdWJsaWMgZm9ybWF0UHJlY2lzaW9uID0gMjtcbiAgcHVibGljIHNjYWxlUHJlY2lzaW9uID0gMjtcbiAgcHVibGljIHZhbHVlcz86IGFueVtdO1xuXG4gIHByaXZhdGUgX2Zvcm1hdHRlcjogRGVjaW1hbFBpcGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlY2ltYWxDaGFyUmVnRXhwOiBSZWdFeHA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmcsIHByaXZhdGUgc2NhbGU6IGFueSA9IG51bGwpIHtcbiAgICAvLyBpbml0IGRlY2ltYWwgcGlwZVxuICAgIHRoaXMuX2Zvcm1hdHRlciA9IG5ldyBEZWNpbWFsUGlwZSh0aGlzLl9sb2NhbGUpO1xuICAgIC8vIGdldCBkZWNpbWFsIHNlcGFyYXRvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5fZGVjaW1hbENoYXJSZWdFeHAgPSBuZXcgUmVnRXhwKCdcXFxcJyArIHRoaXMuX2Zvcm1hdHRlci50cmFuc2Zvcm0oMC4xLCAnMS4xLTEnKS5zdWJzdHIoMSwgMSksICdpZycpO1xuICAgIGlmIChzY2FsZSkge1xuICAgICAgdGhpcy5pZCA9IHNjYWxlWydpZCddO1xuICAgICAgdGhpcy5uYW1lID0gc2NhbGVbJ25hbWUnXTtcbiAgICAgIHRoaXMuc2NhbGVUeXBlID0gc2NhbGVbJ3NjYWxlVHlwZSddO1xuICAgICAgdGhpcy5zY2FsZUZhY3RvciA9IHNjYWxlWydzY2FsZUZhY3RvciddO1xuICAgICAgdGhpcy5zY2FsZUJhc2UgPSBzY2FsZVsnc2NhbGVCYXNlJ107XG4gICAgICB0aGlzLmZvcm1hdFByZWNpc2lvbiA9IHNjYWxlWydmb3JtYXRQcmVjaXNpb24nXTtcbiAgICAgIHRoaXMuc2NhbGVQcmVjaXNpb24gPSBzY2FsZVsnc2NhbGVQcmVjaXNpb24nXTtcbiAgICAgIHRoaXMudmFsdWVzID0gc2NhbGVbJ3ZhbHVlcyddO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgYmFzZWQgb24gdGhpcyBncmFkZSBzY2FsZSBhbmQgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBncmFkZVxuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZvcm1hdChncmFkZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zY2FsZVR5cGUgPT09IDApIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zY2FsZUZhY3RvciAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR3JhZGUgc2NhbGUgZmFjdG9yIG11c3QgYmUgYSBudW1iZXIuJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zY2FsZUZhY3RvciA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dyYWRlIHNjYWxlIGZhY3RvciBtdXN0IGdyZWF0ZXIgdGhhbiB6ZXJvLicpO1xuICAgICAgfVxuICAgICAgLy8gYXJpdGhtZXRpYyBncmFkZSBzY2FsZVxuICAgICAgaWYgKHR5cGVvZiAoZ3JhZGUgYXMgYW55KSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gZ2V0IGZpbmFsIGdyYWRlIGJ5IGFwcGx5aW5nIHJvdW5kaW5nXG4gICAgICAgIGNvbnN0IGZpbmFsR3JhZGUgPSByb3VuZCgoZ3JhZGUgLyB0aGlzLnNjYWxlRmFjdG9yKSwgdGhpcy5mb3JtYXRQcmVjaXNpb24pO1xuICAgICAgICAvLyByZXR1cm4gZm9ybWF0dGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9mb3JtYXR0ZXIudHJhbnNmb3JtKGZpbmFsR3JhZGUsIGAxLiR7dGhpcy5mb3JtYXRQcmVjaXNpb259LSR7dGhpcy5mb3JtYXRQcmVjaXNpb259YCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVUeXBlID09PSAxIHx8IHRoaXMuc2NhbGVUeXBlID09PSAzKSB7XG4gICAgICBsZXQgZmluYWxWYWx1ZSA9IHJvdW5kKGdyYWRlLCB0aGlzLnNjYWxlUHJlY2lzaW9uKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlcyAhPSBudWxsKSB7XG4gICAgICAgIGxldCBmaW5kVmFsdWUgPSB0aGlzLnZhbHVlcy5maW5kKHggPT4ge1xuICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlID49IHgudmFsdWVGcm9tICYmIGZpbmFsVmFsdWUgPD0geC52YWx1ZVRvO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbmRWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmaW5kVmFsdWUubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSB2YWx1ZSBmb3IgZ3JhZGUnKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGdpdmVuIGdyYWRlIHRvIHRoZSBlcXVpdmFsZW50IGdyYWRlIHZhbHVlIGJhc2Ugb24gdGhpcyBncmFkZSBzY2FsZVxuICAgKiBAcGFyYW0gZ3JhZGVcbiAgICovXG4gIGNvbnZlcnQoZ3JhZGU6IGFueSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2NhbGVUeXBlID09PSAwKSB7XG4gICAgICBsZXQgZmluYWxHcmFkZTtcbiAgICAgIC8vIGlmIGdyYWRlIGlzIGEgbnVtYmVyXG4gICAgICBpZiAodHlwZW9mIGdyYWRlID09PSAndW5kZWZpbmVkJyB8fCBncmFkZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBncmFkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgZmluYWxHcmFkZSA9IGdyYWRlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZ3JhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHRyeSB0byBjb252ZXJ0IHRoZSBnaXZlbiBncmFkZVxuICAgICAgICBmaW5hbEdyYWRlID0gcGFyc2VGbG9hdChncmFkZS5yZXBsYWNlKHRoaXMuX2RlY2ltYWxDaGFyUmVnRXhwLCAnLicpKTtcbiAgICAgICAgaWYgKGlzTmFOKGZpbmFsR3JhZGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRoaXMuc2NhbGVGYWN0b3IgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dyYWRlIHNjYWxlIGZhY3RvciBtdXN0IGJlIGEgbnVtYmVyLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2NhbGVGYWN0b3IgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHcmFkZSBzY2FsZSBmYWN0b3IgbXVzdCBncmVhdGVyIHRoYW4gemVyby4nKTtcbiAgICAgIH1cbiAgICAgIC8vIHZhbGlkYXRlIGdyYWRlXG4gICAgICBjb25zdCByZXMgPSA8bnVtYmVyPnJvdW5kKChmaW5hbEdyYWRlICogdGhpcy5zY2FsZUZhY3RvciksIHRoaXMuZm9ybWF0UHJlY2lzaW9uICsgMSApO1xuICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiAxXG4gICAgICBpZiAocmVzIDwgMCB8fCByZXMgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR3JhZGUgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGJldHdlZW4gMCB0byAxLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NhbGVUeXBlID09PSAxIHx8IHRoaXMuc2NhbGVUeXBlID09PSAzKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZXMpIHtcbiAgICAgICAgbGV0IGZpbmRWYWx1ZSA9IHRoaXMudmFsdWVzLmZpbmQoIHggPT4ge1xuICAgICAgICAgIHJldHVybiB4Lm5hbWUgPT09IGdyYWRlIHx8IHguYWx0ZXJuYXRlTmFtZSA9PT0gZ3JhZGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZmluZFZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmRWYWx1ZS5leGFjdFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIHZhbHVlIGZvciBncmFkZScpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCB5ZXQgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmFkZVNjYWxlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfZ3JhZGVTY2FsZXM/OiBBcnJheTxHcmFkZVNjYWxlPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSkge1xuXG4gICAgLy9cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgYXZhaWxhYmxlIGdyYWRlIHNjYWxlc1xuICAgKi9cbiAgZ2V0R3JhZGVTY2FsZXMoKSB7XG4gICAgaWYgKHRoaXMuX2dyYWRlU2NhbGVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2dyYWRlU2NhbGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQubW9kZWwoJ0dyYWRlU2NhbGVzJykuZ2V0SXRlbXMoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5jdXJyZW50TG9jYWxlO1xuICAgICAgdGhpcy5fZ3JhZGVTY2FsZXMgPSByZXN1bHQubWFwKCB4ID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEdyYWRlU2NhbGUobG9jYWxlKSwgeCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ3JhZGVTY2FsZXMpO1xuICAgIH0sIChlcnIpID0+IHtcblxuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBncmFkZSBzY2FsZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gaWRlbnRpZmllclxuICAgKiBAcGFyYW0geyp9IGlkXG4gICAqL1xuICBnZXRHcmFkZVNjYWxlKGlkOiBhbnkpOiBQcm9taXNlPEdyYWRlU2NhbGUgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5fZ3JhZGVTY2FsZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ3JhZGVTY2FsZXMuZmluZCh2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5pZCA9PT0gaWQ7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEdyYWRlU2NhbGVzKCkudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzLmZpbmQodmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gdmFsdWUuaWQgPT09IGlkO1xuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbn1cblxuQFBpcGUoe1xuICBuYW1lOiAnZ3JhZGUnXG59KVxuZXhwb3J0IGNsYXNzIEdyYWRlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dyYWRlU2NhbGVTZXJ2aWNlOiBHcmFkZVNjYWxlU2VydmljZSkge1xuICAgIC8vXG4gIH1cblxuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZ3JhZGVTY2FsZT86IGFueSk6IGFueSB7XG4gICAgaWYgKGdyYWRlU2NhbGUgaW5zdGFuY2VvZiBHcmFkZVNjYWxlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdyYWRlU2NhbGUuZm9ybWF0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmFkZVNjYWxlU2VydmljZS5nZXRHcmFkZVNjYWxlKGdyYWRlU2NhbGUpLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignVGhlIHNwZWNpZmllZCBncmFkZSBzY2FsZSBjYW5ub3QgYmUgZm91bmQgb3IgaXMgaW5hY2Nlc3NpYmxlJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQuZm9ybWF0KHZhbHVlKSk7XG4gICAgfSk7XG4gIH1cblxufVxuIl19