403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/ui/avatar-editor/dist/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/js/ui/avatar-editor/dist/main.avatar-editor.bundle.js
this.BX = this.BX || {};
this.BX.UI = this.BX.UI || {};
(function (exports,ui_fonts_opensans,ui_designTokens,ui_notification,ui_entitySelector,ui_dialogs_messagebox,main_loader,main_core,main_core_events,main_popup,ui_buttons,ui_sidepanel_layout) {
	'use strict';

	let _ = t => t,
	  _t,
	  _t2,
	  _t3,
	  _t4;
	var _parent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("parent");
	class DefaultTab extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    this.cache = new main_core.Cache.MemoryCache();
	    Object.defineProperty(this, _parent, {
	      writable: true,
	      value: void 0
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	  }
	  getPriority() {
	    return this.constructor.priority;
	  }
	  setParentTab(tab) {
	    babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent] = tab;
	  }
	  getHeaderContainer() {
	    return this.cache.remember('headerContainer', () => {
	      const id = this.constructor.code;
	      const title = this.getHeader();
	      if (title === null) {
	        return main_core.Tag.render(_t || (_t = _`<span style="display: none;" data-bx-role="tab-header"  data-bx-state="hidden" data-bx-name="${0}"></span>`), id);
	      }
	      return main_core.Tag.render(_t2 || (_t2 = _`<span class="ui-avatar-editor__tab-button-item" data-bx-role="tab-header" data-bx-state="visible" data-bx-name="${0}">${0}</span>`), id, title);
	    });
	  }
	  getHeader() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent] !== null) return this.constructor.code.toUpperCase();
	    return null;
	  }
	  getBodyContainer() {
	    return this.cache.remember('bodyContainer', () => {
	      const id = this.constructor.code;
	      return main_core.Tag.render(_t3 || (_t3 = _`
				<div class="ui-avatar-editor__content-block ui-avatar-editor__${0}-block" data-bx-role="tab-body" data-bx-name="${0}">${0}</div>`), id, id, this.getBody());
	    });
	  }
	  getBody() {
	    const id = this.constructor.code;
	    return this.cache.remember('body', () => {
	      return main_core.Tag.render(_t4 || (_t4 = _`
			<div>
				${0}
			</div>`), id.toUpperCase());
	    });
	  }
	  inactivate() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer().removeAttribute('data-bx-active');
	      main_core.Dom.removeClass(babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer(), 'ui-avatar-editor__tab-button-active');
	    }
	    this.getHeaderContainer().removeAttribute('data-bx-active');
	    main_core.Dom.removeClass(this.getHeaderContainer(), 'ui-avatar-editor__tab-button-active');
	    this.getBodyContainer().removeAttribute('data-bx-active');
	    this.emit('onInactive');
	    return this;
	  }
	  activate() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer().setAttribute('data-bx-active', 'Y');
	      main_core.Dom.addClass(babelHelpers.classPrivateFieldLooseBase(this, _parent)[_parent].getHeaderContainer(), 'ui-avatar-editor__tab-button-active');
	    }
	    this.getHeaderContainer().setAttribute('data-bx-active', 'Y');
	    main_core.Dom.addClass(this.getHeaderContainer(), 'ui-avatar-editor__tab-button-active');
	    this.getBodyContainer().setAttribute('data-bx-active', 'Y');
	    this.emit('onActive');
	    return this;
	  }
	  showError({
	    message,
	    code
	  }) {
	    const errorContainer = this.getBody().querySelector('[data-bx-role="error-container"]');
	    if (errorContainer) {
	      errorContainer.innerText = message || code;
	    }
	    main_core.Dom.addClass(this.getBodyContainer(), 'ui-avatar-editor--error');
	  }
	  static isAvailable() {
	    return true;
	  }
	  static get code() {
	    return 'default';
	  }
	}
	DefaultTab.priority = 1;

	let _$1 = t => t,
	  _t$1;
	var _isCameraEnabled = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isCameraEnabled");
	class CameraTab extends DefaultTab {
	  getHeader() {
	    return null;
	  }
	  getBody() {
	    return this.cache.remember('body', () => {
	      const res = main_core.Tag.render(_t$1 || (_t$1 = _$1`
				<div>
					<div class="ui-avatar-editor__camera-block-image">
						<div class="ui-avatar-editor__btn-back" data-bx-role="button-back"></div>
						<div class="ui-avatar-editor__user-loader-item">
							<div class="ui-avatar-editor__loader">
								<svg class="ui-avatar-editor__circular" viewBox="25 25 50 50">
									<circle class="ui-avatar-editor__path" cx="50" cy="50" r="20" fill="none" stroke-width="1" stroke-miterlimit="10"/>
								</svg>
							</div>
						</div>
						<div class="ui-avatar-editor__error">
							<span>
								${0}
							</span>
							<span data-bx-role="tab-camera-error"></span>
						</div>
						<div class="ui-avatar-editor__camera-block-image-inner">
							<video autoplay></video>
						</div>
					</div>
					<div class="ui-avatar-editor__button-layout" data-bx-role="camera-button">
						<div class="ui-avatar-editor__button">
							<span class="ui-avatar-editor__button-icon"></span>
						</div>
					</div>
				</div>
			`), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR'));
	      const video = res.querySelector('VIDEO');
	      video.addEventListener("playing", event => {
	        const visibleWidth = res.clientWidth,
	          visibleHeight = res.clientHeight,
	          w = video.clientWidth,
	          h = video.clientHeight,
	          scale = Math.max(w > 0 ? visibleWidth / w : 1, h > 0 ? visibleHeight / h : 1),
	          left = (w * scale - w) / 2 + (visibleWidth - w * scale) / 2,
	          top = (h * scale - h) / 2 + (visibleHeight - h * scale) / 2;
	        main_core.Dom.adjust(video.parentNode, {
	          style: {
	            width: w + 'px',
	            height: h + 'px',
	            transform: 'translate(' + Math.ceil(left) + 'px, ' + Math.ceil(top) + 'px) scale(' + scale + ', ' + scale + ')'
	          }
	        });
	      });
	      res.querySelector('[data-bx-role="camera-button"]').onclick = () => {
	        this.emit('onSetFile', video);
	      };
	      res.querySelector('[data-bx-role="button-back"]').onclick = () => {
	        this.emit('onClickBack');
	      };
	      return res;
	    });
	  }
	  inactivate() {
	    this.stopStreaming();
	    return super.inactivate();
	  }
	  activate() {
	    this.startStreaming();
	    return super.activate();
	  }
	  startStreaming() {
	    const video = this.getBody().querySelector('VIDEO');
	    video.setAttribute("active", "Y");
	    navigator.mediaDevices.getUserMedia({
	      audio: false,
	      video: {
	        width: {
	          max: 1024,
	          min: 640,
	          ideal: 1024
	        },
	        height: {
	          max: 860,
	          min: 480,
	          ideal: 860
	        }
	      }
	    }).then(function (stream) {
	      if (video.hasAttribute("active")) {
	        video.srcObject = stream;
	      } else {
	        stream.getTracks()[0].stop();
	      }
	    }).catch(error => {
	      this.getBody().querySelector('[data-bx-role="tab-camera-error"]').innerHTML = main_core.Text.encode(error);
	    });
	  }
	  stopStreaming() {
	    const video = this.getBody().querySelector('VIDEO');
	    video.removeAttribute("active");
	    video.pause();
	    video.src = "";
	    if (video.srcObject) {
	      video.srcObject.getTracks()[0].stop();
	    }
	  }
	  static check() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] === null) {
	      if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
	        navigator.mediaDevices.enumerateDevices().then(devices => {
	          babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = Array.from(devices).filter(function (deviceInfo) {
	            return deviceInfo.kind === 'videoinput';
	          }).length > 0;
	        }).catch(() => {
	          babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = false;
	        });
	      } else {
	        babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled] = false;
	      }
	    }
	  }
	  static isAvailable() {
	    this.check();
	    return babelHelpers.classPrivateFieldLooseBase(this, _isCameraEnabled)[_isCameraEnabled];
	  }
	  static get code() {
	    return 'camera';
	  }
	}
	CameraTab.priority = 2;
	Object.defineProperty(CameraTab, _isCameraEnabled, {
	  writable: true,
	  value: null
	});

	var _ajaxRepo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ajaxRepo");
	class Backend {
	  static saveMask({
	    id,
	    title,
	    accessCode
	  }, file) {
	    if (main_core.Loc.getMessage('USER_ID') <= 0) {
	      return;
	    }
	    const formObj = new FormData();
	    formObj.append('id', id);
	    formObj.append('title', title);
	    if (accessCode.length > 0) {
	      Array.from(accessCode).forEach((accessCode, index) => {
	        formObj.append('accessCode[' + index + '][0]', accessCode[0]);
	        formObj.append('accessCode[' + index + '][1]', accessCode[1]);
	      });
	    } else {
	      formObj.append('accessCode[]', '');
	    }
	    if (file instanceof Blob) {
	      formObj.append('file[changed]', 'Y');
	      formObj.append('file', file, file['name']);
	    } else {
	      formObj.append('file[changed]', 'N');
	    }
	    return main_core.ajax.runAction('ui.avatar.mask.save', {
	      data: formObj,
	      analyticsLabel: {
	        ui: 'avatarMask',
	        actionType: 'edit',
	        action: 'save'
	      }
	    });
	  }
	  static getMaskList(actionName, {
	    page,
	    size
	  }) {
	    return new Promise((resolve, reject) => {
	      main_core.ajax.runAction('ui.avatar.mask.get' + actionName, {
	        data: {},
	        navigation: {
	          page: page,
	          size: size
	        },
	        analyticsLabel: {
	          ui: 'avatarMask',
	          actionType: 'read',
	          action: 'list'
	        }
	      }).then(({
	        data: {
	          groupedItems
	        }
	      }) => {
	        resolve(groupedItems);
	      }).catch(reject);
	    });
	  }
	  static getMaskInitialInfo({
	    size,
	    recentlyUsedListSize
	  }) {
	    return new Promise((resolve, reject) => {
	      if (babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo']) {
	        return resolve(babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo']);
	      }
	      main_core.ajax.runAction('ui.avatar.mask.getMaskInitialInfo', {
	        data: {
	          recentlyUsedListSize: recentlyUsedListSize
	        },
	        navigation: {
	          page: 1,
	          size: size
	        },
	        analyticsLabel: {
	          ui: 'avatarMask',
	          actionType: 'read',
	          action: 'initialInfo'
	        }
	      }).then(({
	        data: {
	          initialInfo
	        }
	      }) => {
	        babelHelpers.classPrivateFieldLooseBase(this, _ajaxRepo)[_ajaxRepo]['getMaskInitialInfo'] = initialInfo;
	        resolve(initialInfo);
	      }).catch(reject);
	    });
	  }
	  static getMaskAccessCode(itemId) {
	    return main_core.ajax.runAction('ui.avatar.mask.getMaskAccessCode', {
	      data: {
	        id: itemId
	      },
	      analyticsLabel: {
	        ui: 'avatarMask',
	        actionType: 'edit',
	        action: 'accessCode'
	      }
	    });
	  }
	  static deleteMask(itemId) {
	    return main_core.ajax.runAction('ui.avatar.mask.delete', {
	      data: {
	        id: itemId
	      },
	      analyticsLabel: {
	        ui: 'avatarMask',
	        actionType: 'edit',
	        action: 'delete'
	      }
	    });
	  }
	  static useRecently(itemId) {
	    return main_core.ajax.runAction('ui.avatar.mask.useRecently', {
	      data: {
	        id: itemId
	      },
	      analyticsLabel: {
	        ui: 'avatarMask',
	        actionType: 'read',
	        action: 'read'
	      }
	    });
	  }
	  static cleanUp() {
	    return main_core.ajax.runAction('ui.avatar.mask.cleanUp', {
	      analyticsLabel: {
	        ui: 'avatarMask',
	        actionType: 'edit',
	        action: 'cleanUp'
	      }
	    });
	  }
	}
	Object.defineProperty(Backend, _ajaxRepo, {
	  writable: true,
	  value: {}
	});

	let _$2 = t => t,
	  _t$2;
	function isImage(name, type, size) {
	  type = type ? String(type) : null;
	  size = size ? Number(size) : null;
	  name = String(name).toLowerCase();
	  let ext = name.split('.').pop();
	  if (ext === name) {
	    ext = null;
	  }
	  return (type === null || type.indexOf("image/") === 0) && (size === null || size < 20 * 1024 * 1024) && ext !== name && 'jpg,bmp,jpeg,jpe,gif,png,webp'.split(',').indexOf(ext) >= 0;
	}
	var _fileId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileId");
	var _fileAccept = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileAccept");
	class UploadTab extends DefaultTab {
	  constructor(options) {
	    super();
	    Object.defineProperty(this, _fileId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _fileAccept, {
	      writable: true,
	      value: 'image/*'
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId] = ['fileUpload_', new Date().valueOf()].join('_');
	    if (options && options.fileAccept) {
	      babelHelpers.classPrivateFieldLooseBase(this, _fileAccept)[_fileAccept] = options.fileAccept;
	    }
	  }
	  getHeader() {
	    return null;
	  }
	  getBody() {
	    return this.cache.remember('body', () => {
	      const res = main_core.Tag.render(_t$2 || (_t$2 = _$2`
			<div>
				<div class="ui-avatar-editor__btn-back" data-bx-role="button-back"></div>
				<div class="ui-avatar-editor__upload-link-container">
					<div data-bx-role="error-container" class="ui-avatar-editor__upload-error-desc"></div>
					<label for="${0}" class="ui-avatar-editor__upload-link">
						${0}
						<input type="file" id="${0}" data-bx-role="file-button" accept="${0}" />
					</label>
					<div class="ui-avatar-editor__upload-desc">
						${0}
					</div>
				</div>
				<div class="ui-avatar-editor__upload-info">
					<div class="ui-avatar-editor__upload-info-item"><!-- place for limit text --></div>
				</div>
			</div>`), babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId], main_core.Loc.getMessage('JS_AVATAR_EDITOR_PICK_UP_THE_FILE'), babelHelpers.classPrivateFieldLooseBase(this, _fileId)[_fileId], main_core.Text.encode(babelHelpers.classPrivateFieldLooseBase(this, _fileAccept)[_fileAccept]), main_core.Loc.getMessage('JS_AVATAR_EDITOR_DROP_FILES_INTO_THIS_AREA'));
	      const f = event => {
	        const {
	          target
	        } = event;
	        const fileButton = res.querySelector('[data-bx-role="file-button"]');
	        const file = Array.from(target && target.files ? target.files : fileButton.files).shift();
	        if (isImage(file.name, file.type, file.size)) {
	          this.emit('onSetFile', file);
	        }
	        main_core.Event.unbindAll(fileButton);
	        const node = fileButton.cloneNode(true, {
	          value: ""
	        });
	        main_core.Dom.adjust(node, {
	          props: {
	            value: ""
	          },
	          attrs: {}
	        });
	        node.setAttribute("new", "Y" + new Date().valueOf());
	        fileButton.parentNode.insertBefore(node, fileButton);
	        fileButton.parentNode.removeChild(fileButton);
	        main_core.Event.bind(node, "change", f);
	      };
	      main_core.Event.bind(res.querySelector('[data-bx-role="file-button"]'), 'change', f);
	      const dropZone = new BX.DD.dropFiles(res);
	      if (dropZone && dropZone.supported()) {
	        main_core_events.EventEmitter.subscribe(dropZone, 'dropFiles', (files, e) => {
	          if (e && e["dataTransfer"] && e["dataTransfer"]["items"] && e["dataTransfer"]["items"].length > 0) {
	            const fileCopy = [];
	            Array.from(e["dataTransfer"]["items"]).forEach(item => {
	              if (item["webkitGetAsEntry"] && item["getAsFile"]) {
	                let entry = item["webkitGetAsEntry"]();
	                if (entry && entry.isFile) {
	                  fileCopy.push(item["getAsFile"]());
	                }
	              }
	            });
	            if (fileCopy.length > 0) {
	              files = fileCopy;
	            }
	          }
	          f({
	            target: {
	              files: files
	            }
	          });
	        }, {
	          compatMode: true
	        });
	        main_core_events.EventEmitter.subscribe(dropZone, 'dragEnter', e => {
	          if (e && e["dataTransfer"] && e.dataTransfer.types && e.dataTransfer.items) {
	            const isFileTransfer = Array.from(e.dataTransfer.types).filter(type => {
	              return type === "Files";
	            }).length > 0;
	            if (isFileTransfer) {
	              main_core.Dom.addClass(res.parentNode, 'dnd-over');
	            }
	          }
	        }, {
	          compatMode: true
	        });
	        main_core_events.EventEmitter.subscribe(dropZone, 'dragLeave', () => {
	          main_core.Dom.removeClass(res.parentNode, 'dnd-over');
	        }, {
	          compatMode: true
	        });
	      }
	      res.querySelector('[data-bx-role="button-back"]').onclick = () => {
	        this.emit('onClickBack');
	      };
	      return res;
	    });
	  }
	  deleteError() {
	    this.getBody().querySelector('[data-bx-role="error-container"]').innerText = '';
	    main_core.Dom.removeClass(this.getBodyContainer(), 'ui-avatar-editor--error');
	  }
	  static get code() {
	    return 'upload';
	  }
	}
	UploadTab.priority = 3;

	const Options = {
	  maskSize: 400,
	  imageSize: 1024,
	  rawSrc: document.currentScript.src,
	  rawPath: null,
	  eventNamespace: 'Main.Avatar.Editor',
	  get path() {
	    if (Options.rawPath === null) {
	      const res = Options.rawSrc.split('/');
	      let buf;
	      while (buf = res.pop()) {
	        if (buf === 'dist') {
	          break;
	        }
	      }
	      Options.rawPath = new main_core.Uri(res.join('/')).getPath();
	    }
	    return Options.rawPath;
	  },
	  getCollections: () => {
	    const settings = Extension.getSettings('ui.avatar-editor');
	    return Array.from(settings['commonCollection'])[{
	      title: 'Sys',
	      items: ['001_flower.png', '002_flower.png', '003_christmas_tree256.png', '005_red_rectangle.png', '005_blue_circle.png', '004_bow_purple.png'].map(function (title) {
	        return {
	          id: title,
	          title: title,
	          thumb: [Options.path, 'badges', title].join('/').replace('//', '/'),
	          src: [Options.path, 'badges', title].join('/').replace('//', '/')
	        };
	      })
	    }];
	  }
	};

	let _$3 = t => t,
	  _t$3;
	var _instance = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("instance");
	var _data = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("data");
	var _id = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _changesCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("changesCount");
	var _getEditor = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getEditor");
	var _initAccessSelector = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("initAccessSelector");
	var _showSlider = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showSlider");
	var _subscribedToASliderEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("subscribedToASliderEvents");
	class MaskEditor extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    Object.defineProperty(this, _showSlider, {
	      value: _showSlider2
	    });
	    Object.defineProperty(this, _initAccessSelector, {
	      value: _initAccessSelector2
	    });
	    Object.defineProperty(this, _getEditor, {
	      value: _getEditor2
	    });
	    this.cache = new main_core.Cache.MemoryCache();
	    Object.defineProperty(this, _data, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _id, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _changesCount, {
	      writable: true,
	      value: 0
	    });
	    this.setEventNamespace([Options.eventNamespace, 'mask:editor'].join(':'));
	    babelHelpers.classPrivateFieldLooseBase(this, _id)[_id] = [this.getEventNamespace(), new Date().getTime()].join(':');
	  }
	  getContentContainer() {
	    return this.cache.remember('content', () => {
	      const res = main_core.Tag.render(_t$3 || (_t$3 = _$3`<div class="ui-avatar-editor--scope">
						<ol class="ui-avatar-editor-list">
							<li class="ui-avatar-editor-list-item">
								<span class="ui-avatar-editor-list-item-num">1</span>
								${0}
								<div class="ui-avatar-editor-list-link-box">
									<a href="${0}" class="ui-avatar-editor-list-link">${0}</a>
									<a href="/bitrix/js/ui/avatar-editor/dist/user_frame_template.zip" download class="ui-avatar-editor-list-link">${0}</a>
								</div>
							</li>
							<li class="ui-avatar-editor-list-item">
								<span class="ui-avatar-editor-list-item-num">2</span>
								${0}
								<div class="ui-avatar-editor-mask-file" data-bx-role="mask-file"></div>
							</li>
							<li class="ui-avatar-editor-list-item">${0}
								<span class="ui-avatar-editor-list-item-num">3</span>
								<div class="ui-form">
									<div class="ui-form-row">
										<div class="ui-form-label">
											<div class="ui-ctl-label-text">${0}</div>
										</div>
										<div class="ui-form-content">
											<div class="ui-ctl ui-ctl-textbox ui-ctl-w100">
												<input data-bx-role="title" type="text" class="ui-ctl-element" placeholder="${0}">
											</div>
										</div>
									</div>
									<div class="ui-form-row">
										<div class="ui-form-label">
											<div class="ui-ctl-label-text">${0}</div>
										</div>
										<div class="ui-form-content">
											<div class="ui-ctl ui-ctl-textbox ui-ctl-w100" data-bx-role="access-container"></div>
										</div>
									</div>
								</div>
							</li>
						</ol>
					</div>`), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_1_POINT').replace(/#SIZE/gi, main_core.Loc.getMessage('UI_AVATAR_MASK_MAX_SIZE')), main_core.Loc.getMessage('UI_AVATAR_MASK_PATH_ARTICLE'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_HOW_TO'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_DOWNLOAD_TEMPLATE2'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_2_POINT'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_CONTENT_3_POINT'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_TITLE'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_PLACEHOLDER'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ACCESS'));
	      res.querySelector('[data-bx-role="mask-file"]').appendChild(babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getContainer());
	      babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getCanvasZooming().setDefaultValue(0.5).reset();
	      return res;
	    });
	  }
	  isModified() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] > 0;
	  }
	  openNew() {
	    babelHelpers.classPrivateFieldLooseBase(this, _showSlider)[_showSlider]().then(() => {
	      babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] = 0;
	      babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = {
	        id: null,
	        title: '',
	        src: null,
	        accessCode: [['meta-user', 'all-users']]
	      };
	      babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().reset();
	      this.getContentContainer().querySelector('[data-bx-role="title"]').value = '';
	      babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector]();
	    });
	  }
	  openSaved(data) {
	    babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = {
	      id: data.id,
	      title: data.title,
	      src: data.src,
	      accessCode: data.accessCode || null
	    };
	    this.getContentContainer().querySelector('[data-bx-role="title"]').value = main_core.Text.encode(data.title);
	    babelHelpers.classPrivateFieldLooseBase(this, _showSlider)[_showSlider]().then(() => {
	      babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().loadSrc(data.src).then(() => {
	        babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount] = 0;
	        if (!data.accessCode) {
	          Backend.getMaskAccessCode(data.id).then(({
	            data: {
	              accessCode
	            }
	          }) => {
	            this.emit('maskAccessCodeHasGot', accessCode);
	            babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = accessCode;
	            babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector]();
	          });
	        } else {
	          babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = Array.from(data.accessCode);
	          babelHelpers.classPrivateFieldLooseBase(this, _initAccessSelector)[_initAccessSelector]();
	        }
	      });
	    });
	  }
	  checkOpened() {
	    return new Promise((resolve, reject) => {
	      let isSuccess = true;
	      if (babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().isEmpty()) {
	        babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getTab(UploadTab.code).showError({
	          message: main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR_IMAGE_IS_NOT_CHOSEN')
	        });
	        isSuccess = false;
	      }
	      const title = this.getContentContainer().querySelector('[data-bx-role="title"]').value.trim();
	      if (title.length <= 0) {
	        this.getContentContainer().querySelector('[data-bx-role="title"]').style.border = '3px solid red';
	        isSuccess = false;
	      }
	      if (isSuccess) {
	        return resolve();
	      }
	      return reject();
	    });
	  }
	  saveOpened() {
	    return new Promise((resolve, reject) => {
	      const cb = ({
	        blob
	      }) => {
	        Backend.saveMask({
	          id: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].id,
	          title: this.getContentContainer().querySelector('[data-bx-role="title"]').value,
	          accessCode: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode
	        }, blob).then(resolve).catch(reject);
	      };
	      if (!this.isModified()) {
	        return cb({
	          blob: null
	        });
	      }
	      return babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().packBlob().then(cb);
	    });
	  }
	  destroy() {
	    babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().reset();
	    this.getContentContainer().querySelector('[data-bx-role="title"]').value = '';
	    babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = null;
	    this.cache.storage.clear();
	  }
	  /**
	   * Emits specified event with specified event object
	   * @param {string} eventName
	   * @param {BaseEvent | any} event
	   * @return {this}
	   */
	  emit(eventName, event) {
	    BX.SidePanel.Instance.postMessageAll(babelHelpers.classPrivateFieldLooseBase(this, _id)[_id], eventName, event);
	    return this;
	  }
	  static subscribe(eventName, listener) {
	    main_core_events.EventEmitter.subscribe([Options.eventNamespace, 'mask:editor', eventName].join(':'), listener);
	    if (babelHelpers.classPrivateFieldLooseBase(this, _subscribedToASliderEvents)[_subscribedToASliderEvents]) {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _subscribedToASliderEvents)[_subscribedToASliderEvents] = true;
	    main_core_events.EventEmitter.subscribe('SidePanel.Slider:onMessage', ({
	      data: [BXSidePanelMessageEvent]
	    }) => {
	      if (BXSidePanelMessageEvent.getSender().getUrl().indexOf([Options.eventNamespace, 'mask:editor'].join(':')) === 0) {
	        main_core_events.EventEmitter.emit([Options.eventNamespace, 'mask:editor', BXSidePanelMessageEvent.getEventId()].join(':'), BXSidePanelMessageEvent.getData());
	      }
	    });
	  }
	  static getInstance() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]) {
	      return babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance];
	    }
	    if (window === window.top) {
	      if (!babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]) {
	        babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] = new this();
	      }
	      return babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance];
	    }
	    return null;
	  }
	  static getPromiseWithInstance() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] || this.getInstance()) {
	      return new Promise(resolve => {
	        resolve(babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]);
	      });
	    }
	    return new Promise(resolve => {
	      top.BX.Runtime.loadExtension(['ui.avatar-editor']).then(() => {
	        babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance] = top.BX.UI.AvatarEditor.MaskEditor.getInstance();
	        resolve(babelHelpers.classPrivateFieldLooseBase(this, _instance)[_instance]);
	      });
	    });
	  }
	}
	function _getEditor2() {
	  return this.cache.remember('editor', () => {
	    const res = new Editor({
	      enableCamera: false,
	      enableUpload: true,
	      uploadTabOptions: {
	        fileAccept: 'image/png'
	      },
	      enableMask: false
	    });
	    res.subscribe('onChange', ({
	      data
	    }) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _changesCount)[_changesCount]++;
	    });
	    return res;
	  });
	}
	function _initAccessSelector2() {
	  return this.cache.remember('TagSelector', () => {
	    const handler = ({
	      target
	    }) => {
	      if (target instanceof ui_entitySelector.Dialog) {
	        babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode = target.getSelectedItems().map(item => {
	          return [item.entityId, item.id];
	        });
	      }
	    };
	    const selector = new top.BX.UI.EntitySelector.TagSelector({
	      id: this.constructor.name,
	      dialogOptions: {
	        id: this.constructor.name,
	        context: null,
	        preselectedItems: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].accessCode,
	        events: {
	          'Item:onSelect': handler,
	          'Item:onDeselect': handler
	        },
	        entities: [{
	          id: 'meta-user',
	          options: {
	            'all-users': {
	              title: 'All users',
	              allowView: true
	            }
	          }
	        }, {
	          id: 'user',
	          options: {
	            emailUsers: false,
	            inviteGuestLink: false,
	            myEmailUsers: false
	          }
	        }, {
	          id: 'department',
	          options: {
	            selectMode: 'usersAndDepartments',
	            allowFlatDepartments: false
	          }
	        }]
	      }
	    });
	    selector.renderTo(this.getContentContainer().querySelector('[data-bx-role="access-container"]'));
	    return selector;
	  });
	}
	function _showSlider2() {
	  return new Promise((resolve, reject) => {
	    BX.SidePanel.Instance.open(babelHelpers.classPrivateFieldLooseBase(this, _id)[_id], {
	      width: 800,
	      cacheable: false,
	      allowChangeHistory: false,
	      events: {
	        onCloseByEsc: event => {
	          event.denyAction();
	        },
	        onOpen: () => {
	          setTimeout(() => {
	            this.emit('onOpen', {});
	          }, 0);
	          resolve();
	        },
	        onCloseComplete: this.destroy.bind(this)
	      },
	      contentCallback: slider => {
	        return ui_sidepanel_layout.Layout.createContent({
	          extensions: [],
	          title: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_TITLE'),
	          content: () => {
	            const res = this.getContentContainer();
	            setTimeout(() => {
	              babelHelpers.classPrivateFieldLooseBase(this, _getEditor)[_getEditor]().getCanvasZooming().setDefaultValue(0.5).reset();
	            }, 0);
	            return res;
	          },
	          buttons: ({
	            CancelButton,
	            SaveButton
	          }) => {
	            return [new SaveButton({
	              onclick: button => {
	                button.setWaiting(true);
	                this.checkOpened().then(this.saveOpened.bind(this)).then(({
	                  data
	                }) => {
	                  this.emit('onSave', {
	                    id: babelHelpers.classPrivateFieldLooseBase(this, _data)[_data].id,
	                    data: data
	                  });
	                  button.setWaiting(false);
	                  slider.close();
	                }).catch(error => {
	                  if (error) {
	                    BX.UI.Notification.Center.notify({
	                      content: ['Error is here', ...arguments].join('-')
	                    });
	                  }
	                  button.setWaiting(false);
	                });
	              }
	            }), new CancelButton({
	              onclick: () => {
	                slider.close();
	              }
	            })];
	          }
	        });
	      },
	      label: {
	        text: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_CREATOR_LABEL')
	      }
	    });
	  });
	}
	Object.defineProperty(MaskEditor, _instance, {
	  writable: true,
	  value: void 0
	});
	Object.defineProperty(MaskEditor, _subscribedToASliderEvents, {
	  writable: true,
	  value: false
	});

	let _$4 = t => t,
	  _t$4;
	var _repo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("repo");
	var _template = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("template");
	class MaskItem extends main_core_events.EventEmitter {
	  constructor(data, template) {
	    super();
	    this.cache = new main_core.Cache.MemoryCache();
	    Object.defineProperty(this, _template, {
	      writable: true,
	      value: void 0
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    this.data = data;
	    babelHelpers.classPrivateFieldLooseBase(this, _template)[_template] = template;
	    MaskEditor.subscribe('onSave', event => {
	      try {
	        const {
	          data: {
	            id,
	            data
	          }
	        } = event;
	        if (String(this.data.id) === String(id)) {
	          this.update(data);
	        }
	      } catch (e) {
	        console.log(e.message);
	      }
	    });
	  }
	  getContainer() {
	    return this.cache.remember('container', () => {
	      const itemText = babelHelpers.classPrivateFieldLooseBase(this, _template)[_template].replace(/#MASK_ID#/gi, main_core.Text.encode(this.data.id)).replace(/#MASK_TITLE#/gi, main_core.Text.encode(this.data.title || '')).replace(/#MASK_SUBTITLE#/gi, main_core.Text.encode(this.data.description || '')).replace(/#MASK_SRC#/gi, main_core.Text.encode(this.data.src));
	      const res = main_core.Tag.render(_t$4 || (_t$4 = _$4`${0}`), itemText);
	      main_core.Event.bind(res.querySelector('[data-bx-role="mask-item-menu-pointer"]'), 'click', this.onClickMenuPointer.bind(this));
	      babelHelpers.classPrivateFieldLooseBase(this.constructor, _repo)[_repo].set(res, this);
	      main_core.Event.bind(res, 'click', this.setActive.bind(this));
	      return res;
	    });
	  }
	  getData() {
	    return Object.assign({}, this.data);
	  }
	  getId() {
	    return this.data.id;
	  }
	  update(data) {
	    this.data.title = data.title;
	    this.data.src = data.src;
	    this.data.description = data.description;
	    this.data.accessCode = data.accessCode;
	    this.data.editable = data.editable;
	    const oldContainer = this.getContainer();
	    this.cache.delete('container');
	    const newContainer = this.getContainer();
	    main_core.Dom.replace(oldContainer, newContainer);
	  }
	  setActive() {
	    this.emit('onClickMask');
	  }
	  onClickMenuPointer(event) {
	    event.preventDefault();
	    event.stopPropagation();
	    const thisPopupId = 'mask-item-menu-context-' + this.data.id;
	    const thisPopup = main_popup.MenuManager.create(thisPopupId, event.target, [{
	      href: this.data.src,
	      dataset: {
	        id: 'download'
	      },
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_DOWNLOAD_BUTTON'),
	      onclick: (event, item) => {
	        item.getMenuWindow().close();
	      }
	    }, this.data.editable ? {
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_EDIT_BUTTON'),
	      onclick: (event, item) => {
	        this.emit('onClickEditMask');
	        item.getMenuWindow().close();
	      }
	    } : null, this.data.editable ? {
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_DELETE_BUTTON'),
	      onclick: (event, item) => {
	        this.emit('onClickDeleteMask');
	        item.getMenuWindow().close();
	      }
	    } : null], {
	      closeByEsc: true,
	      autoHide: true,
	      offsetTop: 0,
	      offsetLeft: 15,
	      angle: true,
	      cacheable: false,
	      targetContainer: event.target.closest('.ui-avatar-editor__mask-block-container'),
	      className: 'popup-window-content-frame-item-menu',
	      events: {
	        onFirstShow: ({
	          compatData: [popup]
	        }) => {
	          popup.getContentContainer().querySelector('[data-id="download"]').setAttribute('download', '');
	        }
	      }
	    });
	    thisPopup.show();
	    main_core_events.EventEmitter.subscribeOnce(thisPopup.getPopupWindow().getEventNamespace() + ':onBeforeShow', () => {
	      thisPopup.close();
	    });
	    return false;
	  }
	  static getByNode(node) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _repo)[_repo].get(node);
	  }
	}
	Object.defineProperty(MaskItem, _repo, {
	  writable: true,
	  value: new WeakMap()
	});

	let _$5 = t => t,
	  _t$5,
	  _t2$1,
	  _t3$1,
	  _t4$1,
	  _t5,
	  _t6;
	var _container = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("container");
	var _state = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("state");
	var _pageSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("pageSize");
	var _pageNumber = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("pageNumber");
	var _getTemplateGroup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getTemplateGroup");
	var _getTemplateItem = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getTemplateItem");
	class MaskList extends main_core_events.EventEmitter {
	  constructor({
	    initialPageSize,
	    items
	  }) {
	    super();
	    Object.defineProperty(this, _getTemplateItem, {
	      value: _getTemplateItem2
	    });
	    Object.defineProperty(this, _getTemplateGroup, {
	      value: _getTemplateGroup2
	    });
	    Object.defineProperty(this, _container, {
	      writable: true,
	      value: void 0
	    });
	    this.cache = new main_core.Cache.MemoryCache();
	    Object.defineProperty(this, _state, {
	      writable: true,
	      value: this.constructor.paginationStates['ready']
	    });
	    Object.defineProperty(this, _pageSize, {
	      writable: true,
	      value: 10
	    });
	    Object.defineProperty(this, _pageNumber, {
	      writable: true,
	      value: 1
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    babelHelpers.classPrivateFieldLooseBase(this, _container)[_container] = this.getContainer().querySelector('[data-bx-role="avatar-mask-list-container"]');
	    babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize] = this.constructor.regularPageSize;
	    this.loadItems(items);
	    this.setReady();
	  }
	  static getTemplate() {
	    return `<div>
				<div class="ui-avatar-editor--scope" data-bx-role="avatar-mask-list-container">
					<section class="ui-avatar-editor__mask-block-list-container" id="mask_group">
						<h3 class="ui-avatar-editor__mask-title" data-bx-role="group_title" data-bx-group-id="#GROUP_ID#">#GROUP_TITLE#</h3>
						<ul class="ui-avatar-editor__mask-block-mask-box" data-bx-role="group_body" data-bx-group-id="#GROUP_ID#">
							<li class="ui-avatar-editor__mask-block-mask-element" 
								id="mask_item"
								data-bx-role="mask_item"
								title="#MASK_TITLE# \n #MASK_SUBTITLE#"
								data-bx-id="#MASK_ID#">
								<div data-bx-role="mask-thumb" class="ui-avatar-editor__mask-block-mask-image" style="background-image: url('#MASK_SRC#'); "/></div>
								<div class="ui-avatar-editor__mask-block-mask-name">#MASK_TITLE#</div>
								<div class="ui-avatar-editor__mask-block-mask-subname">#MASK_SUBTITLE#</div>
								<div class="ui-avatar-editor__mask-block-mask-menu" data-bx-role="mask-item-menu-pointer"></div>
							</li>
						</ul>
					</section>
				</div>
				<nav class="ui-avatar-editor-pagination" data-bx-role="avatar-mask-list-pagination"></nav>
			</div>`;
	  }
	  static setByNode(node, object) {
	    return this.repoList.set(node, object);
	  }
	  static getByNode(node) {
	    return this.repoList.get(node);
	  }
	  setPageSize(pageSize) {
	    babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize] = pageSize;
	    return this;
	  }
	  getContainer() {
	    return this.cache.remember('container', () => {
	      const res = main_core.Tag.render(_t$5 || (_t$5 = _$5`${0}`), this.constructor.getTemplate());
	      main_core.Dom.remove(res.querySelector('#mask_item'));
	      main_core.Dom.remove(res.querySelector('#mask_group'));
	      return res;
	    });
	  }
	  isReady() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] === this.constructor.paginationStates.ready;
	  }
	  setReady() {
	    this.getMoreButton().setWaiting(false);
	    babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.ready;
	  }
	  setBusy() {
	    this.getMoreButton().setWaiting(true);
	    babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.inprogress;
	  }
	  setFinished() {
	    this.getMoreButton().setDisabled(true);
	    babelHelpers.classPrivateFieldLooseBase(this, _state)[_state] = this.constructor.paginationStates.finished;
	    main_core.Dom.remove(this.getContainer().querySelector('[data-bx-role="avatar-mask-list-pagination"]'));
	  }
	  getMoreButton() {
	    return this.cache.remember('moreButton', () => {
	      const butt = new ui_buttons.Button({
	        text: main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_PAGINATION'),
	        baseClass: 'ui-btn ui-btn-light-border',
	        size: ui_buttons.ButtonSize.SMALL,
	        noCaps: true,
	        round: true,
	        onclick: this.load.bind(this)
	      });
	      butt.renderTo(this.getContainer().querySelector('[data-bx-role="avatar-mask-list-pagination"]'));
	      return butt;
	    });
	  }
	  load() {
	    if (!this.isReady()) {
	      return;
	    }
	    this.setBusy();
	    Backend.getMaskList(this.constructor.name.replace('Mask', ''), {
	      page: ++babelHelpers.classPrivateFieldLooseBase(this, _pageNumber)[_pageNumber],
	      size: babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize]
	    }).then(this.loadItems.bind(this)).catch(this.terminate.bind(this));
	  }
	  loadItems(items) {
	    this.renderItems(items);
	    this.finish(items);
	  }
	  renderItems(data) {
	    let maxCount = babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize];
	    Object.values(data).forEach(({
	      id,
	      title,
	      items
	    }) => {
	      if (maxCount <= 0) {
	        return;
	      }
	      items = Object.values(items).slice(0, maxCount);
	      maxCount -= items.length;
	      id = id || '0';
	      if (!babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`)) {
	        const groupText = babelHelpers.classPrivateFieldLooseBase(this, _getTemplateGroup)[_getTemplateGroup]().replace(/#GROUP_ID#/gi, main_core.Text.encode(id)).replace(/#GROUP_TITLE#/gi, main_core.Text.encode(title || ''));
	        babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].appendChild(main_core.Tag.render(_t2$1 || (_t2$1 = _$5`${0}`), groupText));
	      }
	      const badgeContainer = babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`);
	      items.forEach(item => {
	        const maskItem = new MaskItem(item, babelHelpers.classPrivateFieldLooseBase(this, _getTemplateItem)[_getTemplateItem]());
	        badgeContainer.appendChild(maskItem.getContainer());
	      });
	    });
	  }
	  renderItemsReverse(data) {
	    Object.values(data).forEach(({
	      id,
	      title,
	      items
	    }) => {
	      id = id || '0';
	      if (!babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`)) {
	        const groupText = babelHelpers.classPrivateFieldLooseBase(this, _getTemplateGroup)[_getTemplateGroup]().replace(/#GROUP_ID#/gi, main_core.Text.encode(id)).replace(/#GROUP_TITLE#/gi, main_core.Text.encode(title || ''));
	        main_core.Dom.prepend(main_core.Tag.render(_t3$1 || (_t3$1 = _$5`${0}`), groupText), babelHelpers.classPrivateFieldLooseBase(this, _container)[_container]);
	      }
	      const badgeContainer = babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].querySelector(`[data-bx-group-id="${id}"][data-bx-role="group_body"]`);
	      items.forEach(item => {
	        const maskItem = new MaskItem(item, babelHelpers.classPrivateFieldLooseBase(this, _getTemplateItem)[_getTemplateItem]());
	        main_core.Dom.prepend(maskItem.getContainer(), badgeContainer);
	      });
	    });
	  }
	  finish(data) {
	    let thisPageItemCount = 0;
	    data.forEach(({
	      items
	    }) => {
	      thisPageItemCount += items.length;
	    });
	    if (thisPageItemCount >= babelHelpers.classPrivateFieldLooseBase(this, _pageSize)[_pageSize]) {
	      this.setReady();
	    } else {
	      this.setFinished();
	    }
	  }
	  terminate(data) {
	    let errors = [];
	    if (data instanceof Error) {
	      console.log('data: ', data);
	      errors.push(data);
	    } else if (data['errors']) {
	      errors = data.errors;
	    } else {
	      errors.push({
	        message: 'Some error'
	      });
	    }
	    this.setFinished();
	    errors.forEach(({
	      code,
	      message
	    }) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _container)[_container].appendChild(main_core.Tag.render(_t4$1 || (_t4$1 = _$5`<pre>${0}</pre>`), main_core.Text.encode(message)));
	    });
	  }
	}
	function _getTemplateGroup2() {
	  return this.cache.remember('templateGroup', () => {
	    const maskGroup = main_core.Tag.render(_t5 || (_t5 = _$5`${0}`), this.constructor.getTemplate()).querySelector('#mask_group');
	    const maskItem = maskGroup.querySelector('#mask_item');
	    maskItem.parentNode.removeChild(maskItem);
	    maskGroup.removeAttribute('id');
	    return maskGroup.outerHTML.trim();
	  });
	}
	function _getTemplateItem2() {
	  return this.cache.remember('templateItem', () => {
	    const maskItem = main_core.Tag.render(_t6 || (_t6 = _$5`${0}`), this.constructor.getTemplate()).querySelector('#mask_item');
	    maskItem.removeAttribute('id');
	    return maskItem.outerHTML.trim();
	  });
	}
	MaskList.repoList = new WeakMap();
	MaskList.paginationStates = {
	  ready: 0,
	  inprogress: 1,
	  finished: 3
	};
	MaskList.regularPageSize = 9;
	MaskList.shortPageSize = 3;
	class MaskRecentlyUsedList extends MaskList {}
	class MaskSystemList extends MaskList {}
	class MaskUserList extends MaskList {
	  constructor() {
	    super(...arguments);
	    MaskEditor.subscribe('onSave', event => {
	      try {
	        const {
	          data: {
	            id,
	            data
	          }
	        } = event;
	        if (id === null) {
	          this.renderItemsReverse({
	            'doesNotMatter': {
	              items: [data]
	            }
	          });
	        }
	      } catch (e) {
	        console.log(e.message);
	      }
	    });
	  }
	}
	class MaskSharedList extends MaskList {}

	let _$6 = t => t,
	  _t$6;
	var _ready = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ready");
	var _callbacks = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("callbacks");
	var _fulfillReadyCallbacksTimeout = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fulfillReadyCallbacksTimeout");
	var _deleteMaskVisually = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deleteMaskVisually");
	class MaskTab extends DefaultTab {
	  constructor() {
	    super();
	    Object.defineProperty(this, _deleteMaskVisually, {
	      value: _deleteMaskVisually2
	    });
	    Object.defineProperty(this, _ready, {
	      writable: true,
	      value: false
	    });
	    Object.defineProperty(this, _callbacks, {
	      writable: true,
	      value: []
	    });
	    Object.defineProperty(this, _fulfillReadyCallbacksTimeout, {
	      writable: true,
	      value: void 0
	    });
	    this.badges = null;
	    this.activeId = null;
	    this.mask = this.mask.bind(this);
	    this.subscribeOnce('onActive', this.initialize.bind(this));
	  }
	  getHeader() {
	    return main_core.Loc.getMessage('JS_AVATAR_EDITOR_MASKS');
	  }
	  getBody() {
	    return this.cache.remember('body', () => {
	      return main_core.Tag.render(_t$6 || (_t$6 = _$6`<div class="ui-avatar-editor__mask-block-container">
				<div class="ui-avatar-editor__mask-block-content">
					<div data-bx-role="semantic-container" data-bx-id="recently-used" style="display: none;">
						<h3 class="ui-avatar-editor__mask-title">${0}</h3>
						<div data-bx-role="list-container" data-bx-id="recently-used"></div>
					</div>
					<div data-bx-role="list-container" data-bx-id="system"></div>
					<div data-bx-role="semantic-container" data-bx-id="shared" style="display: none">
						<h3 class="ui-avatar-editor__mask-title">${0}</h3>
						<div data-bx-role="list-container" data-bx-id="shared">
							<a class="ui-btn ui-btn-lg ui-btn-link ui-btn-wait ui-btn-no-caps ui-btn-icon-add">...</a>
						</div>
					</div>
					<div data-bx-role="semantic-container" data-bx-id="my-own">
						<h3 class="ui-avatar-editor__mask-title" data-bx-id="rest-market-export-menu">
							${0}
							<div data-bx-id="rest-market-export-menu-pointer" class="ui-avatar-editor__menu-more"></div>
						</h3>
						<div data-bx-role="list-container" data-bx-id="my-own"></div>

						<a href="#" class="ui-avatar-editor__mask-create-box" data-bx-role="semantic-container" data-bx-id="rest-market" style="display: none;">
							<div class="ui-avatar-editor__mask-btn-load">
								<div class="ui-avatar-editor__mask-btn-load-icon"></div>
								${0}
								<div class="ui-avatar-editor__mask-btn-load-cloud"></div>
							</div>
						</a>

						<div class="ui-avatar-editor__mask-create-box">
							<div class="ui-avatar-editor__mask-btn-add" data-bx-id="avatar-mask-list-own-create">${0}</div>
							<a href="/bitrix/js/ui/avatar-editor/dist/user_frame_template.zip" download class="ui-avatar-editor__mask-link">${0}</a>
						</div>
					</div>
				</div>
			</div>`), main_core.Loc.getMessage('JS_AVATAR_EDITOR_RECENT_MASKS'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_SHARED'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_LIST_MY_OWN'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_LOAD_FROM_MARKET'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_ADD_MY_OWN'), main_core.Loc.getMessage('UI_AVATAR_EDITOR_MASK_DOWNLOAD_TEMPLATE1'));
	    });
	  }
	  initialize() {
	    Backend.getMaskInitialInfo({
	      size: MaskList.regularPageSize,
	      recentlyUsedListSize: MaskList.shortPageSize
	    }).then(this.initializeData.bind(this)).catch(error => {
	      console.log('errors: ', error);
	    });
	  }
	  initializeData({
	    recentlyUsedItems,
	    systemItems,
	    myOwnItems,
	    sharedItems,
	    restMarketInfo
	  }) {
	    const body = this.getBody();
	    if (main_core.Loc.getMessage('USER_ID') > 0) {
	      main_core.Event.bind(body.querySelector('[data-bx-id="avatar-mask-list-own-create"]'), 'click', this.onClickCreateMask.bind(this));
	      main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickEditMask', this.onClickEditMask.bind(this));
	      main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickDeleteMask', this.onClickDeleteMask.bind(this));
	    }
	    if (restMarketInfo['available'] === 'Y') {
	      const menuItem = body.querySelector('[data-bx-id="rest-market-export-menu"]');
	      main_core.Dom.addClass(menuItem, '--menuable');
	      main_core.Event.bind(menuItem.querySelector('[data-bx-id="rest-market-export-menu-pointer"]'), 'click', event => {
	        this.onClickOwnMaskMenu(event, restMarketInfo);
	      });
	      const marketLink = body.querySelector('[data-bx-role="semantic-container"][data-bx-id="rest-market"]');
	      marketLink.style.display = '';
	      marketLink.href = restMarketInfo['marketUrl'];
	    }
	    [[MaskRecentlyUsedList, recentlyUsedItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="recently-used"]')], [MaskSystemList, systemItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="system"]')], [MaskUserList, myOwnItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]')], [MaskSharedList, sharedItems, body.querySelector('[data-bx-role="list-container"][data-bx-id="shared"]')]].forEach(([className, items, container]) => {
	      items = items || [];
	      if (items.length > 0) {
	        const semanticContainer = container.closest('[data-bx-role="semantic-container"]');
	        if (semanticContainer) {
	          semanticContainer.style.display = '';
	        }
	      }
	      container.innerHTML = '';
	      /**
	       * @typedef {MaskList} list
	       */
	      const list = new className({
	        initialPageSize: this.constructor.initialPageSize,
	        items: items
	      });
	      container.appendChild(list.getContainer());
	      MaskList.setByNode(container, list);
	    });
	    main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onClickMask', ({
	      target: maskItem
	    }) => {
	      /**
	       * @typedef {MaskItem} maskItem
	       */
	      if (this.getBody().contains(maskItem.getContainer())) {
	        if (this.activeId === maskItem.getId()) {
	          this.unmask();
	        } else {
	          this.mask(maskItem.getData());
	        }
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _ready)[_ready] = true;
	    this.fulfillReadyCallbacks();
	  }
	  onReady(callback) {
	    babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].push(callback);
	    if (babelHelpers.classPrivateFieldLooseBase(this, _ready)[_ready]) {
	      this.fulfillReadyCallbacks();
	    }
	  }
	  fulfillReadyCallbacks() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] > 0) {
	      return;
	    }
	    const callback = babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].shift();
	    if (callback) {
	      if (babelHelpers.classPrivateFieldLooseBase(this, _callbacks)[_callbacks].length > 0) {
	        babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] = setTimeout(() => {
	          babelHelpers.classPrivateFieldLooseBase(this, _fulfillReadyCallbacksTimeout)[_fulfillReadyCallbacksTimeout] = 0;
	          this.fulfillReadyCallbacks();
	        }, 10);
	      }
	      callback.call(this);
	    }
	  }
	  unmask() {
	    if (this.activeId !== null) {
	      let foundAtLeastOneNode;
	      this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${this.activeId}"]`).forEach(node => {
	        foundAtLeastOneNode = node;
	        main_core.Dom.removeClass(node, '--active');
	      });
	      if (foundAtLeastOneNode) {
	        this.emit('onUnsetMask', this.activeId);
	      }
	    }
	    this.activeId = null;
	  }
	  maskById(id) {
	    this.onReady(() => {
	      const maskItem = MaskItem.getByNode(this.getBody().querySelector(`[data-bx-role="mask_item"][data-bx-id="${id}"]`));
	      if (maskItem instanceof MaskItem) {
	        maskItem.setActive();
	      }
	    });
	  }
	  mask({
	    id,
	    src,
	    thumb
	  }) {
	    if (this.activeId !== id && main_core.Type.isStringFilled(id)) {
	      this.unmask();
	      let foundAtLeastOneNode;
	      this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${id}"]`).forEach(node => {
	        foundAtLeastOneNode = node;
	        main_core.Dom.addClass(node, ' --active');
	      });
	      if (foundAtLeastOneNode) {
	        this.activeId = id;
	        this.emit('onSetMask', {
	          id: id,
	          src: src,
	          thumb: thumb || src
	        });
	      }
	    }
	  }
	  onClickCreateMask(event) {
	    event.stopImmediatePropagation();
	    MaskEditor.getPromiseWithInstance().then(maskEditor => {
	      maskEditor.openNew();
	    });
	  }
	  onClickEditMask(event) {
	    /* @var MaskItem maskItem */
	    const maskItem = event.getTarget();
	    if (this.getBody().contains(maskItem.getContainer())) {
	      event.stopImmediatePropagation();
	      MaskEditor.getPromiseWithInstance().then(maskEditor => {
	        maskEditor.openSaved(Object.assign({}, maskItem.getData()));
	      });
	    }
	  }
	  onClickDeleteMask({
	    target
	  }) {
	    if (this.getBody().contains(target.getContainer())) {
	      /* @var MaskItem target */
	      babelHelpers.classPrivateFieldLooseBase(this, _deleteMaskVisually)[_deleteMaskVisually](target);
	      Backend.deleteMask(target.getId()).then(() => {
	        this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${target.getId()}"]`).forEach(node => {
	          main_core.Dom.remove(node);
	        });
	      }).catch(({
	        errors
	      }) => {
	        BX.UI.Notification.Center.notify({
	          content: [main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR'), ...errors.map(({
	            message,
	            code
	          }) => {
	            return message || code;
	          })].join(' ')
	        });
	      });
	    }
	  }
	  onClickOwnMaskMenu(event, urls) {
	    const thisPopupId = 'mask-item-menu-context-own-masks';
	    const isFilled = !!this.getBody().querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]').querySelector(`[data-bx-role="mask_item"]`);
	    const thisPopup = main_popup.MenuManager.create(thisPopupId, event.target, [isFilled && main_core.Type.isStringFilled(urls.exportUrl) ? {
	      href: urls.exportUrl,
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_EXPORT_BUTTON'),
	      onclick: (event, item) => {
	        this.emit('onClickExport');
	        item.getMenuWindow().close();
	      }
	    } : null, isFilled ? {
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_BUTTON'),
	      onclick: (event, item) => {
	        item.getMenuWindow().close();
	        new ui_dialogs_messagebox.MessageBox({
	          message: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_NOTIFICATION'),
	          title: main_core.Loc.getMessage('JS_AVATAR_EDITOR_CLEAN_NOTIFICATION_TITLE'),
	          buttons: ui_dialogs_messagebox.MessageBoxButtons.OK_CANCEL,
	          okCaption: 'Ok',
	          onOk: messageBox => {
	            messageBox.close();
	            this.cleanUp();
	          }
	        }).show();
	      }
	    } : null, {
	      href: urls.importUrl,
	      text: main_core.Loc.getMessage('JS_AVATAR_EDITOR_IMPORT_BUTTON'),
	      onclick: (event, item) => {
	        this.emit('onClickImport');
	        item.getMenuWindow().close();
	      }
	    }], {
	      closeByEsc: true,
	      autoHide: true,
	      offsetTop: 0,
	      offsetLeft: 15,
	      angle: true,
	      cacheable: false,
	      targetContainer: event.target.closest('.ui-avatar-editor__mask-block-container'),
	      className: 'popup-window-content-frame-item-menu'
	    });
	    thisPopup.show();
	    main_core_events.EventEmitter.subscribeOnce(thisPopup.getPopupWindow().getEventNamespace() + ':onBeforeShow', () => {
	      thisPopup.close();
	    });
	    return false;
	  }
	  cleanUp()
	  //delete all my masks
	  {
	    const container = this.getBody().querySelector('[data-bx-role="list-container"][data-bx-id="my-own"]');
	    const loader = new main_loader.Loader({
	      target: container,
	      color: 'rgba(82, 92, 105, 0.9)'
	    });
	    loader.show();
	    Backend.cleanUp().then(() => {
	      MaskList.getByNode(container).setFinished();
	      container.querySelectorAll(`[data-bx-role="mask_item"]`).forEach(node => {
	        babelHelpers.classPrivateFieldLooseBase(this, _deleteMaskVisually)[_deleteMaskVisually](MaskItem.getByNode(node));
	      });
	      loader.hide();
	    });
	  }

	  //TODO delete this string and its using after testing
	  static isAvailable() {
	    return main_core.Loc.getMessage('UI_AVATAR_MASK_IS_AVAILABLE') === true;
	  }
	  static get code() {
	    return 'mask';
	  }
	}
	function _deleteMaskVisually2(maskItem) {
	  /* @var MaskItem target */
	  this.getBody().querySelectorAll(`[data-bx-role="mask_item"][data-bx-id="${maskItem.getId()}"]`).forEach(node => {
	    // node.style.display = 'none';
	    main_core.Dom.remove(node);
	  });
	  const listContainer = this.getBodyContainer().querySelector('[data-bx-role="list-container"][data-bx-id="recently-used"]');
	  if (listContainer.childNodes.length <= 1) {
	    const semanticContainer = listContainer.closest('[data-bx-role="semantic-container"]');
	    if (semanticContainer) {
	      semanticContainer.style.display = 'none';
	    }
	  }
	  if (String(this.activeId) === String(maskItem.getId())) {
	    this.unmask();
	  }
	}
	MaskTab.maxCount = 5;
	MaskTab.priority = 4;

	let _$7 = t => t,
	  _t$7;
	class CanvasTab extends DefaultTab {
	  getHeader() {
	    return main_core.Loc.getMessage('JS_AVATAR_EDITOR_PHOTO');
	  }
	  getBody() {
	    return this.cache.remember('body', () => {
	      const res = main_core.Tag.render(_t$7 || (_t$7 = _$7`
				<div class="ui-avatar-editor__content-block" data-bx-role="tab-canvas-body">
					<div class="ui-avatar-editor__control" data-bx-role="canvas-zooming">
						<div class="ui-avatar-editor__control-controller" data-bx-role="zoom-minus-button">
							<span class="ui-avatar-editor__control-minus"></span>
						</div>
						<div class="ui-avatar-editor__control-inner" data-bx-role="zoom-scale">
							<div class="ui-avatar-editor__control-slide-container ui-avatar-editor__control-slide-drag-state">
								<div class="ui-avatar-editor__control-slide" data-bx-role="zoom-knob"></div>
							</div>
						</div>
						<div class="ui-avatar-editor__control-controller" data-bx-role="zoom-plus-button">
							<span class="ui-avatar-editor__control-plus"></span>
						</div>
					</div>
					<div class="ui-avatar-editor__camera-block-image">
						<div class="ui-avatar-editor__user-loader-item" data-bx-role="canvas-loader">
							<div class="ui-avatar-editor__loader">
								<svg class="ui-avatar-editor__circular" viewBox="25 25 50 50">
									<circle class="ui-avatar-editor__path" cx="50" cy="50" r="20" fill="none" stroke-width="1" stroke-miterlimit="10"></circle>
								</svg>
							</div>
						</div>
						<div class="ui-avatar-editor__error" data-bx-role="canvas-error">
							<span>${0}</span>
							<span data-bx-role="tab-canvas-error"></span>
						</div>
						<div class="ui-avatar-editor__user-avatar-item" data-bx-role="canvas-holder">
							<span class="ui-avatar-editor__tab-avatar-image-item"></span>
						</div>

						<div data-editor-role="canvas-holder">
							<canvas data-bx-canvas="canvas" height="330" width="330"></canvas>
						</div>
					</div>
					<div class="ui-avatar-editor__button-layout">
						<div class="ui-avatar-editor__button" data-bx-role="button-add-picture" data-bx-id="upload-file">
							<span class="ui-avatar-editor__button-name">${0}</span>
						</div>
						<div class="ui-avatar-editor__button"  data-bx-role="button-add-picture" data-bx-id="snap-picture">
							<span class="ui-avatar-editor__button-name">${0}</span>
						</div>
					</div>
				</div>`), main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_UPLOAD'), main_core.Loc.getMessage('JS_AVATAR_EDITOR_SNAP'));
	      return res;
	    });
	  }
	  static get code() {
	    return 'canvas';
	  }
	}
	CanvasTab.priority = 1;

	let _$8 = t => t,
	  _t$8;
	var _justACounter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("justACounter");
	var _queue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("queue");
	var _image = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("image");
	var _canvas = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas");
	var _context = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("context");
	var _reader = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("reader");
	var _isReady = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isReady");
	var _id$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _load = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("load");
	var _exec = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("exec");
	var _dataURLToBlob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("dataURLToBlob");
	class CanvasLoader {
	  constructor() {
	    Object.defineProperty(this, _exec, {
	      value: _exec2
	    });
	    Object.defineProperty(this, _load, {
	      value: _load2
	    });
	    Object.defineProperty(this, _justACounter, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _queue, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _image, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _canvas, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _context, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _reader, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isReady, {
	      writable: true,
	      value: true
	    });
	    Object.defineProperty(this, _id$1, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader] = new FileReader();
	    babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue] = new Map();
	    babelHelpers.classPrivateFieldLooseBase(this, _image)[_image] = new Image();
	    babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].crossOrigin = 'anonymous';
	    babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas] = main_core.Tag.render(_t$8 || (_t$8 = _$8`<canvas id="loadercanvas"></canvas>`));
	    // document.querySelector('#workarea-content').appendChild(this.#canvas);
	    babelHelpers.classPrivateFieldLooseBase(this, _context)[_context] = babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].getContext('2d');
	    babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] = String(new Date().getTime());
	  }
	  push(file, successCallback, failCallback) {
	    const id = [babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1], babelHelpers.classPrivateFieldLooseBase(this, _justACounter)[_justACounter]++].join('_');
	    babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].set(id, [file, successCallback, failCallback]);
	    babelHelpers.classPrivateFieldLooseBase(this, _exec)[_exec]();
	  }
	  getCanvas() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas];
	  }
	  getContext() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _context)[_context];
	  }
	  pack(fileType) {
	    return new Promise((resolve, reject) => {
	      try {
	        if (babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas]['toBlob']) {
	          babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].toBlob(resolve, fileType);
	        } else {
	          resolve(babelHelpers.classPrivateFieldLooseBase(this.constructor, _dataURLToBlob)[_dataURLToBlob](babelHelpers.classPrivateFieldLooseBase(this, _canvas)[_canvas].toDataURL(fileType)));
	        }
	      } catch (e) {
	        reject(e);
	      }
	    });
	  }
	  static getInstance() {
	    if (this.instance === null) {
	      this.instance = new this();
	    }
	    return this.instance;
	  }
	  static loadFile(file, successCallback, failCallback) {
	    if (!window["FileReader"]) {
	      return failCallback(new Error({
	        message: 'FileReader is not supported.'
	      }));
	    }
	    let newFile = file;
	    if (main_core.Type.isString(file)) {
	      newFile = {
	        src: file,
	        name: file.split('/').pop()
	      };
	    }
	    this.getInstance().push(newFile, successCallback, failCallback);
	  }
	  static loadCanvas() {
	    this.getInstance().getCanvas();
	  }
	}
	function _load2(itemId) {
	  if (!babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].has(itemId) || babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] !== true) {
	    return;
	  }
	  babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] = false;
	  const [file, successCallback, failCallback] = babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].get(itemId);
	  babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onload = function () {};
	  babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onerror = function () {};

	  /* Almost all browsers cache images from local resource except of FF on 06.03.2017. It appears that
	  FF collect src and does not abort image uploading when src is changed. And we had a bug when in
	  onload event we got e.target.src of one element but source of image was from '/bitrix/images/1.gif'. */
	  // TODO check if chrome and other browsers cache local files for now. If it does not then delete next 2 strings
	  try {
	    window["URL"]["revokeObjectURL"](babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src);
	  } catch (e) {}
	  if (!main_core.Browser.isFirefox()) {
	    babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = '/bitrix/images/1.gif';
	  }
	  const onFinish = () => {
	    babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].delete(itemId);
	    babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] = true;
	    setTimeout(() => {
	      babelHelpers.classPrivateFieldLooseBase(this, _exec)[_exec]();
	    }, 0);
	  };
	  const onLoad = e => {
	    const image = e && e.target ? e.target : babelHelpers.classPrivateFieldLooseBase(this, _image)[_image];
	    if (image.src.indexOf('/bitrix/images/1.gif') >= 0) {
	      return;
	    }
	    if (!!successCallback) {
	      onFinish();
	      successCallback(image);
	    }
	  };
	  const onError = () => {
	    if (!!failCallback) {
	      try {
	        failCallback();
	      } catch (e) {
	        main_core.Runtime.debug(e);
	      }
	    }
	    onFinish();
	  };
	  babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].name = file.name;
	  babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onload = onLoad;
	  babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].onerror = onError;
	  if (main_core.Type.isPlainObject(file) && (file['src'] || file['tmp_url'])) {
	    const src = file['src'] || file['tmp_url'];
	    babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = encodeURI(src) + (src.indexOf("?") > 0 ? '&' : '?') + 'imageUploader' + babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] + babelHelpers.classPrivateFieldLooseBase(this, _justACounter)[_justACounter]++;
	  } else {
	    const res = Object.prototype.toString.call(file);
	    if (res !== '[object File]' && res !== '[object Blob]') {
	      onError();
	    } else if (window["URL"]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = window["URL"]["createObjectURL"](file);
	    } else {
	      babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = e => {
	        babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = null;
	        babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = null;
	        babelHelpers.classPrivateFieldLooseBase(this, _image)[_image].src = e.target.result;
	      };
	      babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = () => {
	        babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onloadend = null;
	        babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].onerror = null;
	        onError();
	      };
	      babelHelpers.classPrivateFieldLooseBase(this, _reader)[_reader].readAsDataURL(file);
	    }
	  }
	}
	function _exec2() {
	  if (babelHelpers.classPrivateFieldLooseBase(this, _isReady)[_isReady] === true) {
	    const itemId = Array.from(babelHelpers.classPrivateFieldLooseBase(this, _queue)[_queue].keys()).shift();
	    if (itemId) {
	      babelHelpers.classPrivateFieldLooseBase(this, _load)[_load](itemId);
	    }
	  }
	}
	function _dataURLToBlob2(dataURL) {
	  let marker = ';base64,',
	    parts,
	    contentType,
	    raw,
	    rawLength;
	  if (dataURL.indexOf(marker) < 0) {
	    parts = dataURL.split(',');
	    contentType = parts[0].split(':')[1];
	    raw = parts[1];
	    return new Blob([raw], {
	      type: contentType
	    });
	  }
	  parts = dataURL.split(marker);
	  contentType = parts[0].split(':')[1];
	  raw = window.atob(parts[1]);
	  rawLength = raw.length;
	  const uInt8Array = new Uint8Array(rawLength);
	  for (let i = 0; i < rawLength; ++i) {
	    uInt8Array[i] = raw.charCodeAt(i);
	  }
	  return new Blob([uInt8Array], {
	    type: contentType
	  });
	}
	Object.defineProperty(CanvasLoader, _dataURLToBlob, {
	  value: _dataURLToBlob2
	});
	CanvasLoader.instance = null;

	var _isSet = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isSet");
	var _canvas$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas");
	var _ctx = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ctx");
	var _table = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("table");
	var _tableCloth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tableCloth");
	var _tableFrame = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tableFrame");
	var _stretchToCanvasSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("stretchToCanvasSize");
	class CanvasDefault extends main_core_events.EventEmitter {
	  constructor(canvas, options) {
	    super();
	    Object.defineProperty(this, _isSet, {
	      writable: true,
	      value: false
	    });
	    Object.defineProperty(this, _canvas$1, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _ctx, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _table, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _tableCloth, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _tableFrame, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _stretchToCanvasSize, {
	      writable: true,
	      value: true
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1] = canvas;
	    babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx] = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].getContext("2d");
	    babelHelpers.classPrivateFieldLooseBase(this, _table)[_table] = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].parentNode;
	    if (babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientWidth) {
	      babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientWidth;
	      babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].clientHeight;
	    } else {
	      babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width;
	      babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height;
	    }
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      style: {
	        // 'background' : '#fdbd00',
	      }
	    });
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table], {
	      style: {
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`,
	        border: 'none',
	        position: 'relative',
	        overflow: 'visible'
	      },
	      dataset: {
	        role: 'table',
	        width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width,
	        height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth] = main_core.Dom.create('DIV');
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        'border': 'none',
	        // 'background' : '#ffd7e1',
	        'position': 'absolute',
	        'display': 'flex',
	        'align-items': 'center',
	        'justify-content': 'center',
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`,
	        left: 0,
	        top: 0
	      },
	      dataset: {
	        role: 'tableCloth'
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]);
	    babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth]);
	    babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame] = main_core.Dom.create('DIV');
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        'box-sizing': 'border-box',
	        // 'border' : '4px dotted grey',
	        'position': 'absolute',
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`
	      },
	      dataset: {
	        role: 'tableFrame'
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].appendChild(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame]);
	    this.mouseMove = this.mouseMove.bind(this);
	    this.stopMoving = this.stopMoving.bind(this);
	    babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] = !(options && options.stretchToCanvasSize === false);
	    this.reset();
	  }
	  isEmpty() {
	    return !babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet];
	  }
	  reset() {
	    babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx].clearRect(0, 0, babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width, babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height);
	    babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] = false;
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`,
	        left: 0,
	        top: 0
	      }
	    });
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      style: {
	        transform: 'none',
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`
	      }
	    });
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        width: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width}px`,
	        height: `${babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height}px`,
	        left: 0,
	        top: 0
	      }
	    });
	    this.disableToMove();
	    this.emit('onReset', babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]);
	  }
	  set(imageNode) {
	    //region set image
	    const image = {
	      width: 0,
	      height: 0,
	      scale: 1,
	      name: imageNode["name"]
	    };
	    if (imageNode.clientWidth) {
	      image.width = imageNode.clientWidth;
	      image.height = imageNode.clientHeight;
	    } else {
	      image.width = imageNode.width;
	      image.height = imageNode.height;
	    }
	    if (image.width <= 0 || image.height <= 0) {
	      return;
	    }
	    const scaleForImage = Math.ceil(Math.max(image.width > Options.imageSize ? Options.imageSize / image.width : babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] !== false && image.width < babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / image.width : 1, image.height > Options.imageSize ? Options.imageSize / image.height : babelHelpers.classPrivateFieldLooseBase(this, _stretchToCanvasSize)[_stretchToCanvasSize] !== false && image.height < babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height / image.height : 1) * 1000) / 1000;
	    image.width = Math.ceil(image.width * scaleForImage);
	    image.height = Math.ceil(image.height * scaleForImage);
	    const k = Math.ceil(Math.max(image.width > 0 ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / image.width : 1, image.height > 0 ? babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height / image.height : 1) * 1000) / 1000;
	    image.scale = 0 < k && k < 1 ? k : 1;
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      props: {
	        width: image.width,
	        height: image.height
	      },
	      style: {
	        width: image.width + 'px',
	        height: image.height + 'px',
	        transform: 'scale(' + image.scale + ', ' + image.scale + ')'
	      },
	      dataset: {
	        width: image.width,
	        height: image.height,
	        scale: image.scale,
	        initialScale: image.scale,
	        hasChanged: false
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] = true;
	    babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx].drawImage(imageNode, 0, 0, image.width, image.height);
	    //endregion

	    //region set TableCloth
	    const tableFrame = {
	      width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width,
	      height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height
	    };
	    const tableCloth = {
	      width: 2 * tableFrame.width + Math.ceil(image.scale * image.width),
	      height: 2 * tableFrame.height + Math.ceil(image.scale * image.height),
	      left: -1 * Math.ceil((tableFrame.width + image.scale * image.width) / 2),
	      top: -1 * Math.ceil((tableFrame.height + image.scale * image.height) / 2)
	    };
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        width: `${tableCloth.width}px`,
	        height: `${tableCloth.height}px`,
	        top: `${tableCloth.top}px`,
	        left: `${tableCloth.left}px`
	      },
	      dataset: {
	        top: tableCloth.top,
	        left: tableCloth.left,
	        topToBeInTheCenter: tableCloth.top,
	        leftToBeInTheCenter: tableCloth.left,
	        height: tableCloth.height,
	        width: tableCloth.width
	      }
	    });
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        top: `${tableCloth.top * -1}px`,
	        left: `${tableCloth.left * -1}px`
	      }
	    });
	    //endregion

	    this.enableToMove();
	    this.emit('onSetImage', {
	      canvas: babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1]
	    });
	  }
	  scale(zoomScale) {
	    zoomScale = Math.max(0.01, 1 + zoomScale);
	    const oldScale = Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale);
	    const newScale = zoomScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.initialScale);
	    //region set image
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      style: {
	        transform: 'scale(' + newScale + ', ' + newScale + ')'
	      },
	      dataset: {
	        scale: newScale,
	        hasChanged: true
	      }
	    });
	    //endregion

	    //region set TableCloth
	    const tableFrame = {
	      height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height,
	      width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width
	    };
	    const tableCloth = {
	      height: 2 * tableFrame.height + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)),
	      width: 2 * tableFrame.width + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)),
	      topToBeInTheCenter: -1 * Math.ceil((tableFrame.height + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)) / 2),
	      leftToBeInTheCenter: -1 * Math.ceil((tableFrame.width + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)) / 2),
	      top: null,
	      left: null
	    };
	    const deltaTopOld = babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter;
	    const deltaTop = deltaTopOld / oldScale * newScale;
	    tableCloth.top = Math.ceil(tableCloth.topToBeInTheCenter + deltaTop);
	    tableCloth.top = Math.max(Math.min(tableCloth.top, 0), -1 * (Number(tableCloth.height) - tableFrame.height));
	    const deltaLeftOld = babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter;
	    const deltaLeft = deltaLeftOld / oldScale * newScale;
	    tableCloth.left = Math.ceil(deltaLeft + tableCloth.leftToBeInTheCenter);
	    tableCloth.left = Math.max(Math.min(tableCloth.left, 0), -1 * (Number(tableCloth.width) - tableFrame.width));
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        width: `${tableCloth.width}px`,
	        height: `${tableCloth.height}px`,
	        top: `${tableCloth.top}px`,
	        left: `${tableCloth.left}px`
	      },
	      dataset: {
	        top: tableCloth.top,
	        left: tableCloth.left,
	        topToBeInTheCenter: tableCloth.topToBeInTheCenter,
	        leftToBeInTheCenter: tableCloth.leftToBeInTheCenter,
	        height: tableCloth.height,
	        width: tableCloth.width
	      }
	    });
	    //endregion

	    //region set Table sights
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        top: `${tableCloth.top * -1}px`,
	        left: `${tableCloth.left * -1}px`
	      }
	    });
	    //endregion

	    this.emit('onScale', {
	      zoomScale,
	      scale: newScale,
	      topOffsetFromTheCenter: Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter),
	      leftOffsetFromTheCenter: Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter),
	      topInPercent: Math.ceil(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter)) / 1000,
	      leftInPercent: Math.ceil(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter)) / 1000,
	      oldScale
	    });
	  }
	  onScale({
	    data: {
	      oldScale,
	      scale,
	      topOffsetFromTheCenter,
	      leftOffsetFromTheCenter,
	      topInPercent,
	      leftInPercent
	    }
	  }) {
	    const deltaScale = scale / oldScale;
	    let top, left, newScale;
	    if (Number(oldScale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) {
	      newScale = scale;
	    } else {
	      newScale = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale * deltaScale;
	    }

	    //region set image
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      style: {
	        transform: 'scale(' + newScale + ', ' + newScale + ')'
	      },
	      dataset: {
	        scale: newScale,
	        hasChanged: true
	      }
	    });
	    //endregion

	    //region set TableCloth
	    const tableFrame = {
	      height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height,
	      width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width
	    };
	    const tableCloth = {
	      height: 2 * tableFrame.height + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)),
	      width: 2 * tableFrame.width + Math.ceil(newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)),
	      topToBeInTheCenter: -1 * Math.ceil((tableFrame.height + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.height)) / 2),
	      leftToBeInTheCenter: -1 * Math.ceil((tableFrame.width + newScale * Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.width)) / 2),
	      top: null,
	      left: null
	    };
	    if (Number(scale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) {
	      top = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) + topOffsetFromTheCenter;
	      left = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) + leftOffsetFromTheCenter;
	    } else {
	      top = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) * topInPercent);
	      left = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) * leftInPercent);
	    }
	    tableCloth.top = Math.max(Math.min(top, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height));
	    tableCloth.left = Math.max(Math.min(left, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width));
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        width: `${tableCloth.width}px`,
	        height: `${tableCloth.height}px`,
	        top: `${tableCloth.top}px`,
	        left: `${tableCloth.left}px`
	      },
	      dataset: {
	        top: tableCloth.top,
	        left: tableCloth.left,
	        topToBeInTheCenter: tableCloth.topToBeInTheCenter,
	        leftToBeInTheCenter: tableCloth.leftToBeInTheCenter,
	        height: tableCloth.height,
	        width: tableCloth.width
	      }
	    });
	    //endregion

	    //region set Table sights
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        top: `${tableCloth.top * -1}px`,
	        left: `${tableCloth.left * -1}px`
	      }
	    });
	    //endregion
	  }

	  enableToMove() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor === 'move') {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor = 'move';
	    main_core.Event.bind(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table], 'mousedown', e => {
	      this.cursor = {
	        startX: e.pageX,
	        startY: e.pageY
	      };
	      main_core.Event.bind(document, 'mousemove', this.mouseMove);
	      main_core.Event.bind(document, 'mouseup', this.stopMoving);
	    });
	  }
	  disableToMove() {
	    babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].style.cursor = 'default';
	    main_core.Event.unbindAll(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table]);
	    main_core.Event.unbind(document, 'mousemove', this.mouseMove);
	    main_core.Event.unbind(document, 'mouseup', this.stopMoving);
	  }
	  move(deltaX, deltaY) {
	    //region set image
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], {
	      dataset: {
	        hasChanged: true
	      }
	    });
	    //endregion

	    //region set TableCloth
	    const tableFrame = {
	      height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height,
	      width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width
	    };
	    const left = Math.max(Math.min(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) - deltaX, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - tableFrame.width));
	    const top = Math.max(Math.min(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) - deltaY, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - tableFrame.height));
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        top: `${top}px`,
	        left: `${left}px`
	      },
	      dataset: {
	        top: top,
	        left: left
	      }
	    });
	    this.emit('onMove', {
	      topOffsetFromTheCenter: top - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter),
	      leftOffsetFromTheCenter: left - Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter),
	      scale: babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale,
	      topInPercent: Math.ceil(top * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter)) / 1000,
	      leftInPercent: Math.ceil(left * 1000 / Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter)) / 1000
	    });
	    //region set Table sights
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableFrame)[_tableFrame], {
	      style: {
	        top: `${top * -1}px`,
	        left: `${left * -1}px`
	      }
	    });
	    //endregion
	  }

	  onMove({
	    data: {
	      scale,
	      topOffsetFromTheCenter,
	      leftOffsetFromTheCenter,
	      topInPercent,
	      leftInPercent
	    }
	  }) {
	    let top, left;
	    if (Number(scale) === Number(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale)) {
	      top = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) + topOffsetFromTheCenter;
	      left = Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) + leftOffsetFromTheCenter;
	    } else {
	      top = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter) * topInPercent);
	      left = Math.ceil(Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter) * leftInPercent);
	    }
	    left = Math.max(Math.min(left, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.width) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width));
	    top = Math.max(Math.min(top, 0), -1 * (Number(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.height) - babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height));
	    main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth], {
	      style: {
	        top: `${top}px`,
	        left: `${left}px`
	      },
	      dataset: {
	        top: top,
	        left: left
	      }
	    });
	  }
	  mouseMove(e) {
	    if (this.cursor === null) {
	      return;
	    }
	    this.move(this.cursor.startX - e.pageX, this.cursor.startY - e.pageY);
	    this.cursor.startX = e.pageX;
	    this.cursor.startY = e.pageY;
	  }
	  stopMoving() {
	    BX.unbind(document, "mousemove", this.mouseMove);
	    BX.unbind(document, "mouseup", this.stopMoving);
	  }
	  getCanvas() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1];
	  }
	  getContext() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _ctx)[_ctx];
	  }
	  getTable() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _table)[_table];
	  }
	  getTableCloth() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth];
	  }
	  packBlob() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _isSet)[_isSet] !== true) {
	      return Promise.reject({
	        message: 'Source canvas does not exist.',
	        code: 'empty data'
	      });
	    }
	    return new Promise((resolve, reject) => {
	      //region set TableCloth
	      const tableFrame = {
	        height: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].height,
	        width: babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width
	      };
	      const scale = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.scale;
	      const size = Math.min(Options.imageSize, Math.max(babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width / scale, babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width));
	      const scaleToResult = size / babelHelpers.classPrivateFieldLooseBase(this, _table)[_table].width;
	      const loader = CanvasLoader.getInstance();
	      loader.getCanvas().height = size;
	      loader.getCanvas().width = size;
	      loader.getContext().clearRect(0, 0, size, size);
	      //region getY
	      let imageY, imageY1, imageY2;
	      let canvasY1, canvasY2;
	      imageY = -1 * (babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.topToBeInTheCenter - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.top) + tableFrame.height / 2 - babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale / 2;
	      if (imageY > 0) {
	        canvasY1 = imageY;
	        imageY1 = 0;
	      } else {
	        canvasY1 = 0;
	        imageY1 = -1 * imageY;
	      }
	      imageY2 = imageY + babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale;
	      if (imageY2 > tableFrame.height) {
	        canvasY2 = tableFrame.height;
	        imageY2 = tableFrame.height - imageY;
	      } else {
	        canvasY2 = imageY2;
	        imageY2 = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].height * scale;
	      }
	      //endregion
	      //region getX
	      let imageX, imageX1, imageX2;
	      let canvasX1, canvasX2;
	      imageX = -1 * (babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.leftToBeInTheCenter - babelHelpers.classPrivateFieldLooseBase(this, _tableCloth)[_tableCloth].dataset.left) + tableFrame.width / 2 - babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale / 2;
	      if (imageX > 0) {
	        canvasX1 = imageX;
	        imageX1 = 0;
	      } else {
	        canvasX1 = 0;
	        imageX1 = -1 * imageX;
	      }
	      imageX2 = imageX + babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale;
	      if (imageX2 > tableFrame.width) {
	        canvasX2 = tableFrame.width;
	        imageX2 = tableFrame.width - imageX;
	      } else {
	        canvasX2 = imageX2;
	        imageX2 = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].width * scale;
	      }
	      //endregion

	      imageX1 /= scale;
	      imageX2 /= scale;
	      imageY1 /= scale;
	      imageY2 /= scale;
	      canvasX1 *= scaleToResult;
	      canvasY1 *= scaleToResult;
	      canvasX2 *= scaleToResult;
	      canvasY2 *= scaleToResult;
	      loader.getContext().drawImage(babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1], imageX1, imageY1, imageX2 - imageX1, imageY2 - imageY1, canvasX1, canvasY1, canvasX2 - canvasX1, canvasY2 - canvasY1);
	      const changed = babelHelpers.classPrivateFieldLooseBase(this, _canvas$1)[_canvas$1].dataset.changed;
	      loader.pack().then(blob => {
	        blob.changed = changed;
	        blob.width = size;
	        blob.height = size;
	        resolve(blob);
	      }).catch(error => {
	        reject(error);
	      });
	    });
	  }
	}
	CanvasDefault.imageSize = {
	  width: 1024,
	  height: 1024
	};

	var _fileName = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("fileName");
	var _applyNameAndExtensionToBlob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("applyNameAndExtensionToBlob");
	class CanvasMaster extends CanvasDefault {
	  constructor(...args) {
	    super(...args);
	    Object.defineProperty(this, _applyNameAndExtensionToBlob, {
	      value: _applyNameAndExtensionToBlob2
	    });
	    Object.defineProperty(this, _fileName, {
	      writable: true,
	      value: void 0
	    });
	  }
	  load(file) {
	    this.emit('onLoad');
	    babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] = null;
	    return new Promise((resolve, reject) => {
	      this.reset();
	      CanvasLoader.loadFile(file, imageNode => {
	        babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] = imageNode.name;
	        this.set(imageNode);
	        resolve();
	      }, () => {
	        this.emit('onError', main_core.Loc.getMessage('JS_AVATAR_EDITOR_ERROR_IMAGE_DEPLOYING'));
	        reject();
	      });
	    });
	  }
	  getBlob() {
	    return new Promise((resolve, reject) => {
	      this.packBlob().then(blob => {
	        babelHelpers.classPrivateFieldLooseBase(this, _applyNameAndExtensionToBlob)[_applyNameAndExtensionToBlob](blob);
	        resolve({
	          blob
	        });
	      }).catch(reject);
	    });
	  }
	}
	function _applyNameAndExtensionToBlob2(result) {
	  result.name = babelHelpers.classPrivateFieldLooseBase(this, _fileName)[_fileName] || 'image';
	  let ext = result.name.split('.').pop().toLowerCase();
	  ext = ext === result.name ? '' : ext;
	  if (result.type === 'image/png' && ext !== 'png') {
	    if ('jpg,bmp,jpeg,jpe,gif,png,webp'.lastIndexOf(ext) > 0) {
	      result.name = result.name.substr(0, result.name.lastIndexOf('.'));
	    }
	    result.name = [result.name || 'image', 'png'].join('.');
	  }
	  return result;
	}

	class CanvasPreview extends CanvasDefault {}

	var _stepSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("stepSize");
	var _value = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("value");
	var _defaultValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("defaultValue");
	var _containerWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("containerWidth");
	var _minValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("minValue");
	var _maxValue = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxValue");
	var _scale = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("scale");
	var _knob = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("knob");
	var _getContainerWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getContainerWidth");
	var _makeAStep = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("makeAStep");
	var _adjust = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("adjust");
	class CanvasZooming extends main_core_events.EventEmitter {
	  constructor({
	    knob,
	    scale,
	    minus,
	    plus
	  }, defaultValue) {
	    super();
	    Object.defineProperty(this, _adjust, {
	      value: _adjust2
	    });
	    Object.defineProperty(this, _makeAStep, {
	      value: _makeAStep2
	    });
	    Object.defineProperty(this, _getContainerWidth, {
	      value: _getContainerWidth2
	    });
	    Object.defineProperty(this, _stepSize, {
	      writable: true,
	      value: 0.01
	    });
	    Object.defineProperty(this, _value, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _defaultValue, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _containerWidth, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _minValue, {
	      writable: true,
	      value: -1
	    });
	    Object.defineProperty(this, _maxValue, {
	      writable: true,
	      value: 1
	    });
	    Object.defineProperty(this, _scale, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _knob, {
	      writable: true,
	      value: void 0
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    main_core.Event.bind(minus, 'click', () => {
	      babelHelpers.classPrivateFieldLooseBase(this, _makeAStep)[_makeAStep](false);
	    });
	    main_core.Event.bind(plus, 'click', () => {
	      babelHelpers.classPrivateFieldLooseBase(this, _makeAStep)[_makeAStep](true);
	    });
	    this.stopMoving = this.stopMoving.bind(this);
	    this.move = this.move.bind(this);
	    main_core.Event.bind(knob, 'mousedown', event => {
	      this.startMoving(event);
	    });
	    if (defaultValue) {
	      this.setDefaultValue(defaultValue);
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _scale)[_scale] = scale;
	    babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob] = knob;
	    this.reset();
	  }
	  setDefaultValue(defaultValue) {
	    babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue] = defaultValue > babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue] && defaultValue <= babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue] ? defaultValue : 0;
	    return this;
	  }
	  getValue() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _value)[_value];
	  }
	  reset() {
	    babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] = babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue];
	    babelHelpers.classPrivateFieldLooseBase(this, _adjust)[_adjust]();
	  }
	  setValue(value) {
	    // eslint-disable-next-line no-param-reassign
	    value = Math.ceil(value * 1000) / 1000;
	    if (value !== babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] && value >= babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue] && value <= babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] = value;
	      babelHelpers.classPrivateFieldLooseBase(this, _adjust)[_adjust]();
	      this.emit('onChange', babelHelpers.classPrivateFieldLooseBase(this, _value)[_value] - babelHelpers.classPrivateFieldLooseBase(this, _defaultValue)[_defaultValue]);
	    }
	  }
	  move({
	    pageX
	  }) {
	    if (pageX > 0 && babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth]() > 0) {
	      const percent = (pageX - babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX) / babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth]();
	      babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX = pageX;
	      this.setValue(this.getValue() + percent);
	    }
	  }
	  startMoving({
	    pageX
	  }) {
	    babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob].startPageX = pageX;
	    main_core.Event.bind(document, 'mousemove', this.move);
	    main_core.Event.bind(document, 'mouseup', this.stopMoving);
	  }
	  stopMoving() {
	    main_core.Event.unbind(document, 'mousemove', this.move);
	    main_core.Event.unbind(document, 'mouseup', this.stopMoving);
	  }
	}
	function _getContainerWidth2() {
	  if (babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth] > 0) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth];
	  }
	  const containerPos = main_core.Dom.getPosition(babelHelpers.classPrivateFieldLooseBase(this, _scale)[_scale]);
	  const width = containerPos.width - main_core.Dom.getPosition(babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob]).width;
	  if (width > 0) {
	    babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth] = width;
	    return babelHelpers.classPrivateFieldLooseBase(this, _containerWidth)[_containerWidth];
	  }
	  return 0;
	}
	function _makeAStep2(increase) {
	  const value = Math.min(Math.max(this.getValue() + (increase === false ? -1 : 1) * babelHelpers.classPrivateFieldLooseBase(this, _stepSize)[_stepSize], 0), 1);
	  this.setValue(value);
	}
	function _adjust2() {
	  const middle = babelHelpers.classPrivateFieldLooseBase(this, _getContainerWidth)[_getContainerWidth]() / (babelHelpers.classPrivateFieldLooseBase(this, _maxValue)[_maxValue] - babelHelpers.classPrivateFieldLooseBase(this, _minValue)[_minValue]);
	  const value = middle + middle * this.getValue();
	  main_core.Dom.adjust(babelHelpers.classPrivateFieldLooseBase(this, _knob)[_knob], {
	    style: {
	      left: [Math.ceil(value), 'px'].join('')
	    }
	  });
	}

	var _canvas$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvas");
	var _ctx$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ctx");
	var _container$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("container");
	var _activeMask = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("activeMask");
	class CanvasMask extends main_core_events.EventEmitter {
	  constructor(container) {
	    super();
	    Object.defineProperty(this, _canvas$2, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _ctx$1, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _container$1, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _activeMask, {
	      writable: true,
	      value: null
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1] = container;
	    this.set = this.set.bind(this);
	    this.mask = this.mask.bind(this);
	    this.unmask = this.unmask.bind(this);
	  }
	  mask({
	    id,
	    src,
	    thumb
	  }) {
	    main_core.Dom.style(babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1], 'background-image', 'url("' + main_core.Text.encode(thumb) + '")');
	    babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] = {
	      id,
	      src
	    };
	    CanvasLoader.loadFile(src, this.set, this.unmask);
	  }
	  set(imageSource) {
	    //region set image
	    const trueK = Math.max(imageSource.width > 0 ? Options.maskSize / imageSource.width : 1, imageSource.height > 0 ? Options.maskSize / imageSource.height : 1);
	    const sourceS = parseInt(Options.maskSize / trueK);
	    const sourceX = parseInt((imageSource.width - sourceS) / 2);
	    const sourceY = parseInt((imageSource.height - sourceS) / 2);
	    this.getCanvas().width = Options.maskSize;
	    this.getCanvas().height = Options.maskSize;
	    this.getContext().clearRect(0, 0, Options.maskSize, Options.maskSize);
	    this.getContext().drawImage(imageSource, sourceX, sourceY, sourceS, sourceS, 0, 0, Options.maskSize, Options.maskSize);
	    //endregion
	  }

	  applyAndPack(imageSource) {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] === null || imageSource.width < 100 || imageSource.height < 100) {
	      return Promise.reject({
	        message: 'Image for masking has not appropriate format',
	        code: 'bad image'
	      });
	    }
	    return new Promise(resolve => {
	      const trueK = Math.max(imageSource.width > 0 ? Options.maskSize / imageSource.width : 1, imageSource.height > 0 ? Options.maskSize / imageSource.height : 1);
	      const sourceS = parseInt(Options.maskSize / trueK);
	      const sourceX = parseInt((imageSource.width - sourceS) / 2);
	      const sourceY = parseInt((imageSource.height - sourceS) / 2);
	      const loader = CanvasLoader.getInstance();
	      loader.getCanvas().width = Options.maskSize;
	      loader.getCanvas().height = Options.maskSize;
	      loader.getContext().clearRect(0, 0, Options.maskSize, Options.maskSize);
	      loader.getContext().drawImage(imageSource, sourceX, sourceY, sourceS, sourceS, 0, 0, Options.maskSize, Options.maskSize);
	      loader.getContext().drawImage(this.getCanvas(), 0, 0, Options.maskSize, Options.maskSize);
	      loader.pack('image/png').then(blob => {
	        blob.name = 'mask.png';
	        blob.maskId = babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask].id;
	        resolve(blob, babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask].id);
	      });
	    });
	  }
	  getCanvas() {
	    if (!babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2] = document.createElement('CANVAS');
	    }
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvas$2)[_canvas$2];
	  }
	  getContext() {
	    if (!babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1] = this.getCanvas().getContext("2d");
	    }
	    return babelHelpers.classPrivateFieldLooseBase(this, _ctx$1)[_ctx$1];
	  }
	  unmask() {
	    babelHelpers.classPrivateFieldLooseBase(this, _container$1)[_container$1].style.backgroundImage = '';
	    babelHelpers.classPrivateFieldLooseBase(this, _activeMask)[_activeMask] = null;
	  }
	}

	let _$9 = t => t,
	  _t$9;
	const hiddenCanvas = Symbol('hiddenCanvas');
	var _id$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _activeTabId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("activeTabId");
	var _previousActiveTabId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("previousActiveTabId");
	var _tabs = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tabs");
	var _canvasMaster = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasMaster");
	var _canvasPreview = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasPreview");
	var _canvasZooming = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasZooming");
	var _canvasMask = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("canvasMask");
	var _setActiveTabByDefault = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setActiveTabByDefault");
	var _setPreviousActiveTab = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setPreviousActiveTab");
	var _selectFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("selectFile");
	var _snapAPicture = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("snapAPicture");
	class Editor extends main_core_events.EventEmitter {
	  constructor(options) {
	    super();
	    Object.defineProperty(this, _snapAPicture, {
	      value: _snapAPicture2
	    });
	    Object.defineProperty(this, _selectFile, {
	      value: _selectFile2
	    });
	    Object.defineProperty(this, _setPreviousActiveTab, {
	      value: _setPreviousActiveTab2
	    });
	    Object.defineProperty(this, _setActiveTabByDefault, {
	      value: _setActiveTabByDefault2
	    });
	    Object.defineProperty(this, _id$2, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _activeTabId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _previousActiveTabId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _tabs, {
	      writable: true,
	      value: new Map()
	    });
	    this.cache = new main_core.Cache.MemoryCache();
	    Object.defineProperty(this, _canvasMaster, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _canvasPreview, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _canvasZooming, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _canvasMask, {
	      writable: true,
	      value: void 0
	    });
	    this.setEventNamespace('Main.Avatar.Editor');
	    babelHelpers.classPrivateFieldLooseBase(this, _id$2)[_id$2] = Editor.justANumber++;
	    options = main_core.Type.isPlainObject(options) ? options : {};
	    const tabsWithThePictureInside = [[CanvasTab, true], [MaskTab, options.enableMask, null]];
	    tabsWithThePictureInside.forEach(([tabClass, enabled, initialOptions]) => {
	      if (enabled === true && tabClass.isAvailable() !== false) {
	        const tab = new tabClass(initialOptions);
	        babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].set(tabClass.code, tab);
	        tab.subscribe('onSetMask', ({
	          data
	        }) => {
	          this.getContainer().setAttribute('data-badge-is-set', 'Y');
	          babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].mask(data);
	        });
	        tab.subscribe('onUnsetMask', () => {
	          this.getContainer().removeAttribute('data-badge-is-set');
	          babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].unmask();
	        });
	      }
	    });
	    const tabsWithConnectionsToThePicture = [[UploadTab, options.enableUpload, options.uploadTabOptions], [CameraTab, options.enableCamera, null]];
	    tabsWithConnectionsToThePicture.forEach(([tabClass, enabled, initialOptions]) => {
	      if (enabled !== false && tabClass.isAvailable() !== false) {
	        const tab = new tabClass(initialOptions);
	        babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].set(tabClass.code, tab);
	        tab.setParentTab(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(CanvasTab.code));
	        tab.subscribe('onClickBack', () => {
	          this.setActiveTab(CanvasTab.code);
	        });
	        tab.subscribe('onSetFile', ({
	          data
	        }) => {
	          if (data instanceof Blob) {
	            babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(data);
	          } else {
	            babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].set(data);
	          }
	          this.setActiveTab(CanvasTab.code);
	        });
	        if (tab instanceof CameraTab) {
	          this.subscribe('onOpen', () => {
	            if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) {
	              tab.activate.call(tab);
	            }
	          });
	          this.subscribe('onClose', () => {
	            if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) {
	              tab.inactivate.call(tab);
	            }
	          });
	        }
	      }
	    });
	    let theFutureActiveTab = babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId];
	    babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].forEach((tab, tabId) => {
	      if (!theFutureActiveTab || babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(theFutureActiveTab).getPriority() < tab.getPriority()) {
	        theFutureActiveTab = tabId;
	      }
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](theFutureActiveTab);
	    main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onEditMask', baseEvent => {
	      //TODO describe that true mask has changed and this view is not actual.
	    });
	    main_core_events.EventEmitter.subscribe(this.getEventNamespace() + ':' + 'onDeleteMask', baseEvent => {
	      //TODO describe that true mask has changed and this view is not actual.
	    });
	    this.init();
	  }
	  init() {
	    if (!this.getContainer().querySelector('canvas[data-bx-canvas="canvas"]')) {
	      return setTimeout(this.init.bind(this), 1);
	    }
	    const tabsWithConnectionsToThePicture = [UploadTab, CameraTab];
	    tabsWithConnectionsToThePicture.forEach(tabClass => {
	      this.getContainer().setAttribute('data-bx-' + tabClass.code + '-tab-available', babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(tabClass.code) ? 'Y' : 'N');
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster] = new CanvasMaster(this.getContainer().querySelector('canvas[data-bx-canvas="canvas"]'));
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview] = new CanvasPreview(this.getContainer().querySelector('canvas[data-bx-canvas="preview"]'));
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming] = new CanvasZooming({
	      knob: this.getContainer().querySelector('[data-bx-role="zoom-knob"]'),
	      scale: this.getContainer().querySelector('[data-bx-role="zoom-scale"]'),
	      plus: this.getContainer().querySelector('[data-bx-role="zoom-plus-button"]'),
	      minus: this.getContainer().querySelector('[data-bx-role="zoom-minus-button"]')
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask] = babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code) ? new CanvasMask(this.getContainer().querySelector('[data-bx-role="canvas-mask"]')) : false;
	    this.getContainer().querySelector('[data-bx-role="unset-canvas-mask"]').addEventListener('click', () => {
	      this.getContainer().removeAttribute('data-badge-is-set');
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].unmask();
	      babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(MaskTab.code).unmask();
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onLoad', event => {
	      this.getContainer().setAttribute('data-bx-canvas-load-status', 'loading');
	      this.emit('onChange');
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onReset', event => {
	      this.getContainer().setAttribute('data-bx-canvas-load-status', 'isnotset');
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset();
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].reset();
	      this.emit('onChange');
	    });
	    this.getContainer().setAttribute('data-bx-canvas-load-status', 'isnotset');
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onSetImage', ({
	      data: {
	        canvas
	      }
	    }) => {
	      this.getContainer().setAttribute('data-bx-canvas-load-status', 'set');
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset();
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].set(canvas);
	      this.emit('onSet');
	      this.emit('onChange');
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onMove', event => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].onMove(event);
	      this.emit('onChange');
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onScale', event => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].onScale(event);
	      this.emit('onChange');
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].subscribe('onChange', ({
	      data
	    }) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].scale(data);
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].subscribe('onError', ({
	      data
	    }) => {
	      this.getContainer().setAttribute('data-bx-canvas-load-status', 'errored');
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming].reset();
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasPreview)[_canvasPreview].reset();
	      this.getContainer().querySelector('[data-bx-role="tab-canvas-error"]').innerHTML = data;
	    });
	    this.emit('onReady');
	  }
	  ready(callback) {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster]) {
	      callback.call();
	    } else {
	      this.subscribe('onReady', callback);
	    }
	    return this;
	  }
	  getId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _id$2)[_id$2];
	  }
	  getContainer() {
	    return this.cache.remember('container', () => {
	      const res = main_core.Tag.render(_t$9 || (_t$9 = _$9`
				<div class="ui-avatar-editor__tab-wrapper ui-avatar-editor--scope">
					<input type="hidden" data-bx-active-tab="doesNotMatterForNowItIsAFile">
					<div class="ui-avatar-editor__tab-button-container" data-bx-role="headers" style="display:none;"></div>
					<div class="ui-avatar-editor__tab-container">
						<div data-bx-role="bodies"></div>
						<div class="ui-avatar-editor__tab-avatar-block">
							<div class="ui-avatar-editor__tab-avatar-inner">
								<div class="ui-avatar-editor__arrow-icon-container">
									<span class="ui-avatar-editor__arrow-icon"></span>
								</div>
								<div class="ui-avatar-editor__tab-avatar-image-container">
									<div data-bx-role="unset-canvas-mask" class="ui-avatar-editor__tab-avatar-image-not-allowed"></div>
									<span class="ui-avatar-editor__tab-avatar-image-item" data-bx-role="canvas-button">
										<div data-editor-role="preview-holder">
											<canvas data-bx-canvas="preview" height="165" width="165"></canvas>
										</div>
										<div class="ui-avatar-editor__tab-avatar-mask" data-bx-role="canvas-mask"></div>
									</span>
								</div>
								<div class="ui-avatar-editor__tab-avatar-desc-container">
									<span class="ui-avatar-editor__tab-avatar-desc-item"></span>
								</div>
							</div>
						</div>
					</div>
				</div>`));
	      const headers = res.querySelector('[data-bx-role="headers"]');
	      const bodies = res.querySelector('[data-bx-role="bodies"]');
	      Array.from(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].entries()).forEach(([itemId, itemTab]) => {
	        main_core.Event.bind(itemTab.getHeaderContainer(), 'click', () => {
	          this.setActiveTab(itemId);
	        });
	        main_core.Dom.append(itemTab.getHeaderContainer(), headers);
	        main_core.Dom.append(itemTab.getBodyContainer(), bodies);
	      });
	      if (headers.querySelectorAll('[data-bx-state="visible"]').length > 1) {
	        headers.style.display = "block";
	      }
	      [[UploadTab.code, res.querySelector('[data-bx-role="button-add-picture"][data-bx-id="upload-file"]'), () => {
	        babelHelpers.classPrivateFieldLooseBase(this, _selectFile)[_selectFile]();
	      }], [CameraTab.code, res.querySelector('[data-bx-role="button-add-picture"][data-bx-id="snap-picture"]'), () => {
	        babelHelpers.classPrivateFieldLooseBase(this, _snapAPicture)[_snapAPicture]();
	      }]].forEach(([tabName, buttonNode, callback]) => {
	        if (babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(tabName)) {
	          main_core.Event.bind(buttonNode, 'click', callback);
	        } else {
	          main_core.Dom.remove(buttonNode);
	        }
	      });
	      return res;
	    });
	  }
	  setActiveTab(activeTab, isIt = false) {
	    if (!babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(activeTab)) {
	      return null;
	    }
	    const activeTabChangesCounter = this.cache.get('activeTabChangesCounter') || 0;
	    if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] !== activeTab) {
	      if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === null) {
	        babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] = activeTab;
	      } else if (babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId])) {
	        babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]).inactivate();
	      }
	      if (babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === UploadTab.code || babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] === CameraTab.code) {
	        babelHelpers.classPrivateFieldLooseBase(this, _previousActiveTabId)[_previousActiveTabId] = babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId];
	      }
	      babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId] = activeTab;
	      babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]).activate();
	    }
	    this.cache.set('activeTabChangesCounter', activeTabChangesCounter + 1);
	    return babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(babelHelpers.classPrivateFieldLooseBase(this, _activeTabId)[_activeTabId]);
	  }
	  getTab(tabName) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(tabName);
	  }
	  loadJSON(data) {
	    return this.loadData(JSON.parse(data));
	  }
	  loadData(data) {
	    return new Promise((resolve, reject) => {
	      if (main_core.Type.isPlainObject(data) && data['src']) {
	        babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(data['src']).then(() => {
	          if (data['maskId'] && babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code)) {
	            babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].get(MaskTab.code).maskById(data['maskId']);
	            babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](MaskTab.code);
	          } else {
	            babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](CanvasTab.code);
	          }
	          resolve(data['src'], this);
	        }).catch(reject);
	      } else {
	        babelHelpers.classPrivateFieldLooseBase(this, _setActiveTabByDefault)[_setActiveTabByDefault](UploadTab.code);
	        resolve(null, this);
	      }
	    });
	  }
	  loadSrc(src) {
	    return new Promise((resolve, reject) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].load(src).then(() => {
	        this.setActiveTab(babelHelpers.classPrivateFieldLooseBase(this, _tabs)[_tabs].has(MaskTab.code) ? MaskTab.code : CanvasTab.code);
	        resolve(src, this);
	      }).catch(() => {
	        babelHelpers.classPrivateFieldLooseBase(this, _setPreviousActiveTab)[_setPreviousActiveTab]();
	        reject(src, this);
	      });
	    });
	  }
	  reset() {
	    babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].reset();
	    babelHelpers.classPrivateFieldLooseBase(this, _setPreviousActiveTab)[_setPreviousActiveTab]();
	    return this;
	  }
	  packBlobAndMask() {
	    return new Promise((resolve, reject) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].getBlob().then(({
	        blob
	      }) => {
	        var _loader$hiddenCanvas;
	        const loader = CanvasLoader.getInstance();
	        loader[hiddenCanvas] = (_loader$hiddenCanvas = loader[hiddenCanvas]) != null ? _loader$hiddenCanvas : document.createElement('canvas');
	        const canvas = loader[hiddenCanvas];
	        canvas.width = blob.width;
	        canvas.height = blob.height;
	        canvas.getContext('2d').drawImage(loader.getCanvas(), 0, 0);
	        if (!babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask]) {
	          return resolve({
	            blob,
	            canvas
	          });
	        }
	        babelHelpers.classPrivateFieldLooseBase(this, _canvasMask)[_canvasMask].applyAndPack(canvas).then((maskedBlob, maskId) => {
	          resolve({
	            blob,
	            maskedBlob,
	            maskId,
	            canvas
	          });
	        }).catch(() => {
	          resolve({
	            blob,
	            canvas
	          });
	        });
	      }).catch(error => {
	        return reject(error);
	      });
	    });
	  }
	  packBlob() {
	    return new Promise((resolve, reject) => {
	      babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].getBlob().then(resolve).catch(reject);
	    });
	  }
	  isEmpty() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].isEmpty();
	  }
	  isModified() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster].imageFrame.changed;
	  }
	  getCanvasEditor() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvasMaster)[_canvasMaster];
	  }
	  getCanvasZooming() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _canvasZooming)[_canvasZooming];
	  }
	  destroy() {}
	  static createInstance(id, options) {
	    if (this.repo.has(id)) {
	      this.repo.get(id).destroy();
	    }
	    const editor = new this(options);
	    if (document.querySelector('#' + id)) {
	      editor.ready(() => {
	        editor.loadJSON(document.querySelector('#' + id).getAttribute('data-bx-ui-avatar-editor-info'));
	      });
	    }
	    if (main_core.Type.isStringFilled(id)) {
	      this.repo.set(id, editor);
	    }
	    return editor;
	  }
	  static getInstanceById(id) {
	    if (this.repo.has(id)) {
	      return this.repo.get(id);
	    }
	    return null;
	  }
	  static getOrCreateInstanceById(id, options) {
	    return this.getInstanceById(id) || this.createInstance(...arguments);
	  }
	}
	function _setActiveTabByDefault2(activeTab) {
	  if (this.cache.get('activeTabChangesCounter') > 0) {
	    return;
	  }
	  this.setActiveTab(activeTab);
	  this.cache.delete('activeTabChangesCounter');
	}
	function _setPreviousActiveTab2() {
	  this.setActiveTab(babelHelpers.classPrivateFieldLooseBase(this, _previousActiveTabId)[_previousActiveTabId]);
	}
	function _selectFile2() {
	  // this.#canvasMaster.reset();
	  this.setActiveTab(UploadTab.code);
	  return this;
	}
	function _snapAPicture2() {
	  // this.#canvasMaster.reset();
	  this.setActiveTab(CameraTab.code);
	  return this;
	}
	Editor.justANumber = 0;
	Editor.repo = new Map();

	var _getPopup = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getPopup");
	class EditorInPopup extends Editor {
	  constructor(...args) {
	    super(...args);
	    Object.defineProperty(this, _getPopup, {
	      value: _getPopup2
	    });
	  }
	  hide() {
	    babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().close();
	  }
	  show(tabCode) {
	    this.ready(() => {
	      babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().show();
	      if (main_core.Type.isStringFilled(tabCode)) {
	        this.setActiveTab(tabCode);
	      }
	    });
	  }
	  showFile(url) {
	    this.ready(() => {
	      babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]().show();
	      if (url) {
	        return this.loadSrc(url);
	      }
	    });
	  }
	  apply() {
	    this.packBlobAndMask().then(({
	      blob,
	      maskedBlob,
	      maskId,
	      canvas
	    }) => {
	      if (blob instanceof Blob) {
	        if (maskId > 0) {
	          Backend.useRecently(maskId);
	        }
	        const ev = new main_core_events.BaseEvent({
	          compatData: [blob, canvas],
	          data: {
	            blob,
	            maskedBlob
	          }
	        });
	        main_core_events.EventEmitter.emit(this, 'onApply', ev, {
	          useGlobalNaming: true
	        });
	        this.emit('onApply', ev);
	      }
	    }).catch(error => {
	      console.log('error: ', error);
	    });
	  }
	  onApply(callback) {
	    this.subscribe('onApply', callback);
	    return this;
	  }
	  subscribeOnFormIsReady(fieldName, callback) {
	    this.subscribe('onApply', event => {
	      const formObj = new FormData();
	      const {
	        blob,
	        maskedBlob
	      } = event.getData();
	      formObj.append(fieldName, blob, blob['name']);
	      const maskedFileId = ['maskedFile', Editor.justANumber++].join(':');
	      formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + fieldName, maskedFileId);
	      if (maskedBlob) {
	        formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + '[' + maskedFileId + ']', maskedBlob, blob['name']);
	        formObj.append(main_core.Loc.getMessage('UI_AVATAR_MASK_REQUEST_FIELD_NAME') + '[' + maskedFileId + '][maskId]', maskedBlob['maskId']);
	        callback(new main_core_events.BaseEvent({
	          data: {
	            form: formObj,
	            blob,
	            maskedBlob,
	            maskId: maskedBlob['maskId']
	          }
	        }));
	      } else {
	        callback(new main_core_events.BaseEvent({
	          data: {
	            form: formObj,
	            blob
	          }
	        }));
	      }
	    });
	  }

	  //region Compatibility
	  click() {
	    this.show();
	  }
	  get popup() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _getPopup)[_getPopup]();
	  }
	  static isCameraAvailable() {
	    return CameraTab.isAvailable();
	  }
	  //endregion
	}
	function _getPopup2() {
	  this.cache.remember('okButton', () => {
	    const okButton = new ui_buttons.SaveButton({
	      onclick: () => {
	        if (okButton.getState() === ui_buttons.ButtonState.ACTIVE) {
	          this.apply();
	        }
	        this.hide();
	      }
	    });
	    if (this.isEmpty()) {
	      okButton.setState(ui_buttons.ButtonState.DISABLED);
	      this.subscribeOnce('onSet', () => {
	        okButton.setState(ui_buttons.ButtonState.ACTIVE);
	      });
	    }
	    return okButton;
	  });
	  return this.cache.remember('popup', () => {
	    return main_popup.PopupManager.create('popup_' + this.getId(), null, {
	      className: "ui-avatar-editor__popup",
	      autoHide: false,
	      lightShadow: true,
	      closeIcon: true,
	      closeByEsc: true,
	      titleBar: main_core.Loc.getMessage('JS_AVATAR_EDITOR_TITLE_BAR'),
	      content: this.getContainer(),
	      zIndex: BX.PopupWindowManager.getMaxZIndex() + 1,
	      overlay: {},
	      contentColor: "white",
	      contentNoPaddings: true,
	      bindOnResize: false,
	      draggable: true,
	      isScrollBlock: true,
	      buttons: [this.cache.remember('okButton'), new ui_buttons.CancelButton({
	        onclick: () => {
	          this.hide();
	        }
	      })],
	      events: {
	        onShow: () => {
	          this.emit('onOpen');
	        },
	        onClose: () => {
	          this.emit('onClose');
	        }
	      }
	    });
	  });
	}

	var _id$3 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _showSlider$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("showSlider");

	let currentEditor = EditorInPopup;
	/**
	 * @namespace BX.UI.AvatarEditor
	 */
	function createInstance() {
	  return currentEditor.createInstance(...arguments);
	}
	function isCameraAvailable() {
	  return currentEditor.isCameraAvailable();
	}
	function getInstanceById() {
	  return currentEditor.getInstanceById(...arguments);
	}
	function getOrCreateInstanceById() {
	  return currentEditor.getOrCreateInstanceById(...arguments);
	}
	CameraTab.check();
	const BX$1 = main_core.Reflection.namespace('BX');
	BX$1.AvatarEditor = currentEditor;

	exports.Editor = currentEditor;
	exports.MaskEditor = MaskEditor;
	exports.createInstance = createInstance;
	exports.getInstanceById = getInstanceById;
	exports.getOrCreateInstanceById = getOrCreateInstanceById;
	exports.isCameraAvailable = isCameraAvailable;

}((this.BX.UI.AvatarEditor = this.BX.UI.AvatarEditor || {}),BX,BX,BX,BX.UI.EntitySelector,BX.UI.Dialogs,BX,BX,BX.Event,BX.Main,BX.UI,BX.UI.SidePanel));
//# sourceMappingURL=main.avatar-editor.bundle.js.map

Youez - 2016 - github.com/yon3zu
LinuXploit