@ngneat/reactive-forms
Version:
(Angular Reactive) Forms with Benefits
109 lines • 18.2 kB
JavaScript
import { UntypedFormControl, } from '@angular/forms';
import { isObservable, Subject } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { controlValueChanges$, controlStatus$, controlDisabledWhile, controlEnabledWhile, disableControl, enableControl, mergeErrors, removeError, hasErrorAnd, controlErrorChanges$, } from './core';
export class FormControl extends UntypedFormControl {
constructor(formState, validatorOrOpts, asyncValidator) {
super(formState, validatorOrOpts, asyncValidator);
this.touchChanges = new Subject();
this.dirtyChanges = new Subject();
this.errorsSubject = new Subject();
this.touch$ = this.touchChanges
.asObservable()
.pipe(distinctUntilChanged());
this.dirty$ = this.dirtyChanges
.asObservable()
.pipe(distinctUntilChanged());
this.value$ = controlValueChanges$(this);
this.disabled$ = controlStatus$(this, 'disabled');
this.enabled$ = controlStatus$(this, 'enabled');
this.invalid$ = controlStatus$(this, 'invalid');
this.valid$ = controlStatus$(this, 'valid');
this.status$ = controlStatus$(this, 'status');
this.errors$ = controlErrorChanges$(this, this.errorsSubject.asObservable());
}
setValue(valueOrObservable, options) {
if (isObservable(valueOrObservable)) {
return valueOrObservable.subscribe((value) => super.setValue(value, options));
}
super.setValue(valueOrObservable, options);
}
patchValue(valueOrObservable, options) {
if (isObservable(valueOrObservable)) {
return valueOrObservable.subscribe((value) => super.patchValue(value, options));
}
super.patchValue(valueOrObservable, options);
}
getRawValue() {
return this.value;
}
markAsTouched(...opts) {
super.markAsTouched(...opts);
this.touchChanges.next(true);
}
markAsUntouched(...opts) {
super.markAsUntouched(...opts);
this.touchChanges.next(false);
}
markAsPristine(...opts) {
super.markAsPristine(...opts);
this.dirtyChanges.next(false);
}
markAsDirty(...opts) {
super.markAsDirty(...opts);
this.dirtyChanges.next(true);
}
setEnable(enable = true, opts) {
enableControl(this, enable, opts);
}
setDisable(disable = true, opts) {
disableControl(this, disable, opts);
}
disabledWhile(observable, options) {
return controlDisabledWhile(this, observable, options);
}
enabledWhile(observable, options) {
return controlEnabledWhile(this, observable, options);
}
reset(formState, options) {
super.reset(formState, options);
}
setValidators(newValidators, options) {
super.setValidators(newValidators);
super.updateValueAndValidity(options);
}
setAsyncValidators(newValidator, options) {
super.setAsyncValidators(newValidator);
super.updateValueAndValidity(options);
}
getError(...params) {
return super.getError(...params);
}
setErrors(...opts) {
/**
* @description
* Use an elvis operator to avoid a throw when the control is used with an async validator
* Which will be instantly resolved (like with `of(null)`)
* In such case, Angular will call this method instantly before even instancing the properties causing the throw
* Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor
*
* Issue: https://github.com/ngneat/reactive-forms/issues/91
* Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark
*/
this.errorsSubject?.next(opts[0]);
return super.setErrors(...opts);
}
mergeErrors(errors, opts) {
this.setErrors(mergeErrors(this.errors, errors), opts);
}
removeError(key, opts) {
this.setErrors(removeError(this.errors, key), opts);
}
hasErrorAndTouched(error) {
return hasErrorAnd('touched', this, error);
}
hasErrorAndDirty(error) {
return hasErrorAnd('dirty', this, error);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9yZWFjdGl2ZS1mb3Jtcy9zcmMvbGliL2Zvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEdBR25CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsV0FBVyxFQUNYLFdBQVcsRUFDWCxvQkFBb0IsR0FDckIsTUFBTSxRQUFRLENBQUM7QUFHaEIsTUFBTSxPQUFPLFdBQWUsU0FBUSxrQkFBa0I7SUF5QnBELFlBQ0UsU0FBeUIsRUFDekIsZUFBcUUsRUFDckUsY0FBb0U7UUFFcEUsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7UUExQjVDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0QyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDdEMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztRQUV0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7YUFDaEMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7YUFDaEMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsb0JBQW9CLENBQUksSUFBSSxDQUFDLENBQUM7UUFDdkMsY0FBUyxHQUFH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RCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgY29udHJvbFZhbHVlQ2hhbmdlcyQsXG4gIGNvbnRyb2xTdGF0dXMkLFxuICBjb250cm9sRGlzYWJsZWRXaGlsZSxcbiAgY29udHJvbEVuYWJsZWRXaGlsZSxcbiAgZGlzYWJsZUNvbnRyb2wsXG4gIGVuYWJsZUNvbnRyb2wsXG4gIG1lcmdlRXJyb3JzLFxuICByZW1vdmVFcnJvcixcbiAgaGFzRXJyb3JBbmQsXG4gIGNvbnRyb2xFcnJvckNoYW5nZXMkLFxufSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHsgQm94ZWRWYWx1ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybUNvbnRyb2w8VD4gZXh0ZW5kcyBVbnR5cGVkRm9ybUNvbnRyb2wge1xuICByZWFkb25seSB2YWx1ZSE6IFQ7XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlcyE6IE9ic2VydmFibGU8VD47XG5cbiAgcHJpdmF0ZSB0b3VjaENoYW5nZXMgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGRpcnR5Q2hhbmdlcyA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgZXJyb3JzU3ViamVjdCA9IG5ldyBTdWJqZWN0PFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPigpO1xuXG4gIHJlYWRvbmx5IHRvdWNoJCA9IHRoaXMudG91Y2hDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IGRpcnR5JCA9IHRoaXMuZGlydHlDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IHZhbHVlJCA9IGNvbnRyb2xWYWx1ZUNoYW5nZXMkPFQ+KHRoaXMpO1xuICByZWFkb25seSBkaXNhYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZGlzYWJsZWQnKTtcbiAgcmVhZG9ubHkgZW5hYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZW5hYmxlZCcpO1xuICByZWFkb25seSBpbnZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICdpbnZhbGlkJyk7XG4gIHJlYWRvbmx5IHZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICd2YWxpZCcpO1xuICByZWFkb25seSBzdGF0dXMkID0gY29udHJvbFN0YXR1cyQodGhpcywgJ3N0YXR1cycpO1xuICByZWFkb25seSBlcnJvcnMkID0gY29udHJvbEVycm9yQ2hhbmdlcyQoXG4gICAgdGhpcyxcbiAgICB0aGlzLmVycm9yc1N1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtU3RhdGU/OiBCb3hlZFZhbHVlPFQ+LFxuICAgIHZhbGlkYXRvck9yT3B0cz86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1Db250cm9sPlsxXSxcbiAgICBhc3luY1ZhbGlkYXRvcj86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1Db250cm9sPlsyXVxuICApIHtcbiAgICBzdXBlcihmb3JtU3RhdGUsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IE9ic2VydmFibGU8VD4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRWYWx1ZSddPlsxXVxuICApOiBTdWJzY3JpcHRpb247XG4gIHNldFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBULFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0VmFsdWUnXT5bMV1cbiAgKTogdm9pZDtcbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IGFueSxcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldFZhbHVlJ10+WzFdXG4gICk6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZU9yT2JzZXJ2YWJsZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9yT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlKSA9PlxuICAgICAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZSBhcyBULCBvcHRpb25zKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZU9yT2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwYXRjaFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsncGF0Y2hWYWx1ZSddPlsxXVxuICApOiBTdWJzY3JpcHRpb247XG4gIHBhdGNoVmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IFQsXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydwYXRjaFZhbHVlJ10+WzFdXG4gICk6IHZvaWQ7XG4gIHBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGU6IGFueSwgb3B0aW9ucz86IGFueSk6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZU9yT2JzZXJ2YWJsZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9yT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlKSA9PlxuICAgICAgICBzdXBlci5wYXRjaFZhbHVlKHZhbHVlIGFzIFQsIG9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyLnBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0UmF3VmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+XG4gICk6IFJldHVyblR5cGU8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNUb3VjaGVkKC4uLm9wdHMpO1xuICAgIHRoaXMudG91Y2hDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBtYXJrQXNVbnRvdWNoZWQoXG4gICAgLi4ub3B0czogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1VudG91Y2hlZCddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzVW50b3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNVbnRvdWNoZWQoLi4ub3B0cyk7XG4gICAgdGhpcy50b3VjaENoYW5nZXMubmV4dChmYWxzZSk7XG4gIH1cblxuICBtYXJrQXNQcmlzdGluZShcbiAgICAuLi5vcHRzOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnbWFya0FzUHJpc3RpbmUnXT5cbiAgKTogUmV0dXJuVHlwZTxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1ByaXN0aW5lJ10+IHtcbiAgICBzdXBlci5tYXJrQXNQcmlzdGluZSguLi5vcHRzKTtcbiAgICB0aGlzLmRpcnR5Q2hhbmdlcy5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNEaXJ0eSddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzRGlydHknXT4ge1xuICAgIHN1cGVyLm1hcmtBc0RpcnR5KC4uLm9wdHMpO1xuICAgIHRoaXMuZGlydHlDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBzZXRFbmFibGUoZW5hYmxlID0gdHJ1ZSwgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF0pIHtcbiAgICBlbmFibGVDb250cm9sKHRoaXMsIGVuYWJsZSwgb3B0cyk7XG4gIH1cblxuICBzZXREaXNhYmxlKGRpc2FibGUgPSB0cnVlLCBvcHRzPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF0pIHtcbiAgICBkaXNhYmxlQ29udHJvbCh0aGlzLCBkaXNhYmxlLCBvcHRzKTtcbiAgfVxuXG4gIGRpc2FibGVkV2hpbGUoXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xEaXNhYmxlZFdoaWxlKHRoaXMsIG9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZW5hYmxlZFdoaWxlKFxuICAgIG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xFbmFibGVkV2hpbGUodGhpcywgb2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXNldChcbiAgICBmb3JtU3RhdGU/OiBULFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsncmVzZXQnXT5bMV1cbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVzZXQoZm9ybVN0YXRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldFZhbGlkYXRvcnMoXG4gICAgbmV3VmFsaWRhdG9yczogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldFZhbGlkYXRvcnMnXT5bMF0sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWyd1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5J10+WzBdXG4gICkge1xuICAgIHN1cGVyLnNldFZhbGlkYXRvcnMobmV3VmFsaWRhdG9ycyk7XG4gICAgc3VwZXIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTtcbiAgfVxuXG4gIHNldEFzeW5jVmFsaWRhdG9ycyhcbiAgICBuZXdWYWxpZGF0b3I6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRBc3luY1ZhbGlkYXRvcnMnXT5bMF0sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWyd1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5J10+WzBdXG4gICkge1xuICAgIHN1cGVyLnNldEFzeW5jVmFsaWRhdG9ycyhuZXdWYWxpZGF0b3IpO1xuICAgIHN1cGVyLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7XG4gIH1cblxuICBnZXRFcnJvcjxFPiguLi5wYXJhbXM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydnZXRFcnJvciddPik6IEUgfCBudWxsIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3IoLi4ucGFyYW1zKTtcbiAgfVxuXG4gIHNldEVycm9ycyguLi5vcHRzOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0RXJyb3JzJ10+KSB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVXNlIGFuIGVsdmlzIG9wZXJhdG9yIHRvIGF2b2lkIGEgdGhyb3cgd2hlbiB0aGUgY29udHJvbCBpcyB1c2VkIHdpdGggYW4gYXN5bmMgdmFsaWRhdG9yXG4gICAgICogV2hpY2ggd2lsbCBiZSBpbnN0YW50bHkgcmVzb2x2ZWQgKGxpa2Ugd2l0aCBgb2YobnVsbClgKVxuICAgICAqIEluIHN1Y2ggY2FzZSwgQW5ndWxhciB3aWxsIGNhbGwgdGhpcyBtZXRob2QgaW5zdGFudGx5IGJlZm9yZSBldmVuIGluc3RhbmNpbmcgdGhlIHByb3BlcnRpZXMgY2F1c2luZyB0aGUgdGhyb3dcbiAgICAgKiBDYW4gYmUgZWFzaWx5IHJlcHJvZHVjZWQgd2l0aCBhIHN0ZXAtYnktc3RlcCBkZWJ1ZyBvbmNlIGNvbXBpbGVkIHdoZW4gY2hlY2tpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZ25lYXQvcmVhY3RpdmUtZm9ybXMvaXNzdWVzLzkxXG4gICAgICogUmVwcm9kdWN0aW9uOiBodHRwczovL2NvZGVzYW5kYm94LmlvL2VtYmVkL2dpdGh1Yi9DMFpFTi9uZ25lYXQtcmVhY3RpdmUtZm9ybXMtZXJyb3ItaXNzdWUtY3MvdHJlZS9tYWluLz9hdXRvcmVzaXplPTEmZXhwYW5kZGV2dG9vbHM9MSZmb250c2l6ZT0xNCZoaWRlbmF2aWdhdGlvbj0xJnRoZW1lPWRhcmtcbiAgICAgKi9cbiAgICB0aGlzLmVycm9yc1N1YmplY3Q/Lm5leHQob3B0c1swXSk7XG4gICAgcmV0dXJuIHN1cGVyLnNldEVycm9ycyguLi5vcHRzKTtcbiAgfVxuXG4gIG1lcmdlRXJyb3JzKFxuICAgIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwsXG4gICAgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRFcnJvcnMnXT5bMV1cbiAgKSB7XG4gICAgdGhpcy5zZXRFcnJvcnMobWVyZ2VFcnJvcnModGhpcy5lcnJvcnMsIGVycm9ycyksIG9wdHMpO1xuICB9XG5cbiAgcmVtb3ZlRXJyb3IoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRFcnJvcnMnXT5bMV1cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZXRFcnJvcnMocmVtb3ZlRXJyb3IodGhpcy5lcnJvcnMsIGtleSksIG9wdHMpO1xuICB9XG5cbiAgaGFzRXJyb3JBbmRUb3VjaGVkKGVycm9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzRXJyb3JBbmQoJ3RvdWNoZWQnLCB0aGlzLCBlcnJvcik7XG4gIH1cblxuICBoYXNFcnJvckFuZERpcnR5KGVycm9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzRXJyb3JBbmQoJ2RpcnR5JywgdGhpcywgZXJyb3IpO1xuICB9XG59XG4iXX0=