@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
287 lines • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const noop = (/**
* @return {?}
*/
() => { });
const ɵ0 = noop;
export class FileUploader {
constructor() {
/**
* Accessible text for the button that opens the upload window.
*
* Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service
*/
this.buttonText = 'Agregar archivo(s)';
/**
* Type set for button
*/
this.buttonType = 'basic';
/**
* Specify the types of files that the input should be able to receive
*/
this.accept = [];
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
*/
this.multiple = true;
/**
* Set to `true` for a loading file uploader.
*/
this.skeleton = false;
/**
* Provides a unique id for the underlying <input> node
*/
this.fileUploaderId = `file-uploader-${FileUploader.fileUploaderCount}`;
/**
* The list of files that have been submitted to be uploaded
*/
this.files = new Set();
this.filesChange = new EventEmitter();
this.baseClass = true;
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
FileUploader.fileUploaderCount++;
}
/**
* Specifies the property to be used as the return value to `ngModel`
* @return {?}
*/
get value() {
return this.files;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (v !== this.files) {
this.files = v;
this.onChangeCallback(v);
}
}
/**
* @return {?}
*/
onBlur() {
this.onTouchedCallback();
}
/**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== this.value) {
this.files = value;
}
}
/**
* @return {?}
*/
onFilesAdded() {
/** @type {?} */
const files = this.fileInput.nativeElement.files;
if (!this.multiple) {
this.files.clear();
}
for (let file of files) {
/** @type {?} */
const fileItem = {
file,
uploaded: false,
state: 'edit',
invalid: false,
invalidText: '',
};
this.files.add(fileItem);
this.filesChange.emit(this.files);
}
this.value = this.files;
}
/**
* @param {?} fileItem
* @return {?}
*/
removeFile(fileItem) {
this.files.delete(fileItem);
this.fileInput.nativeElement.value = '';
this.filesChange.emit(this.files);
}
/**
* Registers the injected function to control the touch use of the `FileUploader`.
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
}
/**
* Counter used to create unique ids for file-uploader components
*/
FileUploader.fileUploaderCount = 0;
FileUploader.decorators = [
{ type: Component, args: [{
selector: 'suka-file-uploader',
template: `
<ng-container *ngIf="!skeleton; else skeletonTemplate">
<label class="label">{{title}}</label>
<div *ngIf="description" class="form__helper-text">{{description}}</div>
<div class="file">
<button
type="button"
[sukaButton]="buttonType"
(click)="fileInput.click()"
[attr.for]="fileUploaderId"
[size]="size">
{{buttonText}}
</button>
<input
#fileInput
type="file"
class="file-input"
[accept]="accept"
[id]="fileUploaderId"
[multiple]="multiple"
tabindex="-1"
(change)="onFilesAdded()"/>
<div class="file-container">
<div *ngFor="let fileItem of files">
<suka-file [fileItem]="fileItem" (remove)="removeFile(fileItem)"></suka-file>
<div *ngIf="fileItem.invalid" class="form-requirement">
{{fileItem.invalidText}}
</div>
</div>
</div>
</div>
</ng-container>
<ng-template #skeletonTemplate>
<div class="skeleton__text" style="width: 100px"></div>
<div class="skeleton__text" style="width: 225px"></div>
<button sukaButton skeleton="true"></button>
</ng-template>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: FileUploader,
multi: true
}
]
}] }
];
/** @nocollapse */
FileUploader.ctorParameters = () => [];
FileUploader.propDecorators = {
buttonText: [{ type: Input }],
buttonType: [{ type: Input }],
title: [{ type: Input }],
description: [{ type: Input }],
accept: [{ type: Input }],
multiple: [{ type: Input }],
skeleton: [{ type: Input }],
size: [{ type: Input }],
fileUploaderId: [{ type: Input }],
fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
baseClass: [{ type: HostBinding, args: ['class.file-uploader',] }]
};
if (false) {
/**
* Counter used to create unique ids for file-uploader components
* @type {?}
*/
FileUploader.fileUploaderCount;
/**
* Accessible text for the button that opens the upload window.
*
* Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service
* @type {?}
*/
FileUploader.prototype.buttonText;
/**
* Type set for button
* @type {?}
*/
FileUploader.prototype.buttonType;
/**
* Text set to the title
* @type {?}
*/
FileUploader.prototype.title;
/**
* Text set to the description
* @type {?}
*/
FileUploader.prototype.description;
/**
* Specify the types of files that the input should be able to receive
* @type {?}
*/
FileUploader.prototype.accept;
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
* @type {?}
*/
FileUploader.prototype.multiple;
/**
* Set to `true` for a loading file uploader.
* @type {?}
*/
FileUploader.prototype.skeleton;
/**
* Sets the size of the button.
* @type {?}
*/
FileUploader.prototype.size;
/**
* Provides a unique id for the underlying <input> node
* @type {?}
*/
FileUploader.prototype.fileUploaderId;
/**
* Maintains a reference to the view DOM element of the underlying <input> node
* @type {?}
*/
FileUploader.prototype.fileInput;
/**
* The list of files that have been submitted to be uploaded
* @type {?}
*/
FileUploader.prototype.files;
/** @type {?} */
FileUploader.prototype.filesChange;
/** @type {?} */
FileUploader.prototype.baseClass;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onTouchedCallback;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onChangeCallback;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUk3QyxJQUFJOzs7QUFBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7O0FBa0RyQixNQUFNLE9BQU8sWUFBWTtJQTZEdkI7Ozs7OztRQW5EUyxlQUFVLEdBQUcsb0JBQW9CLENBQUM7Ozs7UUFJbEMsZUFBVSxHQUFvRSxPQUFPLENBQUM7Ozs7UUFZdEYsV0FBTSxHQUFHLEVBQUUsQ0FBQzs7Ozs7O1FBTVosYUFBUSxHQUFHLElBQUksQ0FBQzs7OztRQUloQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBUWpCLG1CQUFjLEdBQUcsaUJBQWlCLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOzs7O1FBUW5FLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBWSxDQUFDO1FBRTNCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVaLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFM0Msc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUErQixJQUFJLENBQUM7UUFHNUQsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFLRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFnQjtRQUN4QixJQUFJLENBQUMsS0FBSyxJ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QUVyRCx5Q0FBK0M7Ozs7O0lBQy9DLHdDQUE4RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEZpbGVJdGVtIH0gZnJvbSAnLi9maWxlLWl0ZW0uaW50ZXJmYWNlJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWZpbGUtdXBsb2FkZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b247IGVsc2Ugc2tlbGV0b25UZW1wbGF0ZVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj57e3RpdGxlfX08L2xhYmVsPlxuICAgICAgPGRpdiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtX19oZWxwZXItdGV4dFwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtzdWthQnV0dG9uXT1cImJ1dHRvblR5cGVcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgW2F0dHIuZm9yXT1cImZpbGVVcGxvYWRlcklkXCJcbiAgICAgICAgICBbc2l6ZV09XCJzaXplXCI+XG4gICAgICAgICAge3tidXR0b25UZXh0fX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNmaWxlSW5wdXRcbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgY2xhc3M9XCJmaWxlLWlucHV0XCJcbiAgICAgICAgICBbYWNjZXB0XT1cImFjY2VwdFwiXG4gICAgICAgICAgW2lkXT1cImZpbGVVcGxvYWRlcklkXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlc0FkZGVkKClcIi8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGVJdGVtIG9mIGZpbGVzXCI+XG4gICAgICAgICAgICA8c3VrYS1maWxlIFtmaWxlSXRlbV09XCJmaWxlSXRlbVwiIChyZW1vdmUpPVwicmVtb3ZlRmlsZShmaWxlSXRlbSlcIj48L3N1a2EtZmlsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWxlSXRlbS5pbnZhbGlkXCIgY2xhc3M9XCJmb3JtLXJlcXVpcmVtZW50XCI+XG4gICAgICAgICAgICAgIHt7ZmlsZUl0ZW0uaW52YWxpZFRleHR9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNza2VsZXRvblRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbl9fdGV4dFwiIHN0eWxlPVwid2lkdGg6IDIyNXB4XCI+PC9kaXY+XG4gICAgICA8YnV0dG9uIHN1a2FCdXR0b24gc2tlbGV0b249XCJ0cnVlXCI+PC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogRmlsZVVwbG9hZGVyLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZGVyIHtcbiAgLyoqXG4gICAqIENvdW50ZXIgdXNlZCB0byBjcmVhdGUgdW5pcXVlIGlkcyBmb3IgZmlsZS11cGxvYWRlciBjb21wb25lbnRzXG4gICAqL1xuICBzdGF0aWMgZmlsZVVwbG9hZGVyQ291bnQgPSAwO1xuICAvKipcbiAgICogQWNjZXNzaWJsZSB0ZXh0IGZvciB0aGUgYnV0dG9uIHRoYXQgb3BlbnMgdGhlIHVwbG9hZCB3aW5kb3cuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBgRklMRV9VUExPQURFUi5PUEVOYCB2YWx1ZSBmcm9tIHRoZSBpMThuIHNlcnZpY2VcbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQgPSAnQWdyZWdhciBhcmNoaXZvKHMpJztcbiAgLyoqXG4gICAqIFR5cGUgc2V0IGZvciBidXR0b25cbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblR5cGU6ICdwcmltYXJ5JyB8ICdiYXNpYycgfCAncGxhaW4nIHwgJ2Rlc3RydWN0aXZlJyB8ICdvdXRsaW5lX3doaXRlJyA9ICdiYXNpYyc7XG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgdGl0bGVcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0eXBlcyBvZiBmaWxlcyB0aGF0IHRoZSBpbnB1dCBzaG91bGQgYmUgYWJsZSB0byByZWNlaXZlXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQgPSBbXTtcbiAgLyoqXG4gICAqIFNldCB0byBgZmFsc2VgIHRvIHRlbGwgdGhlIGNvbXBvbmVudCB0byBvbmx5IGFjY2VwdCBhIHNpbmdsZSBmaWxlIG9uIHVwbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBBY2NlcHRzIG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIGZpbGUgdXBsb2FkZXIuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgc2l6ZTogJ3NtJyB8ICdub3JtYWwnO1xuICAvKipcbiAgICogUHJvdmlkZXMgYSB1bmlxdWUgaWQgZm9yIHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gbm9kZVxuICAgKi9cbiAgQElucHV0KCkgZmlsZVVwbG9hZGVySWQgPSBgZmlsZS11cGxvYWRlci0ke0ZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudH1gO1xuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gbm9kZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0Jywge3N0YXRpYzogZmFsc2V9KSBmaWxlSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYmUgdXBsb2FkZWRcbiAgICovXG4gIEBJbnB1dCgpIGZpbGVzID0gbmV3IFNldDxGaWxlSXRlbT4oKTtcblxuICBAT3V0cHV0KCkgZmlsZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtdXBsb2FkZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByb3RlY3RlZCBvbkNoYW5nZUNhbGxiYWNrOiAoXzogU2V0PEZpbGVJdGVtPikgPT4gdm9pZCA9IG5vb3A7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgRmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSB0byBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgdG8gYG5nTW9kZWxgXG4gICAqL1xuICBnZXQgdmFsdWUoKTogU2V0PEZpbGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXM7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodiAhPT0gdGhpcy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodik7XG4gICAgfVxuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIHRoZSBpbmplY3RlZCBgdmFsdWVgLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsZXNBZGRlZCgpIHtcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXM7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmZpbGVzLmNsZWFyKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVJdGVtOiBGaWxlSXRlbSA9IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogJ2VkaXQnLFxuICAgICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgaW52YWxpZFRleHQ6ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsZXMuYWRkKGZpbGVJdGVtKTtcbiAgICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5maWxlcztcbiAgfVxuXG4gIHJlbW92ZUZpbGUoZmlsZUl0ZW0pIHtcbiAgICB0aGlzLmZpbGVzLmRlbGV0ZShmaWxlSXRlbSk7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGluamVjdGVkIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHRvdWNoIHVzZSBvZiB0aGUgYEZpbGVVcGxvYWRlcmAuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxufVxuIl19