ngx-cropperjs-wrapper
Version:
This angular library is a wrapper of Javascript image cropper
325 lines (324 loc) • 35 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import Cropper from 'cropperjs';
/**
* @record
*/
export function CropperOutputOptions() { }
/** @type {?} */
CropperOutputOptions.prototype.mimeType;
/** @type {?} */
CropperOutputOptions.prototype.qualityArgument;
/**
* @record
*/
export function CropperOptions() { }
/** @type {?} */
CropperOptions.prototype.minCropWidth;
/** @type {?} */
CropperOptions.prototype.minCropHeight;
/** @type {?} */
CropperOptions.prototype.outputOptions;
export class CropperComponent {
constructor() {
this.crop = new EventEmitter();
this.cropMove = new EventEmitter();
this.cropStart = new EventEmitter();
this.cropEnd = new EventEmitter();
this.ready = new EventEmitter();
this.zoom = new EventEmitter();
this.init = new EventEmitter();
this.fail = new EventEmitter();
this.fileChange = new EventEmitter();
this.options = /** @type {?} */ ({});
this.data = /** @type {?} */ ({});
this.propagateChange = (value) => value;
}
/**
* @return {?}
*/
get imageFile() {
return this.originalFile;
}
/**
* @param {?} value
* @return {?}
*/
set imageFile(value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
if (['image/gif', 'image/jpeg', 'image/png'].indexOf(value.type) === -1) {
this.fail.emit(new Error('Invalid input file type'));
return;
}
/** @type {?} */
const reader = new FileReader();
reader.onload = () => {
this.dataUrl = reader.result;
};
this.originalFile = value;
reader.readAsDataURL(this.originalFile);
}
/**
* @param {?} value
* @return {?}
*/
set imageUrl(value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
this.dataUrl = value;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.data = value;
if (this.data && this.cropper) {
this.cropper.setData(this.data);
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* @return {?}
*/
registerOnTouched() { }
/**
* @return {?}
*/
ngOnDestroy() {
this.destroyCropperIfExists();
}
/**
* @param {?} event
* @return {?}
*/
onImageLoad(event) {
/** @type {?} */
const img = /** @type {?} */ (event.target);
this.destroyCropperIfExists();
if ((this.options.minCropWidth && img.naturalWidth < this.options.minCropWidth)
|| (this.options.minCropHeight && img.naturalHeight < this.options.minCropHeight)) {
delete this.dataUrl;
this.fail.emit(new Error('Input image is too small'));
return;
}
this.isReady = false;
this.cropper = new Cropper(img, Object.assign({
crop: this.onCrop.bind(this),
cropmove: this.onCropMove.bind(this),
cropstart: this.onCropStart.bind(this),
cropend: this.onCropEnd.bind(this),
ready: this.onReady.bind(this),
zoom: this.onZoom.bind(this),
}, this.options));
this.init.emit(this.cropper);
}
/**
* @param {?} event
* @return {?}
*/
onCrop(event) {
if (this.options.viewMode !== 0) {
this.correctCropArea();
}
if (this.isReady) {
this.update();
}
this.crop.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropMove(event) {
if (this.options.viewMode === 0) {
this.correctCropArea();
}
this.update();
this.cropMove.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropStart(event) {
this.update();
this.cropStart.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropEnd(event) {
this.correctCropArea();
this.updateFile();
this.update();
this.cropEnd.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onReady(event) {
if (this.data) {
this.cropper.setData(this.data);
this.correctCropArea();
}
else {
this.correctCropArea();
this.update();
}
this.isReady = true;
this.ready.emit(event);
this.updateFile();
}
/**
* @param {?} event
* @return {?}
*/
onZoom(event) {
this.update();
this.zoom.emit(event);
}
/**
* @return {?}
*/
updateFile() {
/** @type {?} */
let name = 'cropped_file';
if (typeof this.dataUrl === 'string') {
/** @type {?} */
const urlParams = this.dataUrl.split('/');
name = urlParams[urlParams.length - 1];
}
/** @type {?} */
const mimeType = (this.options.outputOptions && this.options.outputOptions.mimeType) || 'image/png';
/** @type {?} */
const qualityArgument = (this.options.outputOptions && this.options.outputOptions.qualityArgument) || 0.9;
this.cropper.getCroppedCanvas().toBlob((blob) => {
blob.lastModifiedDate = new Date();
blob.name = this.originalFile ? this.originalFile.name : name;
this.fileChange.emit(blob);
}, mimeType, qualityArgument);
}
/**
* @return {?}
*/
correctCropArea() {
/** @type {?} */
const data = this.cropper.getData();
if (data.height < this.options.minCropHeight || data.width < this.options.minCropWidth) {
data.width = Math.max(data.width, this.options.minCropWidth || 0);
data.height = Math.max(data.height, this.options.minCropHeight || 0);
this.cropper.setData(data);
}
}
/**
* @return {?}
*/
update() {
this.data = this.cropper.getData();
this.propagateChange(this.data);
}
/**
* @return {?}
*/
destroyCropperIfExists() {
if (!this.cropper) {
return;
}
this.cropper.destroy();
delete this.cropper;
}
}
CropperComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-cropper',
template: `<div class="cropper-component" *ngIf="dataUrl">
<img #image alt="image" [src]="dataUrl" (load)="onImageLoad($event)"/>
</div>
`,
styles: [`.cropper-component img{max-width:100%;max-height:100%}::ng-deep{/*!
* Cropper.js v1.4.0
* https://fengyuanchen.github.io/cropperjs
*
* Copyright 2015-present Chen Fengyuan
* Released under the MIT license
*
* Date: 2018-06-01T15:18:09.891Z
*/}::ng-deep .cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}::ng-deep .cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}::ng-deep .cropper-canvas,::ng-deep .cropper-crop-box,::ng-deep .cropper-drag-box,::ng-deep .cropper-modal,::ng-deep .cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .cropper-canvas,::ng-deep .cropper-wrap-box{overflow:hidden}::ng-deep .cropper-drag-box{background-color:#fff;opacity:0}::ng-deep .cropper-modal{background-color:#000;opacity:.5}::ng-deep .cropper-view-box{display:block;height:100%;outline:#eee solid 1px;overflow:hidden;width:100%}::ng-deep .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}::ng-deep .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}::ng-deep .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}::ng-deep .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}::ng-deep .cropper-center:after,::ng-deep .cropper-center:before{background-color:#eee;content:' ';display:block;position:absolute}::ng-deep .cropper-center:before{height:1px;left:-3px;top:0;width:7px}::ng-deep .cropper-center:after{height:7px;left:0;top:-3px;width:1px}::ng-deep .cropper-face,::ng-deep .cropper-line,::ng-deep .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}::ng-deep .cropper-face{background-color:#fff;left:0;top:0}::ng-deep .cropper-line{background-color:#39f}::ng-deep .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}::ng-deep .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}::ng-deep .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}::ng-deep .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}::ng-deep .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}::ng-deep .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}::ng-deep .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}::ng-deep .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}::ng-deep .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}::ng-deep .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}::ng-deep .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}::ng-deep .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}::ng-deep .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px} (min-width:768px){::ng-deep .cropper-point.point-se{height:15px;width:15px}} (min-width:992px){::ng-deep .cropper-point.point-se{height:10px;width:10px}} (min-width:1200px){::ng-deep .cropper-point.point-se{height:5px;opacity:.75;width:5px}}::ng-deep .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}::ng-deep .cropper-invisible{opacity:0}::ng-deep .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}::ng-deep .cropper-hide{display:block;height:0;position:absolute;width:0}::ng-deep .cropper-hidden{display:none!important}::ng-deep .cropper-move{cursor:move}::ng-deep .cropper-crop{cursor:crosshair}::ng-deep .cropper-disabled .cropper-drag-box,::ng-deep .cropper-disabled .cropper-face,::ng-deep .cropper-disabled .cropper-line,::ng-deep .cropper-disabled .cropper-point{cursor:not-allowed}::ng-deep .cropper-line,::ng-deep .cropper-point,::ng-deep .cropper-point.point-se::before{background-color:#eee}`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CropperComponent),
multi: true
}
],
},] },
];
CropperComponent.propDecorators = {
crop: [{ type: Output }],
cropMove: [{ type: Output }],
cropStart: [{ type: Output }],
cropEnd: [{ type: Output }],
ready: [{ type: Output }],
zoom: [{ type: Output }],
init: [{ type: Output }],
fail: [{ type: Output }],
fileChange: [{ type: Output }],
options: [{ type: Input }],
imageFile: [{ type: Input, args: ['imageFile',] }],
imageUrl: [{ type: Input, args: ['imageUrl',] }]
};
if (false) {
/** @type {?} */
CropperComponent.prototype.crop;
/** @type {?} */
CropperComponent.prototype.cropMove;
/** @type {?} */
CropperComponent.prototype.cropStart;
/** @type {?} */
CropperComponent.prototype.cropEnd;
/** @type {?} */
CropperComponent.prototype.ready;
/** @type {?} */
CropperComponent.prototype.zoom;
/** @type {?} */
CropperComponent.prototype.init;
/** @type {?} */
CropperComponent.prototype.fail;
/** @type {?} */
CropperComponent.prototype.fileChange;
/** @type {?} */
CropperComponent.prototype.options;
/** @type {?} */
CropperComponent.prototype.dataUrl;
/** @type {?} */
CropperComponent.prototype.cropper;
/** @type {?} */
CropperComponent.prototype.isReady;
/** @type {?} */
CropperComponent.prototype.originalFile;
/** @type {?} */
CropperComponent.prototype.data;
/** @type {?} */
CropperComponent.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvIiwic291cmNlcyI6WyJsaWIvY3JvcHBlci9jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sT0FBTyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDaEMsTUFBTTs7b0JBRWEsSUFBSSxZQUFZLEVBQWU7d0JBQzNCLElBQUksWUFBWSxFQUFlO3lCQUM5QixJQUFJLFlBQVksRUFBZTt1QkFDakMsSUFBSSxZQUFZLEVBQWU7cUJBQ2pDLElBQUksWUFBWSxFQUFlO29CQUNoQyxJQUFJLFlBQVksRUFBZTtvQkFDL0IsSUFBSSxZQUFZLEVBQVc7b0JBQzNCLElBQUksWUFBWSxFQUFTOzBCQUNuQixJQUFJLFlBQVksRUFBUTt5Q0FFNUIsRUFBb0I7c0NBMkN4QixFQUE0QjsrQkFFekIsQ0FBQyxLQUE2QixFQUFFLEVBQUUsQ0FBQyxLQUFLOzs7OztJQTNDMUQsSUFBSSxTQUFTO1FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7S0FDMUI7Ozs7O0lBRUQsSUFBd0IsU0FBUyxDQUFDLEtBQVc7UUFDM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNYLE1BQU0sQ0FBQztTQUNSO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FB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QUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7OztJQUcxQixzQkFBc0I7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQixNQUFNLENBQUM7U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7O1lBek52QixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRTs7O0NBR1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUM7Ozs7Ozs7O3NpSUFRMmhJLENBQUM7Z0JBQ3JpSSxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDL0MsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7YUFDRjs7O21CQUdFLE1BQU07dUJBQ04sTUFBTTt3QkFDTixNQUFNO3NCQUNOLE1BQU07b0JBQ04sTUFBTTttQkFDTixNQUFNO21CQUNOLE1BQU07bUJBQ04sTUFBTTt5QkFDTixNQUFNO3NCQUVOLEtBQUs7d0JBTUwsS0FBSyxTQUFDLFdBQVc7dUJBc0JqQixLQUFLLFNBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCBDcm9wcGVyIGZyb20gJ2Nyb3BwZXJqcyc7XG5pbXBvcnQgeyBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcHBlck91dHB1dE9wdGlvbnMge1xuICBtaW1lVHlwZTogc3RyaW5nO1xuICBxdWFsaXR5QXJndW1lbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9wcGVyT3B0aW9ucyBleHRlbmRzIENyb3BwZXIuT3B0aW9ucyB7XG4gIG1pbkNyb3BXaWR0aDogbnVtYmVyO1xuICBtaW5Dcm9wSGVpZ2h0OiBudW1iZXI7XG4gIG91dHB1dE9wdGlvbnM6IENyb3BwZXJPdXRwdXRPcHRpb25zO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3JvcHBlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNyb3BwZXItY29tcG9uZW50XCIgKm5nSWY9XCJkYXRhVXJsXCI+XG4gIDxpbWcgI2ltYWdlIGFsdD1cImltYWdlXCIgW3NyY109XCJkYXRhVXJsXCIgKGxvYWQpPVwib25JbWFnZUxvYWQoJGV2ZW50KVwiLz5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYC5jcm9wcGVyLWNvbXBvbmVudCBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfTo6bmctZGVlcHsvKiFcbiAqIENyb3BwZXIuanMgdjEuNC4wXG4gKiBodHRwczovL2Zlbmd5dWFuY2hlbi5naXRodWIuaW8vY3JvcHBlcmpzXG4gKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBDaGVuIEZlbmd5dWFuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTA2LTAxVDE1OjE4OjA5Ljg5MVpcbiAqL306Om5nLWRlZXAgLmNyb3BwZXItY29udGFpbmVye2RpcmVjdGlvbjpsdHI7Zm9udC1zaXplOjA7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3VjaC1hY3Rpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9OjpuZy1kZWVwIC5jcm9wcGVyLWNvbnRhaW5lciBpbWd7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtpbWFnZS1vcmllbnRhdGlvbjowZGVnO21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWluLXdpZHRoOjAhaW1wb3J0YW50O3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItY3JvcC1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLWRyYWctYm94LDo6bmctZGVlcCAuY3JvcHBlci1tb2RhbCw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7Ym90dG9tOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7b3ZlcmZsb3c6aGlkZGVufTo6bmctZGVlcCAuY3JvcHBlci1kcmFnLWJveHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7b3BhY2l0eTowfTo6bmctZGVlcCAuY3JvcHBlci1tb2RhbHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7b3BhY2l0eTouNX06Om5nLWRlZXAgLmNyb3BwZXItdmlldy1ib3h7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvdXRsaW5lOiNlZWUgc29saWQgMXB4O292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWR7Ym9yZGVyOjAgZGFzaGVkICNlZWU7ZGlzcGxheTpibG9jaztvcGFjaXR5Oi41O3Bvc2l0aW9uOmFic29sdXRlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLWh7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXRvcC13aWR0aDoxcHg7aGVpZ2h0OjMzLjMzMzMzJTtsZWZ0OjA7dG9wOjMzLjMzMzMzJTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLXZ7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4O2JvcmRlci1yaWdodC13aWR0aDoxcHg7aGVpZ2h0OjEwMCU7bGVmdDozMy4zMzMzMyU7dG9wOjA7d2lkdGg6MzMuMzMzMzMlfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXJ7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtsZWZ0OjUwJTtvcGFjaXR5Oi43NTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3dpZHRoOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlciw6Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Y29udGVudDonICc7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZX06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtoZWlnaHQ6MXB4O2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo3cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlcntoZWlnaHQ6N3B4O2xlZnQ6MDt0b3A6LTNweDt3aWR0aDoxcHh9OjpuZy1kZWVwIC5jcm9wcGVyLWZhY2UsOjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3BhY2l0eTouMTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1mYWNle2JhY2tncm91bmQtY29sb3I6I2ZmZjtsZWZ0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmV7YmFja2dyb3VuZC1jb2xvcjojMzlmfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtZXtjdXJzb3I6ZXctcmVzaXplO3JpZ2h0Oi0zcHg7dG9wOjA7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtbntjdXJzb3I6bnMtcmVzaXplO2hlaWdodDo1cHg7bGVmdDowO3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtd3tjdXJzb3I6ZXctcmVzaXplO2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1ze2JvdHRvbTotM3B4O2N1cnNvcjpucy1yZXNpemU7aGVpZ2h0OjVweDtsZWZ0OjB9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2JhY2tncm91bmQtY29sb3I6IzM5ZjtoZWlnaHQ6NXB4O29wYWNpdHk6Ljc1O3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtZXtjdXJzb3I6ZXctcmVzaXplO21hcmdpbi10b3A6LTNweDtyaWdodDotM3B4O3RvcDo1MCV9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW57Y3Vyc29yOm5zLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC13e2N1cnNvcjpldy1yZXNpemU7bGVmdDotM3B4O21hcmdpbi10b3A6LTNweDt0b3A6NTAlfTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ze2JvdHRvbTotM3B4O2N1cnNvcjpzLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1uZXtjdXJzb3I6bmVzdy1yZXNpemU7cmlnaHQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbnd7Y3Vyc29yOm53c2UtcmVzaXplO2xlZnQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc3d7Ym90dG9tOi0zcHg7Y3Vyc29yOm5lc3ctcmVzaXplO2xlZnQ6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7Ym90dG9tOi0zcHg7Y3Vyc29yOm53c2UtcmVzaXplO2hlaWdodDoyMHB4O29wYWNpdHk6MTtyaWdodDotM3B4O3dpZHRoOjIwcHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpezo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtoZWlnaHQ6MTVweDt3aWR0aDoxNXB4fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDo1cHg7b3BhY2l0eTouNzU7d2lkdGg6NXB4fX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzM5Zjtib3R0b206LTUwJTtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO2hlaWdodDoyMDAlO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTAlO3dpZHRoOjIwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWludmlzaWJsZXtvcGFjaXR5OjB9OjpuZy1kZWVwIC5jcm9wcGVyLWJne2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQUJsQk1WRVhNek16Ly8vL1RqUlYyQUFBQUNYQklXWE1BQUFyckFBQUs2d0dDaXcxYUFBQUFISFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JHYVhKbGQyOXlhM01nUTFNMjZMeXlqQUFBQUJGSlJFRlVDSmxqK00vQWdCVmhGLzBQQUg2L0QvSGtEeE9HQUFBQUFFbEZUa1N1UW1DQyl9OjpuZy1kZWVwIC5jcm9wcGVyLWhpZGV7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowfTo6bmctZGVlcCAuY3JvcHBlci1oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudH06Om5nLWRlZXAgLmNyb3BwZXItbW92ZXtjdXJzb3I6bW92ZX06Om5nLWRlZXAgLmNyb3BwZXItY3JvcHtjdXJzb3I6Y3Jvc3NoYWlyfTo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1kcmFnLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItZmFjZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItcG9pbnR7Y3Vyc29yOm5vdC1hbGxvd2VkfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1wb2ludCw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9YF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3JvcHBlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBPdXRwdXQoKSBjcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcm9wRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHpvb20gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3JvcHBlcj4oKTtcbiAgQE91dHB1dCgpIGZhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcblxuICBASW5wdXQoKSBvcHRpb25zID0ge30gYXMgQ3JvcHBlck9wdGlvbnM7XG5cbiAgZ2V0IGltYWdlRmlsZSgpOiBGaWxlIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEZpbGU7XG4gIH1cblxuICBASW5wdXQoJ2ltYWdlRmlsZScpIHNldCBpbWFnZUZpbGUodmFsdWU6IEZpbGUpIHtcbiAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ2ltYWdlL2dpZicsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZyddLmluZGV4T2YodmFsdWUudHlwZSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgZmlsZSB0eXBlJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuZGF0YVVybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgfTtcblxuICAgIHRoaXMub3JpZ2luYWxGaWxlID0gdmFsdWU7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwodGhpcy5vcmlnaW5hbEZpbGUpO1xuICB9XG5cbiAgQElucHV0KCdpbWFnZVVybCcpIHNldCBpbWFnZVVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFVcmwgPSB2YWx1ZTtcbiAgfVxuXG4gIGRhdGFVcmw6IHN0cmluZ3xTYWZlVXJsO1xuICBwcml2YXRlIGNyb3BwZXI6IENyb3BwZXI7XG4gIHByaXZhdGUgaXNSZWFkeTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvcmlnaW5hbEZpbGU6IEZpbGU7XG4gIHByaXZhdGUgZGF0YSA9IHt9IGFzIENyb3BwZXIuU2V0RGF0YU9wdGlvbnM7XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSA9PiB2YWx1ZTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuY3JvcHBlcikge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcbiAgfVxuXG4gIG9uSW1hZ2VMb2FkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGltZyA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoKHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGggJiYgaW1nLm5hdHVyYWxXaWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpXG4gICAgICB8fCAodGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgJiYgaW1nLm5hdHVyYWxIZWlnaHQgPCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0lucHV0IGltYWdlIGlzIHRvbyBzbWFsbCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmNyb3BwZXIgPSBuZXcgQ3JvcHBlcihpbWcsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY3JvcDogdGhpcy5vbkNyb3AuYmluZCh0aGlzKSxcbiAgICAgIGNyb3Btb3ZlOiB0aGlzLm9uQ3JvcE1vdmUuYmluZCh0aGlzKSxcbiAgICAgIGNyb3BzdGFydDogdGhpcy5vbkNyb3BTdGFydC5iaW5kKHRoaXMpLFxuICAgICAgY3JvcGVuZDogdGhpcy5vbkNyb3BFbmQuYmluZCh0aGlzKSxcbiAgICAgIHJlYWR5OiB0aGlzLm9uUmVhZHkuYmluZCh0aGlzKSxcbiAgICAgIHpvb206IHRoaXMub25ab29tLmJpbmQodGhpcyksXG4gICAgfSwgdGhpcy5vcHRpb25zKSk7XG5cbiAgICB0aGlzLmluaXQuZW1pdCh0aGlzLmNyb3BwZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3AoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52aWV3TW9kZSAhPT0gMCkge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1JlYWR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wTW92ZShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jcm9wTW92ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wU3RhcnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BTdGFydC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wRW5kKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgdGhpcy51cGRhdGVGaWxlKCk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVhZHkoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZWFkeS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZUZpbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25ab29tKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy56b29tLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlKCkge1xuICAgIGxldCBuYW1lID0gJ2Nyb3BwZWRfZmlsZSc7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZGF0YVVybC5zcGxpdCgnLycpO1xuICAgICAgbmFtZSA9IHVybFBhcmFtc1t1cmxQYXJhbXMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG5cbiAgICBjb25zdCBtaW1lVHlwZSA9ICh0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucy5taW1lVHlwZSkgfHwgJ2ltYWdlL3BuZyc7XG4gICAgY29uc3QgcXVhbGl0eUFyZ3VtZW50ID0gKHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zLnF1YWxpdHlBcmd1bWVudCkgfHwgMC45O1xuXG4gICAgdGhpcy5jcm9wcGVyLmdldENyb3BwZWRDYW52YXMoKS50b0Jsb2IoKGJsb2I6IGFueSkgPT4ge1xuICAgICAgYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGJsb2IubmFtZSA9IHRoaXMub3JpZ2luYWxGaWxlID8gdGhpcy5vcmlnaW5hbEZpbGUubmFtZSA6IG5hbWU7XG4gICAgICB0aGlzLmZpbGVDaGFuZ2UuZW1pdChibG9iKTtcbiAgICB9LCBtaW1lVHlwZSwgcXVhbGl0eUFyZ3VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdENyb3BBcmVhKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuXG4gICAgaWYgKGRhdGEuaGVpZ2h0IDwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgZGF0YS53aWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpIHtcbiAgICAgIGRhdGEud2lkdGggPSBNYXRoLm1heChkYXRhLndpZHRoLCB0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoIHx8IDApO1xuICAgICAgZGF0YS5oZWlnaHQgPSBNYXRoLm1heChkYXRhLmhlaWdodCwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgMCk7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSgpIHtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKSB7XG4gICAgaWYgKCF0aGlzLmNyb3BwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNyb3BwZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmNyb3BwZXI7XG4gIH1cblxufVxuIl19