{"version":3,"sources":["../node_modules/typed-signals/dist/Collector.js","../node_modules/typed-signals/dist/CollectorArray.js","../node_modules/typed-signals/dist/CollectorLast.js","../node_modules/typed-signals/dist/CollectorUntil0.js","../node_modules/typed-signals/dist/CollectorWhile0.js","../node_modules/typed-signals/dist/SignalConnection.js","../node_modules/typed-signals/dist/SignalLink.js","../node_modules/typed-signals/dist/Signal.js","../node_modules/typed-signals/dist/SignalConnections.js","../node_modules/typed-signals/dist/index.js","../src/managers/DeviceManager.ts","../src/pixi/AbstractPixiRoot.ts","../src/pixi/base/GameView.ts","../src/pixi/base/GameObject.ts","../src/pixi/base/GameDispatcher.ts","../src/pixi/base/GameScreen.ts","../src/pixi/effects/BackgroundEffect.ts","../src/utils/MathUtils.ts","../src/pixi/utils/RectangleUtils.ts","../src/pixi/utils/ViewUtils.ts","../src/pixi/base/GameWaiter.ts","../src/pixi/base/GameDialog.ts","../src/managers/SoundManager.ts","../src/utils/DateUtils.ts","../src/managers/AbstractPreferencesManager.ts","../src/utils/ObjectUtils.ts","../src/pixi/layers/GameDialogLayer.ts","../src/pixi/layers/GameScreenLayer.ts","../src/pixi/base/GameSplashScreen.ts","../src/pixi/layers/SplashLayer.ts","../src/pixi/layers/UILayer.ts","../src/pixi/layers/WaiterLayer.ts","../src/utils/ArrayUtils.ts","../src/pixi/base/GameJuggler.ts","../src/pixi/base/GamePool.ts","../src/pixi/base/GameSprite.ts","../src/pixi/dialogs/AbstractInfoDialog.ts","../src/pixi/base/GameScreenNavigator.ts","../src/pixi/assets/PixiAssetsLoader.ts","../src/pixi/flump/library/LibraryFlump.ts","../src/pixi/flump/library/KeyframeMold.ts","../src/pixi/flump/library/MovieLayerMold.ts","../src/pixi/flump/display/Placer.ts","../src/pixi/flump/display/Container.ts","../src/pixi/flump/library/MovieLayer.ts","../src/utils/FuncUtil.ts","../src/pixi/flump/display/Movie.ts","../src/pixi/flump/library/MovieMold.ts","../src/pixi/flump/display/Button.ts","../src/pixi/flump/display/TabButton.ts","../src/pixi/flump/display/ClickArea.ts","../src/pixi/flump/display/TextInput.ts","../src/pixi/flump/display/Checkbox.ts","../src/pixi/flump/library/AtlasTextureMold.ts","../src/pixi/flump/library/AtlasMold.ts","../src/pixi/flump/library/TextureGroupMold.ts","../src/pixi/flump/library/LibraryMold.ts","../src/pixi/spine/SpineMovie.ts","../src/pixi/spine/LibrarySpine.ts","../src/pixi/text/LibraryText.ts","../src/pixi/quadtree/GameQuadtreeView.ts","../src/pixi/quadtree/Quadtree.ts","../src/pixi/quadtree/QuadtreeNode.ts","../src/pixi/ui/Input.ts","../src/pixi/ui/utils/helpers/view.ts","../src/pixi/ui/List.ts","../src/pixi/ui/ScrollBox.ts","../src/pixi/ui/utils/trackpad/Trackpad.ts","../src/pixi/ui/utils/trackpad/Spring.ts","../src/pixi/ui/utils/trackpad/ScrollSpring.ts","../src/pixi/ui/utils/trackpad/SlidingNumber.ts","../src/pixi/ui/utils/HelpTypes.ts","../src/pixi/ui/utils/helpers/cleanup.ts","../src/pixi/ui/utils/helpers/fit.ts","../src/pixi/ui/utils/helpers/resize.ts","../src/pixi/ui/utils/helpers/styles.ts","../src/pixi/ui/utils/helpers/text.ts","../src/managers/ErrorManager.ts","../src/managers/NetworkManager.ts","../src/managers/LocaleManager.ts","../src/app/AbstractApp.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Collector = void 0;\n/**\n * Base class for collectors.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass Collector {\n    /**\n     * Create a new collector.\n     *\n     * @param signal The signal to emit.\n     */\n    constructor(signal) {\n        // eslint-disable-next-line dot-notation\n        this.emit = (...args) => {\n            // eslint-disable-next-line dot-notation\n            signal[\"emitCollecting\"](this, args);\n        };\n    }\n}\nexports.Collector = Collector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CollectorArray = void 0;\nconst Collector_1 = require(\"./Collector\");\n/**\n * Returns the result of the all signal handlers from a signal emission in an array.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass CollectorArray extends Collector_1.Collector {\n    constructor() {\n        super(...arguments);\n        this.result = [];\n    }\n    handleResult(result) {\n        this.result.push(result);\n        return true;\n    }\n    /**\n     * Get the list of results from the signal handlers.\n     */\n    getResult() {\n        return this.result;\n    }\n    /**\n     * Reset the result\n     */\n    reset() {\n        this.result.length = 0;\n    }\n}\nexports.CollectorArray = CollectorArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CollectorLast = void 0;\nconst Collector_1 = require(\"./Collector\");\n/**\n * Returns the result of the last signal handler from a signal emission.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass CollectorLast extends Collector_1.Collector {\n    handleResult(result) {\n        this.result = result;\n        return true;\n    }\n    /**\n     * Get the result of the last signal handler.\n     */\n    getResult() {\n        return this.result;\n    }\n    /**\n     * Reset the result\n     */\n    reset() {\n        delete this.result;\n    }\n}\nexports.CollectorLast = CollectorLast;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CollectorUntil0 = void 0;\nconst Collector_1 = require(\"./Collector\");\n/**\n * Keep signal emissions going while all handlers return true.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass CollectorUntil0 extends Collector_1.Collector {\n    constructor() {\n        super(...arguments);\n        this.result = false;\n    }\n    handleResult(result) {\n        this.result = result;\n        return this.result;\n    }\n    /**\n     * Get the result of the last signal handler.\n     */\n    getResult() {\n        return this.result;\n    }\n    /**\n     * Reset the result\n     */\n    reset() {\n        this.result = false;\n    }\n}\nexports.CollectorUntil0 = CollectorUntil0;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CollectorWhile0 = void 0;\nconst Collector_1 = require(\"./Collector\");\n/**\n * Keep signal emissions going while all handlers return false.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass CollectorWhile0 extends Collector_1.Collector {\n    constructor() {\n        super(...arguments);\n        this.result = false;\n    }\n    handleResult(result) {\n        this.result = result;\n        return !this.result;\n    }\n    /**\n     * Get the result of the last signal handler.\n     */\n    getResult() {\n        return this.result;\n    }\n    /**\n     * Reset the result\n     */\n    reset() {\n        this.result = false;\n    }\n}\nexports.CollectorWhile0 = CollectorWhile0;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalConnectionImpl = void 0;\n/**\n * Implementation of SignalConnection, for internal use only.\n * @private\n */\nclass SignalConnectionImpl {\n    /**\n     * @param link The actual link of the connection.\n     * @param parentCleanup Callback to cleanup the parent signal when a connection is disconnected\n     */\n    constructor(link, parentCleanup) {\n        this.link = link;\n        this.parentCleanup = parentCleanup;\n    }\n    disconnect() {\n        if (this.link !== null) {\n            this.link.unlink();\n            this.link = null;\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            this.parentCleanup();\n            this.parentCleanup = null;\n            return true;\n        }\n        return false;\n    }\n    set enabled(enable) {\n        if (this.link)\n            this.link.setEnabled(enable);\n    }\n    get enabled() {\n        // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n        return this.link !== null && this.link.isEnabled();\n    }\n}\nexports.SignalConnectionImpl = SignalConnectionImpl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalLink = void 0;\n/**\n * SignalLink implements a doubly-linked ring with nodes containing the signal handlers.\n * @private\n */\nclass SignalLink {\n    constructor(prev = null, next = null, order = 0) {\n        this.enabled = true;\n        this.newLink = false;\n        this.callback = null;\n        this.prev = prev !== null && prev !== void 0 ? prev : this;\n        this.next = next !== null && next !== void 0 ? next : this;\n        this.order = order;\n    }\n    isEnabled() {\n        return this.enabled && !this.newLink;\n    }\n    setEnabled(flag) {\n        this.enabled = flag;\n    }\n    unlink() {\n        this.callback = null;\n        this.next.prev = this.prev;\n        this.prev.next = this.next;\n    }\n    insert(callback, order) {\n        let after = this.prev;\n        while (after !== this) {\n            if (after.order <= order)\n                break;\n            after = after.prev;\n        }\n        const link = new SignalLink(after, after.next, order);\n        link.callback = callback;\n        after.next = link;\n        link.next.prev = link;\n        return link;\n    }\n}\nexports.SignalLink = SignalLink;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Signal = void 0;\nconst SignalConnection_1 = require(\"./SignalConnection\");\nconst SignalLink_1 = require(\"./SignalLink\");\n/**\n * A signal is a way to publish and subscribe to events.\n *\n * @typeparam THandler The function signature to be implemented by handlers.\n */\nclass Signal {\n    constructor() {\n        this.head = new SignalLink_1.SignalLink();\n        this.hasNewLinks = false;\n        this.emitDepth = 0;\n        this.connectionsCount = 0;\n    }\n    /**\n     * @returns The number of connections on this signal.\n     */\n    getConnectionsCount() {\n        return this.connectionsCount;\n    }\n    /**\n     * @returns true if this signal has connections.\n     */\n    hasConnections() {\n        return this.connectionsCount > 0;\n    }\n    /**\n     * Subscribe to this signal.\n     *\n     * @param callback This callback will be run when emit() is called.\n     * @param order Handlers with a higher order value will be called later.\n     */\n    connect(callback, order = 0) {\n        this.connectionsCount++;\n        const link = this.head.insert(callback, order);\n        if (this.emitDepth > 0) {\n            this.hasNewLinks = true;\n            link.newLink = true;\n        }\n        return new SignalConnection_1.SignalConnectionImpl(link, () => this.decrementConnectionCount());\n    }\n    decrementConnectionCount() {\n        this.connectionsCount--;\n    }\n    /**\n     * Unsubscribe from this signal with the original callback instance.\n     * While you can use this method, the SignalConnection returned by connect() will not be updated!\n     *\n     * @param callback The callback you passed to connect().\n     */\n    disconnect(callback) {\n        for (let link = this.head.next; link !== this.head; link = link.next) {\n            if (link.callback === callback) {\n                this.decrementConnectionCount();\n                link.unlink();\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Disconnect all handlers from this signal event.\n     */\n    disconnectAll() {\n        while (this.head.next !== this.head) {\n            this.head.next.unlink();\n        }\n        this.connectionsCount = 0;\n    }\n    /**\n     * Publish this signal event (call all handlers).\n     */\n    emit(...args) {\n        this.emitDepth++;\n        for (let link = this.head.next; link !== this.head; link = link.next) {\n            if (link.isEnabled() && link.callback)\n                link.callback.apply(null, args);\n        }\n        this.emitDepth--;\n        this.unsetNewLink();\n    }\n    emitCollecting(collector, args) {\n        this.emitDepth++;\n        for (let link = this.head.next; link !== this.head; link = link.next) {\n            if (link.isEnabled() && link.callback) {\n                const result = link.callback.apply(null, args);\n                if (!collector.handleResult(result))\n                    break;\n            }\n        }\n        this.emitDepth--;\n        this.unsetNewLink();\n    }\n    unsetNewLink() {\n        if (this.hasNewLinks && this.emitDepth === 0) {\n            for (let link = this.head.next; link !== this.head; link = link.next)\n                link.newLink = false;\n            this.hasNewLinks = false;\n        }\n    }\n}\nexports.Signal = Signal;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalConnections = void 0;\n/**\n * Represents a list of connections to a signal for easy disconnect.\n */\nclass SignalConnections {\n    constructor() {\n        this.list = [];\n    }\n    /**\n     * Add a connection to the list.\n     * @param connection\n     */\n    add(connection) {\n        this.list.push(connection);\n    }\n    /**\n     * Disconnect all connections in the list and empty the list.\n     */\n    disconnectAll() {\n        for (const connection of this.list) {\n            connection.disconnect();\n        }\n        this.list = [];\n    }\n    /**\n     * @returns The number of connections in this list.\n     */\n    getCount() {\n        return this.list.length;\n    }\n    /**\n     * @returns true if this list is empty.\n     */\n    isEmpty() {\n        return this.list.length === 0;\n    }\n}\nexports.SignalConnections = SignalConnections;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalConnections = exports.Signal = exports.CollectorWhile0 = exports.CollectorUntil0 = exports.CollectorLast = exports.CollectorArray = exports.Collector = void 0;\nvar Collector_1 = require(\"./Collector\");\nObject.defineProperty(exports, \"Collector\", { enumerable: true, get: function () { return Collector_1.Collector; } });\nvar CollectorArray_1 = require(\"./CollectorArray\");\nObject.defineProperty(exports, \"CollectorArray\", { enumerable: true, get: function () { return CollectorArray_1.CollectorArray; } });\nvar CollectorLast_1 = require(\"./CollectorLast\");\nObject.defineProperty(exports, \"CollectorLast\", { enumerable: true, get: function () { return CollectorLast_1.CollectorLast; } });\nvar CollectorUntil0_1 = require(\"./CollectorUntil0\");\nObject.defineProperty(exports, \"CollectorUntil0\", { enumerable: true, get: function () { return CollectorUntil0_1.CollectorUntil0; } });\nvar CollectorWhile0_1 = require(\"./CollectorWhile0\");\nObject.defineProperty(exports, \"CollectorWhile0\", { enumerable: true, get: function () { return CollectorWhile0_1.CollectorWhile0; } });\nvar Signal_1 = require(\"./Signal\");\nObject.defineProperty(exports, \"Signal\", { enumerable: true, get: function () { return Signal_1.Signal; } });\nvar SignalConnections_1 = require(\"./SignalConnections\");\nObject.defineProperty(exports, \"SignalConnections\", { enumerable: true, get: function () { return SignalConnections_1.SignalConnections; } });\n","import {Device} from \"@capacitor/device\";\nimport {App} from \"@capacitor/app\";\nimport {SafeArea} from 'capacitor-plugin-safe-area';\nimport {SecureStoragePlugin} from \"capacitor-secure-storage-plugin\";\nimport {GameDispatcher} from \"../pixi\";\n\nexport class DeviceDetectorService {\n\n  private userAgent: string;\n\n  constructor() {\n    this.userAgent = navigator.userAgent || '';\n  }\n\n  public isMobile(): boolean {\n    return /Mobi|Android|iPhone|iPod|IEMobile|Opera Mini/i.test(this.userAgent);\n  }\n\n  public isTablet(): boolean {\n    return /iPad|Tablet|PlayBook|Silk/i.test(this.userAgent);\n  }\n\n  public isDesktop(): boolean {\n    return !this.isMobile() && !this.isTablet();\n  }\n\n  public getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\n    if (this.isTablet()) return 'tablet';\n    if (this.isMobile()) return 'mobile';\n    return 'desktop';\n  }\n\n  public getOS(): string {\n    if (/Windows NT/i.test(this.userAgent)) return 'Windows';\n    if (/Macintosh|Mac OS X/i.test(this.userAgent)) return 'macOS';\n    if (/Linux/i.test(this.userAgent)) return 'Linux';\n    if (/Android/i.test(this.userAgent)) return 'Android';\n    if (/iPhone|iPad|iPod/i.test(this.userAgent)) return 'iOS';\n    return 'Unknown';\n  }\n\n  public getBrowser(): string {\n    if (/Chrome\\/\\d+/i.test(this.userAgent)) return 'Chrome';\n    if (/Firefox\\/\\d+/i.test(this.userAgent)) return 'Firefox';\n    if (/Safari\\/\\d+/i.test(this.userAgent) && !/Chrome/i.test(this.userAgent)) return 'Safari';\n    if (/Edg\\/\\d+/i.test(this.userAgent)) return 'Edge';\n    if (/MSIE|Trident/i.test(this.userAgent)) return 'Internet Explorer';\n    return 'Unknown';\n  }\n\n  public getInfo() {\n    return {\n      userAgent: this.userAgent,\n      deviceType: this.getDeviceType(),\n      os: this.getOS(),\n      browser: this.getBrowser(),\n    };\n  }\n}\n\n\nexport class DeviceManager {\n\n  public readonly onAppUrlOpenWithUrl = new GameDispatcher(this);\n  public readonly onActivateEvent = new GameDispatcher(this);\n  public readonly onDeactivateEvent = new GameDispatcher(this);\n  public readonly onWindowResize = new GameDispatcher(this);\n  public readonly onExit = new GameDispatcher(this);\n\n  private _deviceLanguageCode = 'en';\n  private _isAndroid = false;\n  private _isIOS = false;\n  private _isTablet = false;\n  private _isDesktop = false;\n  private _isMobile = false;\n  private _deviceName = '';\n  private _deviceModel = '';\n  private _deviceManufacturer = '';\n  private _deviceOSName = '';\n  private _deviceOperatingSystem = '';\n  private _deviceOSVersion = '';\n  private _appOpenWithUrl = '';\n  private _safeAreaTop = 0;\n  private _safeAreaBottom = 0;\n  private _resizeDebounceTimerId: any = null;\n  private _resizeDebounceTime = 200; // ms\n  private _lastWindowWidth = 0;\n  private _lastWindowHeight = 0;\n\n  public async init() {\n    await this.waitForDOMReady();\n\n    let deviceDetector = new DeviceDetectorService();\n    this._isTablet = deviceDetector.isTablet();\n    this._isDesktop = deviceDetector.isDesktop();\n    this._isMobile = deviceDetector.isMobile();\n\n    const languageCode = await Device.getLanguageCode();\n    this._deviceLanguageCode = languageCode.value;\n\n    const deviceInfo = await Device.getInfo();\n    this._deviceName = deviceInfo.name || '';\n    this._deviceModel = deviceInfo.model;\n    this._deviceManufacturer = deviceInfo.manufacturer;\n    this._deviceOSName = deviceInfo.operatingSystem;\n    this._deviceOSVersion = deviceInfo.osVersion;\n    this._deviceOperatingSystem = deviceInfo.operatingSystem;\n\n    this._isAndroid = deviceInfo.platform === 'android';\n    this._isIOS = deviceInfo.platform === 'ios';\n\n    let launchData = await App.getLaunchUrl();\n    this._appOpenWithUrl = launchData?.url || '';\n    if (this._appOpenWithUrl) {\n      this.onAppUrlOpenWithUrl.dispatch();\n    }\n    void App.addListener('appUrlOpen', data => {\n      this._appOpenWithUrl = data.url;\n      this.onAppUrlOpenWithUrl.dispatch();\n    });\n\n    if (this._isDesktop) {\n      document.addEventListener('visibilitychange', () => {\n        if (document.visibilityState === 'visible') {\n          this.onActivate();\n        } else {\n          this.onDeactivate();\n        }\n      });\n    } else {\n      void App.addListener('pause', () => this.onDeactivate());\n      void App.addListener('resume', () => this.onActivate());\n    }\n\n    await this.updateSafeArea();\n\n    this._lastWindowWidth = window.innerWidth;\n    this._lastWindowHeight = window.innerHeight;\n    window.addEventListener('resize', ()=>{\n      this.checkWindowResize();\n    });\n    window.addEventListener('orientationchange', ()=>{\n      this.checkWindowResize();\n    });\n    void App.addListener('appStateChange', ({ isActive }) => {\n      if (isActive) {\n        this.checkWindowResize();\n      }\n    });\n  }\n\n  get isPortrait() {\n    return window.innerHeight > window.innerWidth;\n  }\n\n  get isLandscape() {\n    return window.innerWidth > window.innerHeight;\n  }\n\n  get devicePixelRatio() {\n    return window.devicePixelRatio || 1;\n  }\n\n  private async checkWindowResize() {\n    clearTimeout(this._resizeDebounceTimerId);\n    const onWindowResize = async () => {\n      const newWidth = window.innerWidth;\n      const newHeight = window.innerHeight;\n      if (this._lastWindowWidth != newWidth || this._lastWindowHeight != newHeight) {\n        this._lastWindowWidth = newWidth;\n        this._lastWindowHeight = newHeight;\n        await this.updateSafeArea();\n        this.onWindowResize.dispatch();\n      }\n    }\n    this._resizeDebounceTimerId = setTimeout(onWindowResize, this._resizeDebounceTime); // задержка 200 мс, можно настроить\n  }\n\n  private async updateSafeArea(){\n    if (this.isMobile) {\n      const safeArea = await SafeArea.getSafeAreaInsets();\n      this._safeAreaTop = safeArea.insets.top;\n      this._safeAreaBottom = safeArea.insets.bottom;\n    }\n    else {\n      const style = getComputedStyle(document.documentElement);\n      const top = style.getPropertyValue('--safe-area-inset-top');\n      const bottom = style.getPropertyValue('--safe-area-inset-bottom');\n      this._safeAreaTop = parseInt(top) || 0;\n      this._safeAreaBottom = parseInt(bottom) || 0;\n    }\n  }\n\n  get safeAreaTop(): number {\n    return this._safeAreaTop;\n  }\n\n  get safeAreaBottom(): number {\n    return this._safeAreaBottom;\n  }\n\n  private onActivate() {\n    this.onActivateEvent.dispatch();\n  }\n\n  private onDeactivate() {\n    this.onDeactivateEvent.dispatch();\n  }\n\n  public forceExit() {\n    this.onExit.dispatch();\n    if (this._isMobile) {\n      App.exitApp();\n    }\n  }\n\n  private async waitForDOMReady() {\n    if (document.readyState === 'complete' || document.readyState === 'interactive') return;\n    return new Promise<void>((resolve) => {\n      document.addEventListener('DOMContentLoaded', () => resolve(), { once: true });\n    });\n  }\n\n  public get appOpenWithUrl() { return this._appOpenWithUrl; }\n  public get deviceLanguageCode() { return this._deviceLanguageCode; }\n  public get deviceName() { return this._deviceName; }\n  public get deviceOperatingSystem() { return this._deviceOperatingSystem; }\n  public get deviceModel() { return this._deviceModel; }\n  public get deviceManufacturer() { return this._deviceManufacturer; }\n  public get deviceOSName() { return this._deviceOSName; }\n  public get deviceOSVersion() { return this._deviceOSVersion; }\n  public get isTablet() { return this._isTablet; }\n  public get isDesktop() { return this._isDesktop; }\n  public get isMobile() { return this._isMobile; }\n  public get isAndroid() { return this._isAndroid; }\n  public get isIOS() { return this._isIOS; }\n\n  public async getDeviceId() {\n    return await Device.getId();\n  }\n\n  public async getPersistentSecureDeviceId() {\n    let { value } = await SecureStoragePlugin.get({ key: 'deviceId' }).catch(() => ({ value: null }));\n    if (!value) {\n      let DeviceId = await this.getDeviceId();\n      let id = DeviceId.identifier;\n      await SecureStoragePlugin.set({ key: 'deviceId', value: id });\n      return id;\n    }\n    return value;\n  }\n\n  public async getDeviceInfo() {\n    return await Device.getInfo();\n  }\n\n  public async getLanguageCode() {\n    return await Device.getLanguageCode();\n  }\n}\n","import * as PIXI from \"pixi.js\"\nimport {GameDispatcher} from \"./base/GameDispatcher\";\nimport {GameScreenNavigator} from \"./base/GameScreenNavigator\";\nimport {AbstractApp} from \"../app/AbstractApp\";\nimport {PixiAssetsLoader} from \"./assets\";\nimport {GameJuggler} from \"./base\";\nimport {Rectangle} from \"pixi.js\";\n\nexport type PixiAssetsScaleFactor = 2 | 4;\n\nexport abstract class AbstractPixiRoot extends GameScreenNavigator {\n\n  readonly app:AbstractApp;\n  readonly pixi: PIXI.Application;\n\n  readonly onScreenHierarchyChanged = new GameDispatcher(this);\n  readonly webglcontextlost = new GameDispatcher();\n  readonly webglcontextrestored = new GameDispatcher();\n\n  protected _currentPixiWidth = 0;\n  protected _currentPixiHeight = 0;\n\n  // 1536 - for scaleFactor 4; 768 - for scaleFactor 2;\n  protected _scaleFactor:PixiAssetsScaleFactor = 4;\n  protected _fixedStageWidth = 0;\n  protected _safeAreaTop = 0;\n  protected _safeAreaBottom = 0;\n  protected _fixedStageHeight = 0;\n  protected _isInitialized:boolean = false;\n\n  protected _pixiContainer!:HTMLElement;\n  protected _pixiContainerResizeObserver:ResizeObserver | null = null;\n\n  protected static _isLoadKTX2Initialized = false;\n\n  constructor(app:AbstractApp) {\n    super();\n    this.root = this;\n    this._juggler = new GameJuggler(this, null);\n    this.app = app;\n    this.pixi = new PIXI.Application();\n  }\n\n  get isInitialized() {\n    return this._isInitialized;\n  }\n\n  override destroy() {\n    super.destroy();\n    this.onScreenHierarchyChanged.destroy();\n    this._pixiContainerResizeObserver?.unobserve(this._pixiContainer);\n    this._pixiContainerResizeObserver?.disconnect();\n    this.app.device.onActivateEvent.remove(this.onActivate);\n    this.app.device.onDeactivateEvent.remove(this.onDeActivate);\n    this.app.device.onExit.remove(this.onExit);\n    this.app.device.onWindowResize.remove(this.onResize);\n  }\n\n  get scaleFactor() {\n    return this._scaleFactor;\n  }\n\n  static multiply(scaleFactor:PixiAssetsScaleFactor) {\n    if (scaleFactor == 4) {\n      return 1;\n    }\n    if (scaleFactor == 2) {\n      return .5;\n    }\n    return 1;\n  }\n\n  get fixedStageWidth() {\n    return this._fixedStageWidth;\n  }\n\n  get fixedStageHeight() {\n    return this._fixedStageHeight;\n  }\n\n  get safeZoneBottom() {\n    return this._safeAreaBottom;\n  }\n\n  get safeZoneTop() {\n    return this._safeAreaTop;\n  }\n\n  get fixedStageSafeHeight() {\n    return this._fixedStageHeight - this.safeZoneBottom - this.safeZoneTop;\n  }\n\n  adapt(size: number) {\n    if (this.scaleFactor == 4) {\n      return size;\n    }\n    if (this.scaleFactor == 2) {\n      return .5 * size;\n    }\n    return size;\n  }\n\n  deAdaptsize(size: number) {\n    if (this.scaleFactor == 4)\n      return size;\n    if (this.scaleFactor == 2)\n      return 2 * size;\n    return size;\n  }\n\n  lock() {\n    this.interactive = false;\n  }\n\n  unlock() {\n    this.interactive = true;\n  }\n  \n  get uiLib() {\n    return this.assetsLoader!.getFlumpLib('ui')!;\n  }\n\n  get mainTextLib() {\n    return this.assetsLoader!.getTextLib('main')!;\n  }\n\n  get dialogTitleTextLib() {\n    return this.assetsLoader!.getTextLib('dialogTitle')!;\n  }\n\n  public async init(pixiContainer: HTMLElement, options: {\n    backgroundColor: number,\n    backgroundAlpha: number,\n  } = {\n    backgroundAlpha: 1,\n    backgroundColor: 0xfbf4d9\n  }) {\n    if (this._isInitialized) {\n      return;\n    }\n\n    this._pixiContainer = pixiContainer;\n\n    await this.pixi.init({\n      width: this._pixiContainer.clientWidth,\n      height: this._pixiContainer.clientHeight,\n      backgroundColor: options.backgroundColor,\n      backgroundAlpha: options.backgroundAlpha,\n      resolution: this.app.device.devicePixelRatio, // влияет только на четкость изображения, оставить так\n      autoDensity: true,\n    });\n\n    this._pixiContainer.appendChild(this.pixi.canvas);\n    this.pixi.stage.addChild(this);\n\n    // this.pixi.stage.boundsArea = new Rectangle(0, 0, this._pixiContainer.clientWidth, this._pixiContainer.clientHeight);\n    // this.boundsArea = new Rectangle(0, 0, this._pixiContainer.clientWidth, this._pixiContainer.clientHeight);\n\n    // CONTEXT LOSS HANDLING\n    this.pixi.canvas.addEventListener(\"webglcontextlost\", (e) => {\n      // window.location.reload();\n      this.webglcontextlost.dispatch();\n    });\n    this.pixi.canvas.addEventListener(\"webglcontextrestored\", (e) => {\n      // SandboxPixiRoot.log('CONTEXT RESTORED');\n      this.webglcontextrestored.dispatch();\n    });\n\n    const physicalHeight = window.screen.height * this.app.device.devicePixelRatio;\n    if (physicalHeight >= (this.app.device.isAndroid ? 1280 : 1120)) {\n      this._scaleFactor = 4;\n      this._fixedStageWidth = 1536;\n      this._fixedStageHeight = 2048;\n    } else {\n      this._scaleFactor = 2;\n      this._fixedStageWidth = 768;\n      this._fixedStageHeight = 1024;\n    }\n\n    this._pixiContainerResizeObserver = new ResizeObserver((entries) => {\n      this.onResize();\n    });\n    this._pixiContainerResizeObserver.observe(this._pixiContainer);\n    this.app.device.onWindowResize.add(this.onResize, this);\n    this.onResize();\n\n    this.pixi.ticker.minFPS = 60;\n    this.pixi.ticker.maxFPS = 60;\n    this.pixi.ticker.add((now) => {\n      this.juggler?.advanceTime(now.deltaMS / 1000);\n    });\n\n    if (!AbstractPixiRoot._isLoadKTX2Initialized) {\n      AbstractPixiRoot._isLoadKTX2Initialized = true;\n      PIXI.extensions.add(\n          PIXI.loadKTX2,\n      );\n    }\n\n    this._isInitialized = true;\n  }\n\n  override onResize() {\n    let newWidth = this._pixiContainer.clientWidth;\n    let newHeight = this._pixiContainer.clientHeight;\n\n    if (this._currentPixiWidth != newWidth || this._currentPixiHeight != newHeight) {\n      this._currentPixiWidth = newWidth;\n      this._currentPixiHeight = newHeight;\n\n      this._safeAreaTop = this.app.device.safeAreaTop;\n      this._safeAreaBottom = this.app.device.safeAreaBottom;\n\n      // this.pixi.stage.boundsArea.width = newWidth;\n      // this.pixi.stage.boundsArea.height = newHeight;\n\n      this.pixi.renderer.resize(\n          newWidth,\n          newHeight\n      );\n\n      let rootScale = newHeight / this._fixedStageHeight;\n      this._fixedStageWidth = newWidth / rootScale;\n      this.scale = rootScale;\n\n\n      // todo ??? расчитывать четко по краям экрана\n      // this.boundsArea.width = this._fixedStageWidth / rootScale;\n      // this.boundsArea.height = this._fixedStageHeight / rootScale;\n\n      super.onResize();\n    }\n  }\n  \n  public createTextureByColor(color:PIXI.Color){\n    const graphics = new PIXI.Graphics();\n    graphics.beginFill(color); // Красный цвет\n    graphics.drawRect(0, 0, 1, 1); // Рисуем прямоугольник 100x100\n    graphics.endFill();\n\n    const renderTexture = PIXI.RenderTexture.create({ width: 1, height: 1 });\n    this.pixi.renderer.render(graphics, { renderTexture });\n    return new PIXI.Texture(renderTexture);\n  }\n}\n","import {IDestroy} from \"./GameObject\";\nimport {GameJuggler, GameTween, IAnimatable} from \"./GameJuggler\";\nimport * as PIXI from 'pixi.js';\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {Easing} from \"@tweenjs/tween.js\";\n\nexport class GameView extends PIXI.Container implements IDestroy, IAnimatable {\n\n  public root!:AbstractPixiRoot;\n\n  constructor(...args: any[]) {\n    super();\n    // this.interactive = false;\n  }\n\n  public onResize(): void {\n  }\n\n  override set interactive(value: boolean) {\n    super.interactive = value;\n    this.interactiveChildren = value;\n  }\n\n  protected get pulsatingDisplayObject(): GameView {\n    return this;\n  }\n\n  protected _pulsateTween?: GameTween;\n\n  public startPulsating(scaleDiff: number = 0.03, time: number = 0.6) {\n    this._pulsateTween?.destroy();\n    // console.log(this.pulsatingDisplayObject.scale.x, this.pulsatingDisplayObject.scale.y);\n\n    this._pulsateTween = this.juggler.tween(this.pulsatingDisplayObject, 2, {\n      scale: {\n        y: this.pulsatingDisplayObject.scale.y - scaleDiff,\n        x: this.pulsatingDisplayObject.scale.x - scaleDiff * 3,\n      }\n    })\n      .repeat(Infinity)\n      .yoyoFix((t: any) => Easing.Linear.InOut(t)).start();\n  }\n\n  public continuePulsating(): void {\n    // Main.log('continuePulsating')\n    if (this._pulsateTween) {\n      this.juggler.addAnimatable(this._pulsateTween);\n    }\n  }\n\n  public stopPulsating(): void {\n    if (this._pulsateTween) {\n      this.juggler.removeAnimatable(this._pulsateTween);\n    }\n  }\n\n  protected _juggler?: GameJuggler;\n\n  public advanceTime(delta: number) {\n  }\n\n  addToJuggler(): void {\n    this.juggler?.addAnimatable(this);\n  }\n\n  removeFromJuggler() {\n    this.juggler?.removeAnimatable(this);\n  }\n\n  onRemovedFromJuggler() {\n\n  }\n\n  public get juggler() {\n    return this._juggler || this.root?.juggler;\n  }\n\n  public set juggler(value: GameJuggler) {\n    this._juggler = value;\n  }\n\n\n  destroyChildren() {\n    while (this.children.length > 0) {\n      const child = this.removeChildAt(0);\n      if ('destroy' in child && typeof child.destroy === 'function') {\n        child.destroy({ children: true });\n      }\n    }\n  }\n\n  override destroy() {\n    if (this.destroyed) {\n      return;\n    }\n    this._pulsateTween?.destroy();\n    this.removeFromJuggler();\n    this.removeFromParent();\n    this.destroyChildren();\n    super.destroy({\n      children: true\n    });\n  }\n\n}\n","import {GameJuggler, IAnimatable} from \"./GameJuggler\";\nimport {GamePool, IPoolable} from \"./GamePool\";\nimport {Container} from \"pixi.js/lib/scene/container/Container\";\nimport {GameView} from \"./GameView\";\nimport * as PIXI from 'pixi.js';\n\nexport interface IDestroy {\n  destroy(): void;\n  get destroyed(): boolean;\n}\n\nconst isIDestroy = (obj: any) => {\n  return obj &&\n    typeof obj.destroy === 'function' &&\n    typeof obj.destroyed === 'boolean';\n}\n\nexport class GameObject implements IDestroy, IPoolable, IAnimatable {\n\n  protected _isDestroyed = false;\n\n  protected _juggler: GameJuggler | null = null;\n\n  public advanceTime(delta: number) {\n  }\n\n  addToJuggler(): void {\n    this.juggler?.addAnimatable(this);\n  }\n\n  onRemovedFromJuggler() {\n\n  }\n\n  removeFromJuggler() {\n    this.juggler?.removeAnimatable(this);\n  }\n\n  public get juggler(): GameJuggler | null {\n    return this._juggler;\n  }\n\n  public set juggler(value: GameJuggler) {\n    this._juggler = value;\n  }\n\n  public get destroyed(): boolean {\n    return this._isDestroyed;\n  }\n\n  static destroy(object: any) {\n    if (!object) {\n      return null;\n    }\n\n    // first check on interfaces\n\n    if (object instanceof GameObject || object instanceof GameView) {\n      (object as IDestroy).destroy();\n      return null;\n    }\n\n    if (isIDestroy(object)) {\n      (object as IDestroy).destroy();\n      return null;\n    }\n\n    // second check on implementations\n\n    if (Array.isArray(object)) {\n      const objects = object as Object[] | null; // Проверяем, является ли объект массивом\n      if (objects) {\n        while (objects.length) {\n          this.destroy(objects.pop()!); // Вызываем dispose для каждого элемента\n        }\n      }\n      return null;\n    }\n\n    if (object instanceof PIXI.Container) {\n      let container = object as Container;\n      container.removeFromParent();\n      container.destroy({children: true});\n    }\n\n    return null;\n  }\n\n  public onReturnToPool(): void {\n  }\n\n  public onGetFromPool(pool: GamePool): void {\n  }\n\n  public destroy(): void {\n    if (!this._isDestroyed) {\n      this._isDestroyed = true;\n      this.removeFromJuggler();\n    }\n  }\n\n}\n","import {GameObject} from \"./GameObject\";\n\nexport type GameDispatcherListener = (sender?: GameObject | null, argument?: any | null) => void;\n\nexport class GameDispatcher extends GameObject {\n  private _sender?: any | null;\n  private _listeners?: Map<GameDispatcherListener, GameDispatcherListener> | null;\n\n  constructor(sender?: any) {\n    super();\n    this._sender = sender;\n    this._listeners = new Map();\n  }\n\n  public add(listener: GameDispatcherListener, context: any): void {\n    if (this._isDestroyed || !listener) {\n      return;\n    }\n\n    if (!this._listeners!.has(listener)) {\n      // Привязываем к переданному контексту (если есть) или оставляем оригинал\n      const boundListener = context ? listener.bind(context) : listener;\n      this._listeners!.set(listener, boundListener);\n    }\n  }\n\n  public remove(listener: GameDispatcherListener): void {\n    if (this.destroyed || !listener) {\n      return;\n    }\n\n    // Удаляем оригинальный и привязанный вариант\n    if (this._listeners!.has(listener)) {\n      this._listeners!.delete(listener);\n    }\n  }\n\n  public dispatch(argument?: any): void {\n    if (this._isDestroyed || !this._listeners) {\n      return;\n    }\n\n    // Вызываем привязанные функции\n    for (const [, boundListener] of this._listeners) {\n      boundListener(this._sender, argument);\n    }\n  }\n\n  public hasListener(listener: GameDispatcherListener): boolean {\n    if (this.destroyed || !listener) {\n      return false;\n    }\n\n    return this._listeners!.has(listener);\n  }\n\n  public removeAllListeners(): void {\n    if (this._listeners) {\n      this._listeners.clear();\n    }\n  }\n\n  override destroy(): void {\n    if (this._listeners) {\n      this._listeners.clear();\n      this._listeners = null;\n    }\n    this._sender = null;\n    super.destroy();\n  }\n}\n","import {GameView} from \"./GameView\";\nimport * as PIXI from \"pixi.js\";\nimport {BackgroundEffect} from \"../effects/BackgroundEffect\";\nimport {GameObject} from \"./GameObject\";\nimport {RectangleUtils, ScaleMode} from \"../utils/RectangleUtils\";\nimport {PixiAssetsLoader} from \"../assets/PixiAssetsLoader\";\n\nexport class GameScreen extends GameView {\n\n  public assetsLoader: PixiAssetsLoader | null = null;\n  \n  protected _bgImage?: PIXI.Sprite | null = null;\n  protected _bgParticleEffect: BackgroundEffect | null = null;\n  protected _isAdded = false;\n\n  constructor() {\n    super();\n    // this.interactive = true;\n  }\n\n  public getAreaForHtml(){\n    return this.boundsArea;\n  }\n\n  public get screenID() {\n    return \"GameScreen\";\n  }\n\n  override destroy() {\n    super.destroy();\n    this._bgImage = GameObject.destroy(this._bgImage);\n    this._bgParticleEffect = GameObject.destroy(this._bgParticleEffect);\n    this.assetsLoader = GameObject.destroy(this.assetsLoader);\n  }\n\n  public async onAdded() {\n    this._isAdded = true;\n  }\n\n  public getStateDescription() {\n    return \"GameScreen: \";\n  }\n\n  public async loadAssets(onLoad?: () => void) {\n    if (onLoad) {\n      onLoad();\n    }\n  }\n\n  public createBg() {\n    this._bgImage = new PIXI.Sprite(this.getBgTexture());\n    this._bgImage.interactive = false;\n\n    const launchImageSize = RectangleUtils.fitRectangle(\n      new PIXI.Rectangle(0, 0, this._bgImage!.width, this._bgImage!.height),\n      new PIXI.Rectangle(0, 0, this.root.fixedStageWidth, this.root.fixedStageHeight),\n      ScaleMode.NO_BORDER\n    );\n\n    this._bgImage!.width = launchImageSize.width;\n    this._bgImage!.height = launchImageSize.height;\n    this.addChild(this._bgImage!);\n  }\n\n  protected getBgTexture() {\n    return this.assetsLoader?.getTextureByName('bg');\n  }\n\n  protected createBgEffect(): void {\n    this._bgParticleEffect = new BackgroundEffect(this.root, 80);\n    this.addChild(this._bgParticleEffect)\n  }\n\n  public onActivate(): void {\n  }\n\n  public onDeActivate(): void {\n  }\n\n  public onExit(): void {\n  }\n\n}\n","import {GameObject} from \"../base/GameObject\";\nimport {GameView} from \"../base/GameView\";\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport * as PIXI from \"pixi.js\";\nimport {MathUtils} from \"../../utils/MathUtils\";\n\nexport class BackgroundEffectParticle extends GameView {\n\n  protected _dx: number = 0;\n  protected _dy: number = 0;\n  protected _rotSpeed: number = 0;\n\n  constructor(root:AbstractPixiRoot, layerNum: number) {\n    super();\n    this.root = root;\n\n    let image: PIXI.Sprite = this.createParticleImage();\n    image.anchor.set(0.5);\n    this.addChild(image);\n\n    this.x = MathUtils.getRandomInt(0, this.root.fixedStageWidth);\n    this.y = MathUtils.getRandomInt(-32 * this.root.scaleFactor / 4, this.root.fixedStageHeight);\n\n    let minSpeed = 0;\n    let maxSpeed = 0;\n\n    switch (layerNum) {\n      case 1:\n        this.scale = MathUtils.getRandomInt(20, 30) * .01;\n        // this.alpha = .4;\n        minSpeed = 3;\n        maxSpeed = 4;\n        break;\n      case 2:\n        this.scale = MathUtils.getRandomInt(40, 60) * .01;\n        // this.alpha = .7;\n        minSpeed = 4;\n        maxSpeed = 6;\n        break;\n      case 3:\n        this.scale = MathUtils.getRandomInt(70, 80) * .01;\n        minSpeed = 7;\n        maxSpeed = 9;\n        break;\n    }\n\n    if (layerNum == 2 || layerNum == 3) {\n      if (MathUtils.getRandomInt(0, 1) == 1) {\n        this._rotSpeed = MathUtils.deg2rad(.1 * MathUtils.getRandomInt(10, 20));\n      } else {\n        this._rotSpeed = MathUtils.deg2rad(.1 * MathUtils.getRandomInt(-20, -10));\n      }\n    }\n\n    minSpeed *= (this.root.scaleFactor / 4);\n    maxSpeed *= (this.root.scaleFactor / 4);\n\n    let fallSpeed = 0.75;\n    let speed = MathUtils.getRandomInt(minSpeed, maxSpeed) * fallSpeed;\n    let angle = MathUtils.getRandomInt(250, 290);\n\n    this._dx = speed * Math.cos((180 - angle) * Math.PI / 180);\n    this._dy = -speed * Math.sin((180 - angle) * Math.PI / 180);\n  }\n\n  protected get horizontalForce() {\n    return 0;\n  }\n\n  public update() {\n    this.x += (this._dx + this.horizontalForce * this.scale.x);\n    this.y += this._dy;\n\n    if (this._rotSpeed != 0) {\n      this.rotation += this._rotSpeed;\n    }\n\n    if (this.y > this.root.fixedStageHeight || this.x > this.root.fixedStageWidth || this.x < 0) {\n      this.x = MathUtils.getRandomInt(0, this.root.fixedStageWidth);\n      this.y = -32 * this.root.scaleFactor / 4;\n    }\n  }\n\n  protected createParticleImage() {\n    return new PIXI.Sprite(this.root.uiLib.getTexture(\"petal\"));\n  }\n}\n\nexport class BackgroundEffect extends GameView {\n\n  private _particles: BackgroundEffectParticle[] = [];\n\n  constructor(root:AbstractPixiRoot, particlesCount: number) {\n    super();\n    this.root = root;\n\n    let particle: BackgroundEffectParticle;\n    let distribution = this.distribution();\n    let layer1Count = distribution[0] * particlesCount * .01;\n    let layer2Count = distribution[1] * particlesCount * .01;\n\n    for (let i = 0; i < particlesCount; i++) {\n      if (i < layer1Count)\n        particle = this.createParticle(1);\n      else if (i > layer1Count && i < layer1Count + layer2Count)\n        particle = this.createParticle(2);\n      else\n        particle = this.createParticle(3);\n\n      this.addChild(particle);\n      this._particles.push(particle);\n    }\n\n    this.addToJuggler();\n  }\n\n  override advanceTime(): void {\n    for (let i = 0; i < this._particles.length; i++) {\n      this._particles[i].update();\n    }\n  }\n\n  override destroy() {\n    GameObject.destroy(this._particles);\n    super.destroy();\n  }\n\n  protected createParticle(layer: number) {\n    return new BackgroundEffectParticle(this.root, layer);\n  }\n\n  protected distribution() {\n    return [30, 40, 50];\n  }\n}\n","import {Point} from \"pixi.js\";\n\nexport class MathUtils {\n  static getMidPoint(startX: number, startY: number, endX: number, endY: number): { x: number; y: number } {\n    const distance = MathUtils.getDistance(startX, startY, endX, endY);\n    const point = {\n      x: (startX + endX) / 2,\n      y: (startY + endY) / 2,\n    };\n\n    if (MathUtils.getRandomInt(0, 1) === 0) {\n      point.x += 0.01 * MathUtils.getRandomInt(10, 20) * distance;\n    } else {\n      point.x -= 0.01 * MathUtils.getRandomInt(10, 20) * distance;\n    }\n\n    return point;\n  }\n\n  static getRandomElementOf<T>(array: T[]): T {\n    const idx = Math.floor(Math.random() * array.length);\n    return array[idx];\n  }\n\n  static toArray<T>(iterable: Iterable<T>): T[] {\n    return Array.from(iterable);\n  }\n\n  static isEvenInt(value: number): boolean {\n    return value % 2 === 0;\n  }\n\n  static getDistance(x1: number, y1: number, x2: number, y2: number): number {\n    return Math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2);\n  }\n\n  static getRandomInt(fromNum: number, toNum: number): number {\n    if (fromNum === toNum) {\n      return fromNum;\n    }\n    return Math.floor(fromNum + Math.random() * (toNum - fromNum + 1));\n  }\n\n  static getRandomNumber(fromNum: number, toNum: number): number {\n    if (fromNum === toNum) {\n      return fromNum;\n    }\n    return fromNum + Math.random() * (toNum - fromNum);\n  }\n\n  static getAngle(x1: number, y1: number, x2: number, y2: number): number {\n    if (x2 !== x1) {\n      let angle = (180 / Math.PI) * Math.atan((y2 - y1) / (x2 - x1));\n      if (x1 < x2) angle += 180;\n      if (angle < 0) angle += 360;\n      return angle;\n    } else {\n      return y1 < y2 ? 270 : 90;\n    }\n  }\n\n  static generateRandomArray(length: number): number[] {\n    const array = Array.from({ length }, (_, i) => i);\n\n    for (let i = 0; i < length; i++) {\n      const r = MathUtils.generateRandom(0, length);\n      [array[i], array[r]] = [array[r], array[i]];\n    }\n\n    return array;\n  }\n\n  static generateRandom(min: number, max: number): number {\n    if (min === max) return min;\n    if (max > min) return MathUtils.randomInt() % (max - min) + min;\n    return MathUtils.randomInt() % (min - max) + max;\n  }\n\n  static randomBoolean(): boolean {\n    return MathUtils.randomInt() % 2 === 0;\n  }\n\n  static chance(chance: number): boolean {\n    if (chance < 2) return true;\n    return MathUtils.randomInt() % chance === 0;\n  }\n\n  static chooseWeighedItem(weights: number[]): number {\n    const totalWeight = weights.reduce((sum, weight) => sum + weight, 0);\n    if (totalWeight === 0) return 0;\n\n    let randomWeight = MathUtils.randomInt() % totalWeight;\n    for (let i = 0; i < weights.length; i++) {\n      randomWeight -= weights[i];\n      if (randomWeight < 0) return i;\n    }\n\n    return 0; // Этот случай никогда не должен быть достигнут\n  }\n\n  static randomInt(): number {\n    return Math.round(Math.random() * Number.MAX_SAFE_INTEGER);\n  }\n\n  static DEG_TO_RAD = Math.PI / 180;\n  static deg2rad(degrees: number): number {\n    return degrees * MathUtils.DEG_TO_RAD;\n  }\n\n  static int(num: number) {\n    return Math.floor(num);\n  }\n\n  static float(num: number, decimals: number): number {\n    const multiplier = Math.pow(10, decimals); // Вычисляем 10 в степени decimals\n    return Math.round(num * multiplier) / multiplier;\n  }\n\n  static distance(point1: Point | null, point2: Point | null) {\n    if (point1 && point2) {\n      const dx = point2.x - point1.x;\n      const dy = point2.y - point1.y;\n      return Math.sqrt(dx * dx + dy * dy);\n    }\n    return 0;\n  }\n}\n","import * as PIXI from \"pixi.js\";\n\nexport enum ScaleMode {\n  SHOW_ALL = \"SHOW_ALL\",\n  NO_BORDER = \"NO_BORDER\",\n}\nexport class RectangleUtils {\n  static fitRectangle(\n    source: PIXI.Rectangle,\n    target: PIXI.Rectangle,\n    scaleMode: ScaleMode\n  ): PIXI.Rectangle {\n    const sourceAspect = source.width / source.height;\n    const targetAspect = target.width / target.height;\n\n    let scale: number;\n\n    if (scaleMode === ScaleMode.NO_BORDER) {\n      scale = sourceAspect > targetAspect ? target.height / source.height : target.width / source.width;\n    } else {\n      // Default to SHOW_ALL\n      scale = sourceAspect > targetAspect ? target.width / source.width : target.height / source.height;\n    }\n\n    const width = source.width * scale;\n    const height = source.height * scale;\n    const x = (target.width - width) / 2;\n    const y = (target.height - height) / 2;\n\n    return new PIXI.Rectangle(x, y, width, height);\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {Color, Graphics} from 'pixi.js';\nimport {AbstractText} from \"pixi.js/lib/scene/text/AbstractText\";\n\nexport enum Align {\n  LEFT = 'left',\n  CENTER = 'center',\n  RIGHT = 'right',\n  TOP = 'top',\n  BOTTOM = 'bottom'\n}\n\n\n\nexport class ViewUtils {\n\n  // Функция возвращает видимое расстояние между двумя контейнерами\n  static getVisibleGap(containerA: PIXI.Container, containerB: PIXI.Container): { horizontal: number; vertical: number } {\n    // Получаем глобальные границы контейнеров\n    const boundsA = containerA.getBounds();\n    const boundsB = containerB.getBounds();\n\n    // Вычисляем горизонтальное расстояние\n    let horizontalGap = 0;\n    if (boundsA.right < boundsB.left) {\n      // A левее B\n      horizontalGap = boundsB.left - boundsA.right;\n    } else if (boundsB.right < boundsA.left) {\n      // B левее A\n      horizontalGap = boundsA.left - boundsB.right;\n    }\n    // Если пересекаются по горизонтали, gap = 0\n\n    // Вычисляем вертикальное расстояние\n    let verticalGap = 0;\n    if (boundsA.bottom < boundsB.top) {\n      // A выше B\n      verticalGap = boundsB.top - boundsA.bottom;\n    } else if (boundsB.bottom < boundsA.top) {\n      // B выше A\n      verticalGap = boundsA.top - boundsB.bottom;\n    }\n    // Если пересекаются по вертикали, gap = 0\n\n    return {\n      horizontal: horizontalGap,\n      vertical: verticalGap,\n    };\n  }\n\n// Функция для выравнивания pivot\n  static alignPivot(displayObject: PIXI.Container | null | undefined, horizontalAlign: Align = Align.CENTER, verticalAlign: Align = Align.CENTER) {\n    if (displayObject) {\n      const bounds = displayObject.getLocalBounds();\n\n      let pivotX = 0;\n      let pivotY = 0;\n\n      // Рассчитываем горизонтальное выравнивание\n      if (horizontalAlign === Align.LEFT) {\n        pivotX = bounds.x;\n      } else if (horizontalAlign === Align.CENTER) {\n        pivotX = bounds.x + bounds.width / 2;\n      } else if (horizontalAlign === Align.RIGHT) {\n        pivotX = bounds.x + bounds.width;\n      }\n\n      // Рассчитываем вертикальное выравнивание\n      if (verticalAlign === Align.TOP) {\n        pivotY = bounds.y;\n      } else if (verticalAlign === Align.CENTER) {\n        pivotY = bounds.y + bounds.height / 2;\n      } else if (verticalAlign === Align.BOTTOM) {\n        pivotY = bounds.y + bounds.height;\n      }\n\n      // Устанавливаем точку опоры\n      displayObject.pivot.set(pivotX, pivotY);\n    } else {\n      console.warn('alignPivot: displayObject не поддерживает getLocalBounds.');\n    }\n  }\n\n  static isEqualRects(rect1?: PIXI.Rectangle, rect2?: PIXI.Rectangle) {\n    if (rect1 && rect2) {\n      return rect1.x === rect2.x &&\n        rect1.y === rect2.y &&\n        rect1.width === rect2.width &&\n        rect1.height === rect2.height;\n    }\n    return false;\n  }\n\n  static putOnTop(view?: PIXI.Container | null) {\n    if (view && view.parent) {\n      view.parent.setChildIndex(view, view.parent.children.length - 1);\n    }\n  }\n\n  static fitToWidth(fitDisplayObject: PIXI.Container | AbstractText | null | undefined, fitWidth: number, fitIfBigger: boolean = true, fitIfSmaller: boolean = true): void {\n    if (fitDisplayObject && fitWidth > 0) {\n      let fitDisplayObjectWidth = fitDisplayObject.width;\n      if (fitDisplayObjectWidth != fitWidth) {\n        if (!fitIfBigger && fitDisplayObjectWidth > fitWidth) {\n          return;\n        }\n        if (!fitIfSmaller && fitDisplayObjectWidth < fitWidth) {\n          return;\n        }\n        fitDisplayObject.scale.set((fitWidth / fitDisplayObjectWidth) * fitDisplayObject.scale.x);\n      }\n    }\n  }\n\n  static fitToHeight(fitDisplayObject: PIXI.Container | AbstractText | null | undefined, fitHeight: number, fitIfBigger: boolean = true, fitIfSmaller: boolean = true): void {\n    if (fitDisplayObject && fitHeight > 0) {\n      let fitDisplayObjectHeight = fitDisplayObject.height;\n      if(fitDisplayObjectHeight != fitHeight) {\n        if (!fitIfBigger && fitDisplayObjectHeight > fitHeight) {\n          return;\n        }\n        if (!fitIfSmaller && fitDisplayObjectHeight < fitHeight) {\n          return;\n        }\n        fitDisplayObject.scale.set((fitHeight / fitDisplayObjectHeight) * fitDisplayObject.scale.x);\n      }\n    }\n  }\n\n  static createRoundedRect(width: number = 1, height: number = 1, color:Color, cornerRadius:number, lineWidth = 0, lineColor:Color) {\n    let bg = new Graphics();\n    if (lineWidth) {\n      bg.lineStyle(lineWidth, lineColor); // устанавливаем границу\n    }\n    bg.beginFill(color); // начинаем заливку\n    bg.drawRoundedRect(0, 0, width, height, cornerRadius);\n    bg.endFill(); // заканчиваем заливку\n    return bg;\n  }\n\n  static createRect(width: number = 1, height: number = 1, color:string = '0x000000') {\n    let bg = new Graphics();\n    bg.beginFill(color); // начинаем заливку\n    bg.drawRect(0, 0, width, height);\n    bg.endFill(); // заканчиваем заливку\n    return bg;\n  }\n\n}\n","import {GameView} from \"./GameView\";\nimport * as PIXI from \"pixi.js\";\nimport {Movie} from \"../flump\";\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {ViewUtils} from \"../utils\";\nimport {GameObject} from \"./GameObject\";\nimport {GameTween} from \"./GameJuggler\";\n\nexport class GameWaiter extends GameView {\n\n  private _blackImage!:PIXI.Graphics;\n  private _spinner!:Movie;\n  private _isShowed = false;\n  private _container!:PIXI.Container;\n  private _spinnerTween!:GameTween;\n  private _blackTween!:GameTween;\n\n  constructor(root:AbstractPixiRoot, container:PIXI.Container) {\n    super();\n    this.root = root;\n    this._container = container;\n  }\n\n  override destroy():void {\n    super.destroy();\n  }\n\n  protected createSpinner(): Movie {\n    return this.root.uiLib!.create(\"spinner\") as Movie;\n  }\n\n  public show():void {\n    if (this._isShowed || this.destroyed) {\n      return;\n    }\n\n    this._isShowed = true;\n\n    this._blackImage = ViewUtils.createRect(this.root.fixedStageWidth, this.root.fixedStageHeight, '0x000000');\n    this._container.addChild(this._blackImage);\n\n    this._spinner = this.createSpinner();\n    this._spinner.interactive = false;\n    ViewUtils.alignPivot(this._spinner);\n    this._spinner.x = this.root.fixedStageWidth / 2;\n    this._spinner.y = this.root.fixedStageHeight / 2;\n    this._spinner.alpha = 0.01;\n    this._spinner.scale.set(0.01);\n    this._spinner.playLoop();\n    this._container.addChild(this._spinner);\n\n    this._spinnerTween = this.root.juggler.tween(this._spinner, 0.4, {\n      alpha: 1,\n      scale: {\n        x:1, y: 1\n      }\n    }).delay(0.2).start();\n\n    this._blackTween = this.root.juggler.tween(this._blackImage, 0.4, {\n      alpha: 0.4\n    }).start();\n  }\n\n  public hide():void {\n    if (this._isShowed) {\n      this._spinnerTween?.destroy();\n      this._blackTween?.destroy();\n      GameObject.destroy(this._spinner);\n      GameObject.destroy(this._blackImage);\n      this._isShowed = false;\n    }\n  }\n}\n","import {GameView} from \"./GameView\";\nimport {PixiAssetsLoader} from \"../assets/PixiAssetsLoader\";\nimport {GameObject} from \"./GameObject\";\nimport {ViewUtils} from \"../utils/ViewUtils\";\nimport * as PIXI from 'pixi.js';\nimport {Movie} from \"../flump/display/Movie\";\nimport {Container} from \"../flump/display/Container\";\nimport {Placer} from \"../flump/display/Placer\";\nimport {Easing} from \"@tweenjs/tween.js\";\nimport {SoundManager} from \"../../managers/SoundManager\";\n\nexport class GameDialog extends GameView {\n\n  static SHOW_TIME: number = 0.6;\n\n  public assetsLoader: PixiAssetsLoader | null = null;\n\n  protected _waiter: Movie | null = null;\n  protected _dialog: GameView | null = null;\n  protected _blackBack: PIXI.Graphics | null = null;\n  protected _dialogContent: Container | null = null;\n  protected _isInHideProcess: boolean = false;\n  public _shouldDisposeCallback?: ((dialog: GameDialog) => void) | null; // internal, used in App, don't assign explicitly\n\n  get btnClose() {\n    return this._dialogContent?.getButtonByLabel('btn_close');\n  }\n\n  protected get title(): string | null {\n    return null;\n  }\n\n  protected get dialogContentMoldName(): string {\n    return '';\n  }\n\n  protected get dialogScale(): number {\n    let multiplier = 1;\n    if (this.root.app.device.isTablet || this.root.app.device.isDesktop) {\n      multiplier = this.tabletMultiplier;\n    }\n    if (this.root.app.device.isIOS) {\n      return 1.3 * multiplier;\n    }\n    if (this.root.app.device.isAndroid) {\n      return 1.2 * multiplier;\n    }\n    return multiplier;\n  }\n\n  protected get tabletMultiplier(): number {\n    return 0.8;\n  }\n\n  protected get backgroundAlpha(): number {\n    return 0.5;\n  }\n\n  protected get createDialogLib() {\n    return this.root.uiLib;\n  }\n\n  protected playShowSound(): void {\n    void this.root.app.sound.playSound(SoundManager.DialogOpen);\n  }\n\n  async loadAssets(onLoaded?: () => void) {\n    if (onLoaded) {\n      onLoaded();\n    }\n  }\n\n  onAdded(): void {\n    this.createBlackBack();\n    this.createBackgroundEffect();\n  }\n\n  override destroy() {\n    this._dialog = GameObject.destroy(this._dialog);\n    this._blackBack = GameObject.destroy(this._blackBack);\n    this.assetsLoader = GameObject.destroy(this.assetsLoader);\n    this.hideWaiter();\n    this._dialogContent = GameObject.destroy(this._dialogContent);\n    this._shouldDisposeCallback = null;\n    super.destroy();\n  }\n\n  showWaiter(): void {\n    this.hideWaiter();\n    this._waiter = this.root.uiLib!.create(\"loading_anim\") as Movie;\n    ViewUtils.fitToHeight(this._waiter, this.root.adapt(150), true, true);\n    ViewUtils.alignPivot(this._waiter);\n    this._waiter.x = this.root.fixedStageWidth / 2;\n    this._waiter.y = this.root.fixedStageHeight / 2;\n    this._waiter.playLoop();\n    this.addChildAt(this._waiter, this.children?.length);\n  }\n\n  hideWaiter(): void {\n    if (this._waiter) {\n      this._waiter = GameObject.destroy(this._waiter);\n    }\n  }\n\n  createDialog(): void {\n    this._dialog = new GameView();\n    this.addChild(this._dialog);\n\n    this._dialogContent = this.createDialogLib!.create(this.dialogContentMoldName) as Container;\n    this._dialog.addChild(this._dialogContent);\n\n    if (this.btnClose) {\n      this.btnClose.clickCallback = this.onButtonClose.bind(this);\n    }\n    this.createTitle();\n  }\n\n  show(): void {\n    this.playShowSound();\n\n    if (this._dialog) {\n      this._dialog.interactive = false;\n      this._dialog.scale = this.dialogScale;\n\n      ViewUtils.fitToHeight(this._dialog, this.root.fixedStageSafeHeight - this.root.adapt(100), true, false);\n      ViewUtils.alignPivot(this._dialog);\n\n      this._dialog.x = this.getCenterX();\n      this._dialog.y = -this._dialog.height;\n\n      this.root.juggler.tween(this._dialog, GameDialog.SHOW_TIME, {\n        y: this.getCenterY(),\n      }).easing(Easing.Back.Out).onComplete(this.onDialogShowEnd.bind(this)).start();\n    }\n  }\n\n  hide(): void {\n    if (this._isInHideProcess) {\n      return;\n    }\n    this._isInHideProcess = true;\n    this.interactive = false;\n    this.playCloseSound();\n    this.hideBlackBack();\n    this.hideDialog();\n  }\n\n  onButtonClose(): void {\n    this.interactive = false;\n    void this.root.app.sound.playSound(SoundManager.Click);\n    this.hide();\n  }\n\n  protected createBlackBack(): void {\n    this._blackBack = ViewUtils.createRect(this.root.fixedStageWidth, this.root.fixedStageHeight, \"0x000000\");\n    this.addChild(this._blackBack);\n    this._blackBack.interactive = true; // !!! keep\n\n\n    this.root.juggler.tween(this._blackBack, 0.5 * GameDialog.SHOW_TIME, {\n      alpha: this.backgroundAlpha\n    }).start();\n  }\n\n  protected createBackgroundEffect(): void {\n    // No implementation\n  }\n\n  protected createTitle(): void {\n    if (this.title) {\n      const titlePlacer: Placer = this._dialogContent!.getPlacerByLabel('txt_title');\n      titlePlacer.place(this.root.dialogTitleTextLib.createBitmapText(this.title, titlePlacer.width, titlePlacer.height))\n        .fitHeight(true, true)\n        .fitWidth(true, false)\n        .alignCenter();\n    }\n  }\n\n  protected getCenterX(): number {\n    return this.root.fixedStageWidth / 2;\n  }\n\n  protected getCenterY(): number {\n    return this.root.safeZoneTop + this.root.fixedStageSafeHeight / 2;\n  }\n\n  protected hideDialog(): void {\n    if (this._dialog) {\n      this._dialog.interactive = false;\n\n      this.root.juggler.tween(this._dialog, GameDialog.SHOW_TIME, {\n        delay: 0.1,\n        y: -this._dialog.height,\n      }).easing(Easing.Back.In).onComplete(this.disposeFromNavigator.bind(this)).start();\n    } else {\n      this.disposeFromNavigator();\n    }\n  }\n\n  protected onDialogShowEnd(): void {\n    if (this._dialog) {\n      this._dialog.interactive = true;\n    }\n  }\n\n  protected playCloseSound(): void {\n    void this.root.app.sound.playSound(SoundManager.DialogClose);\n  }\n\n  protected disposeFromNavigator(): void {\n    if (this._shouldDisposeCallback) {\n      this._shouldDisposeCallback(this);\n    }\n  }\n\n  protected hideBlackBack(): void {\n    if (this._blackBack) {\n      this.root.juggler.tween(this._blackBack, 0.5 * GameDialog.SHOW_TIME, {\n        alpha: 0\n      }).start();\n    }\n  }\n}\n","import {Howl} from \"howler\";\nimport {DateUtils} from \"../utils/DateUtils\";\nimport {AbstractApp} from \"../app/AbstractApp\";\nimport {AbstractPreferencesManager} from \"./AbstractPreferencesManager\";\n\nexport class SoundManager extends AbstractPreferencesManager {\n\n  static SOUND_VOLUME = 0.8;\n  static MUSIC_VOLUME = 0.6;\n\n  static Click = \"Click\";\n  static DialogOpen = \"DialogOpen\";\n  static DialogClose = \"DialogClose\";\n\n  protected howlerSoundPool: Map<string, Howl> = new Map();\n  protected howlMusic: Howl | null = null;\n  protected musicName = '';\n  protected soundLastPlayed: Map<string, number> = new Map();\n\n  readonly app: AbstractApp;\n\n  protected static SOUND_MUTED_KEY = \"SOUND_MUTED_KEY\";\n  protected static MUSIC_MUTED_KEY = \"MUSIC_MUTED_KEY\";\n\n  protected _soundMuted = false;\n  protected _musicMuted = false;\n  protected _needPersistence:boolean;\n\n  constructor(app: AbstractApp, needPersistence: boolean) {\n    super();\n    this.app = app;\n    this._needPersistence = needPersistence;\n  }\n\n  async init() {\n    if(this._needPersistence) {\n      this._soundMuted = await this.getBoolValue(SoundManager.SOUND_MUTED_KEY);\n      this._musicMuted = await this.getBoolValue(SoundManager.MUSIC_MUTED_KEY);\n    }\n  }\n\n  async playSound(soundName: string, timeGapBetweenNextSameSound: number = 100) {\n    if (this.soundMuted) {\n      return;\n    }\n\n    // Проверяем время последнего воспроизведения этого звука\n    const lastPlayedTime = this.soundLastPlayed.get(soundName) || 0;\n    const currentTime = DateUtils.currentTime;\n\n    // Если прошло достаточно времени с последнего воспроизведения, играем звук\n    if (currentTime - lastPlayedTime >= timeGapBetweenNextSameSound) {\n\n      if(!this.howlerSoundPool.has(soundName)) {\n        const sound = new Howl({\n          src: [`assets/sounds/${soundName}.mp3`],\n          volume: SoundManager.SOUND_VOLUME,\n          html5: false,\n        });\n        this.howlerSoundPool.set(soundName, sound);\n      }\n      this.howlerSoundPool.get(soundName)?.play();\n\n      this.soundLastPlayed.set(soundName, currentTime); // Обновляем время последнего воспроизведения\n    }\n  }\n\n  async onActivate() {\n    this.playMusic(this.musicName);\n  }\n\n  async onDeActivate() {\n    this.unloadSounds();\n    this.unloadMusic();\n    Howler.stop();\n    Howler.unload();\n  }\n\n  playMusic(musicName: string) {\n    if (!musicName) {\n      return;\n    }\n\n    if (this._musicMuted) {\n      this.musicName = musicName;\n      return;\n    }\n\n    if (this.musicName === musicName && this.howlMusic) {\n      return;\n    }\n\n    this.unloadMusic();\n\n    this.musicName = musicName;\n\n    try {\n      this.howlMusic = new Howl({\n        src: [`assets/music/${musicName}.mp3`],\n        volume: SoundManager.MUSIC_VOLUME,\n        loop: true,\n        html5: false,\n      });\n      this.howlMusic.play();\n      this.howlMusic.loop();\n    } catch (error) {\n      this.app.error.handleCaughtError(error, 'SoundService:playMusic: ' + musicName);\n    }\n  }\n\n  unloadMusic() {\n    try {\n      if (this.howlMusic) {\n        this.howlMusic.stop();\n        this.howlMusic.unload();\n        this.howlMusic = null;\n      }\n    }\n    catch (error) {\n      this.app.error.handleCaughtError(error, 'SoundService:unloadMusic');\n    }\n  }\n\n  unloadSounds(): void {\n    try {\n      this.howlerSoundPool.forEach((sound) => {\n        sound.stop();\n        sound.unload();\n      });\n      this.howlerSoundPool.clear();\n    }\n    catch (error) {\n      this.app.error.handleCaughtError(error, 'SoundService:unloadSounds');\n    }\n  }\n\n  get soundMuted(): boolean {\n    return this._soundMuted;\n  }\n\n   set soundMuted(value: boolean) {\n    if (this._soundMuted != value) {\n      this._soundMuted = value;\n      if (this._needPersistence) {\n        void this.setBoolValue(SoundManager.SOUND_MUTED_KEY, value);\n      }\n      if (this._soundMuted) {\n        this.unloadSounds();\n      }\n    }\n  }\n\n  async unmute() {\n    if (this._musicMuted) {\n      this._musicMuted = false;\n      if (this._needPersistence) {\n        void this.setBoolValue(SoundManager.MUSIC_MUTED_KEY, false);\n      }\n      if (this.musicName) {\n        this.playMusic(this.musicName);\n      }\n    }\n  }\n\n  async mute() {\n    if (!this._musicMuted) {\n      this._musicMuted = true;\n      if (this._needPersistence) {\n        void this.setBoolValue(SoundManager.MUSIC_MUTED_KEY, true);\n      }\n      this.unloadMusic();\n    }\n  }\n}\n","export class DateUtils {\n  \n  static readonly MINUTE = 60 * 1000;\n  static readonly HOUR = 60 * DateUtils.MINUTE;\n  static readonly DAY = 24 * DateUtils.HOUR;\n\n  private static readonly dateTime = new Date().getTime();\n  private static readonly dateTimestamp = performance.now();\n\n  static get currentUTCDate(): Date {\n    const localDate = new Date();\n    return new Date(localDate.getTime() + localDate.getTimezoneOffset() * 60000);\n  }\n\n  static get currentDateFormatted(): string {\n    const date = new Date();\n    const dtf = new Intl.DateTimeFormat(\"en-US\", { year: 'numeric', month: '2-digit', day: '2-digit' });\n    return dtf.format(date);   // Format: 2012-06-06\n  }\n\n  static get currentTime(): number {\n    return DateUtils.dateTime + (performance.now() - DateUtils.dateTimestamp);\n  }\n\n  static msToSeconds(ms: number): number {\n    return ms / 1000;\n  }\n\n  static msToMinutes(ms: number): number {\n    return DateUtils.msToSeconds(ms) / 60;\n  }\n\n  static msToHours(ms: number): number {\n    return (ms / 1000) / 60 / 60;\n  }\n\n  static secondsToDays(sec: number): number {\n    return DateUtils.msToHours(DateUtils.secondsToMs(sec)) / 24;\n  }\n\n  static hoursToSeconds(hours: number): number {\n    return DateUtils.minutesToSeconds(DateUtils.hoursToMinutes(hours));\n  }\n\n  static hoursToMinutes(hours: number): number {\n    return hours * 60;\n  }\n\n  static daysToMs(days: number): number {\n    return DateUtils.hoursToMS(24 * days);\n  }\n\n  static daysToMinutes(days: number): number {\n    return DateUtils.hoursToMinutes(24 * days);\n  }\n\n  static minutesToSeconds(min: number): number {\n    return min * 60;\n  }\n\n  static hoursToMS(hours: number): number {\n    return DateUtils.minutesToMs(hours * 60);\n  }\n\n  static minutesToMs(min: number): number {\n    return DateUtils.secondsToMs(min * 60);\n  }\n\n  static secondsToMs(sec: number): number {\n    return sec * 1000;\n  }\n\n  static getDaysBetween(d1: Date, d2: Date): number {\n    const MS_PER_DAY = 86400000;\n    const date1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());\n    const date2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate());\n    return Math.round((date2.getTime() - date1.getTime()) / MS_PER_DAY);\n  }\n\n  static getTimeString(index: number, fps: number): string {\n    let sec = Math.round(index / fps);\n    const min = Math.floor(sec / 60);\n\n    sec = sec % 60;\n\n    const mStr = min < 10 ? \"0\" + min : min.toString();\n    const sStr = sec < 10 ? \"0\" + sec : sec.toString();\n\n    return mStr + \":\" + sStr;\n  }\n\n  static getTimeStringFromSeconds(seconds: number): string {\n    const min = Math.floor(seconds / 60);\n    seconds = seconds % 60;\n\n    const mStr = min < 10 ? \"0\" + min : min.toString();\n    const sStr = seconds < 10 ? \"0\" + seconds : seconds.toString();\n\n    return mStr + \":\" + sStr;\n  }\n\n  static getNowTimeString(): string {\n    const today = new Date();\n    const minutes = today.getMinutes();\n    const hours = today.getHours();\n    const seconds = today.getSeconds();\n\n    return `${hours}:${minutes}:${seconds}`;\n  }\n\n  static getTimeBetween(d1: Date, d2: Date): number {\n    const date1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours(), d1.getMinutes(), d1.getSeconds());\n    const date2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes(), d2.getSeconds());\n    return date2.getTime() - date1.getTime();\n  }\n\n  static isNextDay(d1: Date, d2: Date): boolean {\n    const d1Year = d1.getFullYear();\n    const d2Year = d2.getFullYear();\n    const d1Month = d1.getMonth();\n    const d2Month = d2.getMonth();\n    const d1Day = d1.getDate();\n    const d2Day = d2.getDate();\n\n    return d2Year > d1Year || d2Month > d1Month || d2Day > d1Day;\n  }\n\n  static isTheSameDays(d1: Date, d2: Date): boolean {\n    const d1Year = d1.getFullYear();\n    const d2Year = d2.getFullYear();\n    const d1Month = d1.getMonth();\n    const d2Month = d2.getMonth();\n    const d1Day = d1.getDate();\n    const d2Day = d2.getDate();\n\n    return d2Year === d1Year && d2Month === d1Month && d2Day === d1Day;\n  }\n\n  static parseDateStringToDate(utcParseString: string): Date | null {\n    if (!utcParseString) {\n      return null;\n    }\n\n    const matches = utcParseString.match(/(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})Z/);\n    if (!matches) {\n      return null;\n    }\n\n    const d = new Date();\n    d.setFullYear(Number(matches[1]));\n    d.setMonth(Number(matches[2]) - 1);\n    d.setDate(Number(matches[3]));\n    d.setHours(Number(matches[4]));\n    d.setMinutes(Number(matches[5]));\n    d.setSeconds(Number(matches[6]));\n    d.setMilliseconds(Number(matches[7]));\n    return d;\n  }\n\n  static parseObjectToDate(o: any): Date | null {\n    if (o && o.__type === \"Date\" && o.iso) {\n      return DateUtils.parseDateStringToDate(o.iso);\n    }\n    return null;\n  }\n\n  static formatTimeMs(ms: number, dayLng: string, hourLng: string, minLng: string, secLng: string): string {\n    let out = \"\";\n    let days = 0;\n    let hours = 0;\n    let minutes = 0;\n    let seconds = DateUtils.msToSeconds(ms);\n\n    minutes = Math.floor(seconds / 60);\n    seconds -= minutes * 60;\n\n    hours = Math.floor(minutes / 60);\n    minutes -= hours * 60;\n\n    days = Math.floor(hours / 24);\n    hours -= days * 24;\n\n    if (days > 0) {\n      out = `${days}${dayLng}${hours > 0 ? ` ${hours}${hourLng}` : \"\"}`;\n    } else if (hours > 0) {\n      out = `${hours}${hourLng}${minutes > 0 ? ` ${minutes}${minLng}` : \"\"}`;\n    } else {\n      out = `${minutes > 0 ? `${minutes}${minLng} ` : \"\"}${seconds > 0 ? `${seconds}${secLng}` : \"\"}`;\n    }\n\n    return out;\n  }\n}\n","import {Preferences} from '@capacitor/preferences';\n\nexport abstract class AbstractPreferencesManager {\n\n    protected async setBoolValue(key: string, value: true | false): Promise<void> {\n        await Preferences.set({\n            key: key,\n            value: JSON.stringify(value || false),\n        });\n    }\n\n    protected async getBoolValue(key: string): Promise<boolean> {\n        const {value} = await Preferences.get({key: key});\n        return Boolean(JSON.parse(value || 'false'));\n    }\n\n    protected async setValue(key: string, value: string): Promise<void> {\n        await Preferences.set({\n            key: key,\n            value: value,\n        });\n    }\n\n    protected async getValue(key: string): Promise<string | null> {\n        const {value} = await Preferences.get({key: key});\n        return value;\n    }\n\n    protected async removeValue(key: string): Promise<void> {\n        await Preferences.remove({key: key});\n    }\n}","export class ObjectUtils {\n\n  static truncateString(str: string, maxLength = 10, replace = '..'): string {\n    return str.length > maxLength ? str.substring(0, maxLength - replace.length) + replace : str;\n  }\n\n  static getQualifiedClassName(obj: unknown): string {\n    if (obj === null || obj === undefined) {\n      return String(obj); // Возвращает \"null\" или \"undefined\"\n    }\n    return obj.constructor.name; // Возвращает имя конструктора объекта\n  }\n\n  static getBase64Size(base64String: string): number {\n    // Убираем символы выравнивания '='\n    const padding = base64String.endsWith(\"==\") ? 2 : base64String.endsWith(\"=\") ? 1 : 0;\n    // Длина строки без учета выравнивания\n    const base64Length = base64String.length;\n    // Рассчитываем исходный размер данных\n    return (base64Length * 3) / 4 - padding;\n  }\n\n  static getKeyObjValue<T = any>(json: Record<string, any> | null, key: string, fallback: T | null = null): T | null {\n    if (json && json[key]) {\n      return json[key] as T;\n    }\n    return fallback;\n  }\n\n  static getKeyBoolValue(json: Record<string, any> | null, key: string, fallback: boolean = false): boolean {\n    if (json && json.hasOwnProperty(key)) {\n      return Boolean(json[key]);\n    }\n    return fallback;\n  }\n\n  static getKeyStringValue(json: Record<string, any> | null, key: string, fallback: string = \"\"): string {\n    if (json && typeof json[key] === \"string\" && json[key].length > 0) {\n      return json[key];\n    }\n    return fallback;\n  }\n\n  static getKeyNumberValue(json: Record<string, any> | null, key: string, fallback: number = 0): number {\n    if (json && !isNaN(json[key])) {\n      return Number(json[key]);\n    }\n    return fallback;\n  }\n\n  static getKeyIntValue(json: Record<string, any> | null, key: string, fallback: number = 0): number {\n    if (json && !isNaN(json[key])) {\n      return Math.floor(Number(json[key]));\n    }\n    return fallback;\n  }\n\n  static getKeyArrayValue<T = any>(json: Record<string, any> | null, key: string, fallback: T[] = []): T[] {\n    if (json && Array.isArray(json[key])) {\n      return json[key] as T[];\n    }\n    return fallback;\n  }\n\n  static getKeyDateValue(json: Record<string, any> | null, key: string, fallback: Date | null = null): Date | null {\n    if (json && json[key] instanceof Date) {\n      return json[key] as Date;\n    }\n    if (json && typeof json[key] === \"string\") {\n      const parsedDate = new Date(json[key]);\n      if (!isNaN(parsedDate.getTime())) {\n        return parsedDate;\n      }\n    }\n    return fallback;\n  }\n\n  static getKeyByteArrayValue(json: Record<string, any> | null, key: string, fallback: Uint8Array | null = null): Uint8Array | null {\n    if (json && json[key] instanceof Uint8Array) {\n      return json[key] as Uint8Array;\n    }\n    return fallback;\n  }\n}\n","import {GameView} from \"../base/GameView\";\nimport {GameDialog} from \"../base/GameDialog\";\nimport {ObjectUtils} from \"../../utils/ObjectUtils\";\n\nexport class GameDialogLayer extends GameView {\n  public hideAllDialogsWithType(dialogType: string): void {\n    let dialogsToHide: GameDialog[] | null = null;\n    for (let i = 0; i < this.children?.length; i++) {\n      let dialog: GameDialog = this.getChildAt(i) as GameDialog;\n      if (ObjectUtils.getQualifiedClassName(dialog) == dialogType) {\n        if (!dialogsToHide) {\n          dialogsToHide = [];\n        }\n        dialogsToHide.push(dialog);\n      }\n    }\n    while (dialogsToHide && dialogsToHide.length) {\n      dialogsToHide.pop()?.hide();\n    }\n  }\n\n  override onResize() {\n    for (let i = this.children.length - 1; i >= 0; i--) {\n      let child = this.getChildAt(i);\n      if(child instanceof GameDialog) {\n        let dialog = child as GameDialog;\n        dialog.onResize();\n      }\n    }\n  }\n}\n","import {GameScreen} from \"../base/GameScreen\";\nimport {GameView} from \"../base/GameView\";\n\nexport class GameScreenLayer extends GameView {\n    override onResize() {\n        for (let i = this.children.length - 1; i >= 0; i--) {\n            let child = this.getChildAt(i);\n            if(child instanceof GameScreen) {\n                let screen = child as GameScreen;\n                screen.onResize();\n            }\n        }\n    }\n}\n","import {GameScreen} from \"./GameScreen\";\n\nexport class GameSplashScreen extends GameScreen {\n\n  public onShowed?:Function | null = null;\n  public onHide?:Function | null = null;\n\n  override async onAdded() {\n    await super.onAdded();\n    this.onShowComplete();\n  }\n\n  public hide():void {\n    this.onHideComplete();\n  }\n\n  protected onShowComplete():void {\n    if (this.onShowed) {\n      this.onShowed();\n      this.onShowed = null;\n    }\n  }\n\n  protected onHideComplete():void {\n    if (this.onHide) {\n      this.onHide();\n      this.onHide = null;\n    }\n  }\n}\n","import {GameView} from \"../base/GameView\";\nimport {GameSplashScreen} from \"../base/GameSplashScreen\";\n\nexport class SplashLayer extends GameView {\n    override onResize() {\n        for (let i = this.children.length - 1; i >= 0; i--) {\n            let child = this.getChildAt(i);\n            if(child instanceof GameSplashScreen) {\n                let splashScreen = child as GameSplashScreen;\n                splashScreen.onResize();\n            }\n        }\n    }\n}\n","import {GameView} from \"../base/GameView\";\nimport {GameDialog} from \"../base/GameDialog\";\n\nexport class UILayer extends GameView {\n    override onResize() {\n        for (let i = this.children.length - 1; i >= 0; i--) {\n            let child = this.getChildAt(i);\n            if(child instanceof GameView) {\n                let gameView = child as GameView;\n                gameView.onResize();\n            }\n        }\n    }\n}\n","import {GameView} from \"../base/GameView\";\nimport {GameSplashScreen} from \"../base/GameSplashScreen\";\nimport {GameWaiter} from \"../base/GameWaiter\";\n\nexport class WaiterLayer extends GameView {\n    override onResize() {\n        for (let i = this.children.length - 1; i >= 0; i--) {\n            let child = this.getChildAt(i);\n            if(child instanceof GameWaiter) {\n                let gameWaiter = child as GameWaiter;\n                gameWaiter.onResize();\n            }\n        }\n    }\n\n}\n","export class ArrayUtils {\n\n  static remove(array?: any[] | undefined | null, element?: any) {\n    if (!array || !array.length) {\n      return;\n    }\n    let index= array.indexOf(element);\n    if (index >= 0 && index < array.length) {\n      // for (let i = index; i < array.length - 1; i++) {\n      //   array[i] = array[i + 1]; // Сдвигаем элементы влево\n      // }\n      // array.length--; // Уменьшаем длину массива\n      array.splice(index, 1);\n    }\n  }\n\n  static removeAt(array: any[], index: number) {\n    let item = array[index];\n    if (index >= 0 && index < array.length) {\n      for (let i = index; i < array.length - 1; i++) {\n        array[i] = array[i + 1]; // Сдвигаем элементы влево\n      }\n      array.length--; // Уменьшаем длину массива\n    }\n    return item;\n  }\n\n  static clear(array?: any[] | null) {\n    if (array) {\n      array.length = 0;\n    }\n    return null;\n  }\n\n  static getRandomEvenIndex<T>(collection: T[]): number {\n    if (!collection || collection.length === 0) {\n      return -1;\n    }\n    const halfLength: number = collection.length / 2;\n    const randomIndex: number = Math.floor(Math.random() * halfLength);\n    return randomIndex * 2;\n  }\n\n  static filterBoolean<T>(array: T[]): T[] {\n    if (array) {\n      let i = 0;\n      while (i < array.length) {\n        if (!array[i]) {\n          array.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n    }\n    return array;\n  }\n\n  static shuffle(array:any[]):void {\n    if (array && array.length) {\n      for (let i = array.length - 1; i > 0; i--) {\n        let j = Math.floor(Math.random() * (i + 1));\n        let temp = array[i];\n        array[i] = array[j];\n        array[j] = temp;\n      }\n    }\n  }\n\n  static getRandomElement(array:any[] | null | undefined) {\n    if (array && array.length) {\n      let randomIndex = Math.floor(Math.random() * array.length);\n      return array[randomIndex];\n    }\n    return null;\n  }\n\n}\n\n","import {GameObject, IDestroy} from \"./GameObject\";\nimport {ArrayUtils} from \"../../utils/ArrayUtils\";\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {Interpolation, Tween} from '@tweenjs/tween.js';\n\nexport interface IAnimatable extends IDestroy {\n  get juggler(): GameJuggler | null;\n\n  set juggler(value: GameJuggler | null) ;\n\n  advanceTime(delta: number): void;\n\n  addToJuggler(): void;\n\n  removeFromJuggler(): void;\n\n  onRemovedFromJuggler(): void;\n}\n\nexport class GameDelayCall extends GameObject {\n\n  private readonly _callback: Function;\n  private _totalDelta: number = 0;\n  private readonly _endDelta: number = 0;\n\n  constructor(juggler: GameJuggler, callback: Function, durationSec: number) {\n    super();\n    this._juggler = juggler;\n    this._callback = callback;\n    this._endDelta = durationSec;\n  }\n\n  override advanceTime(delta: number) {\n    if (this._isDestroyed || !this._juggler) {\n      return;\n    }\n    this._totalDelta += delta;\n    if (this._totalDelta >= this._endDelta) {\n      this._callback();\n      this.destroy();\n    }\n  }\n}\n\ninterface TweenBezier {\n  startPoint: { x: number; y: number },\n  endPoint: { x: number; y: number },\n  curviness: number\n}\n\ninterface TweenParams {\n  [key: string]: any;\n\n  bezier?: TweenBezier\n}\n\nexport class GameTween extends Tween implements IAnimatable, IDestroy {\n\n  private _isDestroyed = false;\n  private _juggler: GameJuggler;\n  private _targetObject: IDestroy | null = null;\n  private _isCompleted = false;\n  private _onComplete: ((object: any) => void) | null = null;\n\n  constructor(target: IDestroy, juggler: GameJuggler) {\n    super(target);\n    this._targetObject = target;\n    this._juggler = juggler;\n    super.onComplete(this.onCompleteInternal.bind(this));\n  }\n\n  get targetObject() {\n    return this._targetObject;\n  }\n\n  addToJuggler(): void {\n    this.juggler?.addAnimatable(this);\n  }\n\n  removeFromJuggler() {\n    this.juggler?.removeAnimatable(this);\n  }\n\n  public get juggler() {\n    return this._juggler;\n  }\n\n  public set juggler(value: GameJuggler) {\n    this._juggler = value;\n  }\n\n  public get destroyed(): boolean {\n    return this._isDestroyed;\n  }\n\n  override start(time?: number, overrideStartingValues?: boolean): this {\n    return super.start(time, overrideStartingValues);\n  }\n\n  override delay(amount: number): this {\n    return super.delay(amount * 1000);\n  }\n\n  override repeatDelay(amount: number): this {\n    return super.repeatDelay(amount * 1000);\n  }\n\n  override stop(): this {\n    return super.stop();\n  }\n\n  override end(): this {\n    return super.end();\n  }\n\n  override pause(time?: number): this {\n    return super.pause(time ? (time * 1000) : undefined);\n  }\n\n  override repeat(times: number): this {\n    return super.repeat(times);\n  }\n\n  yoyoFix(easingFunction: (amount: number) => number): this {\n    return super.easing((t: any) => {\n      if (t < 0.5) {\n        return easingFunction(2 * t);\n      } else {\n        return 1 - easingFunction(2 * (t - 0.5));\n      }\n    });\n    // throw new Error(\"TweenJs bug: https://github.com/tweenjs/tween.js/issues/677#issuecomment-1938289416\");\n  }\n\n  override easing(easingFunction: (amount: number) => number): this {\n    return super.easing(easingFunction);\n  }\n\n  override to(props: TweenParams, duration: number): this {\n    if (props.bezier) {\n      const midPoint = this.calculateMidPoint(props.bezier.startPoint, props.bezier.endPoint, props.bezier.curviness);\n      const bezierPath = {\n        x: [props.bezier.startPoint.x, midPoint.x, props.bezier.endPoint.x],\n        y: [props.bezier.startPoint.y, midPoint.y, props.bezier.endPoint.y],\n      };\n      delete props.bezier;\n      props[\"x\"] = bezierPath.x;\n      props[\"y\"] = bezierPath.y;\n      this.interpolation(Interpolation.Bezier) // Используем интерполяцию Bezier\n    }\n    return super.to(props, duration * 1000);\n  }\n\n  calculateMidPoint(\n    startPoint: { x: number; y: number },\n    endPoint: { x: number; y: number },\n    curviness: number\n  ): { x: number; y: number } {\n    const midX = (startPoint.x + endPoint.x) / 2;\n    const midY = (startPoint.y + endPoint.y) / 2;\n\n    const dx = endPoint.x - startPoint.x;\n    const dy = endPoint.y - startPoint.y;\n    const distance = Math.sqrt(dx * dx + dy * dy);\n\n    // Смещение средней точки на основе curviness\n    const offsetX = -curviness * dy * distance * 0.01;\n    const offsetY = curviness * dx * distance * 0.01;\n\n    return {x: midX + offsetX, y: midY + offsetY};\n  }\n\n  onRemovedFromJuggler() {\n    // if (!this._isDestroyed) {\n    //   this.pause();\n    //   // App.log('pause');\n    // }\n  }\n\n  private onCompleteInternal() {\n    if (!this._isCompleted) {\n      this._isCompleted = true;\n      if (this._onComplete) {\n        this._onComplete(this._targetObject);\n      }\n      this.destroy();\n    }\n  }\n\n  override onComplete(callback?: (object: any) => void): this {\n    this._onComplete = callback || null;\n    return this;\n  }\n\n  advanceTime(delta: number) {\n    if (!this._juggler) {\n      return;\n    }\n    if (!this._targetObject || this._targetObject.destroyed || this._isCompleted) {\n      this.destroy();\n      return;\n    }\n    this.update(this._juggler.root.pixi.ticker.lastTime);\n    // this.update(Main.pixi.ticker.lastTime);\n    // this.update();\n  }\n\n  destroy() {\n    if (!this._isDestroyed) {\n      this.removeFromJuggler();\n      this.stop();\n      this.remove();\n      this._isDestroyed = true;\n      this._targetObject = null;\n    }\n  }\n}\n\nexport class GameJuggler extends GameObject {\n\n  protected _animates: IAnimatable[] = [];\n  readonly root: AbstractPixiRoot;\n\n  constructor(root:AbstractPixiRoot, parentJuggler: GameJuggler | null) {\n    super();\n    this.root = root;\n    this._juggler = parentJuggler;\n  }\n\n  override advanceTime(delta: number) {\n    for (let i = this._animates.length - 1; i >= 0; i--) {\n      if (this._animates[i]?.destroyed) {\n        this.removeAnimatable(this._animates[i]);\n      } else {\n        this._animates[i]?.advanceTime(delta);\n      }\n      // App.log(this._animates[i])\n    }\n  }\n\n  public delayCall(callback: Function, durationSec: number) {\n    let delayCall = new GameDelayCall(this, callback, durationSec);\n    this._animates?.push(delayCall);\n    return delayCall;\n  }\n\n  public tween(target: any, duration: number, params: TweenParams) {\n    let tween = new GameTween(target, this);\n    this.addAnimatable(tween);\n    tween.to(params, duration);\n    // App.log(tween);\n    return tween;\n  }\n\n  public removeTweens(animatable?: IAnimatable | null) {\n    if (animatable) {\n      for (let i = this._animates.length - 1; i >= 0; i--) {\n        const anim = this._animates[i];\n        if (anim instanceof GameTween) {\n          const tween = anim as GameTween;\n          if (tween.targetObject == animatable) {\n            tween.destroy();\n          }\n        }\n      }\n    }\n  }\n\n  public removeAnimatable(animatable?: IAnimatable | null) {\n    ArrayUtils.remove(this._animates, animatable);\n    if (animatable && !animatable.destroyed) {\n      animatable.onRemovedFromJuggler();\n    }\n  }\n\n  public addAnimatable(animatable: IAnimatable | null) {\n    if (animatable && !this._animates?.includes(animatable)) {\n      animatable.juggler?.removeAnimatable(animatable);\n      animatable.juggler = this;\n      this._animates?.push(animatable);\n    }\n  }\n\n  public purge() {\n    while (this._animates?.length) {\n      this._animates.pop()?.destroy();\n    }\n  }\n\n  override destroy() {\n    this.purge();\n    super.destroy();\n  }\n}\n","import {GameObject, IDestroy} from \"./GameObject\";\nimport {ArrayUtils} from \"../../utils/ArrayUtils\";\n\nexport interface IPoolable extends IDestroy {\n  onReturnToPool():void;\n  onGetFromPool(pool:GamePool):void;\n}\n\nexport class GamePool extends GameObject {\n\n  private _allObjects:IPoolable[] = [];\n  private _pool:IPoolable[] = [];\n  private _creator:()=>IPoolable;  // function():Object\n\n  constructor(creator:()=>IPoolable) {\n    super();\n    this._creator = creator;\n  }\n\n  override destroy():void {\n    if (this._allObjects) {\n      this._allObjects.forEach((gameObject) => {\n        gameObject.destroy();\n      });\n      this._allObjects.length = 0;\n    }\n    if (this._pool) {\n      this._pool.forEach((gameObject) => {\n        gameObject.destroy();\n      });\n      this._pool.length = 0;\n    }\n    super.destroy();\n  }\n\n  public removeFromPool(obj:IPoolable):void {\n    if (!this.destroyed && obj) {\n      ArrayUtils.remove(this._pool, obj);\n      ArrayUtils.remove(this._allObjects, obj);\n    }\n  }\n\n  public returnToPool(obj:IPoolable):void {\n    if (obj && !this._pool.includes(obj)) {\n      obj.onReturnToPool();\n      this._pool.push(obj);\n    }\n  }\n\n  public getFromPool() {\n    let obj!:IPoolable;\n    if (this._pool.length == 0) {\n      obj = this._creator();\n      this._allObjects.push(obj);\n    } else {\n      obj = this._pool.pop()!;\n    }\n    obj.onGetFromPool(this);\n    return obj;\n  }\n\n  public returnAllToPool() {\n    if (!this.destroyed) {\n      this._allObjects.forEach((gameObject) => {\n        this.returnToPool(gameObject);\n      })\n    }\n  }\n\n}\n","import {IDestroy} from \"./GameObject\";\nimport * as PIXI from 'pixi.js';\nimport {Bounds} from \"pixi.js/lib/scene/container/bounds/Bounds\";\n\nexport class GameSprite extends PIXI.Sprite implements IDestroy {\n\n  public needDestroyTexture = false\n\n  override set interactive(value: boolean) {\n    super.interactive = value;\n    this.interactiveChildren = value;\n  }\n\n  override destroy() {\n    if (this.destroyed) {\n      return;\n    }\n    this.removeFromParent();\n    super.destroy({\n      children: true,\n\n      texture: this.needDestroyTexture,\n      textureSource: this.needDestroyTexture,\n    });\n  }\n\n}\n","import {GameDialog, GameObject} from \"../base\";\nimport {AbstractText} from \"pixi.js\";\nimport {Button} from \"../flump\";\n\nexport abstract class AbstractInfoDialog extends GameDialog {\n\n  protected _text = '';\n  protected _tf?: AbstractText | null;\n  protected _btnCallback?: Function | null;\n\n  constructor(text: string, btnCallback: Function | null = null) {\n    super();\n    this._text = text;\n    this._btnCallback = btnCallback;\n  }\n\n  override onAdded() {\n    super.onAdded();\n    this.createDialog();\n    this.show();\n  }\n\n  override get tabletMultiplier() {\n    return 1;\n  }\n\n  override destroy() {\n    this._tf = GameObject.destroy(this._tf);\n    this._btnCallback = null;\n    super.destroy();\n  }\n\n  override get dialogContentMoldName(): string {\n    return 'dialog_info';\n  }\n\n  override getCenterY(): number {\n    return this.root.fixedStageSafeHeight / 2;\n  }\n\n  override createDialog() {\n    super.createDialog();\n\n    this._dialogContent!.getButtonByLabel('btn_confirm').visible = false;\n    this._dialogContent!.getButtonByLabel('btn_cancel').visible = false;\n\n    let btnCancel:Button = this._dialogContent!.getChildByLabel('btn_ok') as Button;\n    btnCancel.setText(this.getButtonText());\n    btnCancel.startPulsating();\n    btnCancel.clickCallback = this.onButtonClick.bind(this);\n\n    const iconPlacer = this._dialogContent!.getPlacerByLabel('icon');\n    iconPlacer.place(this.getIcon())\n      .fitHeight(true, true)\n      .fitWidth(true, false)\n      .alignCenter();\n\n    const textPlacer = this._dialogContent!.getPlacerByLabel('text');\n    this._tf = this.root.mainTextLib.createBitmapText(this.getText(), textPlacer.width, textPlacer.height);\n    textPlacer.place(this._tf)\n      .fitWidth(true, true)\n      .fitHeight(true, false)\n      .alignCenter();\n  }\n\n  protected getText(): string {\n    return this._text;\n  }\n\n  protected getIcon() {\n    return this.root.uiLib.create(\"icon_info\");\n  }\n\n  protected getButtonText() {\n    return 'OK';\n  }\n\n  protected onButtonClick() {\n    this.onButtonClose();\n    if (this._btnCallback) {\n      this._btnCallback();\n    }\n  }\n}\n","import {GameScreen} from './GameScreen';\nimport {GameSplashScreen} from './GameSplashScreen';\nimport {GameWaiter} from './GameWaiter';\nimport {GameDialog} from './GameDialog';\nimport {GameDispatcher} from './GameDispatcher';\nimport {GameDialogLayer, GameScreenLayer} from '../layers';\nimport {GameObject} from \"./GameObject\";\nimport {ArrayUtils} from \"../../utils/ArrayUtils\";\nimport {ObjectUtils} from \"../../utils/ObjectUtils\";\nimport {WaiterLayer} from \"../layers/WaiterLayer\";\nimport {SplashLayer} from \"../layers/SplashLayer\";\nimport {UILayer} from \"../layers/UILayer\";\nimport {AbstractInfoDialog} from \"../dialogs/AbstractInfoDialog\";\nimport {Rectangle} from \"pixi.js\";\n\nexport class GameScreenNavigator extends GameScreen {\n\n  protected _splashScreenClass: (new () => GameSplashScreen) | null = null;  // Class type for splash screen\n  protected _splashScreen: GameSplashScreen | null = null;\n  protected _isScreenChangingProcess: boolean = false;\n  protected _gameWaiter: GameWaiter | null = null;\n\n  protected _screenLayer: GameScreenLayer = new GameScreenLayer();\n  protected _uiLayer = new UILayer();\n  protected _dialogLayer = new GameDialogLayer();\n  protected _splashLayer = new SplashLayer();\n  protected _waiterLayer = new WaiterLayer();\n  protected _incomingScreen: GameScreen | null = null;\n  protected _dialogsQueue: GameDialog[] = [];\n\n  constructor() {\n    super();\n    this.addChild(this._screenLayer);\n    this.addChild(this._uiLayer);\n    this.addChild(this._dialogLayer);\n    this.addChild(this._splashLayer);\n    this.addChild(this._waiterLayer);\n  }\n\n  protected _currentScreen: GameScreen | null = null;\n\n  override getAreaForHtml(){\n    return this._currentScreen?.getAreaForHtml() || new Rectangle();\n  }\n\n  public get currentScreen(): GameScreen | null {\n    return this._currentScreen;\n  }\n\n  public getScreenFromHierarchy(targetClass: any):any {\n    for (const child of this._screenLayer.children) {\n      // console.log(child.constructor.name);\n\n      if (child instanceof targetClass) {\n        return child;\n      }\n      if (child instanceof GameScreenNavigator) {\n        let result =  (child as GameScreenNavigator).getScreenFromHierarchy(targetClass);\n        if (result) {\n          return result;\n        }\n      }\n    }\n    return null;\n  }\n\n  public get isLoadingIncomingScreen(): boolean {\n    return Boolean(this._incomingScreen);\n  }\n\n  override getStateDescription(): string {\n    return `GameScreenNavigator: currentScreen: ${this._currentScreen ? this._currentScreen.getStateDescription() : '---'}`;\n  }\n\n  public setSplashScreenClass(splashScreenClass: (new () => GameSplashScreen)): void {\n    this._splashScreenClass = splashScreenClass;\n  }\n\n  override destroy(): void {\n    this.removeAllDialogs();\n    super.destroy();\n    this._splashScreen = GameObject.destroy(this._splashScreen);\n    GameObject.destroy(this._uiLayer);\n    GameObject.destroy(this._screenLayer);\n    GameObject.destroy(this._dialogLayer);\n    GameObject.destroy(this._splashLayer);\n    GameObject.destroy(this._waiterLayer);\n    GameObject.destroy(this._incomingScreen);\n  }\n\n  public showDialog(dialog: GameDialog, enqueue: boolean = false, replaceOthersOfSameType: boolean = false): void {\n    this.root.app.executeWhenApplicationIsActive(() => {\n      if (this.destroyed) {\n        return;\n      }\n      if (!dialog || dialog.destroyed || dialog.parent || !this.root.assetsLoader?.isLoaded) {\n        return;\n      }\n\n      dialog.root = this.root;\n\n      if (replaceOthersOfSameType) {\n        this._dialogLayer.hideAllDialogsWithType(ObjectUtils.getQualifiedClassName(dialog));\n      }\n      if (!enqueue || !this._dialogsQueue.length) {\n        if (dialog instanceof AbstractInfoDialog) {\n          this._waiterLayer.addChild(dialog);\n        } else {\n          this._dialogLayer.addChild(dialog);\n        }\n        dialog.loadAssets(dialog.onAdded.bind(dialog));\n        dialog._shouldDisposeCallback = this.onDialogRemove.bind(this);\n      }\n      if (enqueue && !this._dialogsQueue.includes(dialog)) {\n        this._dialogsQueue.push(dialog);\n      }\n    });\n  }\n\n  public async changeScreen<T extends GameScreen>(screen: T, withSplash: boolean) {\n    if (this.destroyed) {\n      return;\n    }\n    if (this._splashScreen) {\n      return;\n    }\n    if (this._incomingScreen || this._isScreenChangingProcess) {\n      return;\n    }\n\n    screen.root = this.root;\n\n    this._incomingScreen = screen;\n    this._isScreenChangingProcess = true;\n\n    this.root.app.executeWhenApplicationIsActive(async () => {\n      if (withSplash && this._splashScreenClass) {\n        this._splashScreen = new this._splashScreenClass();\n        this._splashScreen.root = this.root;\n        await this._splashScreen!.loadAssets(this.showSplashScreen.bind(this));\n      } else {\n        this.loadIncomingScreen();\n      }\n    });\n  }\n\n  public showWaiter(): void {\n    if (!this._gameWaiter) {\n      this._gameWaiter = new GameWaiter(this.root, this._waiterLayer);\n    }\n    this.root.app.executeWhenApplicationIsActive(this._gameWaiter.show.bind(this._gameWaiter));\n  }\n\n  public hideWaiter(): void {\n    if (this._gameWaiter) {\n      this.root.app.executeWhenApplicationIsActive(this._gameWaiter.hide.bind(this._gameWaiter));\n    }\n  }\n\n  public removeAllDialogs(): void {\n    if (this.children) {\n      for (let i = this.children.length - 1; i >= 0; i--) {\n        let child = this.children[i];\n        if (child instanceof GameScreenNavigator) {\n          (child as GameScreenNavigator).removeAllDialogs();\n        }\n      }\n    }\n    if (this._dialogsQueue) {\n      GameObject.destroy(this._dialogsQueue);\n    }\n    if (this._dialogLayer) {\n      this._dialogLayer.destroyChildren();\n    }\n  }\n\n  public destroySplash(): void {\n    this._splashScreen = GameObject.destroy(this._splashScreen);\n  }\n\n  protected loadIncomingScreen(): void {\n    if (this._currentScreen) {\n      this._currentScreen = GameObject.destroy(this._currentScreen);\n    }\n    if (this._incomingScreen) {\n      setTimeout(() => this._incomingScreen?.loadAssets(this.onIncomingScreenLoaded.bind(this)), 50); // time for GC\n    }\n  }\n\n  protected async onIncomingScreenLoaded() {\n    this._currentScreen = this._incomingScreen;\n    this._isScreenChangingProcess = false;\n    this._incomingScreen = null;\n\n    if (this.currentScreen) {\n      this._screenLayer.addChild(this.currentScreen);\n      await this.currentScreen.onAdded();\n      this.root.onScreenHierarchyChanged.dispatch();\n    }\n\n    if (this._splashScreen) {\n      this._splashScreen.hide();\n    }\n\n    // if (DeviceManager.isLowMemory()) {\n    //   this.showDialog(new ErrorDialog(Locale.getText(Locale.low_device_memory)));\n    // }\n  }\n\n  private onDialogRemove(dialog: GameDialog): void {\n    this.root.app.executeWhenApplicationIsActive(() => {\n      if (this.destroyed) {\n        return;\n      }\n      ArrayUtils.remove(this._dialogsQueue, dialog);\n      GameObject.destroy(dialog);\n      if (this._dialogsQueue && this._dialogsQueue.length) {\n        if (!this.root.app.error.isUncaughtErrorOccurred) {\n          let dialogToShow = this._dialogsQueue.shift();\n          if(dialogToShow && !dialogToShow.parent) {\n            this.showDialog(dialogToShow);\n          }\n        }\n      }\n    });\n  }\n\n  private showSplashScreen(): void {\n    this._splashLayer.addChild(this._splashScreen!);\n    this._splashScreen!.onShowed = this.loadIncomingScreen.bind(this);\n    this._splashScreen!.onHide = this.destroySplash.bind(this);\n    this._splashScreen!.onAdded();\n  }\n\n  override onActivate(): void {\n    this._currentScreen?.onActivate();\n  }\n\n  override onDeActivate(): void {\n    this._currentScreen?.onDeActivate();\n  }\n\n  override onExit(): void {\n    this._currentScreen?.onExit();\n  }\n\n  override onResize(): void {\n    this._screenLayer?.onResize();\n    this._uiLayer?.onResize();\n    this._dialogLayer?.onResize();\n    this._splashLayer?.onResize();\n    this._waiterLayer?.onResize();\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {Assets, Texture} from 'pixi.js';\nimport {GameObject} from \"../base/GameObject\";\nimport {PixiAssetsScaleFactor, AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {LibraryFlump} from \"../flump/library/LibraryFlump\";\nimport {LibraryMold} from \"../flump/library/LibraryMold\";\nimport {LibrarySpine} from \"../spine/LibrarySpine\";\nimport {TextureAtlas} from \"@esotericsoftware/spine-pixi-v8\";\nimport {LibraryText} from \"../text/LibraryText\";\n\nexport interface AssetAlias {\n  alias:string;\n  src:string;\n  isMultipack?:boolean;\n}\n\nexport class PixiAssetsLoader extends GameObject {\n\n  private static referenceCounter: Map<string, number> = new Map(); // Храним счетчик использования ассетов\n  private loadedAssets: Set<string> = new Set(); // Отслеживаем загруженные ассеты для текущего экрана\n  private onLoadCallbacks: (() => void)[] = [];\n  private isLoading: boolean = false;\n  private loadingQueue: AssetAlias[] = [];\n  private flumpLibs: Map<string, LibraryFlump> = new Map();\n  private spineLibs: Map<string, LibrarySpine> = new Map();\n  private textLibs: Map<string, LibraryText> = new Map();\n  private _isLoaded = false;\n\n  readonly root: AbstractPixiRoot;\n\n  constructor(root: AbstractPixiRoot) {\n    super();\n    this.root = root;\n    if (!this.root.isInitialized) {\n      throw new Error(\"PixiAssetsLoader requires initialized PIXI instance\");\n    }\n  }\n\n  get isLoaded() {\n    return this._isLoaded;\n  }\n\n  private get assetsScaleFactorPath() {\n    return `assets/${this.root.scaleFactor}x`;\n  }\n\n  // public getSpineLibraryByName(name: string): LibrarySpine | undefined {\n  //   return this.spineLibraries.get(name);\n  // }\n\n  private get assetsFlumpDirPath() {\n    return `assets/flump`;\n  }\n\n  private get assetsSpineDirPath() {\n    return `assets/spine`;\n  }\n\n  public getTextLib(libName: string) {\n    return this.textLibs.get(libName)!;\n  }\n\n  public getFlumpLib(libName: string) {\n    return this.flumpLibs.get(libName)!;\n  }\n\n  public getSpineLib(libName: string) {\n    return this.spineLibs.get(libName);\n  }\n\n  public async enqueueFontFace() {\n    throw new Error('Not implemented');\n    // for not bitmap text\n    // let font:FontFace;\n    // switch (Locale.currentLanguage) {\n    //   case Locale.hi:\n    //     font = new FontFace('main', 'url(/assets/fonts/Laila-Bold.ttf)');\n    //     break;\n    //   default:\n    //     font = new FontFace('main', 'url(/assets/fonts/main.ttf)');\n    //     break;\n    // }\n    // await font.load();\n    // (document.fonts as FontFaceSet & { add(font: FontFace): void }).add(font);\n  }\n\n  public enqueueBitmapFont(fontFileName:string) {\n    if (!this.textLibs.has(fontFileName)) {\n      this.textLibs.set(fontFileName, new LibraryText(this.root, fontFileName));\n      this.enqueueFile({src: 'assets/fonts/'+fontFileName+'.xml', alias: fontFileName});\n    }\n  }\n\n  private static flumpLibJsonFilePrefix = 'flumpLib_';\n  public enqueueFlumpLib(name: string, isMultiatlas = false, libInstance: LibraryFlump | null = null): void {\n    if (!this.flumpLibs.has(name)) {\n      this.flumpLibs.set(name, libInstance || new LibraryFlump(this.root));\n\n      this.enqueueAtlas(name, isMultiatlas);\n      const libFileAlias:AssetAlias = {alias:PixiAssetsLoader.flumpLibJsonFilePrefix+name, src: `${this.assetsFlumpDirPath}/${name}.json`};\n      this.loadingQueue.push(libFileAlias);\n      this.incrementReferenceCount(libFileAlias.src);\n\n      this.loadedAssets.add(libFileAlias.alias);\n      this.incrementReferenceCount(libFileAlias.alias); // Увеличиваем счетчик использования для каждого ресурса\n    }\n  }\n\n  private static spineLibJsonFilePrefix = 'spineLib_';\n  private static spineAtlasFilePrefix = 'spineAtlas_';\n  public enqueueSpineLib(name: string): void {\n    if (!this.spineLibs.has(name)) {\n      const skeletonName = PixiAssetsLoader.spineLibJsonFilePrefix + name;\n      const atlasName = PixiAssetsLoader.spineAtlasFilePrefix + name;\n      this.spineLibs.set(name, new LibrarySpine(skeletonName, atlasName));\n\n      let alias:AssetAlias = {alias:atlasName, src: `${this.assetsScaleFactorPath}/spine/${name}.atlas`};\n      this.enqueueFile(alias);\n\n      const libFileAlias:AssetAlias = {alias:skeletonName, src: `${this.assetsSpineDirPath}/${name}.json`};\n      this.enqueueFile(libFileAlias);\n\n      // spine assets hack\n      this.loadedAssets.add(skeletonName + '-' + atlasName + '-1');\n      this.incrementReferenceCount(skeletonName + '-' + atlasName + '-1');\n    }\n  }\n  // !!! Make sure to only load the first sprite sheet of your multipack set.\n  // If you load more than one sheet from the same set, PixiJS deadlocks and does not complete the loading process.\n  // PIXI.Assets.load([\n  //     \"spritesheets/sheet-0.json\",\n  // ]).then(() => {\n  public enqueueAtlas(name: string, isMultiatlas = false): void {\n    let alias:AssetAlias;\n    if (isMultiatlas) {\n      alias = {alias:name, src: `${this.assetsScaleFactorPath}/${name}/${name}-0.json`, isMultipack: true};\n      this.enqueueFile(alias);\n\n      alias = {alias:name, src: `${this.assetsScaleFactorPath}/${name}/${name}-1.json`, isMultipack: true};\n      this.enqueueFile(alias);\n    } else {\n      alias = {alias:name, src: `${this.assetsScaleFactorPath}/${name}/${name}.json`};\n      this.enqueueFile(alias);\n    }\n  }\n\n  public enqueueFile(alias: AssetAlias) {\n    // for (const child of this.loadingQueue) {\n    //   if (child.alias == alias.alias && child.src == alias.src) {\n    //     return false;\n    //   }\n    // }\n    this.loadingQueue.push(alias);\n    this.loadedAssets.add(alias.src);\n    this.incrementReferenceCount(alias.src);\n    return true;\n  }\n\n  public async loadAssets(onLoad?: () => void): Promise<void> {\n    if (this.isLoading) {\n      if (onLoad) {\n        this.onLoadCallbacks.push(onLoad);\n      }\n      return;\n    }\n\n    if (this._isLoaded) {\n      if (onLoad) {\n        onLoad();\n      }\n      return;\n    }\n\n    this.isLoading = true;\n\n    try {\n      // Загружаем ассеты для текущего экрана\n      await PIXI.Assets.load(this.loadingQueue);\n\n      // const cache = Assets.cache;\n\n      this.flumpLibs.forEach((libraryFlump, flumpName) => {\n        const libJSON = Assets.cache.get(PixiAssetsLoader.flumpLibJsonFilePrefix+flumpName);\n        const libraryMold = LibraryMold.fromJSON(libJSON, AbstractPixiRoot.multiply(this.root.scaleFactor));\n        libraryFlump.init(flumpName, libraryMold);\n      });\n\n      this._isLoaded = true;\n\n      // console.log(this.loadedAssets);\n\n      // Вызываем все колбэки загрузки\n      for (const callback of this.onLoadCallbacks) {\n        callback();\n      }\n\n      this.onLoadCallbacks = [];\n      this.isLoading = false;\n\n      if (onLoad) {\n        onLoad();\n      }\n    } catch (error) {\n      this.isLoading = false;\n      this._isLoaded = false;\n      console.error('Ошибка при загрузке ассетов:', error);\n    }\n  }\n\n  private replaceFileNameInPath(path:string, fileName:string){\n    let lastSlashIndex = path.lastIndexOf(\"/\");\n    return path.substring(0, lastSlashIndex + 1) + fileName;\n  }\n\n  public async unloadAssets() {\n    if (!this._isLoaded) {\n      return;\n    }\n    const loadedAssets = this.loadedAssets;\n    for (const path of loadedAssets) {\n      this.decrementReferenceCount(path); // Уменьшаем счетчик использования при удалении экрана\n    }\n    this.loadedAssets.clear();\n    this._isLoaded = false;\n  }\n\n  public getTextureByName(alias: string): PIXI.Texture | undefined {\n    const cache = Assets.cache;\n    const value = cache.get(alias);\n    return value as PIXI.Texture;\n  }\n\n  public unloadAssetByAlias(alias: string) {\n    this.decrementReferenceCount(alias);\n  }\n\n  public getObjectByAlias(alias: string) {\n    const cache = Assets.cache;\n    const value = cache.get(alias);\n    return value;\n  }\n\n  override destroy(): void {\n    if (!this._isDestroyed) {\n      this.unloadAssets();\n      this.loadingQueue = [];\n      this.onLoadCallbacks = [];\n      this.textLibs.clear();\n      this.flumpLibs.clear();\n      this.spineLibs.clear();\n    }\n    super.destroy();\n  }\n\n  private incrementReferenceCount(path: string): void {\n    const count = PixiAssetsLoader.referenceCounter.get(path) || 0;\n    PixiAssetsLoader.referenceCounter.set(path, count + 1);\n  }\n\n  private async decrementReferenceCount(path: string) {\n    const count = PixiAssetsLoader.referenceCounter.get(path) || 0;\n    if (count > 0) {\n      PixiAssetsLoader.referenceCounter.set(path, count - 1);\n      if (count - 1 <= 0) {\n        const cache = Assets.cache;\n        const asset = cache.get(path);\n\n        // Spine textures dispose\n        if (asset instanceof TextureAtlas) {\n          const atlas = asset as TextureAtlas;\n          atlas.pages.forEach((page) => {\n            if (page.texture) {\n              // @ts-ignore\n              const texture:any = page.texture['texture'] as any;\n              if (texture instanceof Texture) {\n                (texture as Texture).destroy(true);\n              }\n            }\n            const image = page.texture?.getImage();\n            if (image instanceof ImageBitmap) {\n              image.close();\n            }\n            page.texture?.dispose();\n          });\n          atlas.dispose();\n        }\n\n        await PIXI.Assets.unload(path);\n\n        cache.remove(path);\n      }\n    }\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {Assets} from 'pixi.js';\nimport {GameObject, IDestroy} from \"../../base/GameObject\";\nimport {LibraryMold} from \"./LibraryMold\";\nimport {AbstractPixiRoot} from \"../../AbstractPixiRoot\";\nimport {MovieMold} from \"./MovieMold\";\nimport {Container} from \"../display/Container\";\nimport {Movie} from \"../display/Movie\";\nimport {Button} from \"../display/Button\";\nimport {TabButton} from \"../display/TabButton\";\nimport {ClickArea} from \"../display/ClickArea\";\nimport {TextInput} from \"../display/TextInput\";\nimport {Checkbox} from \"../display/Checkbox\";\nimport {GameView} from \"../../base/GameView\";\n\nexport interface DisplayObjectFrameState {\n  x: number;\n  y: number;\n  scaleX: number;\n  scaleY: number;\n  skewX: number;\n  skewY: number;\n  pivotX: number;\n  pivotY: number;\n  alpha: number;\n  visible: boolean;\n}\n\nexport class LibraryFlump extends GameObject {\n\n  static readonly FLUMP_LABEL = \"label\";\n  static readonly FLUMP_CLASS = \"CLASS:\";\n  static readonly FLUMP_PLACER = \"PLACER:\";\n  static readonly FLUMP_CONTENT = \"CONTENT\";\n  static readonly FLUMP_IGNORE = \"IGNORE\";\n  static readonly FLUMP_STATE_UP = \"STATE_UP\";\n  static readonly FLUMP_STATE_DOWN = \"STATE_DOWN\";\n  static readonly FLUMP_BOX = \"BOX\";\n  static readonly FLUMP_CHECK = \"CHECK\";\n  static readonly FLUMP_TEXT = \"TEXT:\";\n\n  private name!: string;\n  private creatorsMap: Record<string, IDestroy> = {};\n  private libraryMold!: LibraryMold;\n\n  readonly pixiRoot: AbstractPixiRoot;\n\n  constructor(pixiRoot: AbstractPixiRoot) {\n    super();\n    this.pixiRoot = pixiRoot;\n  }\n\n  unloadAssets() {\n    // TODO!!!!!!!!\n  }\n\n  public init(name: string, libraryMold: LibraryMold) {\n    this.name = name;\n\n    this.libraryMold = libraryMold;\n    const textureGroup = this.libraryMold.bestTextureGroupForScaleFactor(this.pixiRoot.app.device.devicePixelRatio);\n\n    if (textureGroup) {\n      for (const atlasMold of textureGroup.atlasMolds) {\n        const scale = atlasMold.scaleFactor;\n\n        for (const atlasTextureMold of atlasMold.atlasTextureMolds) {\n\n          let bounds = atlasTextureMold.bounds;\n          let origin = atlasTextureMold.origin;\n\n          // Преобразуем границы и координаты для масштаба\n          if (scale !== 1) {\n            bounds = bounds.clone();\n            bounds.x = bounds.x / scale;\n            bounds.y = bounds.y / scale;\n            bounds.width = bounds.width / scale;\n            bounds.height = bounds.height / scale;\n\n            origin = origin.clone();\n            origin.x = origin.x / scale;\n            origin.y = origin.y / scale;\n          }\n\n          const cache = Assets.cache;\n          const symbol = atlasTextureMold.symbol;\n          const texture = cache.get(symbol);\n          if (!texture) {\n            this.pixiRoot.app.log(\"SpriteCreator texture for symbol: \" + symbol + \" = null!!!\");\n          }\n          this.addCreator(atlasTextureMold.symbol, new SpriteCreator(texture, origin, symbol));\n        }\n      }\n    }\n\n    for (const movieMold of this.libraryMold.movieMolds) {\n      this.addCreator(movieMold.symbol!, movieMold);\n    }\n  }\n\n  public getMovieMoldBySymbol(symbol: string) {\n    for (let movieMold of this.libraryMold.movieMolds) {\n      if (movieMold.symbol == symbol) {\n        return movieMold;\n      }\n    }\n    return null;\n  }\n\n  public getTexture(name: string): PIXI.Texture | undefined {\n    const cache = Assets.cache;\n    const value = cache.get(name);\n    return value as PIXI.Texture;\n  }\n\n  public createImage(textureName: string) {\n    return this.create(textureName) as PIXI.Sprite;\n  }\n\n  public createMovie(movieName: string) {\n    return this.create(movieName) as Movie;\n  }\n\n  public createContainer(containerName: string) {\n    return this.create(containerName) as Container;\n  }\n\n  create(symbolName: string) {\n    const creator = this.creatorsMap[symbolName];\n    if (!creator) {\n      this.pixiRoot.app.logError(`ERROR: no creator found for symbol: ${symbolName}`);\n    }\n\n    let displayObject!: PIXI.Container;\n\n    if (creator instanceof SpriteCreator) {\n      displayObject = creator.createSprite();\n    } else if (creator instanceof MovieMold) {\n      const movieMold = creator as MovieMold;\n      const flumpLabel = movieMold.flumpClassLabel;\n\n      if (flumpLabel.includes(LibraryFlump.FLUMP_CLASS)) {\n        const className = flumpLabel.replace(LibraryFlump.FLUMP_CLASS, '');\n        let container = this.createContainerByClassName(className, movieMold);\n        if (!creator) {\n          this.pixiRoot.app.logError(`ERROR: CustomContainerCreator:create - Unknown class ${className}`);\n        }\n        displayObject = container!;\n      } else {\n        displayObject = new Movie(movieMold, this);\n      }\n    } else {\n      this.pixiRoot.app.logError(`ERROR: wrong symbol creator: ${symbolName}`);\n    }\n\n    if (displayObject instanceof GameView) {\n      (displayObject as GameView).root = this.pixiRoot;\n    }\n    if (displayObject instanceof Container) {\n      (displayObject as Container).build();\n    }\n    return displayObject;\n  }\n\n  protected createContainerByClassName(className: string, movieMold: MovieMold):Container | null {\n    switch (className) {\n      case 'Container':\n        return new Container(movieMold, this);\n      case 'Button':\n        return new Button(movieMold, this);\n      case 'TabButton':\n        return new TabButton(movieMold, this);\n      case \"ClickArea\":\n        return new ClickArea(movieMold, this);\n      case \"TextInput\":\n        return new TextInput(movieMold, this);\n      case \"Checkbox\":\n        return new Checkbox(movieMold, this);\n      default:\n        return null;\n    }\n  }\n\n  applyFrameState(displayObject: PIXI.Container, state: DisplayObjectFrameState) {\n    if (displayObject instanceof PIXI.Sprite) {\n      displayObject?.anchor?.set(0);\n    }\n\n    if (state.skewX == state.skewY) {\n      displayObject.skew.set(0, 0);\n      displayObject.angle = 0;\n      displayObject.rotation = state.skewX;\n    } else if (state.skewX > 0 && state.skewY < 0) {\n      // displayObject.rotation = 0;\n      displayObject.skew.set(-state.skewX, -state.skewY);\n      // displayObject.rotation = state.skewY;\n    } else {\n      displayObject.skew.set(state.skewX, state.skewY);\n      displayObject.rotation = 0;\n    }\n    displayObject.pivot.set(state.pivotX, state.pivotY);\n    displayObject.position.set(state.x, state.y);\n    // if (displayObject.parent) {\n    //   displayObject.scale.set(state.scaleX / displayObject.parent.scale.x, state.scaleY / displayObject.parent.scale.y);\n    // } else {\n    //   displayObject.scale.set(state.scaleX, state.scaleY);\n    // }\n    displayObject.scale.set(state.scaleX, state.scaleY);\n\n    displayObject.alpha = state.alpha;\n    displayObject.visible = state.visible;\n  }\n\n  override destroy(): void {\n    this.unloadAssets();\n    super.destroy();\n    for (const key in this.creatorsMap) {\n      this.creatorsMap[key].destroy();\n      delete this.creatorsMap[key];\n    }\n    this.creatorsMap = {};\n  }\n\n  private addCreator(symbol: string, creator: IDestroy): void {\n    if (this.creatorsMap[symbol]) {\n      console.error(`LibraryFlump:addCreator '${symbol}' creator already exists!`);\n    }\n    this.creatorsMap[symbol] = creator;\n  }\n}\n\nclass SpriteCreator extends GameObject {\n\n  private texture: PIXI.Texture;\n  private origin: { x: number; y: number };\n  private symbol: string;\n\n  constructor(texture: PIXI.Texture, origin: { x: number; y: number }, symbol: string) {\n    super();\n    this.texture = texture;\n    this.origin = origin;\n    this.symbol = symbol;\n  }\n\n  createSprite(): PIXI.Sprite {\n    const sprite = new PIXI.Sprite(this.texture);\n    sprite.anchor.set(this.origin.x / this.texture.width, this.origin.y / this.texture.height);\n    return sprite;\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport {DisplayObjectFrameState} from \"./LibraryFlump\";\n\nexport class KeyframeMold extends GameObject implements DisplayObjectFrameState {\n\n  index: number = 0;\n\n  /** The length of this keyframe in frames. */\n  duration: number = 0;\n\n  /** The symbol of the image or movie in this keyframe, or null if there is nothing in it. */\n  ref: string | null = null;\n\n  /** The label on this keyframe, or null if there isn't one */\n  label: string | null = null;\n\n  /** Exploded values from matrix */\n  x: number = 0.0;\n  y: number = 0.0;\n  scaleX: number = 1.0;\n  scaleY: number = 1.0;\n  skewX: number = 0.0;\n  skewY: number = 0.0;\n\n  /** Transformation point */\n  pivotX: number = 0.0;\n  pivotY: number = 0.0;\n\n  alpha: number = 1;\n  visible: boolean = true;\n\n  /** Is this keyframe tweened? */\n  tweened: boolean = true;\n\n  /** Tween easing. Only valid if tweened==true. */\n  ease: number = 0;\n\n  static fromJSON(o: Record<string, any>, mult: number = 1) {\n    const mold = new KeyframeMold();\n    mold.index = ObjectUtils.getKeyNumberValue(o, \"index\");\n    mold.duration = ObjectUtils.getKeyNumberValue(o, \"duration\");\n    this.extract(o, mold, \"ref\");\n    this.extract(o, mold, \"alpha\");\n    this.extract(o, mold, \"visible\");\n    this.extract(o, mold, \"ease\");\n    this.extract(o, mold, \"tweened\");\n    this.extract(o, mold, \"label\");\n    this.extractNested(o, mold, \"loc\", \"x\", \"y\", mult);\n    this.extractNested(o, mold, \"scale\", \"scaleX\", \"scaleY\");\n    this.extractNested(o, mold, \"skew\", \"skewX\", \"skewY\");\n    this.extractNested(o, mold, \"pivot\", \"pivotX\", \"pivotY\", mult);\n    return mold;\n  }\n\n  private static extractNested(o: Record<string, any>, destObj: Record<string, any>, source: string,\n    dest1: string, dest2: string, mult: number = 1) {\n    const extracted = o[source];\n    if (extracted === undefined) {\n      return;\n    }\n    destObj[dest1] = extracted[0] * mult;\n    destObj[dest2] = extracted[1] * mult;\n  }\n\n  private static extract(o: Record<string, any>, destObj: Record<string, any>, field: string, mult: number = 1) {\n    const extracted = o[field];\n    if (extracted === undefined) {\n      return;\n    }\n    if (extracted instanceof Number) {\n      // @ts-ignore\n      destObj[field] = extracted * mult;\n    } else {\n      destObj[field] = extracted;\n    }\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport {KeyframeMold} from \"./KeyframeMold\";\nimport {DisplayObjectFrameState} from \"./LibraryFlump\";\nimport * as PIXI from \"pixi.js\";\n\nexport class FrameMold implements DisplayObjectFrameState {\n  ref: string | null = null;\n  x: number = 0.0;\n  y: number = 0.0;\n  scaleX: number = 1.0;\n  scaleY: number = 1.0;\n  skewX: number = 0.0;\n  skewY: number = 0.0;\n  pivotX: number = 0.0;\n  pivotY: number = 0.0;\n  alpha: number = 1;\n  tintColor: string | null = null;\n  visible: boolean = true;\n\n  // display: PIXI.Container | null = null;\n}\n\nexport class MovieLayerMold extends GameObject {\n\n  name = \"\";\n  keyframeMolds: KeyframeMold[] = [];\n  framesMolds: (FrameMold | null)[] = [];\n\n  get framesCount(): number {\n    if (this.keyframeMolds.length === 0) {\n      return 0;\n    }\n    const lastKf = this.keyframeMolds[this.keyframeMolds.length - 1];\n    return lastKf.index + lastKf.duration;\n  }\n\n  static fromJSON(o: Record<string, any>, mult: number = 1): MovieLayerMold {\n    const mold = new MovieLayerMold();\n    mold.name = ObjectUtils.getKeyStringValue(o, \"name\", \"\");\n    const keyframes = ObjectUtils.getKeyObjValue(o, \"keyframes\", []);\n    if (Array.isArray(keyframes)) {\n      for (const kf of keyframes) {\n        mold.keyframeMolds.push(KeyframeMold.fromJSON(kf, mult));\n      }\n      mold.initFrames();\n    }\n    return mold;\n  }\n\n  private initFrames(){\n    for (let i = 0; i < this.framesCount; i++) {\n\n      let keyframeMold: KeyframeMold | null = null;\n\n      for (let k = 0; k < this.keyframeMolds.length; k++) {\n        const keyframe = this.keyframeMolds[k];\n        if (i >= keyframe.index && i < (keyframe.index + keyframe.duration)) {\n          keyframeMold = keyframe;\n        }\n      }\n\n      if (keyframeMold && keyframeMold.ref) {\n\n        const frame = new FrameMold();\n        frame.ref = keyframeMold.ref;\n        frame.pivotX = keyframeMold.pivotX;\n        frame.pivotY = keyframeMold.pivotY;\n        frame.visible = keyframeMold.visible;\n\n        const nextKf = this.keyframeMolds[this.keyframeMolds.indexOf(keyframeMold) + 1];\n\n        if (keyframeMold.tweened && nextKf) {\n          let interped = (i - keyframeMold.index) / keyframeMold.duration;\n          let ease = keyframeMold.ease;\n          if (ease !== 0) {\n            let t: number;\n            if (ease < 0) {\n              // Ease in\n              const inv = 1 - interped;\n              t = 1 - inv * inv;\n              ease = -ease;\n            } else {\n              // Ease out\n              t = interped * interped;\n            }\n            interped = ease * t + (1 - ease) * interped;\n          }\n\n          frame.x = keyframeMold.x + (nextKf.x - keyframeMold.x) * interped;\n          frame.y = keyframeMold.y + (nextKf.y - keyframeMold.y) * interped;\n          frame.scaleX = keyframeMold.scaleX + (nextKf.scaleX - keyframeMold.scaleX) * interped;\n          frame.scaleY = keyframeMold.scaleY + (nextKf.scaleY - keyframeMold.scaleY) * interped;\n          frame.skewX = keyframeMold.skewX + (nextKf.skewX - keyframeMold.skewX) * interped;\n          frame.skewY = keyframeMold.skewY + (nextKf.skewY - keyframeMold.skewY) * interped;\n          frame.alpha = keyframeMold.alpha + (nextKf.alpha - keyframeMold.alpha) * interped;\n        } else {\n          frame.x = keyframeMold.x;\n          frame.y = keyframeMold.y;\n          frame.scaleX = keyframeMold.scaleX;\n          frame.scaleY = keyframeMold.scaleY;\n          frame.skewX = keyframeMold.skewX;\n          frame.skewY = keyframeMold.skewY;\n          frame.alpha = keyframeMold.alpha;\n        }\n\n        this.framesMolds.push(frame);\n      } else {\n        this.framesMolds.push(null);\n      }\n    }\n  }\n\n  override destroy(): void {\n    super.destroy();\n    GameObject.destroy(this.keyframeMolds);\n  }\n}\n","import {GameView} from \"../../base/GameView\";\nimport {AbstractPixiRoot} from \"../../AbstractPixiRoot\";\nimport * as PIXI from 'pixi.js';\nimport {Align, ViewUtils} from \"../../utils/ViewUtils\";\nimport {GameObject} from \"../../base/GameObject\";\n\nexport class Placer extends GameView {\n\n  private _content: GameView;\n\n  constructor(root:AbstractPixiRoot, x: number, y: number, width: number, height: number, pivotX: number, pivotY: number) {\n    super();\n    this.root = root;\n\n    let placerWidth = width * (root.scaleFactor / 2);\n    let placerHeight = height * (root.scaleFactor / 2);\n\n    if (pivotX) {\n      this.x = x + (Math.abs(pivotX * width));\n    } else {\n      this.x = x;\n    }\n\n    if (pivotY) {\n      this.y = y + (Math.abs(pivotY * height));\n    } else {\n      this.y = y;\n    }\n\n    /**\n     * An optional bounds area for this container. Setting this rectangle will stop the renderer\n     * from recursively measuring the bounds of each children and instead use this single boundArea.\n     * This is great for optimisation! If for example you have a 1000 spinning particles and you know they all sit\n     * within a specific bounds, then setting it will mean the renderer will not need to measure the\n     * 1000 children to find the bounds. Instead it will just use the bounds you set.\n     */\n    this.boundsArea = new PIXI.Rectangle(0, 0, placerWidth, placerHeight);\n\n    // for debug\n    // const boundsQuad: PIXI.Sprite = ViewUtils.createGreenQuad(this.boundsArea.width, this.boundsArea.height, 0);\n    // this.addChild(boundsQuad);\n\n    this._content = new GameView();\n    this.addChild(this._content);\n  }\n\n  get content(): GameView {\n    return this._content;\n  }\n\n  clear(): Placer {\n    if (this._content) {\n      this._content.destroyChildren();\n    }\n    return this;\n  }\n\n  place(child: PIXI.Container): Placer {\n    if (this._content) {\n      this._content.addChild(child);\n    }\n    return this;\n  }\n\n  fitWidth(shouldFitIfBigger: boolean = true, shouldFitIfSmaller: boolean = true): Placer {\n    if (this._content) {\n      ViewUtils.fitToWidth(this._content, this.boundsArea.width, shouldFitIfBigger, shouldFitIfSmaller);\n    }\n    return this;\n  }\n\n  fitHeight(shouldFitIfBigger: boolean = true, shouldFitIfSmaller: boolean = true): Placer {\n    if (this._content) {\n      ViewUtils.fitToHeight(this._content, this.boundsArea.height, shouldFitIfBigger, shouldFitIfSmaller);\n    }\n    return this;\n  }\n\n  alignLeft(): Placer {\n    if (this._content) {\n      ViewUtils.alignPivot(this._content);\n      this._content.x = this._content.width / 2;\n      this._content.y = this.boundsArea.height / 2;\n    }\n    return this;\n  }\n\n  alignCenter(offsetX: number = 0, offsetY: number = 0): Placer {\n    if (this._content) {\n      this._content.x = this.boundsArea.width / 2 + offsetX;\n      this._content.y = this.boundsArea.height / 2 + offsetY;\n      ViewUtils.alignPivot(this._content);\n    }\n    return this;\n  }\n\n  alignCenterTop(): Placer {\n    if (this._content) {\n      ViewUtils.alignPivot(this._content, Align.CENTER, Align.TOP);\n      this._content.x = this.boundsArea.width / 2;\n      this._content.y = 0;\n    }\n    return this;\n  }\n\n  alignCenterBottom(): Placer {\n    if (this._content) {\n      ViewUtils.alignPivot(this._content, Align.CENTER, Align.BOTTOM);\n      this._content.x = this.boundsArea.width / 2;\n      this._content.y = 0;\n    }\n    return this;\n  }\n\n  override destroy(): void {\n    this.clear();\n    GameObject.destroy(this._content);\n    super.destroy();\n  }\n}\n","import {GameView} from \"../../base/GameView\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {Movie} from \"./Movie\";\nimport {KeyframeMold} from \"../library/KeyframeMold\";\nimport {Placer} from \"./Placer\";\nimport {Button} from \"./Button\";\nimport * as PIXI from 'pixi.js';\nimport {MovieLayerMold} from \"../library/MovieLayerMold\";\n\nexport class Container extends GameView {\n\n  protected _mold: MovieMold;\n  protected _library: LibraryFlump;\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super();\n    this._mold = mold;\n    this._library = library;\n    this.label = mold.symbol;\n  }\n\n  clone(){\n    let clone = new Container(this._mold, this._library);\n    clone.label = this.label + '_clone';\n    return clone;\n  }\n\n  getPlacerByLabel(label: string): Placer {\n    return this.getChildByLabel(label) as Placer;\n  }\n\n  getMovieByLabel(label: string): Movie {\n    return this.getChildByLabel(label) as Movie;\n  }\n\n  getButtonByLabel(label: string): Button {\n    return this.getChildByLabel(label) as unknown as Button;\n  }\n\n  getContainerByLabel(label: string): Container {\n    return this.getChildByLabel(label) as Container;\n  }\n\n  getImageByLabel(label: string): PIXI.Sprite {\n    return this.getChildByLabel(label) as PIXI.Sprite;\n  }\n\n  public build(): void {\n    for (let i = 0; i < this._mold.layers.length; i++) {\n      const moldLayer: MovieLayerMold = this._mold.layers[i];\n      const layerName: string = moldLayer.name;\n      const firstKeyFrameMold: KeyframeMold = moldLayer.keyframeMolds[0];\n      let display: PIXI.Container | null = null;\n\n      if (layerName.indexOf(LibraryFlump.FLUMP_PLACER) > -1) {\n        display = this.createPlacer(layerName, firstKeyFrameMold);\n      } else if (firstKeyFrameMold && firstKeyFrameMold.ref) {\n        display = this.createDisplayObject(layerName, firstKeyFrameMold);\n      }\n\n      if (display) {\n        this.addChild(display);\n      }\n    }\n  }\n\n  protected createPlacer(layerName: string, firstKeyFrameMold: KeyframeMold): Placer {\n    const placer: Placer = new Placer(this.root,\n      firstKeyFrameMold.x, firstKeyFrameMold.y,\n      firstKeyFrameMold.scaleX, firstKeyFrameMold.scaleY,\n      firstKeyFrameMold.pivotX, firstKeyFrameMold.pivotY\n    );\n    placer.label = layerName.replace(LibraryFlump.FLUMP_PLACER, '');\n    return placer;\n  }\n\n  protected createDisplayObject(layerName: string, firstKeyFrameMold: KeyframeMold) {\n    // App.log(layerName);\n    const display = this._library.create(firstKeyFrameMold.ref || '');\n    if (display) {\n      this._library.applyFrameState(display, firstKeyFrameMold);\n      display.label = layerName;\n      return display;\n    }\n    return null;\n  }\n\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {Movie} from \"../display/Movie\";\nimport {MovieLayerMold} from \"./MovieLayerMold\";\nimport {LibraryFlump} from \"./LibraryFlump\";\nimport * as PIXI from 'pixi.js';\nimport {GameView} from \"../../base/GameView\";\nimport {Container} from \"../display/Container\";\nimport {Button} from \"../display/Button\";\n\nexport class MovieLayer extends GameObject {\n\n  private _currentDisplay: PIXI.Container | null = null;\n  private _displaysByFrames: (PIXI.Container | null)[] = [];\n  private _library: LibraryFlump;\n  private _layerMold: MovieLayerMold;\n\n  constructor(movie: Movie, layerMold: MovieLayerMold, library: LibraryFlump) {\n    super();\n    this._library = library;\n    this._layerMold = layerMold;\n\n    for (let i = 0; i < layerMold.framesMolds.length; i++) {\n      const frameMold = layerMold.framesMolds[i];\n      if (frameMold) {\n        const previousDisplay = this._displaysByFrames[i - 1];\n        const previousMold = layerMold.framesMolds[i - 1];\n        if (previousMold && previousDisplay && previousMold.ref && previousMold.ref === frameMold.ref) {\n          this._displaysByFrames[i] = previousDisplay;\n        } else {\n          const display = library.create(frameMold.ref!);\n          display.label = layerMold.name;\n          this._displaysByFrames[i] = display;\n\n          library.applyFrameState(display, frameMold);\n          movie.addChild(display);\n\n          display.visible = false;\n        }\n      } else {\n        this._displaysByFrames[i] = null;\n      }\n    }\n  }\n\n  override destroy(): void {\n    super.destroy();\n    this._currentDisplay?.destroy();\n  }\n\n  public drawFrame(frameNumber: number): void {\n    if (this._currentDisplay) {\n      this._currentDisplay.visible = false;\n    }\n\n    // if (this._currentDisplay instanceof Button) {\n    //   App.log(this._currentDisplay);\n    // }\n\n    let display = this._displaysByFrames[frameNumber - 1];\n    if (display) {\n      this._currentDisplay = display;\n      if (this._currentDisplay) {\n\n        this._library.applyFrameState(this._currentDisplay, this._layerMold.framesMolds[frameNumber - 1]!);\n\n        // this._currentDisplay.position.set(frame.x, frame.y);\n        // this._currentDisplay.scale.set(frame.scaleX, frame.scaleY);\n        // this._currentDisplay.pivot.set(frame.pivotX, frame.pivotY);\n        // // this._currentDisplay.skew.set(currentFrame.skewX, currentFrame.skewY);\n        // this._currentDisplay.rotation = frame.skewX;\n        // this._currentDisplay.alpha = frame.alpha;\n        // this._currentDisplay.visible = frame.visible;\n        // (this._currentDisplay as PIXI.Sprite).anchor.set(0);\n        // App.log(currentFrame.alpha);\n      }\n    }\n  }\n}\n","export class FuncUtil {\n  static call(func:Function | null | undefined, argument1:any = null, argument2:any = null) {\n    if (func) {\n      if (func.length == 0) {\n        func();\n      } else if (func.length == 1) {\n        func(argument1);\n      } else if (func.length == 2) {\n        func(argument1, argument2);\n      }\n    }\n  }\n}\n","import {Container} from \"./Container\";\nimport {GameObject} from \"../../base/GameObject\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {MovieLayer} from \"../library/MovieLayer\";\nimport {FuncUtil} from \"../../../utils/FuncUtil\";\n\nexport class Movie extends Container {\n\n  static STOPPED: number = 0;\n  static PLAYING: number = 1;\n\n  static FIRST_FRAME: string = \"com.flump.movie.FIRST_FRAME\";\n  static LAST_FRAME: string = \"com.flump.movie.LAST_FRAME\";\n\n  public onLabelPassed: ((movie: Movie, label: string) => void) | null = null;\n  public onPlayToPositionComplete?: ((movie: Movie) => void) | null = null;\n\n  protected _stopFrame = 0;\n  protected _layers: MovieLayer[] = [];\n  protected _startFrame = 0;\n  protected _isPlayRangeLoop = false;\n  protected _shouldDisposeOnComplete = false;\n  protected _currentFrame = 0;\n  protected _numFrames = 0;\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super(mold, library);\n  }\n\n  override build(): void {\n    this._juggler = this.root.juggler;\n\n    const layersMolds = this._mold.layers;\n\n    for (let moldLayer of layersMolds) {\n      let layerName = moldLayer.name;\n      if (layerName.indexOf(LibraryFlump.FLUMP_PLACER) !== -1) {\n        let firstKeyFrameMold = moldLayer.keyframeMolds[0];\n        let placer = this.createPlacer(layerName, firstKeyFrameMold);\n        this.addChild(placer);\n      } else if (layerName !== LibraryFlump.FLUMP_LABEL) {\n        let movieLayer= new MovieLayer(this, moldLayer, this._library);\n        this._layers.push(movieLayer);\n        this._numFrames = moldLayer.framesCount;\n      }\n    }\n\n    if (this._numFrames <= 1) {\n      this.root.app.logError('Movie should have more then one frame! Symbol name: '+this._mold.symbol);\n    }\n\n    // for (const child of this.children) {\n    //   if(child instanceof PIXI.Sprite){\n    //     const sprite = child as PIXI.Sprite;\n    //     sprite.texture.source.alphaMode = 'premultiplied-alpha';\n    //   }\n    // }\n\n    this._currentFrame = 1;\n    this.drawCurrentFrame();\n\n    // this.interactive = false;\n  }\n\n  override destroy(): void {\n    this.stop();\n    GameObject.destroy(this._layers);\n    super.destroy();\n  }\n\n  override removeFromParent() {\n    // console.log(\"removeFromParent\");\n    super.removeFromParent()\n  }\n\n  getFrameForLabel(label: string): number {\n    if (this._mold.labels && this._mold.labels) {\n      for (let i = 0; i < this._mold.labels.length; i++) {\n        if (this._mold.labels[i] === label) {\n          return i + 1;\n        }\n      }\n    }\n    return 0;\n  }\n\n  goTo(position:string){\n    this._startFrame = this.getFrameForLabel(position);\n    this._currentFrame = this._startFrame;\n    this.drawCurrentFrame();\n  }\n\n  playLoop(): Movie {\n    this.addToJuggler();\n    this._isPlayRangeLoop = true;\n    this._stopFrame = this._numFrames;\n    this._startFrame = 1;\n    this._currentFrame = this._startFrame;\n    return this;\n  }\n\n  playOnce(shouldDispose: boolean): Movie {\n    this._shouldDisposeOnComplete = shouldDispose;\n    return this.playToPosition(Movie.LAST_FRAME);\n  }\n\n  playRange(positionFrom: string = Movie.FIRST_FRAME, positionTo: string = Movie.LAST_FRAME, loop = false, shouldDispose = false): Movie {\n    this.addToJuggler();\n    this._isPlayRangeLoop = loop;\n    this._startFrame = this.getFrameForLabel(positionFrom);\n    if (positionTo == Movie.LAST_FRAME) {\n      this._stopFrame = this.getFrameForLabel(positionTo);\n    } else {\n      this._stopFrame = this.getFrameForLabel(positionTo) - 1;\n    }\n    this._currentFrame = this._startFrame;\n    this._shouldDisposeOnComplete = shouldDispose;\n    return this;\n  }\n\n  playToPosition(positionTo: string = Movie.LAST_FRAME): Movie {\n    this.addToJuggler();\n    this._isPlayRangeLoop = false;\n    if (positionTo == Movie.LAST_FRAME) {\n      this._stopFrame = this.getFrameForLabel(positionTo);\n    } else {\n      this._stopFrame = this.getFrameForLabel(positionTo) - 1;\n    }\n    return this;\n  }\n\n  stop(): Movie {\n    this.removeFromJuggler();\n    this.onPlayToPositionComplete = null;\n    this._isPlayRangeLoop = false;\n    return this;\n  }\n\n  private drawCurrentFrame(){\n    // App.log(this._currentFrame);\n\n    for (let layer of this._layers) {\n      layer.drawFrame(this._currentFrame);\n    }\n\n    let label = this._mold.labels[this._currentFrame - 1];\n    if (label && this.onLabelPassed) {\n      // App.log(label);\n      this.onLabelPassed(this, label);\n    }\n\n    if (this._currentFrame >= this._stopFrame) {\n      if (this._isPlayRangeLoop) {\n        this._currentFrame = this._startFrame;\n        return;\n      } else {\n        const onCompleteCallback = this.onPlayToPositionComplete;\n        this.stop();\n        if (onCompleteCallback) {\n          FuncUtil.call(onCompleteCallback, this);\n        }\n        if (this._shouldDisposeOnComplete) {\n          this.destroy();\n        }\n        return;\n      }\n    }\n\n    this._currentFrame++;\n  }\n\n  override advanceTime(dt: number): void {\n    for (let layer of this._layers) {\n      layer.advanceTime(dt);\n    }\n    this.drawCurrentFrame();\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport {MovieLayerMold} from \"./MovieLayerMold\";\nimport {Movie} from \"../display/Movie\";\nimport {LibraryFlump} from \"./LibraryFlump\";\n\nexport class MovieMold extends GameObject {\n\n  symbol: string = '';\n  layers: MovieLayerMold[] = [];\n  labels: string[] = [];\n\n  get flumpClassLabel(): string {\n    return this.layers[this.layers.length - 1]?.name || \"\";\n  }\n\n  getLayerMoldByName(name:string){\n    for (let i = 0; i < this.layers.length; i++) {\n      if (this.layers[i].name == name) {\n        return this.layers[i];\n      }\n    }\n    return null;\n  }\n\n  static fromJSON(o: Record<string, any>, mult: number = 1): MovieMold {\n    const mold = new MovieMold();\n    mold.symbol = ObjectUtils.getKeyStringValue(o, \"id\", \"\");\n    const layers = ObjectUtils.getKeyObjValue(o, \"layers\", []);\n    if (Array.isArray(layers)) {\n      for (const layer of layers) {\n        const layerMold = MovieLayerMold.fromJSON(layer, mult);\n        mold.layers.push(layerMold);\n      }\n    }\n    mold.fillLabels();\n    return mold;\n  }\n\n  override destroy(): void {\n    super.destroy();\n    GameObject.destroy(this.layers);\n    GameObject.destroy(this.labels);\n  }\n\n  private fillLabels(): void {\n    const frames = this.layers.reduce((max, layer) => Math.max(max, layer.framesCount), 0);\n    if (frames === 0) {\n      return;\n    }\n\n    this.labels[0] = Movie.FIRST_FRAME;\n\n    let labelsLayer:MovieLayerMold | null = null;\n\n    for (let i = 0; i < this.layers.length; i++) {\n      const layer = this.layers[i];\n      if (layer && layer.name == LibraryFlump.FLUMP_LABEL) {\n        labelsLayer = layer;\n        break;\n      }\n    }\n\n    if (labelsLayer) {\n      for (let i = 0; i < labelsLayer.keyframeMolds.length; i++) {\n        const keyframe = labelsLayer.keyframeMolds[i];\n        if (keyframe && keyframe.label) {\n          this.labels[keyframe.index] = keyframe.label;\n        }\n      }\n    }\n\n    if (frames > 1) {\n      this.labels[frames - 1] = Movie.LAST_FRAME;\n    }\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {Container} from \"./Container\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {GameDelayCall, GameTween} from \"../../base/GameJuggler\";\nimport {Align, ViewUtils} from \"../../utils/ViewUtils\";\nimport {GameSprite} from \"../../base/GameSprite\";\nimport {GameObject} from \"../../base/GameObject\";\nimport {GameView} from \"../../base/GameView\";\nimport {AbstractText} from \"pixi.js/lib/scene/text/AbstractText\";\n\nexport class Button extends Container {\n\n  protected _onClickCallback: Function | null = null;\n  protected _btnContent!: Container;\n  protected _alreadyClickedOnce = false;\n  protected _isDown = false;\n  protected _initialScale = 0;\n  protected _scaleTween?: GameTween;\n  protected _clickDelayCall?: GameDelayCall;\n  protected _shimmer:PIXI.Sprite | null = null;\n  protected _shimmerTween:GameTween | null = null;\n\n  private _text = '';\n  private _textField: AbstractText | null = null;\n  private _iconTextAlignContainer: GameView | null = null;\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super(mold, library);\n  }\n\n  override destroy(): void {\n    this._textField = GameObject.destroy(this._textField);\n    this._iconTextAlignContainer = GameObject.destroy(this._iconTextAlignContainer);\n    this.stopShimmer();\n    this._clickDelayCall?.destroy();\n    this.removeAllTweens();\n    this.removeClickListener();\n    this._onClickCallback = null;\n    super.destroy();\n  }\n\n  startShimmer() {\n    this.stopShimmer();\n\n    let buttonContentBg = this._btnContent.getContainerByLabel('bg') ;\n    if (!buttonContentBg) {\n      return;\n    }\n\n    /**\n     * An optional bounds area for this container. Setting this rectangle will stop the renderer\n     * from recursively measuring the bounds of each children and instead use this single boundArea.\n     * This is great for optimisation! If for example you have a 1000 spinning particles and you know they all sit\n     * within a specific bounds, then setting it will mean the renderer will not need to measure the\n     * 1000 children to find the bounds. Instead it will just use the bounds you set.\n     */\n\n    let maskSprite = new GameSprite(this.root.pixi.renderer.extract.texture({\n      target: buttonContentBg\n    }));\n    maskSprite.needDestroyTexture = true;\n    maskSprite.interactive = false;\n    this._btnContent.addChild(maskSprite);\n\n    this._shimmer = new PIXI.Sprite(this.root.uiLib.getTexture('shimmer'));\n    // _shimmer.alpha = 0.7;\n    this._shimmer.interactive = false;\n    ViewUtils.fitToHeight(this._shimmer, buttonContentBg.height, true, true);\n    ViewUtils.alignPivot(this._shimmer, Align.CENTER, Align.CENTER);\n    this._shimmer.x = -this.width / 2 - this._shimmer.width; // Старт слева\n    this._shimmer.y = buttonContentBg.y;\n    this.addChild( this._shimmer);\n\n    this._shimmerTween = this.root.juggler.tween(this._shimmer, 1.5, {\n      x: this._shimmer.width + this.width,\n    })\n      .repeat(Infinity)\n      .repeatDelay(2)\n      .onRepeat(()=>{\n        if (this._shimmer) {\n          this._shimmer.x = -this.width / 2 - this._shimmer.width; // Старт слева\n        }\n      })\n      .start();\n\n    this._shimmer.mask = maskSprite;\n  }\n\n  public stopShimmer() {\n    this._shimmer = GameObject.destroy(this._shimmer);\n    this._shimmerTween = GameObject.destroy(this._shimmerTween);\n  }\n\n  override get pulsatingDisplayObject() {\n    return this._btnContent;\n  }\n\n  public get content() {\n    return this._btnContent;\n  }\n\n  protected _shouldClickOnlyOnce = false;\n\n  set shouldClickOnlyOnce(value: boolean) {\n    this._shouldClickOnlyOnce = value;\n  }\n\n  protected _minDistance = 100;\n\n  set minDistance(value: number) {\n    this._minDistance = value;\n  }\n\n  protected _animTime = 0.15;\n\n  set animTime(value: number) {\n    this._animTime = value;\n  }\n\n  protected _clicksBetweenDelay = 0.2;\n\n  get clicksBetweenDelay(): number {\n    return this._clicksBetweenDelay;\n  }\n\n  set clicksBetweenDelay(value: number) {\n    this._clicksBetweenDelay = value;\n  }\n\n  protected _unTouchAnimTime = 0.2;\n\n  get unTouchAnimTime(): number {\n    return this._unTouchAnimTime;\n  }\n\n  set unTouchAnimTime(value: number) {\n    this._unTouchAnimTime = value;\n  }\n\n  protected _minScale = 0.8;\n\n  set minScale(value: number) {\n    this._minScale = value;\n  }\n\n  protected _isEnabled = true;\n\n  get isEnabled(): boolean {\n    return this._isEnabled;\n  }\n\n  set isEnabled(value: boolean) {\n    if (this._isEnabled !== value) {\n      this._isEnabled = value;\n      if (this._isEnabled) {\n        this.filters = [];\n        this.continuePulsating();\n      } else {\n        const grayFilter = new PIXI.ColorMatrixFilter();\n        grayFilter.desaturate(); // Убираем насыщенность цвета\n        this.filters = [grayFilter];\n        this.stopPulsating();\n      }\n      this.interactive = value;\n      // this.content.alpha = value ? 1 : 0.5;\n    }\n  }\n\n  set clickCallback(value: Function | null) {\n    if (value) {\n      this.interactive = true;\n      this._onClickCallback = value;\n      this.addClickListener();\n    } else {\n      this.interactive = false;\n      this._onClickCallback = null;\n      this.removeClickListener();\n    }\n  }\n\n  protected get textPlacer() {\n    return this._btnContent?.getPlacerByLabel('text');\n  }\n\n  protected get animScale() {\n    return this._initialScale * this._minScale;\n  }\n\n  public setText(txt: string){\n    if (this._text == txt) {\n      return this;\n    }\n\n    this._text = txt;\n    this.textPlacer?.clear();\n    GameObject.destroy(this._textField);\n    GameObject.destroy(this._iconTextAlignContainer);\n\n    let icon = this.content.getChildByLabel('icon');\n    if (icon) {\n      this._textField = this.root.mainTextLib.createBitmapText(txt, this.textPlacer!.width, this.textPlacer!.height, 'left');\n\n      let iconTextGap = ViewUtils.getVisibleGap(icon, this.textPlacer!).horizontal;\n\n      this._iconTextAlignContainer = new GameView();\n      ViewUtils.alignPivot(icon, Align.LEFT, Align.CENTER);\n      this._iconTextAlignContainer.addChild(icon);\n      icon.x = 0;\n      icon.y = 0;\n      this.content.addChild(this._iconTextAlignContainer);\n      ViewUtils.alignPivot(this._iconTextAlignContainer, Align.CENTER, Align.CENTER);\n      this._iconTextAlignContainer.x = this.width / 2;\n      this._iconTextAlignContainer.y = this.height / 2;\n\n      ViewUtils.fitToHeight(this._textField, this.textPlacer!.height, true, true);\n      ViewUtils.fitToWidth(this._textField, this.textPlacer!.width, true, false);\n      ViewUtils.alignPivot(this._textField, Align.LEFT, Align.CENTER);\n      this._textField!.x = icon.x + icon.width + iconTextGap;\n      this._iconTextAlignContainer!.addChild(this._textField!);\n\n      ViewUtils.alignPivot(this._iconTextAlignContainer, Align.LEFT, Align.TOP);\n      this._iconTextAlignContainer!.x = this.boundsArea.width / 2 - this._iconTextAlignContainer.width / 2;\n      this._iconTextAlignContainer!.y = this.boundsArea.height / 2 - this._iconTextAlignContainer.height / 2;\n    }\n    else {\n      this._textField = this.root.mainTextLib.createBitmapText(txt, this.textPlacer!.width, this.textPlacer!.height, 'center');\n      this.textPlacer?.place(this._textField)\n        .fitHeight(true, true)\n        .fitWidth(true, false)\n        .alignCenter();\n    }\n    return this;\n  }\n\n  override build() {\n    super.build();\n    this._btnContent = this.getContainerByLabel(LibraryFlump.FLUMP_CONTENT);\n    ViewUtils.alignPivot(this._btnContent);\n    this._btnContent.x += this._btnContent.width / 2;\n    this._btnContent.y += this._btnContent.height / 2;\n\n    this.initBoundsArea();\n  }\n\n  protected initBoundsArea(): void {\n    this.boundsArea = new PIXI.Rectangle(0,0,this._btnContent.width, this._btnContent.height);\n  }\n\n  protected onTouch(): void {\n    if (!this._initialScale) {\n      this._initialScale = this._btnContent?.scale.x || 1;\n    }\n    // Main.log('onTouch');\n    this.removeAllTweens();\n    if (this._btnContent) {\n      // App.log(this._btnContent.filters);\n      // this._btnContent.filters = [];\n      this._scaleTween = this.root.juggler.tween(this._btnContent, this._animTime, {\n        scale: {\n          x: this.animScale,\n          y: this.animScale,\n        }\n\n        // brightness: 1.3 // Tint effect\n        // ease: \"back.in(1.7)\",\n      }).start();\n    }\n  }\n\n  protected onUnTouch(): void {\n    // Main.log('onUnTouch');\n\n    this.removeAllTweens();\n    if (this._btnContent) {\n      this._scaleTween = this.root.juggler.tween(this._btnContent, this.unTouchAnimTime, {\n        scale: {\n          x:this._initialScale,\n          y:this._initialScale\n        },\n        // brightness: 1, // Tint back\n        // ease: \"back.inOut(1.7)\",\n      }).onComplete(this.onScaleTweenComplete.bind(this)).start();\n    }\n  }\n\n  protected onScaleTweenComplete() {\n    // App.log(this._btnContent.effects);\n    // this._btnContent.filters = [];\n    // this._btnContent.effects?.forEach((effect)=>{\n    //   if (effect instanceof PIXI.FilterEffect) {\n    //     const filterEffect = effect as PIXI.FilterEffect;\n    //     filterEffect.filters.forEach((filter)=>{\n    //       if (filter instanceof PIXI.ColorMatrixFilter) {\n    //         const colorMatrixFilter = filter as PIXI.ColorMatrixFilter;\n    //         // colorMatrixFilter.enabled = false;\n    //       }\n    //     })\n    //   }\n    // })\n    // this._btnContent.filters = [];\n    this.continuePulsating();\n  }\n\n  protected onTap(event: PIXI.FederatedPointerEvent): void {\n    if (this._shouldClickOnlyOnce && this._alreadyClickedOnce) {\n      return;\n    }\n    this._alreadyClickedOnce = true;\n\n    // Main.log('onClick');\n    let shouldRestoreInteractive = false;\n    if (this.interactive) {\n      this.interactive = false;\n      shouldRestoreInteractive = true\n    }\n\n    if (this._onClickCallback) {\n      this._onClickCallback(this);\n\n      this._clickDelayCall?.destroy();\n      this._clickDelayCall = this.juggler.delayCall(() => {\n        if (shouldRestoreInteractive) {\n          this.interactive = true;\n        }\n      }, this._clicksBetweenDelay);\n    }\n  }\n\n  protected onTouched(event: PIXI.FederatedPointerEvent): void {\n    if (!this._isEnabled) {\n      return;\n    }\n    if (this._shouldClickOnlyOnce && this._alreadyClickedOnce) {\n      return;\n    }\n    if (event && event.type === 'pointerdown' && !this._isDown) {\n      this._isDown = true;\n      this.onTouch();\n    } else if (this._isDown) {\n      this._isDown = false;\n      this.onUnTouch();\n    }\n  }\n\n  protected addClickListener(): void {\n    this.removeClickListener();\n    this.on('pointerdown', this.onTouched, this);\n    this.on('pointerup', this.onTouched, this);\n    this.on('pointertap', this.onTap, this);\n    this.on('pointerupoutside', this.onTouched, this);\n  }\n\n  protected removeClickListener(): void {\n    this.off('pointerdown', this.onTouched, this);\n    this.off('pointerup', this.onTouched, this);\n    this.off('pointertap', this.onTap, this);\n    this.off('pointerupoutside', this.onTouched, this);\n  }\n\n  protected removeAllTweens(): void {\n    // PixiJS не имеет встроенного \"джагглера\", как Starling.\n    // Для кастомной анимации требуется следить за текущими активными твинами.\n    this._scaleTween?.destroy();\n    this.stopPulsating();\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {GameObject} from \"../../base/GameObject\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {Button} from \"./Button\";\n\nexport class TabButton extends Button {\n\n  protected _upState!: PIXI.Container;\n  protected _downState!: PIXI.Container;\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super(mold, library);\n  }\n\n  protected _isSelected = false;\n\n  public get isSelected(): boolean {\n    return this._isSelected;\n  }\n\n  public set isSelected(value: boolean) {\n    if (this._isSelected == value) {\n      return;\n    }\n    this._isSelected = value;\n    if (value) {\n      this._upState.visible = true;\n      this._downState.visible = false;\n    } else {\n      this._upState.visible = false;\n      this._downState.visible = true;\n    }\n    this.onSelectedStateChange();\n  }\n\n  override build() {\n    super.build();\n    this._upState = this._btnContent.getChildByLabel(LibraryFlump.FLUMP_STATE_UP)!;\n    this._downState = this._btnContent.getChildByLabel(LibraryFlump.FLUMP_STATE_DOWN)!;\n  }\n\n  override destroy() {\n    GameObject.destroy(this._upState);\n    GameObject.destroy(this._downState);\n    super.destroy();\n  }\n\n  protected override onTouch() {\n    this._upState.visible = true;\n    this._downState.visible = false;\n  }\n\n  protected override onUnTouch() {\n    this._upState.visible = false;\n    this._downState.visible = true;\n  }\n\n  protected onSelectedStateChange() {\n\n  }\n\n}\n","import {Button} from \"./Button\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\n\nexport class ClickArea extends Button {\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super(mold, library);\n  }\n\n  // override  getShimmerPixelMaskObject():DisplayObject {\n  //   return _btnContent;\n  // }\n\n  override build() {\n    super.build();\n    this.clicksBetweenDelay = 0.5;\n    this.interactive = true;\n    this._btnContent!.alpha = 0;\n  }\n\n  override onTouch() {\n  }\n  override onUnTouch() {\n  }\n}\n","import {Graphics, Text} from \"pixi.js\";\nimport {Container} from \"./Container\";\nimport {GameDispatcher} from \"../../base/GameDispatcher\";\nimport {Input} from \"@pixi/ui\";\nimport {MovieMold} from \"../library/MovieMold\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {GameObject} from \"../../base/GameObject\";\n\n\nexport class TextInput extends Container {\n\n  public static hack_currentInputPlaceholder = '';\n\n  public onChange = new GameDispatcher(this);\n  public onEnter = new GameDispatcher(this);\n\n  protected _input?: Input | null;\n  protected _inputText = '';\n  protected _inputPlaceholderText = '';\n\n  constructor(mold: MovieMold, library: LibraryFlump) {\n    super(mold, library);\n  }\n\n  get input() {\n    return this._input;\n  }\n\n  get text() {\n    return this._input!.value;\n  }\n\n  set text(value: string) {\n    this._input!.value = value;\n  }\n\n  extractText() {\n    for (let i = 0; i < this._mold.layers.length; i++) {\n      const moldLayer = this._mold.layers[i];\n      let layerName: string = moldLayer.name;\n      if (layerName.indexOf(LibraryFlump.FLUMP_TEXT) > -1) {\n        return layerName.replace(LibraryFlump.FLUMP_TEXT, '');\n      }\n    }\n    return '';\n  }\n\n  override build() {\n    super.build();\n\n    const place = this.getPlacerByLabel('text');\n\n    const border = this.root.adapt(15);\n    const radius = this.root.adapt(20);\n    const width = place.width;\n    const height = place.height;\n    const paddingLeft = this.root.adapt(120); // to give room for icon\n    const paddingRight = this.root.adapt(30);\n    const paddingTop = this.root.adapt(10);\n\n    this._input = new Input({\n      TextClass: Text,\n      nineSliceSprite: [0,0,0,0],\n      bg: new Graphics()\n        .roundRect(0, 0, width, height, radius + border)\n        .fill('#9C6F06')\n        .roundRect(border, border, width - (border * 2), height - (border * 2), radius)\n        .fill('#F5EADA'),\n      textStyle: {\n        fill: '#9C6F06',\n        fontSize: 75,\n        fontWeight: 'bold',\n      },\n      maxLength: 30,\n      align: 'left',\n      placeholder: TextInput.hack_currentInputPlaceholder,\n      secure: false,\n      value: this._inputText,\n      padding: {\n        left: paddingLeft,\n        right: paddingRight,\n        top: 0,\n        bottom: 0,\n      },\n      cleanOnFocus: false,\n      addMask: true,\n    });\n\n    this._input.onEnter.connect(this.onInputEnter.bind(this));\n    this._input.onChange.connect(this.onInputChange.bind(this));\n\n    this._input.x = place.x;\n    this._input.y = place.y;\n    this.addChild(this._input);\n\n    this.setChildIndex(this.getChildByLabel('btn_edit')!, this.children!.length - 1);\n  }\n\n  override destroy() {\n    super.destroy();\n    this._input = GameObject.destroy(this._input);\n    GameObject.destroy(this.onChange);\n    GameObject.destroy(this.onEnter);\n  }\n\n  protected onInputChange(val: string) {\n    this.onChange.dispatch(this._input!.value);\n    // Main.log(this._input!.value);\n  }\n\n  protected onInputEnter(val: string) {\n    this.onEnter.dispatch(this._input!.value);\n    // Main.log(this._input!.value);\n  }\n}\n","import * as PIXI from 'pixi.js';\nimport {Container} from \"./Container\";\nimport {LibraryFlump} from \"../library/LibraryFlump\";\nimport {GameObject} from \"../../base/GameObject\";\n\nexport class Checkbox extends Container {\n\n  public payload = '';\n\n  protected _checkFunction: Function | null = null;\n  protected _bg: PIXI.Container | null = null;\n  protected _check: PIXI.Container | null = null;\n  protected _initialScale = 0;\n  protected _isDown = false;\n  protected _isSelected = false;\n  protected _isEnabled = true;\n\n  public get isSelected() {\n    return this._isSelected;\n  }\n\n  public set isSelected(value: boolean) {\n    if (this._isSelected == value) {\n      return;\n    }\n    this._isSelected = value;\n    this._check!.visible = this._isSelected;\n  }\n\n  public set checkCallback(value: Function) {\n    if (!this.destroyed) {\n      if (value) {\n        this.interactive = true;\n        this.interactiveChildren = true;\n        this._bg!.interactive = true;\n        this._check!.interactive = true;\n        this._checkFunction = value;\n        this.addClickListener();\n      } else {\n        this.interactiveChildren = false;\n        this.interactive = false;\n        this._bg!.interactive = false;\n        this._check!.interactive = false;\n        this._checkFunction = null;\n        this.removeClickListener();\n      }\n    }\n  }\n\n  get isEnabled(): boolean {\n    return this._isEnabled;\n  }\n\n  set isEnabled(value: boolean) {\n    if (this._isEnabled !== value) {\n      this._isEnabled = value;\n      this.interactive = value;\n      this.alpha = value ? 1 : 0.5;\n    }\n  }\n\n  override build() {\n    super.build();\n    this._bg = this.getChildByLabel(LibraryFlump.FLUMP_BOX);\n    this._check = this.getChildByLabel(LibraryFlump.FLUMP_CHECK);\n    this._check!.visible = false;\n  }\n\n  override destroy(): void {\n    this.removeClickListener();\n    this._bg = GameObject.destroy(this._bg);\n    this._check = GameObject.destroy(this._check);\n    super.destroy();\n  }\n\n  protected addClickListener(): void {\n    this.on('pointerdown', this.onTouched, this);\n    this.on('pointerup', this.onTouched, this);\n    this.on('pointertap', this.onTap, this);\n    this.on('pointerupoutside', this.onTouched, this);\n  }\n\n  protected removeClickListener(): void {\n    this.off('pointerdown', this.onTouched, this);\n    this.off('pointerup', this.onTouched, this);\n    this.off('pointertap', this.onTap, this);\n    this.off('pointerupoutside', this.onTouched, this);\n  }\n\n  protected onTouched(event: PIXI.FederatedPointerEvent): void {\n    if (!this._isEnabled) {\n      return;\n    }\n    const touch = event.global;\n    if (event.type === 'pointerdown' && !this._isDown) {\n      this._isDown = true;\n      this.onTouch();\n    } else if (this._isDown) {\n      this._isDown = false;\n      this.onUnTouch();\n    }\n  }\n\n  protected onTap(event: PIXI.FederatedPointerEvent): void {\n    this.changeState();\n  }\n\n  protected onTouch(): void {\n    if (!this._initialScale) {\n      this._initialScale = this._bg!.scale.y;\n    }\n    this.stopPulsating();\n    this._bg!.scale = this._initialScale * 0.85;\n  }\n\n  protected onUnTouch(): void {\n    this._bg!.scale = this._initialScale;\n  }\n\n  protected changeState(): void {\n    this.isSelected = !this.isSelected;\n    if (this._checkFunction) {\n      if (this._checkFunction.length) {\n        this._checkFunction(this);\n      } else {\n        this._checkFunction();\n      }\n    }\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport { Rectangle, Point } from 'pixi.js';\n\nexport class AtlasTextureMold extends GameObject {\n\n  symbol: string = '';\n  bounds = new Rectangle(0, 0, 0, 0);\n  origin = new Point(0, 0);\n  tint_color: number = 0;\n\n  static fromJSON(o: Record<string, any>): AtlasTextureMold {\n    const mold = new AtlasTextureMold();\n    mold.symbol = ObjectUtils.getKeyStringValue(o, \"symbol\");\n    const rect: number[] = ObjectUtils.getKeyArrayValue(o, \"rect\");\n    mold.bounds = new Rectangle(rect[0], rect[1], rect[2], rect[3]);\n    const orig: number[] = ObjectUtils.getKeyArrayValue(o, \"origin\");\n    mold.origin = new Point(orig[0], orig[1]);\n    mold.tint_color = ObjectUtils.getKeyNumberValue(o, \"tint_color\");\n    return mold;\n  }\n\n  override destroy(): void {\n    super.destroy();\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {AtlasTextureMold} from \"./AtlasTextureMold\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\n\nexport class AtlasMold extends GameObject {\n\n  private static readonly SCALE_FACTOR: RegExp = /@(\\d+)x$/;\n\n  file: string = '';\n  atlasTextureMolds: AtlasTextureMold[] = [];\n\n  get scaleFactor(): number {\n    return AtlasMold.extractScaleFactor(this.file);\n  }\n\n  static extractScaleFactor(filename: string): number {\n    const result = this.SCALE_FACTOR.exec(this.stripPathAndDotSuffix(filename));\n    return (result !== null ? parseInt(result[1], 10) : 1);\n  }\n\n  static fromJSON(o: Record<string, any>): AtlasMold {\n    const mold = new AtlasMold();\n    mold.file = ObjectUtils.getKeyStringValue(o, \"file\");\n    for (const tex of ObjectUtils.getKeyObjValue(o, \"textures\")) {\n      mold.atlasTextureMolds.push(AtlasTextureMold.fromJSON(tex));\n    }\n    return mold;\n  }\n\n  static stripDotSuffix(filename: string): string {\n    const ix = filename.lastIndexOf(\".\");\n    return (ix >= 0 ? filename.substr(0, ix) : filename);\n  }\n\n  static stripPath(filename: string, separator: string = \"/\"): string {\n    const ix = filename.lastIndexOf(separator);\n    return (ix >= 0 ? filename.substr(ix + 1) : filename);\n  }\n\n  static stripPathAndDotSuffix(filename: string, separator: string = \"/\"): string {\n    return this.stripDotSuffix(this.stripPath(filename, separator));\n  }\n\n  override destroy(): void {\n    super.destroy();\n    GameObject.destroy(this.atlasTextureMolds);\n  }\n}\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport {AtlasMold} from \"./AtlasMold\";\n\nexport class TextureGroupMold extends GameObject {\n\n  scaleFactor: number = 1;\n  atlasMolds: AtlasMold[] = [];\n\n  static fromJSON(o: Record<string, any>): TextureGroupMold {\n    const mold = new TextureGroupMold();\n    mold.scaleFactor = ObjectUtils.getKeyNumberValue(o, \"scaleFactor\");\n    const atlases = ObjectUtils.getKeyObjValue(o, \"atlases\", []);\n    if (Array.isArray(atlases)) {\n      for (const atlas of atlases) {\n        mold.atlasMolds.push(AtlasMold.fromJSON(atlas));\n      }\n    }\n    return mold;\n  }\n\n  override destroy(): void {\n    super.destroy();\n    GameObject.destroy(this.atlasMolds);\n  }\n}\n\n","import {GameObject} from \"../../base/GameObject\";\nimport {ObjectUtils} from \"../../../utils/ObjectUtils\";\nimport {TextureGroupMold} from \"./TextureGroupMold\";\nimport {MovieMold} from \"./MovieMold\";\n\nexport class LibraryMold extends GameObject {\n\n  // Format of the atlases. Default is \"png\"\n  movieMolds: MovieMold[] = [];\n  textureGroups: TextureGroupMold[] = [];\n\n  static fromJSON(data: Record<string, any>, mult: number = 1): LibraryMold {\n    const mold = new LibraryMold();\n\n    const movies = ObjectUtils.getKeyObjValue(data, \"movies\") || [];\n    for (const movie of movies) {\n      const movieMold = MovieMold.fromJSON(movie, mult);\n      mold.movieMolds.push(movieMold);\n    }\n\n    const textureGroups = ObjectUtils.getKeyObjValue(data, \"textureGroups\") || [];\n    for (const tg of textureGroups) {\n      mold.textureGroups.push(TextureGroupMold.fromJSON(tg));\n    }\n\n    return mold;\n  }\n\n  override destroy(): void {\n    super.destroy();\n    GameObject.destroy(this.movieMolds);\n    GameObject.destroy(this.textureGroups);\n  }\n\n  bestTextureGroupForScaleFactor(scaleFactor: number): TextureGroupMold | null {\n    if (this.textureGroups.length === 0) {\n      return null;\n    }\n\n    // Sort texture groups by scale factor\n    this.textureGroups.sort((a, b) => LibraryMold.compareInts(a.scaleFactor, b.scaleFactor));\n\n    // Find the group with the highest scale factor <= desired scale factor\n    for (let i = this.textureGroups.length - 1; i >= 0; --i) {\n      if (this.textureGroups[i].scaleFactor <= scaleFactor) {\n        return this.textureGroups[i];\n      }\n    }\n\n    // Return the group with the smallest scale factor\n    return this.textureGroups[0];\n  }\n\n  private static compareInts(a: number, b: number): number {\n    return a > b ? 1 : a === b ? 0 : -1;\n  }\n}\n","import {GameView} from \"../base/GameView\";\nimport * as PIXI from 'pixi.js';\nimport {Spine} from \"@esotericsoftware/spine-pixi-v8\";\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {GameDelayCall} from \"../base/GameJuggler\";\nimport {TrackEntry} from \"@esotericsoftware/spine-core/dist/AnimationState\";\nimport {Assets} from \"pixi.js\";\n\nexport class SpineMovie extends GameView {\n\n  private readonly _spine: Spine;\n  private readonly _touchableQuad?: PIXI.Sprite;\n  private _durationDelayCall?: GameDelayCall;\n  private _currentCallback?: (() => void) | null;\n\n  constructor(skeleton: string, atlas: string) {\n    super();\n\n    const cache = Assets.cache;\n    const skeletonValue = cache.get(skeleton);\n    const atlasValue = cache.get(atlas);\n\n    this._spine = Spine.from({\n      skeleton: skeleton,\n      atlas: atlas,\n      // scale: App.multiply(),\n      autoUpdate: true, // todo\n      darkTint: false,\n    });\n    this.addChild(this._spine);\n    this.interactive = false;\n\n    // const bounds = this._spine.getLocalBounds();\n    // this._touchableQuad = ViewUtils.createGreenQuad(bounds.width, bounds.height, 0.5);\n    // this._touchableQuad.x = bounds.minX;\n    // this._touchableQuad.y = bounds.minY;\n    // this._touchableQuad.interactive = false;\n    // this.addChild(this._touchableQuad);\n  }\n\n  override destroy(): void {\n    if (!this.destroyed) {\n      this._spine.autoUpdate = false;\n      this._durationDelayCall?.destroy();\n      this._touchableQuad?.destroy();\n      this._spine.destroy();\n      // this._spine.destroy({\n      //   texture: true // Should it destroy the current texture of the renderable as well\n      // })\n      super.destroy();\n    }\n  }\n\n  override addToJuggler(): void {\n    this.juggler?.addAnimatable(this);\n  }\n\n  override removeFromJuggler() {\n    this.juggler?.removeAnimatable(this);\n  }\n\n  override advanceTime(time: number): void {\n    if (this._spine) {\n      // this._spine.update(time); // todo\n      // console.log(time);\n    }\n  }\n\n  public playLoop(animationName: string, fromDelta: number = 0) {\n    this.addToJuggler();\n    this._durationDelayCall?.destroy();\n    this._currentCallback = null;\n    this._spine.state.clearListeners();\n    this._spine.state.setAnimation(0, animationName, true);\n    this._spine.update(fromDelta);\n    return this;\n  }\n\n  public playOnce(animationName: string, onComplete: (() => void) | null = null): SpineMovie {\n    this.addToJuggler();\n    this._currentCallback = null;\n    this._durationDelayCall?.destroy();\n    this._spine.state.clearListeners();\n    this._spine.state.setAnimation(0, animationName, false);\n    if (onComplete) {\n      this._currentCallback = onComplete;\n      this._spine.state.addListener({\n        complete: this.onAnimationComplete.bind(this)\n      });\n    }\n    return this;\n  }\n\n  public playDuration(animationName: string, durationSec: number, onEndCallback: () => void): SpineMovie {\n    this.addToJuggler();\n    this._currentCallback = null;\n    this._durationDelayCall?.destroy();\n    this._spine.state.clearListeners();\n    if (onEndCallback) {\n      this._durationDelayCall = this.juggler.delayCall(onEndCallback, durationSec);\n    }\n    this._spine.state.setAnimation(0, animationName, false);\n    return this;\n  }\n\n  public stop() {\n    this.removeFromJuggler();\n    return this;\n  }\n\n  private onAnimationComplete(entry: TrackEntry): void {\n    // if (entry.animation.name === \"animation_name\") {\n    //   App.log(\"Анимация завершилась:\", entry.animation.name);\n    //   // Ваш код для обработки завершения анимации\n    // }\n    if (this._currentCallback) {\n      this._currentCallback();\n    }\n  }\n}\n","import {GameObject} from \"../base/GameObject\";\nimport {SpineMovie} from \"./SpineMovie\";\n\nexport class LibrarySpine extends GameObject {\n\n  private readonly _skeletonName!: string;\n  private readonly _atlasName!: string;\n\n  constructor(skeletonName: string, atlasName: string) {\n    super();\n    this._skeletonName = skeletonName;\n    this._atlasName = atlasName;\n  }\n\n  unloadAssets() {\n    // TODO!!!!!!!!\n  }\n\n  public createSpineMovie(): SpineMovie {\n    return new SpineMovie(this._skeletonName, this._atlasName);\n  }\n\n  override destroy(): void {\n    this.unloadAssets();\n    super.destroy();\n  }\n}\n","import {GameObject} from \"../base/GameObject\";\nimport * as PIXI from \"pixi.js\";\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\nimport {AbstractText} from \"pixi.js/lib/scene/text/AbstractText\";\nimport {StrokeAttributes} from \"pixi.js/lib/scene/graphics/shared/FillTypes\";\n\nexport class LibraryText extends GameObject {\n\n  readonly fontName: string;\n  readonly root: AbstractPixiRoot;\n\n  constructor(root:AbstractPixiRoot, fontName: string) {\n    super();\n    this.root = root;\n    this.fontName = fontName;\n  }\n\n  unloadAssets() {}\n\n  override destroy(): void {\n    this.unloadAssets();\n    super.destroy();\n  }\n\n  createBitmapText(txt: string, maxWidth: number, maxHeight: number, align:PIXI.TextStyleAlign = 'center', fontSize = 75) {\n    const text = new PIXI.BitmapText(txt,{\n      align: align,\n      fontFamily: this.fontName,\n      fontSize: this.root.adapt(fontSize),\n      fill: '#ffffff',\n      wordWrap: true,\n      wordWrapWidth: maxWidth,\n    });\n    this.fitText(text, maxWidth, maxHeight);\n    return text;\n  }\n\n  // dialogTitleText(txt: string, maxWidth: number, maxHeight: number, fontSize = 75) {\n  //   const text = new PIXI.BitmapText(txt,{\n  //     // dropShadow: {\n  //     //   alpha: 1,\n  //     //   color: '#d39836', // Цвет тени,\n  //     //   blur: 0,\n  //     //   angle: -0.5, // Угол тени (45 градусов),\n  //     //   distance: -4\n  //     // },\n  //     // fill: new PIXI.FillGradient({\n  //     //   colorStops: [\n  //     //     {color: '#f8de83', offset: 0},\n  //     //     {color: '#ffffff', offset: 0.7},\n  //     //   ]\n  //     // }),\n  //     align: 'center',\n  //     fontFamily: TextManager.font_dialogTitle,\n  //     fontSize: SandboxPixiRoot.adapt(fontSize),\n  //     fill: '#ffffff',\n  //     wordWrap: true,\n  //     wordWrapWidth: maxWidth,\n  //     // stroke: {\n  //     //   color: '#ffffff',\n  //     //   width: 3,\n  //     //   join: 'round',\n  //     // },\n  //   });\n  //   TextManager.fitText(text, maxWidth, maxHeight);\n  //   return text;\n  // }\n  //\n  // // менять размер только через входной аргумент fontSize !!!\n  // dialogContentText(txt: string, maxWidth: number, maxHeight: number, fontSize = 75) {\n  //   const text =  new PIXI.BitmapText(txt, {\n  //     fill: '#ffffff', // Цвет текста\n  //     align: 'center',\n  //     fontFamily: TextManager.font_main,\n  //     fontSize: SandboxPixiRoot.adapt(fontSize),\n  //     wordWrap: true,\n  //     wordWrapWidth: maxWidth,\n  //     // stroke: {\n  //     //   color: '#8B572A',\n  //     //   // fill: new PIXI.FillGradient({\n  //     //   //   textureSpace: 'local',\n  //     //   //   colorStops: [\n  //     //   //     {color: '#ffffff', offset: 0},\n  //     //   //     {color: AssetsManager.color.main_light, offset: 0.3},\n  //     //   //   ]\n  //     //   // }),\n  //     //   width: Main.adapt(fontSize / 3),\n  //     //   join: 'round',\n  //     // },\n  //   });\n  //   this.fitText(text, maxWidth, maxHeight);\n  //   return text;\n  // }\n\n  private fitText(text:AbstractText, areaWidth:number, areaHeight:number) {\n    const originalStyle = text.style.clone();\n    let fontSize = originalStyle.fontSize || 16; // Начальный размер шрифта\n    let wordWrapWidth = areaWidth; // Начальная ширина переноса\n    // Итеративно уменьшаем размер шрифта, пока текст не впишется в область\n    while (true) {\n      text.style.fontSize = fontSize;\n      let stroke = text.style.stroke as StrokeAttributes;\n      if (stroke) {\n        let newStroke = { ...stroke };\n        newStroke.width = fontSize / 3;\n        text.style.stroke = newStroke;\n      }\n      text.style.wordWrapWidth = wordWrapWidth;\n      // Проверяем размеры текста\n      const bounds = text.getSize();\n      // console.warn(fontSize, bounds, this.areaWidth, this.areaHeight);\n      if (bounds.width <= areaWidth && bounds.height <= areaHeight) {\n        // console.warn('Text fit!');\n        // const quad = ViewUtils.createGreenQuad(bounds.width, bounds.height, 0.5);\n        // quad.position.set(this.position.x, this.position.y);\n        // this.addChild(quad);\n        break; // Текст помещается\n      }\n      fontSize--; // Уменьшаем шрифт\n      if (fontSize < 8) {\n        // console.warn('Text could not fit within the specified area');\n        break;\n      }\n    }\n  }\n\n  // bitmapShadowText(txt: string, fontFamily = TextManager.main, textTint = TextManager.WHITE_COLOR, shadowTint = TextManager.MAIN_TEXT_COLOR, shadowOffset = 2) {\n  // //   const container = new GameView();\n  // //   const text = TextManager.bitmapFont(txt, fontFamily, textTint);\n  // //   const shadow = TextManager.bitmapFont(txt, fontFamily, shadowTint);\n  // //   container.addChild(shadow);\n  // //   shadow.x = -Main.adapt(shadowOffset);\n  // //   shadow.y = Main.adapt(shadowOffset);\n  // //   container.addChild(text);\n  // //   return container;\n  // // }\n}\n","import * as PIXI from 'pixi.js';\nimport {GameView} from \"../base/GameView\";\nimport {Quadtree} from \"./Quadtree\";\nimport {ViewUtils} from \"../utils/ViewUtils\";\n\nexport class GameQuadtreeView extends GameView {\n\n  private _quadtree: Quadtree<PIXI.Container>;\n  private _viewport: PIXI.Rectangle;\n  private _quadChildren: PIXI.Container[];\n  private _childrenPositions: Map<PIXI.Container, number> | null;\n  private _invalidated = false;\n\n  constructor(worldSpace: PIXI.Rectangle, maintainOrder: boolean = false) {\n    super();\n    this._quadtree = new Quadtree<PIXI.Container>(\n      worldSpace.left,\n      worldSpace.top,\n      worldSpace.right,\n      worldSpace.bottom\n    );\n    this._viewport = worldSpace.clone();\n    this._quadChildren = [];\n    this._childrenPositions = maintainOrder ? new Map() : null;\n    this._invalidated = true;\n  }\n\n  override advanceTime(delta:number): void {\n    if (!this._invalidated) {\n      return;\n    }\n\n    this._invalidated = false;\n    this.removeChildren();\n\n    const visibleObjects = this._quadtree.objectsInRectangle(this._viewport);\n\n    // Если нужно сохранить порядок, сортируем видимые объекты\n    if (this._childrenPositions) {\n      visibleObjects.sort((a, b) => {\n        const posA = this._childrenPositions!.get(a) ?? 0;\n        const posB = this._childrenPositions!.get(b) ?? 0;\n        return posA - posB;\n      });\n    }\n\n    for (const visibleObject of visibleObjects) {\n      super.addChildAt(visibleObject, this.children?.length || 0);\n    }\n  }\n\n  public updateChild(child: PIXI.Container): void {\n    this._quadtree.update(child, child.getBounds().rectangle);\n    this._invalidated = true;\n  }\n\n  override addChild<U extends (PIXI.IRenderLayer | PIXI.ContainerChild)[]>(...children: U): U[0] {\n    return this.addChildAt(children[0], this._quadChildren.length);\n  }\n\n  override addChildAt<U extends PIXI.IRenderLayer | PIXI.ContainerChild>(child: U, index: number): U {\n    // Проверяем пересечение с viewport\n    if (child instanceof PIXI.Container) {\n      if (this._viewport.intersects(child.getBounds().rectangle)) {\n        super.addChildAt(child, this.children.length);\n      }\n\n      if (this._childrenPositions) {\n        this._quadChildren.splice(index, 0, child);\n        this.updateChildrenPositions(index);\n      } else {\n        this._quadChildren.push(child);\n      }\n\n      this._quadtree.insert(child, child.getBounds().rectangle);\n      this._invalidated = true;\n    }\n\n    return child;\n  }\n\n  override removeChild<U extends (PIXI.IRenderLayer | PIXI.ContainerChild)[]>(...children: U): U[0] {\n    const child = children[0];\n\n    if(child instanceof PIXI.Container) {\n      const index = this._quadChildren.indexOf(child);\n      if (index >= 0) {\n        this._quadChildren.splice(index, 1);\n      }\n\n      this._quadtree.remove(child);\n\n      if (this._childrenPositions) {\n        this._childrenPositions.delete(child);\n        this.updateChildrenPositions(index);\n      }\n\n      if (this.children.includes(child)) {\n        super.removeChild(child);\n      }\n    }\n\n    return child;\n  }\n\n  public get visibleViewport(): PIXI.Rectangle {\n    return this._viewport;\n  }\n\n  public get quadtree() {\n    return this._quadtree;\n  }\n\n  override get width(): number {\n    return 0;\n  }\n\n  override get height(): number {\n    return 0;\n  }\n\n  public updateViewport(viewport: PIXI.Rectangle, force: boolean = false): void {\n    if (!force && ViewUtils.isEqualRects(viewport, this._viewport)) {\n      return;\n    }\n    this._viewport.copyFrom(viewport);\n    this._invalidated = true;\n  }\n\n  private updateChildrenPositions(startIndex: number): void {\n    if (!this._childrenPositions) return;\n\n    for (let i = startIndex; i < this._quadChildren.length; i++) {\n      const child = this._quadChildren[i];\n      this._childrenPositions.set(child, i);\n    }\n  }\n}\n","import { Point, Rectangle } from 'pixi.js';\nimport { QuadtreeNode } from './QuadtreeNode';\n\nexport class Quadtree<T> {\n\n  private root: QuadtreeNode<T>;\n  private bounds: Rectangle;\n  private minimumBounds: Point;\n  private objectNodeMapping: Map<T, QuadtreeNode<T>>;\n\n  constructor(minX: number, minY: number, maxX: number, maxY: number, minimumSize: number = 100) {\n    this.bounds = new Rectangle(minX, minY, maxX - minX, maxY - minY);\n    this.minimumBounds = new Point(minimumSize, minimumSize);\n    this.root = new QuadtreeNode<T>(this.bounds, this.minimumBounds);\n    this.objectNodeMapping = new Map<T, QuadtreeNode<T>>();\n  }\n\n  public insert(object: T, bounds: Rectangle): boolean {\n    const targetQuadtreeNode = this.root.insert(object, bounds);\n\n    if (targetQuadtreeNode) {\n      this.objectNodeMapping.set(object, targetQuadtreeNode);\n    }\n\n    return targetQuadtreeNode !== null;\n  }\n\n  public nodeForObject(object: T): QuadtreeNode<T> | undefined {\n    return this.objectNodeMapping.get(object);\n  }\n\n  public remove(object: T): boolean {\n    const node = this.objectNodeMapping.get(object);\n\n    if (!node) {\n      return false;\n    }\n\n    node.removeObject(object);\n    this.objectNodeMapping.delete(object);\n\n    return true;\n  }\n\n  public update(object: T, bounds: Rectangle): void {\n    const wasRemoved = this.remove(object);\n    if (!wasRemoved) {\n      throw new Error(\"Can't update object which has not been added to Quadtree.\");\n    }\n    this.insert(object, bounds);\n  }\n\n  public objectsInRectangle(rectangle: Rectangle): T[] {\n    return this.root.objectInBounds(rectangle);\n  }\n\n  public getRoot(): QuadtreeNode<T> {\n    return this.root;\n  }\n}\n","import * as PIXI from 'pixi.js';\n\nclass NodeElement<T> {\n  public object: T;\n  public bounds: PIXI.Rectangle;\n\n  constructor(object: T, bounds: PIXI.Rectangle) {\n    this.object = object;\n    this.bounds = bounds;\n  }\n}\n\nexport class QuadtreeNode<T> {\n  private topRight: QuadtreeNode<T> | null = null;\n  private topLeft: QuadtreeNode<T> | null = null;\n  private bottomRight: QuadtreeNode<T> | null = null;\n  private bottomLeft: QuadtreeNode<T> | null = null;\n\n  private bounds: PIXI.Rectangle;\n  private minimumBounds: PIXI.Point;\n\n  private objectContainer: NodeElement<T>[] = [];\n  private objectsInBounds: T[] = [];\n\n  constructor(bounds: PIXI.Rectangle, minimumBounds: PIXI.Point) {\n    this.bounds = bounds;\n    this.minimumBounds = minimumBounds;\n  }\n\n  public removeObject(object: T): void {\n    for (let i = 0; i < this.objectContainer.length; i++) {\n      const element = this.objectContainer[i];\n      if (element.object === object) {\n        this.objectContainer.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  private objectInBoundsHelper(checkingBounds: PIXI.Rectangle, found: T[]): void {\n    if (!checkingBounds.intersects(this.bounds)) {\n      return; // Границы не пересекаются\n    }\n\n    for (const nodeElement of this.objectContainer) {\n      if (checkingBounds.intersects(nodeElement.bounds)) {\n        found.push(nodeElement.object);\n      }\n    }\n\n    this.topLeft?.objectInBoundsHelper(checkingBounds, found);\n    this.topRight?.objectInBoundsHelper(checkingBounds, found);\n    this.bottomLeft?.objectInBoundsHelper(checkingBounds, found);\n    this.bottomRight?.objectInBoundsHelper(checkingBounds, found);\n  }\n\n  public objectInBounds(checkingBounds: PIXI.Rectangle): T[] {\n    this.objectsInBounds.length = 0;\n    this.objectInBoundsHelper(checkingBounds, this.objectsInBounds);\n    return this.objectsInBounds;\n  }\n\n  public insert(object: T, objectBounds: PIXI.Rectangle): QuadtreeNode<T> | null {\n    if (!this.bounds.intersects(objectBounds)) {\n      return null; // Объект не подходит по границам\n    }\n\n    // console.log(\"insert\");\n\n    const newWidth = this.bounds.width / 2;\n    const newHeight = this.bounds.height / 2;\n\n    if (newHeight < this.minimumBounds.x || newWidth < this.minimumBounds.y) {\n      this.objectContainer.push(new NodeElement(object, objectBounds));\n      return this;\n    }\n\n    let intersectCount = 0;\n    let lastIntersection: PIXI.Rectangle | null = null;\n\n    const subBoundTopLeft = new PIXI.Rectangle(this.bounds.x, this.bounds.y, newWidth, newHeight);\n    if (subBoundTopLeft.intersects(objectBounds)) {\n      intersectCount++;\n      lastIntersection = subBoundTopLeft;\n    }\n\n    const subBoundTopRight = new PIXI.Rectangle(this.bounds.x + newWidth, this.bounds.y, newWidth, newHeight);\n    if (subBoundTopRight.intersects(objectBounds)) {\n      intersectCount++;\n      lastIntersection = subBoundTopRight;\n    }\n\n    const subBoundBottomLeft = new PIXI.Rectangle(this.bounds.x, this.bounds.y + newHeight, newWidth, newHeight);\n    if (subBoundBottomLeft.intersects(objectBounds)) {\n      intersectCount++;\n      lastIntersection = subBoundBottomLeft;\n    }\n\n    const subBoundBottomRight = new PIXI.Rectangle(this.bounds.x + newWidth, this.bounds.y + newHeight, newWidth, newHeight);\n    if (subBoundBottomRight.intersects(objectBounds)) {\n      intersectCount++;\n      lastIntersection = subBoundBottomRight;\n    }\n\n    if (intersectCount === 1) {\n      if (lastIntersection === subBoundTopLeft) {\n        if (!this.topLeft) {\n          this.topLeft = new QuadtreeNode<T>(lastIntersection, this.minimumBounds);\n        }\n        return this.topLeft.insert(object, objectBounds);\n      }\n      if (lastIntersection === subBoundTopRight) {\n        if (!this.topRight) {\n          this.topRight = new QuadtreeNode<T>(lastIntersection, this.minimumBounds);\n        }\n        return this.topRight.insert(object, objectBounds);\n      }\n      if (lastIntersection === subBoundBottomLeft) {\n        if (!this.bottomLeft) {\n          this.bottomLeft = new QuadtreeNode<T>(lastIntersection, this.minimumBounds);\n        }\n        return this.bottomLeft.insert(object, objectBounds);\n      }\n      if (lastIntersection === subBoundBottomRight) {\n        if (!this.bottomRight) {\n          this.bottomRight = new QuadtreeNode<T>(lastIntersection, this.minimumBounds);\n        }\n        return this.bottomRight.insert(object, objectBounds);\n      }\n    } else if (intersectCount > 1) {\n      this.objectContainer.push(new NodeElement(object, objectBounds));\n      return this;\n    }\n\n    return null;\n  }\n\n  public getObjects(): T[] {\n    return this.objectContainer.map(element => element.object);\n  }\n\n  public getBounds(): PIXI.Rectangle {\n    return this.bounds;\n  }\n}\n","import {\n    Color,\n    Container,\n    DestroyOptions,\n    Graphics,\n    isMobile,\n    NineSliceSprite,\n    Optional,\n    Size,\n    Sprite,\n    Text,\n    TextStyleOptions,\n    Texture,\n    Ticker,\n} from 'pixi.js';\nimport { Signal } from 'typed-signals';\nimport { PixiText, PixiTextClass, PixiTextStyle } from './utils/helpers/text';\nimport { getView } from './utils/helpers/view';\nimport { Padding } from './utils/HelpTypes';\nimport {AbstractPixiRoot} from \"../AbstractPixiRoot\";\n\ntype ViewType = Sprite | Graphics | Texture | string;\n\nexport type InputOptions = {\n    bg: ViewType;\n    textStyle: PixiTextStyle;\n    TextClass: PixiTextClass;\n    placeholder: string;\n    value: string;\n    maxLength: number;\n    secure: boolean;\n    align: 'left' | 'center' | 'right';\n    padding: Padding;\n    cleanOnFocus: boolean;\n    nineSliceSprite: [number, number, number, number];\n    addMask: boolean;\n};\n\nconst SECURE_CHARACTER = '*';\n\n/**\n * Container-based component that creates an input to read the user's text.\n * @example\n * new Input({\n *     bg: Sprite.from('input.png'),\n *     placeholder: 'Enter text',\n *     padding: {\n *      top: 11,\n *      right: 11,\n *      bottom: 11,\n *      left: 11\n *     } // alternatively you can use [11, 11, 11, 11] or [11, 11] or just 11\n * });\n */\nexport class Input extends Container\n{\n    protected _bg!: Container | NineSliceSprite | Graphics;\n    protected inputMask?: Container | NineSliceSprite | Graphics;\n    protected _cursor?: Sprite;\n    protected _value: string = '';\n    protected _secure: boolean;\n    protected inputField?: PixiText;\n    protected placeholder?: PixiText;\n    protected editing = false;\n    protected tick = 0;\n    protected lastInputData:string | null = '';\n\n    protected activation = false;\n    protected readonly options: InputOptions;\n    protected input: HTMLInputElement | null = null;\n\n    protected handleActivationBinding = this.handleActivation.bind(this);\n    protected onKeyUpBinding = this.onKeyUp.bind(this);\n    protected stopEditingBinding = this.stopEditing.bind(this);\n    protected onInputBinding = this.onInput.bind(this);\n    protected onPasteBinding = this.onPaste.bind(this);\n\n    /** Fires when input loses focus. */\n    onEnter: Signal<(text: string) => void>;\n\n    /** Fires every time input string is changed. */\n    onChange: Signal<(text: string) => void>;\n\n    /** Top side padding */\n    paddingTop = 0;\n\n    /** Right side padding */\n    paddingRight = 0;\n\n    /** Bottom side padding */\n    paddingBottom = 0;\n\n    /** Left side padding */\n    paddingLeft = 0;\n\n    /**\n     * Creates an input.\n     * @param { number } options - Options object to use.\n     * @param { Sprite | Graphics | Texture | string } options.bg - Background of the Input.\n     * <br> Can be a string (name of texture) or an instance of Texture, Sprite or Graphics.\n     * <br> If you want to use NineSliceSprite, you have to pass a text (name of texture)\n     * or an instance of Texture as a parameter.\n     * @param { PixiTextStyle } options.textStyle - Text style of the Input.\n     * @param { string } options.placeholder - Placeholder of the Input.\n     * @param { string } options.value - Value of the Input.\n     * @param { number } options.maxLength - Max length of the Input.\n     * @param { 'left' | 'center' | 'right' } options.align - Align of the Input.\n     * @param { Padding } options.padding - Padding of the Input.\n     * @param { number } options.padding.top - Top padding of the Input.\n     * @param { number } options.padding.right - Right padding of the Input.\n     * @param { number } options.padding.bottom - Bottom padding of the Input.\n     * @param { number } options.padding.left - Left padding of the Input.\n     * @param { boolean } options.cleanOnFocus - Clean Input on focus.\n     * @param { boolean } options.addMask - Add mask to the Input text, so it is cut off when it does not fit.\n     * @param { Array } options.nineSliceSprite - NineSliceSprite values for bg and fill ([number, number, number, number]).\n     * <br> <b>!!! IMPORTANT:</b> To make it work, you have to pass a texture name or texture instance as a bg parameter.\n     */\n    constructor(options: InputOptions)\n    {\n        super();\n\n        this.options = options;\n\n        this.options = options;\n        this.padding = options.padding;\n        this._secure = options.secure ?? false;\n\n        this.cursor = 'text';\n        this.interactive = true;\n\n        this.on('pointertap', () =>\n        {\n            this.activation = true;\n            isMobile.any && this.handleActivation(); // handleActivation always call before this function called.\n        });\n\n        window.addEventListener(isMobile.any ? 'touchstart' : 'click', this.handleActivationBinding);\n\n        this.onEnter = new Signal();\n        this.onChange = new Signal();\n\n        Ticker.shared.add((ticker) => this.update(ticker.deltaTime));\n\n        if (options.bg)\n        {\n            this.bg = options.bg;\n        }\n        else\n        {\n            console.error('Input: bg is not defined, please define it.');\n        }\n    }\n\n    protected onInput(e: InputEvent)\n    {\n        this.lastInputData = e.data;\n    }\n\n    protected onKeyUp(e: KeyboardEvent)\n    {\n        const key = e.key;\n\n        const keysToSkip = ['Shift', 'Control', 'Alt', 'Meta', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];\n\n        if (keysToSkip.includes(key)) return;\n\n        if (e.metaKey) return;\n        if (e.ctrlKey) return;\n\n        if (key === 'Backspace')\n        {\n            this._delete();\n        }\n        else if (key === 'Escape' || key === 'Enter')\n        {\n            this.stopEditing();\n        }\n        else if (key.length === 1)\n        {\n            this._add(key);\n        }\n        else if (this.lastInputData && this.lastInputData.length === 1)\n        {\n            this._add(this.lastInputData);\n        }\n\n        if (this.input) {\n            this.input.value = '';\n        }\n    }\n\n    protected init()\n    {\n        const options = this.options;\n\n        const defaultTextStyle = {\n            fill: 0x000000,\n            align: 'center',\n        } as TextStyleOptions;\n\n        this.options.textStyle = options.textStyle ?? defaultTextStyle;\n        this.options.TextClass = options.TextClass ?? Text;\n\n        const textStyle = { ...defaultTextStyle, ...options.textStyle };\n        const colorSource = textStyle.fill && Color.isColorLike(textStyle.fill)\n            ? textStyle.fill\n            : 0x000000;\n\n        this.inputField = new this.options.TextClass({\n            text: '',\n            style: textStyle,\n        });\n\n        this._cursor = new Sprite(Texture.WHITE);\n\n        this._cursor.tint = colorSource;\n        this._cursor.anchor.set(0.5);\n        this._cursor.width = 2;\n        this._cursor.height = this.inputField.height * 0.8;\n        this._cursor.alpha = 0;\n\n        this.placeholder = new this.options.TextClass({\n            text: options.placeholder,\n            style: textStyle ?? defaultTextStyle,\n        });\n        this.placeholder.visible = !!options.placeholder;\n\n        this.addChild(this.inputField, this.placeholder, this._cursor);\n\n        this.value = options.value ?? '';\n\n        this.align();\n    }\n\n    set bg(bg: ViewType)\n    {\n        if (this._bg)\n        {\n            this._bg.destroy();\n        }\n\n        if (this.options?.nineSliceSprite)\n        {\n            if (typeof bg === 'string')\n            {\n                this._bg = new NineSliceSprite({\n                    texture: Texture.from(bg),\n                    leftWidth: this.options.nineSliceSprite[0],\n                    topHeight: this.options.nineSliceSprite[1],\n                    rightWidth: this.options.nineSliceSprite[2],\n                    bottomHeight: this.options.nineSliceSprite[3],\n                });\n            }\n            else if (bg instanceof Texture)\n            {\n                this._bg = new NineSliceSprite({\n                    texture: bg,\n                    leftWidth: this.options.nineSliceSprite[0],\n                    topHeight: this.options.nineSliceSprite[1],\n                    rightWidth: this.options.nineSliceSprite[2],\n                    bottomHeight: this.options.nineSliceSprite[3],\n                });\n            }\n            else\n            {\n                console.warn(`NineSliceSprite can not be used with views set as Container.\n                    Pass the texture or texture name as instead of the Container extended instance.`);\n            }\n        }\n\n        if (!this._bg)\n        {\n            this._bg = getView(bg);\n        }\n\n        this._bg.cursor = 'text';\n        this._bg.interactive = true;\n\n        this.addChildAt(this._bg, 0);\n\n        if (!this.inputField)\n        {\n            this.init();\n        }\n\n        if (this.options.addMask)\n        {\n            this.createInputMask(bg);\n        }\n    }\n\n    get bg(): Container | string\n    {\n        return this._bg || '';\n    }\n\n    protected _add(key: string): void\n    {\n        if (!this.editing)\n        {\n            return;\n        }\n\n        if (this.options.maxLength && this.value.length >= this.options.maxLength)\n        {\n            return;\n        }\n\n        this.value = this.value + key;\n\n        this.onChange.emit(this.value);\n    }\n\n    protected _delete(): void\n    {\n        const length = this.value.length;\n\n        if (!this.editing || length === 0) return;\n\n        this.value = this.value.substring(0, length - 1);\n\n        this.onChange.emit(this.value);\n    }\n\n    protected _startEditing(): void\n    {\n        if (this.options.cleanOnFocus)\n        {\n            this.value = '';\n        }\n\n        this.tick = 0;\n        this.editing = true;\n      if (this.placeholder) {\n        this.placeholder.visible = false;\n      }\n      if (this._cursor) {\n        this._cursor.alpha = 1;\n      }\n\n        this.createInputField();\n\n        this.align();\n    }\n\n    protected createInputField()\n    {\n        if (this.input)\n        {\n            this.input.removeEventListener('blur', this.stopEditingBinding);\n            this.input.removeEventListener('keydown', this.onKeyUpBinding);\n            this.input.removeEventListener('input', this.onInputBinding as EventListener);\n            this.input.removeEventListener('paste', this.onPasteBinding);\n\n            this.input?.blur();\n            this.input?.remove();\n            this.input = null;\n        }\n\n        const input: HTMLInputElement = document.createElement('input');\n\n        document.body.appendChild(input);\n\n        input.style.position = 'fixed';\n        input.style.left = `${this.getGlobalPosition().x}px`;\n        input.style.top = `${this.getGlobalPosition().y}px`;\n        input.style.opacity = '0.0000001';\n        // input.style.width = `${Main.adapt(this._bg.width)}px`;\n        // input.style.height = `${Main.adapt(this._bg.height)}px`;\n        input.style.border = 'none';\n        input.style.outline = 'none';\n        input.style.background = 'white';\n\n        // This hack fixes instant hiding keyboard on mobile after showing it\n        if (isMobile.android.device)\n        {\n            setTimeout(() =>\n            {\n                input.focus();\n                input.click();\n            }, 100);\n        }\n        else\n        {\n            input.focus();\n            input.click();\n        }\n\n        input.addEventListener('blur', this.stopEditingBinding);\n        input.addEventListener('keydown', this.onKeyUpBinding);\n        input.addEventListener('input', this.onInputBinding as EventListener);\n        input.addEventListener('paste', this.onPasteBinding);\n\n        this.input = input;\n\n        this.align();\n    }\n\n    protected handleActivation()\n    {\n        if (this.editing) return;\n\n        this.stopEditing();\n\n        if (this.activation)\n        {\n            this._startEditing();\n\n            this.activation = false;\n        }\n    }\n\n    protected stopEditing(): void\n    {\n        if (!this.editing) return;\n\n      if (this._cursor) {\n        this._cursor.alpha = 0;\n      }\n        this.editing = false;\n\n        if (this.inputField?.text === '')\n        {\n          if(this.placeholder)\n            this.placeholder.visible = true;\n        }\n\n        if (this.value.length === 0) {\n          if(this.placeholder)\n            this.placeholder.visible = true;\n        }\n\n        this.input?.blur();\n        this.input?.remove();\n        this.input = null;\n\n        this.align();\n\n        this.onEnter.emit(this.value);\n    }\n\n    protected update(dt: number): void\n    {\n        if (!this.editing) return;\n        this.tick += dt * 0.1;\n        if(this._cursor)\n          this._cursor.alpha = Math.round((Math.sin(this.tick) * 0.5) + 0.5);\n    }\n\n    protected align()\n    {\n        if (!this._bg) return;\n\n        const align = this.getAlign();\n\n      if (this.inputField) {\n        this.inputField.anchor.set(align, 0.5);\n        this.inputField.x\n          = (this._bg.width * align) + (align === 1 ? -this.paddingRight : this.paddingLeft);\n        this.inputField.y = (this._bg.height / 2) + this.paddingTop - this.paddingBottom;\n      }\n\n      if (this.placeholder) {\n        this.placeholder.anchor.set(align, 0.5);\n        this.placeholder.x\n          = (this._bg.width * align) + (align === 1 ? -this.paddingRight : this.paddingLeft);\n        this.placeholder.y = this._bg.height / 2;\n      }\n\n      if (this._cursor) {\n        this._cursor.x = this.getCursorPosX();\n        this._cursor.y = this.inputField!.y;\n      }\n\n    }\n\n    protected getAlign(): 0 | 1 | 0.5\n    {\n        const maxWidth = this._bg.width * 0.95;\n        const paddings = this.paddingLeft + this.paddingRight - 10;\n        const isOverflowed = this.inputField!.width + paddings > maxWidth;\n\n        if (isOverflowed)\n        {\n            return this.editing ? 1 : 0;\n        }\n        switch (this.options.align)\n        {\n            case 'left':\n                return 0;\n            case 'center':\n                return 0.5;\n            case 'right':\n                return 1;\n            default:\n                return 0;\n        }\n    }\n\n    protected getCursorPosX()\n    {\n        const align = this.getAlign();\n\n        switch (align)\n        {\n            case 0:\n                return this.inputField!.x + this.inputField!.width;\n            case 0.5:\n                return this.inputField!.x + (this.inputField!.width * 0.5);\n            case 1:\n                return this.inputField!.x;\n            default:\n                return 0;\n        }\n    }\n\n    /** Sets the input text. */\n    set value(text: string)\n    {\n        const textLength = text.length;\n\n        this._value = text;\n        this.inputField!.text = this.secure ? SECURE_CHARACTER.repeat(textLength) : text;\n\n        if (textLength !== 0)\n        {\n          if(this.placeholder)\n            this.placeholder.visible = false;\n        }\n        else\n        {\n          if(this.placeholder)\n            this.placeholder.visible = !this.editing;\n        }\n\n        this.align();\n    }\n\n    /** Return text of the input. */\n    get value(): string\n    {\n        return this._value;\n    }\n\n    set secure(val: boolean)\n    {\n        this._secure = val;\n\n        // Update text based on secure state (useful for show/hide password implementations)\n        this.value = this._value;\n    }\n\n    get secure(): boolean\n    {\n        return this._secure;\n    }\n\n    /**\n     * Set paddings\n     * @param value - number, array of 4 numbers or object with keys: top, right, bottom, left\n     * or: [top, right, bottom, left]\n     * or: [top&bottom, right&left]\n     * or: {\n     *  left: 10,\n     *  right: 10,\n     *  top: 10,\n     *  bottom: 10,\n     * }\n     */\n    set padding(value: Padding)\n    {\n        if (typeof value === 'number')\n        {\n            this.paddingTop = value;\n            this.paddingRight = value;\n            this.paddingBottom = value;\n            this.paddingLeft = value;\n        }\n\n        if (Array.isArray(value))\n        {\n            this.paddingTop = value[0] ?? 0;\n            this.paddingRight = value[1] ?? value[0] ?? 0;\n            this.paddingBottom = value[2] ?? value[0] ?? 0;\n            this.paddingLeft = value[3] ?? value[1] ?? value[0] ?? 0;\n        }\n        else if (typeof value === 'object')\n        {\n            this.paddingTop = value.top ?? 0;\n            this.paddingRight = value.right ?? 0;\n            this.paddingBottom = value.bottom ?? 0;\n            this.paddingLeft = value.left ?? 0;\n        }\n    }\n\n    // Return array of paddings [top, right, bottom, left]\n    get padding(): [number, number, number, number]\n    {\n        return [this.paddingTop, this.paddingRight, this.paddingBottom, this.paddingLeft];\n    }\n\n    override destroy(options?: DestroyOptions | boolean)\n    {\n        this.off('pointertap');\n\n        window.removeEventListener(isMobile.any ? 'touchstart' : 'click', this.handleActivationBinding);\n\n        super.destroy(options);\n    }\n\n    /**\n     * Sets width of a Input.\n     * If nineSliceSprite is set, then width will be set to nineSliceSprite.\n     * If nineSliceSprite is not set, then width will control components width as Container.\n     * @param width - Width value.\n     */\n    override set width(width: number)\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.width = width;\n            }\n\n            this.updateInputMaskSize();\n\n            this.align();\n        }\n        else\n        {\n            super.width = width;\n        }\n    }\n\n    /** Gets width of Input. */\n    override get width(): number\n    {\n        return super.width;\n    }\n\n    /**\n     * Sets height of a Input.\n     * If nineSliceSprite is set, then height will be set to nineSliceSprite.\n     * If nineSliceSprite is not set, then height will control components height as Container.\n     * @param height - Height value.\n     */\n    override set height(height: number)\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.height = height;\n            }\n\n            this.updateInputMaskSize();\n\n            this.align();\n        }\n        else\n        {\n            super.height = height;\n        }\n    }\n\n    /** Gets height of Input. */\n    override get height(): number\n    {\n        return super.height;\n    }\n\n    override setSize(value: number | Optional<Size, 'height'>, height?: number): void\n    {\n        if (this.options?.nineSliceSprite)\n        {\n            if (this._bg)\n            {\n                this._bg.setSize(value, height);\n            }\n\n            this.updateInputMaskSize();\n            this.align();\n        }\n        else\n        {\n            super.setSize(value, height);\n        }\n    }\n\n    protected createInputMask(bg: ViewType)\n    {\n        if (this.inputMask)\n        {\n            this.inputField!.mask = null;\n            this._cursor!.mask = null;\n            this.inputMask.destroy();\n        }\n\n        if (this.options?.nineSliceSprite && typeof bg === 'string')\n        {\n            this.inputMask = new NineSliceSprite({\n                texture: Texture.from(bg),\n                leftWidth: this.options.nineSliceSprite[0],\n                topHeight: this.options.nineSliceSprite[1],\n                rightWidth: this.options.nineSliceSprite[2],\n                bottomHeight: this.options.nineSliceSprite[3],\n            });\n        }\n        else if (bg instanceof Sprite)\n        {\n            this.inputMask = new Sprite(bg.texture);\n        }\n        else if (bg instanceof Graphics)\n        {\n            this.inputMask = bg.clone(true);\n        }\n        else\n        {\n            this.inputMask = getView(bg);\n        }\n\n        this.inputField!.mask = this.inputMask;\n\n        this._cursor!.mask = this.inputMask;\n\n        this.updateInputMaskSize();\n\n        this.addChildAt(this.inputMask, 0);\n    }\n\n    protected updateInputMaskSize()\n    {\n        if (!this.inputMask || !this._bg) return;\n\n        this.inputMask.setSize(\n            this._bg.width - this.paddingLeft - this.paddingRight,\n            this._bg.height - this.paddingTop - this.paddingBottom,\n        );\n\n        this.inputMask.position.set(this.paddingLeft, this.paddingTop);\n    }\n\n    protected onPaste(e: any) {\n        e.preventDefault();\n\n        const text = (e.clipboardData || (window as any).clipboardData).getData(\"text\");\n\n        if (!text) return;\n\n        this._add(text);\n    }\n}\n","import { Container, Graphics, Sprite, Texture } from 'pixi.js';\n\nexport type GetViewSettings = string | Texture | Container | Sprite | Graphics;\n\nexport function getView(view: GetViewSettings): Container | Sprite | Graphics\n{\n    if (typeof view === 'string')\n    {\n        return Sprite.from(view);\n    }\n\n    if (view instanceof Texture)\n    {\n        return new Sprite(view);\n    }\n\n    return view;\n}\n","import { Container, ContainerChild } from 'pixi.js';\n\nexport type ListType = 'horizontal' | 'vertical';\n\nexport type ListOptions<C extends ContainerChild = ContainerChild> = {\n    elementsMargin?: number;\n    children?: C[];\n    padding?: number;\n    vertPadding?: number;\n    horPadding?: number;\n    topPadding?: number;\n    bottomPadding?: number;\n    leftPadding?: number;\n    rightPadding?: number;\n    items?: C[];\n};\n\n/**\n * Container-based component for arranging Pixi containers one after another based on their sizes.\n *\n * Type option is used to set the direction of the arrangement.\n *\n * If type is not specified, it will be acting like a bidirectional, items will be arranged to fit horizontally,\n * after there is no space left, new line will be started, so items will be arranged like `inline-block` in css.\n *\n * It is used inside elements with repeatable content, like {@link Select} or {@link ScrollBox}.\n * @example\n * const list = new List({\n *    children: [\n        new Graphics().rect(0, 0, 50, 50).fill(0x000000),\n        new Graphics().rect(0, 0, 50, 50).fill(0xFFFFFF),\n *    ],\n * });\n *\n * list.addChild(new Graphics().rect(0, 0, 50, 50)).fill(0x000000);\n */\nexport class List<C extends ContainerChild = ContainerChild> extends Container<C>\n{\n    protected options?: { type?: ListType } & ListOptions<C>;\n\n    /** Container, that holds all inner elements. */\n    view!: Container;\n\n    /** Arrange direction. */\n    protected _type!: ListType;\n\n    /** Returns all arranged elements. */\n    override readonly children: C[] = [];\n\n    constructor(options?: { type?: ListType } & ListOptions<C>)\n    {\n        super();\n\n        if (options)\n        {\n            this.init(options);\n        }\n\n        options?.items?.forEach((item) => this.addChild(item));\n\n        this.on('added', () => this.arrangeChildren());\n        this.on('childAdded', () => this.arrangeChildren());\n    }\n\n  /**\n     * Initiates list component.\n     * @param options\n     */\n    init(options?: { type?: ListType } & ListOptions<C>)\n    {\n        this.options = options;\n\n        if (options?.type)\n        {\n            this.type = options.type;\n        }\n\n        if (options?.children)\n        {\n            options.children.forEach((child) => this.addChild(child));\n        }\n    }\n\n    /**\n     * Set items arrange direction.\n     * @param type - Arrange direction.\n     */\n    set type(type: ListType)\n    {\n        this._type = type;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get items arrange direction.\n     * @returns Arrange direction.\n     */\n    get type(): ListType\n    {\n        return this._type;\n    }\n\n    /**\n     * Set element margin.\n     * @param margin - Margin between elements.\n     */\n    set elementsMargin(margin: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.elementsMargin = margin;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get element margin.\n     * @returns Margin between elements.\n     */\n    get elementsMargin(): number\n    {\n        return this.options?.elementsMargin ?? 0;\n    }\n\n    /**\n     * Set padding, overriding all padding options.\n     * @param padding - Padding surrounding list elements and its border.\n     */\n    set padding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.padding = padding;\n        this.options.vertPadding = padding;\n        this.options.horPadding = padding;\n        this.options.leftPadding = padding;\n        this.options.rightPadding = padding;\n        this.options.topPadding = padding;\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get padding.\n     * @returns Padding surrounding list elements and its border.\n     */\n    get padding(): number\n    {\n        return this.options?.padding ?? 0;\n    }\n\n    /**\n     * Set vertical padding, overriding all top and bottom padding options.\n     * @param padding - Vertical padding between list border and its elements.\n     */\n    set vertPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.vertPadding = padding;\n        this.options.topPadding = padding;\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get vertical padding.\n     * @returns Vertical padding between list border and its elements.\n     */\n    get vertPadding(): number\n    {\n        return this.options?.vertPadding ?? this.padding ?? 0;\n    }\n\n    /**\n     * Set horizontal padding, overriding all left and right padding options.\n     * @param padding - Horizontal padding between list border and its elements.\n     */\n    set horPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.horPadding = padding;\n        this.options.leftPadding = padding;\n        this.options.rightPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get horizontal padding.\n     * @returns Horizontal padding between list border and its elements.\n     */\n    get horPadding(): number\n    {\n        return this.options?.horPadding ?? this.padding ?? 0;\n    }\n\n    /**\n     * Set left padding.\n     * @param padding - Left padding between list border and its elements.\n     */\n    set leftPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.leftPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get left padding.\n     * @returns Left padding between list border and its elements.\n     */\n    get leftPadding(): number\n    {\n        return this.options?.leftPadding ?? this.horPadding;\n    }\n\n    /**\n     * Set right padding.\n     * @param padding - Right padding between list border and its elements.\n     */\n    set rightPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.rightPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get right padding.\n     * @returns Right padding between list border and its elements.\n     */\n    get rightPadding(): number\n    {\n        return this.options?.rightPadding ?? this.horPadding;\n    }\n\n    /**\n     * Set top padding.\n     * @param padding - Top padding between list border and its elements.\n     */\n    set topPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.topPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get top padding.\n     * @returns Top padding between list border and its elements.\n     */\n    get topPadding(): number\n    {\n        return this.options?.topPadding ?? this.vertPadding;\n    }\n\n    /**\n     * Set bottom padding.\n     * @param padding - Bottom padding between list border and its elements.\n     */\n    set bottomPadding(padding: number)\n    {\n        if (!this.options) throw new Error('List has not been initiated!');\n        this.options.bottomPadding = padding;\n        this.arrangeChildren();\n    }\n\n    /**\n     * Get bottom padding.\n     * @returns Bottom padding between list border and its elements.\n     */\n    get bottomPadding(): number\n    {\n        return this.options?.bottomPadding ?? this.vertPadding;\n    }\n\n    /**\n     * Arrange all elements basing in their sizes and component options.\n     * Can be arranged vertically, horizontally or bidirectional.\n     */\n    public arrangeChildren()\n    {\n        let maxHeight = 0;\n        let x = this.leftPadding;\n        let y = this.topPadding;\n\n        const elementsMargin = this.options?.elementsMargin ?? 0;\n        let maxWidth = this.parent?.width;\n\n        if (this.rightPadding)\n        {\n            maxWidth -= this.rightPadding;\n        }\n\n        this.children.forEach((child, id) =>\n        {\n            switch (this.type)\n            {\n                case 'vertical':\n                    child.y = y;\n                    child.x = x;\n\n                    y += elementsMargin + child.height;\n                    break;\n\n                case 'horizontal':\n                    child.x = x;\n                    child.y = y;\n\n                    x += elementsMargin + child.width;\n                    break;\n\n                default: // bidirectional\n                    child.x = x;\n                    child.y = y;\n\n                    if (child.x + child.width > maxWidth && id > 0)\n                    {\n                        y += elementsMargin + maxHeight;\n                        x = this.leftPadding;\n\n                        child.x = x;\n                        child.y = y;\n                        maxHeight = 0;\n                    }\n\n                    maxHeight = Math.max(maxHeight, child.height);\n                    x += elementsMargin + child.width;\n                    break;\n            }\n        });\n    }\n\n    /**\n     * Removes items from the list. (Does not destroy them)\n     * @param itemID - Item to remove (starting from 0).\n     */\n    removeItem(itemID: number)\n    {\n        const child = this.children[itemID];\n\n        if (!child)\n        {\n            return;\n        }\n\n        this.removeChild(child);\n        this.arrangeChildren();\n    }\n}\n","import {\n    ColorSource,\n    Container,\n    DestroyOptions,\n    EventMode,\n    FederatedPointerEvent,\n    Graphics,\n    isMobile,\n    Optional,\n    Point,\n    PointData,\n    Size,\n    Ticker,\n} from 'pixi.js';\nimport {Signal} from 'typed-signals';\nimport type {ListOptions, ListType} from './List';\nimport {List} from './List';\nimport {Trackpad} from './utils/trackpad/Trackpad';\n\nexport type ScrollBoxOptions = {\n    width: number;\n    height: number;\n    background?: ColorSource;\n    type?: ListType;\n    radius: number;\n    disableDynamicRendering?: boolean;\n    disableEasing?: boolean;\n  disableDragOutOfBounce?: boolean;\n    dragTrashHold?: number;\n    globalScroll?: boolean;\n    shiftScroll?: boolean;\n    proximityRange?: number;\n    proximityDebounce?: number;\n    disableProximityCheck?: boolean;\n} & Omit<ListOptions, 'children'>;\n\ntype ProximityEventData = {\n    item: Container;\n    index: number;\n    inRange: boolean;\n};\n\n/**\n * Scrollable view, for arranging lists of Pixi container-based elements.\n *\n * Items, that are out of the visible area, are not rendered by default.\n * This behavior can be changed by setting 'disableDynamicRendering' option to true.\n * @example\n * new ScrollBox({\n *     background: 0XFFFFFF,\n *     width: 200,\n *     height: 300,\n *     items: [\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *         new Graphics().drawRect(0, 0, 200, 50).fill(0x000000),\n *     ],\n * });\n */\n\nexport class ScrollBox extends Container\n{\n    protected background!: Graphics;\n    protected borderMask!: Graphics;\n    protected lastWidth!: number;\n    protected lastHeight!: number;\n    protected __width = 0;\n    protected __height = 0;\n    protected _dimensionChanged = false;\n\n    protected list!: List;\n\n    protected _trackpad!: Trackpad;\n    public get trackpad(): Trackpad {\n      return this._trackpad;\n    }\n\n    protected isDragging = 0;\n    protected interactiveStorage: {\n        item: Container;\n        eventMode?: EventMode;\n    }[] = [];\n    protected visibleItems: Container[] = [];\n    protected pressedChild: Container | null = null;\n    protected ticker = Ticker.shared;\n    protected options!: ScrollBoxOptions;\n    protected stopRenderHiddenItemsTimeout?: any;\n    protected onMouseScrollBinding = this.onMouseScroll.bind(this);\n    protected dragStarTouchPoint!: Point;\n    protected isOver = false;\n\n    protected proximityRange!: number;\n    protected proximityStatusCache: boolean[] = [];\n    protected lastScrollX!: number | null;\n    protected lastScrollY!: number | null;\n    protected proximityCheckFrameCounter = 0;\n    public onProximityChange = new Signal<(data: ProximityEventData) => void>();\n    public onScroll: Signal<(value: number) => void> = new Signal();\n\n    /**\n     * @param options\n     * @param {number} options.background - background color of the ScrollBox.\n     * @param {number} options.width - width of the ScrollBox.\n     * @param {number} options.height - height of the ScrollBox.\n     * @param {number} options.radius - radius of the ScrollBox and its masks corners.\n     * @param {number} options.elementsMargin - margin between elements.\n     * @param {number} options.vertPadding - vertical padding of the ScrollBox.\n     * @param {number} options.horPadding - horizontal padding of the ScrollBox.\n     * @param {number} options.padding - padding of the ScrollBox (same horizontal and vertical).\n     * @param {boolean} options.disableDynamicRendering - disables dynamic rendering of the ScrollBox,\n     * so even elements the are not visible will be rendered. Be careful with this options as it can impact performance.\n     * @param {boolean} [options.globalScroll=true] - if true, the ScrollBox will scroll even if the mouse is not over it.\n     * @param {boolean} [options.shiftScroll=false] - if true, the ScrollBox will only scroll horizontally if the shift key\n     * is pressed, and the type is set to 'horizontal'.\n     */\n    constructor(options?: ScrollBoxOptions)\n    {\n        super();\n\n        if (options)\n        {\n            this.init(options);\n        }\n\n        this.ticker.add(this.update, this);\n    }\n\n    /**\n     * Initiates ScrollBox.\n     * @param options\n     * @param {number} options.background - background color of the ScrollBox.\n     * @param {number} options.width - width of the ScrollBox.\n     * @param {number} options.height - height of the ScrollBox.\n     * @param {number} options.radius - radius of the ScrollBox and its masks corners.\n     * @param {number} options.elementsMargin - margin between elements.\n     * @param {number} options.vertPadding - vertical padding of the ScrollBox.\n     * @param {number} options.horPadding - horizontal padding of the ScrollBox.\n     * @param {number} options.padding - padding of the ScrollBox (same horizontal and vertical).\n     * @param {boolean} options.disableDynamicRendering - disables dynamic rendering of the ScrollBox,\n     * so even elements the are not visible will be rendered. Be careful with this options as it can impact performance.\n     * @param {boolean} [options.globalScroll=true] - if true, the ScrollBox will scroll even if the mouse is not over it.\n     * @param {boolean} [options.shiftScroll=false] - if true, the ScrollBox will only scroll horizontally if the shift key\n     */\n    init(options: ScrollBoxOptions)\n    {\n        this.options = options;\n        this.setBackground(options.background);\n\n        this.__width = options.width | this.background.width;\n        this.__height = options.height | this.background.height;\n\n        this.proximityRange = options.proximityRange ?? 0;\n\n        if (!this.list)\n        {\n            this.list = new List();\n\n            super.addChild(this.list);\n        }\n\n        this.list.init({\n            type: options.type,\n            elementsMargin: options.elementsMargin,\n            padding: options.padding,\n            vertPadding: options.vertPadding,\n            horPadding: options.horPadding,\n            topPadding: options.topPadding,\n            bottomPadding: options.bottomPadding,\n            leftPadding: options.leftPadding,\n            rightPadding: options.rightPadding,\n        });\n\n        this.addItems(options.items || []);\n\n        if (this.hasBounds)\n        {\n            this.addMask();\n            this.makeScrollable();\n        }\n\n        this._trackpad.xAxis.value = 0;\n        this._trackpad.yAxis.value = 0;\n\n        this.options.globalScroll = options.globalScroll ?? true;\n        this.options.shiftScroll = options.shiftScroll ?? false;\n        this.resize();\n    }\n\n    protected get hasBounds(): boolean\n    {\n        return !!this.__width || !!this.__height;\n    }\n\n    /**\n     *  Adds array of items to a scrollable list.\n     * @param {Container[]} items - items to add.\n     */\n    addItems(items: Container[])\n    {\n        if (!items?.length) return;\n\n        items.forEach((item) => this.addItem(item));\n    }\n\n    /** Remove all items from a scrollable list. */\n    removeItems()\n    {\n        this.proximityStatusCache.length = 0;\n        this.list.removeChildren();\n    }\n\n    /**\n     * Adds one or more items to a scrollable list.\n     * @param {Container} items - one or more items to add.\n     */\n    addItem<T extends Container[]>(...items: T): T[0]\n    {\n        if (items.length > 1)\n        {\n            items.forEach((item) => this.addItem(item));\n        }\n        else\n        {\n            const child = items[0];\n\n            if (!child.width || !child.height)\n            {\n                console.error('ScrollBox item should have size');\n            }\n\n            child.eventMode = 'static';\n\n            this.list.addChild(child);\n            this.proximityStatusCache.push(false);\n\n            if (!this.options.disableDynamicRendering)\n            {\n                child.renderable = this.isItemVisible(child);\n            }\n        }\n\n        this.resize();\n\n        return items[0];\n    }\n\n    /**\n     * Removes an item from a scrollable list.\n     * @param {number} itemID - id of the item to remove.\n     */\n    removeItem(itemID: number)\n    {\n        this.list.removeItem(itemID);\n        this.proximityStatusCache.splice(itemID, 1);\n        this.resize();\n    }\n\n    /**\n     * Checks if the item is visible or scrolled out of the visible part of the view.* Adds an item to a scrollable list.\n     * @param {Container} item - item to check.\n     * @param padding - proximity padding to consider the item visible.\n     */\n    isItemVisible(item: Container, padding = 0): boolean\n    {\n        const isVertical = this.options.type === 'vertical' || !this.options.type;\n        let isVisible = false;\n        const list = this.list;\n\n        if (isVertical)\n        {\n            const posY = item.y + list.y;\n\n            if (posY + item.height >= -padding && posY <= this.options.height + padding)\n            {\n                isVisible = true;\n            }\n        }\n        else\n        {\n            const posX = item.x + list.x;\n\n            if (posX + item.width >= -padding && posX <= this.options.width + padding)\n            {\n                isVisible = true;\n            }\n        }\n\n        return isVisible;\n    }\n\n    /**\n     * Returns all inner items in a list.\n     * @returns {Array<Container> | Array} - list of items.\n     */\n    get items(): Container[] | []\n    {\n        return this.list?.children ?? [];\n    }\n\n    /**\n     * Set ScrollBox background.\n     * @param {number | string} background - background color or texture.\n     */\n    setBackground(background?: ColorSource)\n    {\n        if (this.background)\n        {\n            this.removeChild(this.background);\n        }\n\n        this.options.background = background;\n\n        this.background = new Graphics();\n\n        this.addChildAt(this.background, 0);\n\n        this.resize();\n    }\n\n    protected addMask()\n    {\n        if (!this.borderMask)\n        {\n            this.borderMask = new Graphics();\n            super.addChild(this.borderMask);\n            this.mask = this.borderMask;\n        }\n\n        this.resize();\n    }\n\n    protected makeScrollable()\n    {\n        if (!this._trackpad)\n        {\n            this._trackpad = new Trackpad({\n                disableEasing: this.options.disableEasing,\n              disableDragOutOfBounce: this.options.disableDragOutOfBounce,\n            });\n        }\n\n        this.on('pointerdown', (e: FederatedPointerEvent) =>\n        {\n            this.renderAllItems();\n\n            this.isDragging = 1;\n            this.dragStarTouchPoint = this.worldTransform.applyInverse(e.global);\n\n            this._trackpad.pointerDown(this.dragStarTouchPoint);\n\n            const listTouchPoint = this.list.worldTransform.applyInverse(e.global);\n\n            this.visibleItems.forEach((item) =>\n            {\n                if (\n                    item.x < listTouchPoint.x\n                    && item.x + item.width > listTouchPoint.x\n                    && item.y < listTouchPoint.y\n                    && item.y + item.height > listTouchPoint.y\n                )\n                {\n                    this.pressedChild = item;\n                }\n            });\n        });\n\n        this.on('pointerup', () =>\n        {\n            this.isDragging = 0;\n            this._trackpad.pointerUp();\n            this.restoreItemsInteractivity();\n\n            this.pressedChild = null;\n\n            this.stopRenderHiddenItems();\n        });\n\n        this.on('pointerover', () =>\n        {\n            this.isOver = true;\n        });\n\n        this.on('pointerout', () =>\n        {\n            this.isOver = false;\n        });\n\n        this.on('pointerupoutside', () =>\n        {\n            this.isDragging = 0;\n            this._trackpad.pointerUp();\n            this.restoreItemsInteractivity();\n\n            this.pressedChild = null;\n\n            this.stopRenderHiddenItems();\n        });\n\n        this.on('globalpointermove', (e: FederatedPointerEvent) =>\n        {\n            if (!this.isDragging) return;\n\n            const isVertical: boolean = this.options.type !== 'horizontal';\n            const touchPoint = this.worldTransform.applyInverse(e.global);\n\n            if (this.dragStarTouchPoint)\n            {\n                const dragTrashHold = this.options.dragTrashHold ?? 10;\n\n                if (this.options.type === 'horizontal')\n                {\n                    const xDist = touchPoint.x - this.dragStarTouchPoint.x;\n\n                    if (Math.abs(xDist) > dragTrashHold)\n                    {\n                        this.isDragging = 2;\n                    }\n                }\n                else\n                {\n                    const yDist = touchPoint.y - this.dragStarTouchPoint.y;\n\n                    if (Math.abs(yDist) > dragTrashHold)\n                    {\n                        this.isDragging = 2;\n                    }\n                }\n            }\n\n            if (this.dragStarTouchPoint && this.isDragging !== 2) return;\n\n            this._trackpad.pointerMove(touchPoint);\n\n            if (this.pressedChild)\n            {\n                this.revertClick(this.pressedChild);\n                this.pressedChild = null;\n            }\n\n            this.onScroll?.emit(isVertical ? this.scrollY : this.scrollX);\n        });\n\n        document.addEventListener('wheel', this.onMouseScrollBinding, true);\n    }\n\n    protected setInteractive(interactive: boolean)\n    {\n        this.eventMode = interactive ? 'static' : 'auto';\n    }\n\n    protected get listHeight(): number\n    {\n        return this.list.height + this.list.topPadding + this.list.bottomPadding;\n    }\n\n    protected get listWidth(): number\n    {\n        return this.list.width + this.list.leftPadding + this.list.rightPadding;\n    }\n\n    /**\n     * Controls item positions and visibility.\n     * @param force\n     */\n    resize(force = false): void\n    {\n        if (!this.hasBounds) return;\n\n        this.renderAllItems();\n\n        if (\n            this.borderMask\n            && (force\n                || this._dimensionChanged\n                || this.lastWidth !== this.listWidth\n                || this.lastHeight !== this.listHeight)\n        )\n        {\n            if (!this.options.width)\n            {\n                this.__width += this.listWidth;\n            }\n\n            if (!this.options.height)\n            {\n                this.__height += this.listHeight;\n            }\n\n            this.borderMask\n                .clear()\n                .roundRect(0, 0, this.__width, this.__height, this.options!.radius | 0)\n                .fill(0xff00ff)\n                .stroke(0x0);\n            this.borderMask.eventMode = 'none';\n\n            const color = this.options.background;\n\n            this.background\n                .clear()\n                .roundRect(0, 0, this.__width, this.__height, this.options.radius | 0)\n                .fill({\n                    color: color ?? 0x000000,\n                    alpha: color ? 1 : 0.0000001, // if color is not set, set alpha to 0 to be able to drag by click on bg\n                });\n\n            if (this.options.type === 'horizontal')\n            {\n                this.setInteractive(this.listWidth > this.__width);\n            }\n            else\n            {\n                this.setInteractive(this.listHeight > this.__height);\n            }\n\n            this.lastWidth = this.listWidth;\n            this.lastHeight = this.listHeight;\n        }\n\n        if (this._trackpad)\n        {\n            const maxWidth\n                = this.borderMask.width\n                - this.list.width\n                - this.list.leftPadding\n                - this.list.rightPadding;\n\n            const maxHeight\n                = this.borderMask.height\n                - this.list.height\n                - this.list.topPadding\n                - this.list.bottomPadding;\n\n            if (this.options.type === 'vertical')\n            {\n                this._trackpad.yAxis.max = -Math.abs(maxHeight);\n            }\n            else if (this.options.type === 'horizontal')\n            {\n                this._trackpad.xAxis.max = -Math.abs(maxWidth);\n            }\n            else\n            {\n                this._trackpad.yAxis.max = -Math.abs(maxHeight);\n                this._trackpad.xAxis.max = -Math.abs(maxWidth);\n            }\n        }\n\n        if (this._dimensionChanged)\n        {\n            this.list.arrangeChildren();\n\n            // Since the scrolling adjustment can happen due to the resize,\n            // we shouldn't update the visible items immediately.\n            this.stopRenderHiddenItems();\n\n            this._dimensionChanged = false;\n        }\n        else this.updateVisibleItems();\n\n        this.lastScrollX = null;\n        this.lastScrollY = null;\n    }\n\n    protected onMouseScroll(event: WheelEvent): void\n    {\n        if (!this.isOver && !this.options.globalScroll) return;\n\n        this.renderAllItems();\n\n        const scrollOnX = this.options.shiftScroll\n            ? typeof event.deltaX !== 'undefined' || typeof event.deltaY !== 'undefined'\n            : typeof event.deltaX !== 'undefined';\n\n        if (this.options.type === 'horizontal' && scrollOnX)\n        {\n            const delta = this.options.shiftScroll ? event.deltaX : event.deltaY;\n            const targetPos = this.list.x - delta;\n\n            if (this.listWidth < this.__width)\n            {\n                this._trackpad.xAxis.value = 0;\n            }\n            else\n            {\n                const min = this.__width - this.listWidth;\n                const max = 0;\n\n                this._trackpad.xAxis.value = Math.min(max, Math.max(min, targetPos));\n            }\n\n            this.onScroll?.emit(this._trackpad.xAxis.value);\n        }\n        else if (typeof event.deltaY !== 'undefined')\n        {\n            const targetPos = this.list.y - event.deltaY;\n\n            if (this.listHeight < this.__height)\n            {\n                this._trackpad.yAxis.value = 0;\n            }\n            else\n            {\n                const min = this.__height - this.listHeight;\n                const max = 0;\n\n                this._trackpad.yAxis.value = Math.min(max, Math.max(min, targetPos));\n            }\n\n            this.onScroll?.emit(this._trackpad.yAxis.value);\n        }\n\n        this.stopRenderHiddenItems();\n    }\n\n    /** Makes it scroll down to the last element. */\n    scrollBottom()\n    {\n        if (!this.interactive)\n        {\n            this.scrollTop();\n        }\n        else\n        {\n            this.scrollTo(this.list.children.length - 1);\n        }\n    }\n\n    /** Makes it scroll up to the first element. */\n    scrollTop()\n    {\n        this.renderAllItems();\n\n        this._trackpad.xAxis.value = 0;\n        this._trackpad.yAxis.value = 0;\n\n        this.stopRenderHiddenItems();\n    }\n\n    protected renderAllItems()\n    {\n        clearTimeout(this.stopRenderHiddenItemsTimeout);\n        this.stopRenderHiddenItemsTimeout = undefined;\n\n        if (this.options.disableDynamicRendering)\n        {\n            return;\n        }\n\n        this.items.forEach((child) =>\n        {\n            child.renderable = true;\n        });\n    }\n\n    protected stopRenderHiddenItems()\n    {\n        if (this.options.disableDynamicRendering)\n        {\n            return;\n        }\n\n        if (this.stopRenderHiddenItemsTimeout)\n        {\n            clearTimeout(this.stopRenderHiddenItemsTimeout);\n            this.stopRenderHiddenItemsTimeout = undefined;\n        }\n\n        this.stopRenderHiddenItemsTimeout = setTimeout(() => this.updateVisibleItems(), 2000);\n    }\n\n    protected updateVisibleItems()\n    {\n        this.visibleItems.length = 0;\n\n        this.items.forEach((child) =>\n        {\n            child.renderable = this.isItemVisible(child);\n            this.visibleItems.push(child);\n        });\n    }\n\n    /**\n     * Scrolls to the element with the given ID.\n     * @param elementID\n     */\n    scrollTo(elementID: number)\n    {\n        if (!this.interactive)\n        {\n            return;\n        }\n\n        const target = this.list.children[elementID];\n\n        if (!target)\n        {\n            return;\n        }\n\n        this.renderAllItems();\n\n        this._trackpad.xAxis.value\n            = this.options.type === 'horizontal'\n                ? this.__width - target.x - target.width - this.list.rightPadding\n                : 0;\n\n        this._trackpad.yAxis.value\n            = !this.options.type || this.options.type === 'vertical'\n                ? this.__height - target.y - target.height - this.list.bottomPadding\n                : 0;\n\n        this.stopRenderHiddenItems();\n    }\n\n    /**\n     * Scrolls to the given position.\n     * @param position - x and y position object.\n     * @param position.x - x position.\n     * @param position.y - y position.\n     */\n    scrollToPosition({ x, y }: Partial<PointData>)\n    {\n        if (x === undefined && y === undefined) return;\n        this.renderAllItems();\n        if (x !== undefined) this.scrollX = -x;\n        if (y !== undefined) this.scrollY = -y;\n        this.stopRenderHiddenItems();\n    }\n\n    /** Gets component height. */\n    override get height(): number\n    {\n        return this.__height;\n    }\n\n    override set height(value: number)\n    {\n        this.__height = value;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    /** Gets component width. */\n    override get width(): number\n    {\n        return this.__width;\n    }\n\n    override set width(value: number)\n    {\n        this.__width = value;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    override setSize(value: number | Optional<Size, 'height'>, height?: number): void\n    {\n        if (typeof value === 'object')\n        {\n            height = value.height ?? value.width;\n            value = value.width;\n        }\n        else\n        {\n            height = height ?? value;\n        }\n\n        this.__width = value;\n        this.__height = height;\n        this._dimensionChanged = true;\n        this.resize();\n        this.scrollTop();\n    }\n\n    override getSize(out?: Size): Size\n    {\n        out = out || { width: 0, height: 0 };\n        out.width = this.__width;\n        out.height = this.__height;\n\n        return out;\n    }\n\n    /** Gets the current raw scroll position on the x-axis (Negated Value). */\n    get scrollX(): number\n    {\n        return this._trackpad.xAxis.value;\n    }\n\n    /** Sets the current raw scroll position on the x-axis (Negated Value). */\n    set scrollX(value: number)\n    {\n        this._trackpad.xAxis.value = value;\n    }\n\n    /** Gets the current raw scroll position on the y-axis (Negated Value). */\n    get scrollY(): number\n    {\n        return this._trackpad.yAxis.value;\n    }\n\n    /** Sets the current raw scroll position on the y-axis (Negated Value). */\n    set scrollY(value: number)\n    {\n        this._trackpad.yAxis.value = value;\n    }\n\n    protected update()\n    {\n        if (!this.list) return;\n\n        this._trackpad.update();\n\n        const type = this.options.type === 'horizontal' ? 'x' : 'y';\n\n        if (this.list[type] !== this._trackpad[type])\n        {\n            this.list[type] = this._trackpad[type];\n        }\n\n        if (\n            !this.options.disableProximityCheck\n            && (this._trackpad.x !== this.lastScrollX || this._trackpad.y !== this.lastScrollY)\n        )\n        {\n            this.proximityCheckFrameCounter++;\n            if (this.proximityCheckFrameCounter >= (this.options.proximityDebounce ?? 10))\n            {\n                this.items.forEach((item, index) =>\n                {\n                    const inRange = this.isItemVisible(item, this.proximityRange);\n                    const wasInRange = this.proximityStatusCache[index];\n\n                    if (inRange !== wasInRange)\n                    {\n                        this.proximityStatusCache[index] = inRange;\n                        this.onProximityChange.emit({ item, index, inRange });\n                    }\n                });\n                this.lastScrollX = this._trackpad.x;\n                this.lastScrollY = this._trackpad.y;\n                this.proximityCheckFrameCounter = 0;\n            }\n        }\n    }\n\n    /**\n     * Destroys the component.\n     * @param {boolean | DestroyOptions} [options] - Options parameter.\n     * A boolean will act as if all options have been set to that value\n     */\n    override destroy(options?: DestroyOptions | boolean)\n    {\n        this.ticker.remove(this.update, this);\n\n        document.removeEventListener('wheel', this.onMouseScrollBinding, true);\n\n        this.background.destroy();\n        this.list.destroy();\n\n        super.destroy(options);\n    }\n\n    protected restoreItemsInteractivity()\n    {\n        this.interactiveStorage.forEach((element) =>\n        {\n            element.item.eventMode = element.eventMode;\n        });\n\n        this.interactiveStorage.length = 0;\n    }\n\n    protected revertClick(item: Container)\n    {\n        if (item.eventMode !== 'auto')\n        {\n            // @ts-ignore\n          isMobile.any ? item.emit('pointerupoutside', null) : item.emit('mouseupoutside', null);\n\n            this.interactiveStorage.push({\n                item,\n                eventMode: item.eventMode,\n            });\n\n            item.eventMode = 'auto';\n        }\n\n        // need to disable click for all children too\n        if (item instanceof Container && item.children)\n        {\n            item.children.forEach((child) => this.revertClick(child));\n        }\n    }\n\n    get scrollHeight(): number\n    {\n        return this.list.height;\n    }\n\n    get scrollWidth(): number\n    {\n        return this.list.width;\n    }\n}\n","import { Point, Rectangle } from 'pixi.js';\nimport { ConstrainEase, SlidingNumber } from './SlidingNumber';\n\ninterface TrackpadOptions\n{\n    /** override the easing function when constraining */\n    xEase?: ConstrainEase;\n    yEase?: ConstrainEase;\n\n    maxSpeed?: number;\n    constrain?: boolean;\n\n    disableEasing?: boolean;\n\n    disableDragOutOfBounce?: boolean;\n}\n\n/** Easing controller for the {@link ScrollBox}. */\nexport class Trackpad\n{\n    xAxis: SlidingNumber;\n    yAxis: SlidingNumber;\n\n    protected _isDown = false;\n    protected _globalPosition: Point;\n    protected _frame: Rectangle;\n    protected _bounds: Rectangle;\n    protected _dirty = false;\n    protected disableEasing = false;\n\n    constructor(options: TrackpadOptions)\n    {\n        this.xAxis = new SlidingNumber({\n            ease: options.xEase,\n            maxSpeed: options.maxSpeed,\n            constrain: options.constrain,\n          disableDragOutOfBounce: options.disableDragOutOfBounce,\n\n        });\n\n        this.yAxis = new SlidingNumber({\n            ease: options.yEase,\n            maxSpeed: options.maxSpeed,\n            constrain: options.constrain,\n          disableDragOutOfBounce: options.disableDragOutOfBounce,\n        });\n\n        this.disableEasing = options.disableEasing ?? false;\n\n        this._frame = new Rectangle();\n\n        this._bounds = new Rectangle();\n        this._globalPosition = new Point();\n    }\n\n    pointerDown(pos: Point): void\n    {\n        this._globalPosition = pos;\n        this.xAxis.grab(pos.x);\n        this.yAxis.grab(pos.y);\n        this._isDown = true;\n    }\n\n    pointerUp(): void\n    {\n        this._isDown = false;\n    }\n\n    pointerMove(pos: Point): void\n    {\n        this._globalPosition = pos;\n    }\n\n    update(): void\n    {\n        if (this._dirty)\n        {\n            this._dirty = false;\n\n            this.xAxis.min = this._bounds.left;\n            this.xAxis.min = this._bounds.right - this._frame.width;\n\n            this.xAxis.min = this._bounds.top;\n            this.xAxis.min = this._bounds.bottom - this._frame.height;\n        }\n\n        if (this._isDown)\n        {\n            this.xAxis.hold(this._globalPosition.x);\n            this.yAxis.hold(this._globalPosition.y);\n        }\n        else\n        {\n            this.xAxis.slide(this.disableEasing);\n            this.yAxis.slide(this.disableEasing);\n        }\n    }\n\n    resize(w: number, h: number): void\n    {\n        this._frame.x = 0;\n        this._frame.width = w;\n\n        this._frame.y = 0;\n        this._frame.height = h;\n\n        this._dirty = true;\n    }\n\n    setBounds(minX: number, maxX: number, minY: number, maxY: number): void\n    {\n        this._bounds.x = minX;\n        this._bounds.width = maxX - minX;\n        this._bounds.y = minY;\n        this._bounds.height = maxY - minY;\n\n        this._dirty = true;\n    }\n\n    get x(): number\n    {\n        return this.xAxis.value;\n    }\n\n    get y(): number\n    {\n        return this.yAxis.value;\n    }\n}\n","export interface SpringOptions\n{\n    max: number;\n    damp: number;\n    springiness: number;\n}\n\nexport class Spring\n{\n    x: number;\n    ax: number;\n    dx: number;\n    tx: number;\n\n    protected _options: SpringOptions;\n\n    constructor(options: SpringOptions = {max: 160, damp: 0.8, springiness: 0.1})\n    {\n        this.x = 0;\n        this.ax = 0;\n        this.dx = 0;\n        this.tx = 0;\n\n        // add opts to object for shared opts.\n        this._options = options;\n        this._options.max = options.max;\n        this._options.damp = options.damp;\n        this._options.springiness = options.springiness;\n    }\n\n    update(): void\n    {\n        this.ax = (this.tx - this.x) * this._options.springiness;\n\n        this.dx += this.ax;\n        this.dx *= this._options.damp;\n\n        if (this.dx < -this._options.max) this.dx = -this._options.max;\n        else if (this.dx > this._options.max) this.dx = this._options.max;\n\n        this.x += this.dx;\n    }\n\n    reset(): void\n    {\n        this.x = 0;\n        this.ax = 0;\n        this.dx = 0;\n        this.tx = 0;\n    }\n\n    get max(): number\n    {\n        return this._options.max;\n    }\n\n    set max(value: number)\n    {\n        this._options.max = value;\n    }\n\n    get damp(): number\n    {\n        return this._options.damp;\n    }\n\n    set damp(value: number)\n    {\n        this._options.damp = value;\n    }\n\n    get springiness(): number\n    {\n        return this._options.springiness;\n    }\n\n    set springiness(value: number)\n    {\n        this._options.springiness = value;\n    }\n}\n","import { Spring } from './Spring';\n\nexport default class ScrollSpring\n{\n    done = false;\n    to: number;\n\n    protected _spring: Spring;\n    protected _pos: number;\n    protected _speed = 0;\n    protected _correctSpeed = false;\n\n    constructor()\n    {\n        this._spring = new Spring();\n        this._pos = 0;\n        this.to = 0;\n    }\n\n    start(speed: number, pos: number, to: number): void\n    {\n        this._speed = speed;\n        this._pos = pos;\n        this.to = to;\n        this.done = false;\n\n        this._spring.x = this._pos;\n        this._spring.tx = this.to;\n\n        const diff = this.to - this._pos;\n        const toDirection = Math.abs(diff) / diff;\n        const currentDirection = Math.abs(this._speed) / this._speed;\n\n        if (toDirection !== currentDirection)\n        {\n            this._correctSpeed = true;\n        }\n        else\n        {\n            this._correctSpeed = false;\n        }\n    }\n\n    update(): number\n    {\n        if (this._correctSpeed)\n        {\n            this._speed *= 0.6;\n\n            if (Math.abs(this._speed) < 2)\n            {\n                this._correctSpeed = false;\n            }\n\n            this._pos += this._speed;\n\n            this._spring.x = this._pos;\n        }\n        else\n        {\n            const diff = this.to - this._pos;\n\n            if (Math.abs(diff) < 0.05)\n            {\n                this._pos = this.to;\n                this.done = true;\n            }\n            else\n            {\n                this._spring.tx = this.to;\n                this._spring.update();\n                this._pos = this._spring.x;\n            }\n        }\n\n        return this._pos;\n    }\n\n    cancel(): void\n    {\n        // matches jux interface\n    }\n}\n","import ScrollSpring from './ScrollSpring';\n\nexport interface SlidingNumberOptions {\n  constrain?: boolean;\n  maxSpeed?: number;\n  ease?: ConstrainEase;\n\n  disableDragOutOfBounce?: boolean;\n}\n\nexport interface ConstrainEase {\n  done: boolean;\n  to: number;\n\n  start(speed: number, pos: number, to: number): void;\n\n  update(): number;\n}\n\nexport class SlidingNumber {\n  position = 0;\n  constrain = true;\n  min = 0; // the window width of the drag\n  max = 0; // the window width of the drag\n  maxSpeed = 400;\n  disableDragOutOfBounce = false;\n\n  protected _ease: ConstrainEase;\n\n  protected _offset = 0;\n  protected _prev = 0;\n  protected _speed = 0;\n  protected _hasStopped = false;\n\n  protected _targetSpeed = 0;\n  protected _speedChecker = 0;\n  protected _grab = 0;\n  protected _activeEase: ConstrainEase | null = null;\n\n  constructor(options: SlidingNumberOptions = {}) {\n    this.constrain = options.constrain ?? true;\n    this.maxSpeed = options.maxSpeed ?? 400;\n    this._ease = options.ease ?? new ScrollSpring();\n    this.disableDragOutOfBounce = options.disableDragOutOfBounce || false;\n  }\n\n  set value(n: number) {\n    this._speed = 0;\n    this.position = n;\n  }\n\n  get value(): number {\n    return this.position;\n  }\n\n  grab(offset: number): void {\n    this._grab = offset;\n    this._offset = this.position - offset;\n    this._speedChecker = 0;\n    this._targetSpeed = this._speed = 0;\n    this._hasStopped = false;\n  }\n\n  hold(newPosition: number): void {\n    this._speedChecker++;\n\n    this.position = newPosition + this._offset;\n\n    if (this._speedChecker > 1) {\n      this._targetSpeed = this.position - this._prev;\n    }\n\n    this._speed += (this._targetSpeed - this._speed) / 2;\n\n    if (this._speed > this.maxSpeed) this._speed = this.maxSpeed;\n    else if (this._speed < -this.maxSpeed) this._speed = -this.maxSpeed;\n\n    this._prev = this.position;\n\n    if (this.constrain) {\n      this._activeEase = null;\n\n      if (this.position > this.min) {\n        if (this.disableDragOutOfBounce) {\n          this.position = this.min;\n        } else {\n          this.position -= (this.position - this.min) / 1.5;\n        }\n      } else if (this.position < this.max) {\n        if (this.disableDragOutOfBounce) {\n          this.position = this.max;\n        } else {\n          this.position += (this.max - this.position) / 1.5;\n        }\n      }\n    }\n  }\n\n  slide(instant = false): void {\n    if (this._hasStopped) return;\n\n    if (this.constrain) {\n      this._updateConstrain(instant);\n    } else {\n      this._updateDefault();\n    }\n  }\n\n  get moveAmount(): number {\n    return -(this.position - this._offset - this._grab);\n  }\n\n  protected _updateDefault(): void {\n    this._speed *= 0.9;\n    this.position += this._speed;\n\n    if ((this._speed < 0 ? this._speed * -1 : this._speed) < 0.01) {\n      this._hasStopped = true;\n    }\n  }\n\n  protected _updateConstrain(instant = false): void {\n    const max: number = this.max;\n\n    if (instant) {\n      if (this.value > 0) {\n        this.value = 0;\n      }\n\n      if (this.value > 0) {\n        this.value = 0;\n      }\n\n      if (this.value < this.max) {\n        this.value = this.max;\n      }\n\n      if (this.value < this.max) {\n        this.value = this.max;\n      }\n    } else if (this.position > this.min || this.position < max || this._activeEase) {\n      if (!this._activeEase) {\n        this._activeEase = this._ease;\n\n        if (this.position > this.min) {\n          this._activeEase.start(this._speed, this.position, this.min);\n        } else {\n          this._activeEase.start(this._speed, this.position, max);\n        }\n      }\n\n      this.position = this._activeEase.update();\n\n      if (this._activeEase.done) {\n        this.position = this._activeEase.to;\n        this._speed = 0;\n        this._activeEase = null;\n      }\n    } else {\n      this._updateDefault();\n    }\n  }\n}\n","import { Container, FederatedPointerEvent, Point } from 'pixi.js';\n\n/** TODO */\nexport interface DragObject extends Container\n{\n    dragData: FederatedPointerEvent;\n    dragging: number;\n    dragPointerStart: Container;\n    dragObjStart: Point;\n    dragGlobalStart: Point;\n}\n\nexport const BUTTON_EVENTS = ['onPress', 'onDown', 'onUp', 'onHover', 'onOut', 'onUpOut'];\n\nexport type ButtonEvent = (typeof BUTTON_EVENTS)[number];\n\nexport type Padding =\n    | number\n    | [number, number]\n    | [number, number, number, number]\n    | {\n        left?: number;\n        right?: number;\n        top?: number;\n        bottom?: number;\n    };\n","import { Container } from 'pixi.js';\n\nexport function cleanup(element: Container)\n{\n    if (!element) return;\n\n    if (element.parent)\n    {\n        element.parent.removeChild(element);\n    }\n\n    element.destroy();\n}\n","import { Container } from 'pixi.js';\n\nexport function fitToView(parent: Container, child: Container, padding = 0, uniformScaling = true)\n{\n    let scaleX = child.scale.x;\n    let scaleY = child.scale.y;\n\n    if (!parent)\n    {\n        throw new Error('Parent is not defined');\n    }\n\n    const maxWidth = parent.width - (padding * 2);\n    const maxHeight = parent.height - (padding * 2);\n\n    const widthOverflow = maxWidth - Math.round(child.width);\n    const heightOverflow = maxHeight - Math.round(child.height);\n\n    if (widthOverflow < 0)\n    {\n        scaleX = maxWidth / (child.width / scaleX);\n    }\n\n    if (heightOverflow < 0)\n    {\n        scaleY = maxHeight / (child.height / scaleY);\n    }\n\n    if (scaleX <= 0 || scaleY <= 0)\n    {\n        child.scale.set(0);\n\n        return;\n    }\n\n    if (uniformScaling || child.scale.x === child.scale.y)\n    {\n        const scale = Math.min(scaleX, scaleY);\n\n        child.scale.set(scale, scale);\n    }\n    else\n    {\n        const ratio = child.scale.x / child.scale.y;\n\n        if (widthOverflow < heightOverflow)\n        {\n            child.scale.set(scaleX, scaleX / ratio);\n        }\n        else\n        {\n            child.scale.set(scaleY * ratio, scaleY);\n        }\n    }\n}\n","import { Container } from 'pixi.js';\n\nexport function centerElement(view: Container, horPos?: number, verPos?: number)\n{\n    const canvas = document.getElementById('storybook-root');\n\n    if (!canvas) {\n        return;\n    }\n\n    if (view.width > 0)\n    {\n        if (horPos === 0)\n        {\n            view.x = 0;\n        }\n        else if (horPos)\n        {\n            view.x = (canvas.offsetWidth * horPos) - (view.width / 2);\n        }\n        else\n        {\n            view.x = (canvas.offsetWidth / 2) - (view.width / 2);\n        }\n    }\n    else\n    {\n        view.x = canvas.offsetWidth / 2;\n    }\n\n    if (view.height > 0)\n    {\n        if (verPos === 0)\n        {\n            view.y = 0;\n        }\n        else if (verPos)\n        {\n            view.y = (canvas.offsetHeight * verPos) - (view.height / 2);\n        }\n        else\n        {\n            view.y = (canvas.offsetHeight / 2) - (view.height / 2);\n        }\n    }\n    else\n    {\n        view.y = canvas.offsetHeight / 2;\n    }\n}\n\nexport function centerView(view: Container)\n{\n    const canvas = document.getElementById('storybook-root');\n    if (canvas) {\n        view.x = canvas.offsetWidth / 2;\n        view.y = canvas.offsetHeight / 2;\n    }\n}\n","import { TextStyleOptions } from 'pixi.js';\n\nexport const defaultTextStyle: TextStyleOptions = {\n    fill: 0xffffff,\n    fontSize: 42,\n    fontWeight: 'bold',\n    dropShadow: {\n        color: 0x000000,\n        alpha: 0.5,\n        distance: 0,\n        blur: 3,\n        angle: 0,\n    },\n};\n","import { AbstractText, AnyTextStyle, AnyTextStyleOptions, Text } from 'pixi.js';\n\nexport type PixiText = AbstractText;\nexport type AnyText = string | number | PixiText;\nexport type PixiTextClass = new ({\n    text,\n    style,\n}: {\n    text: string;\n    style?: PixiTextStyle;\n    [x: string]: any;\n}) => PixiText;\nexport type PixiTextStyle = AnyTextStyle | Partial<AnyTextStyleOptions>;\n\nexport function getTextView(text: AnyText): PixiText\n{\n    if (typeof text === 'string' || typeof text === 'number')\n    {\n        return new Text({ text: String(text) });\n    }\n\n    return text;\n}\n","import {AbstractApp} from \"../app/AbstractApp\";\nimport {DateUtils} from \"../utils/DateUtils\";\n\nexport class ErrorInfo {\n    [key: string]: any;\n\n    isUncaught: true | false = false;\n    listener = '';\n    message = '';\n\n    stackTrace? = '';\n    name? = '';\n    date? = '';\n    deviceModel? = '';\n    deviceName? = '';\n    deviceManufacturer? = '';\n    deviceOSName? = '';\n    deviceOSVersion? = '';\n    deviceOSType? = '';\n}\n\nexport class ErrorManager {\n\n    readonly app: AbstractApp;\n\n    private _isUncaughtErrorOccurred = false;\n    private _onError: ((errorInfo: ErrorInfo) => void) | null = null;\n\n    constructor(app: AbstractApp) {\n        this.app = app;\n    }\n\n    get isUncaughtErrorOccurred() {\n        return this._isUncaughtErrorOccurred;\n    }\n\n    public handleCaughtError(error: any, devMessage = '-') {\n        const errorInfo: ErrorInfo = {\n            isUncaught: false,\n            listener: 'handleCaughtError',\n            message: JSON.stringify(error) + ' DEV MESSAGE: ' + devMessage,\n        };\n        this.addDeviceInfoToReport(errorInfo);\n        // Main.onUncaughtError(); не надо так как ошибка не существенна\n        if (this._onError) {\n            this._onError(errorInfo);\n        }\n    }\n\n    private handleUncaughtError(errorInfo:ErrorInfo) {\n        if (!this._isUncaughtErrorOccurred) {\n            this._isUncaughtErrorOccurred = true;\n            if (this._onError) {\n                this._onError(errorInfo);\n            }\n        }\n    }\n\n    init(onError: (errorInfo: ErrorInfo) => void) {\n        this._onError = onError;\n\n        window.onerror = (message, source, lineno, colno, error) => {\n            const errorInfo: ErrorInfo = {\n                isUncaught: true,\n                listener: 'window.onerror',\n                name: error?.name || '',\n                message: error?.message || message?.toString() || '',\n                stackTrace: error?.stack || '',\n            };\n            this.addDeviceInfoToReport(errorInfo);\n            this.handleUncaughtError(errorInfo);\n            return true; // prevent crash\n        };\n\n        window.onunhandledrejection = ((event) => {\n            const errorInfo: ErrorInfo = {\n                isUncaught: true,\n                listener: 'window.unhandledrejection',\n                name: event.type,\n                message: JSON.stringify(event.reason),\n                stackTrace: '',\n            };\n            this.addDeviceInfoToReport(errorInfo);\n            event.preventDefault(); // prevent crash\n            this.handleUncaughtError(errorInfo);\n        });\n    }\n\n    private addDeviceInfoToReport(data: ErrorInfo): void {\n        if (!data) return;\n        data.date = DateUtils.currentUTCDate.toLocaleDateString();\n        data.deviceModel = this.app.device.deviceModel;\n        data.deviceName = this.app.device.deviceName;\n        data.deviceManufacturer = this.app.device.deviceManufacturer;\n        data.deviceOSName = this.app.device.deviceOSName;\n        data.deviceOSVersion = this.app.device.deviceOSVersion;\n        data.deviceOSType = this.app.device.deviceOperatingSystem;\n    }\n}\n","import { Network } from '@capacitor/network';\nimport {GameDispatcher} from \"../pixi/base/GameDispatcher\";\nimport {PluginListenerHandle} from \"@capacitor/core\";\n\nexport class NetworkManager {\n\n  private _networkChangeEvent: GameDispatcher = new GameDispatcher(this);\n  private networkListener?: PluginListenerHandle;\n\n  constructor() {}\n\n  async init() {}\n\n  async startListening() {\n    if (Network) {\n      // Подписка на изменения состояния сети\n      this.networkListener = await Network.addListener('networkStatusChange', this.networkChangeHandler.bind(this));\n    }\n  }\n\n  stopListening(): void {\n    if (this.networkListener) {\n      // Отписка от изменений состояния сети\n      this.networkListener.remove();\n      this._networkChangeEvent.removeAllListeners();\n    }\n  }\n\n  async isReachable(): Promise<boolean> {\n    // Проверка состояния сети\n    const status = await Network.getStatus();\n    return status.connected;\n  }\n\n  get networkChangeEvent(): GameDispatcher {\n    return this._networkChangeEvent;\n  }\n\n  private networkChangeHandler(status: { connected: boolean }): void {\n    // Диспатчим событие о изменении состояния сети\n    this._networkChangeEvent.dispatch(status.connected);\n  }\n}\n","import {AbstractApp} from \"../app\";\nimport {AbstractPreferencesManager} from \"./AbstractPreferencesManager\";\n\nexport class LocaleManager extends AbstractPreferencesManager {\n\n    static readonly en = 'en'; // English\n    static readonly es = 'es'; // Spanish\n    static readonly fr = 'fr'; // French\n    static readonly de = 'de'; // German\n    static readonly ru = 'ru'; // Russian\n    static readonly uk = 'uk'; // Ukrainian\n    static readonly pl = 'pl'; // Польский\n    static readonly pt = 'pt'; // Португальский\n    // readonly hi = 'hi'; // Hindi\n\n     readonly languagesNames = {\n        [LocaleManager.en]: 'English',\n        [LocaleManager.es]: 'Español',\n        [LocaleManager.fr]: 'Français',\n        [LocaleManager.de]: 'Deutsch',\n        [LocaleManager.ru]: 'Русский',\n        [LocaleManager.uk]: 'Українська',\n        [LocaleManager.pl]: 'Polski',\n        [LocaleManager.pt]: 'Português'\n        // [Locale.hi]: हिन्दी (Hindi, Хинди)\n    };\n\n    readonly app: AbstractApp;\n    readonly needPersistence:boolean;\n    readonly supportedLanguages:string[];\n\n    protected static LANG_CODE_KEY = 'LANG_CODE_KEY';\n    protected _currentLangCode!:string;\n\n    constructor(app: AbstractApp, needPersistence: boolean, supportedLanguages:string[]) {\n        super();\n        this.app = app;\n        this.needPersistence = needPersistence;\n        this.supportedLanguages = supportedLanguages;\n    }\n\n    async init() {\n        if (this.needPersistence) {\n            this._currentLangCode = await this.getValue(LocaleManager.LANG_CODE_KEY) || '';\n        }\n\n        if (!this._currentLangCode) {\n            let deviceLanguageCode = this.app.device.deviceLanguageCode;\n            if (this.supportedLanguages.includes(deviceLanguageCode)) {\n                this._currentLangCode = deviceLanguageCode;\n            } else {\n                this._currentLangCode = LocaleManager.en;\n            }\n\n            if (this.needPersistence) {\n                await this.setValue(LocaleManager.LANG_CODE_KEY, this._currentLangCode);\n            }\n        }\n    }\n\n    getText(localeObject:Record<string, string>, innerTxt:string | null = null, innerTxt2:string | null = null):string {\n        // @ts-ignore\n        let text = localeObject[this._currentLangCode] || localeObject[this.en] || '';\n        if (innerTxt != null) {\n            text = text.split(\"[x]\").join(innerTxt);\n        }\n        if (innerTxt2 != null) {\n            text = text.split(\"[y]\").join(innerTxt2);\n        }\n        return text;\n    }\n\n    getLang(): string {\n        return this._currentLangCode;\n    }\n\n    async setLang(value: string) {\n        if(this._currentLangCode != value && this.supportedLanguages.includes(value)) {\n            this._currentLangCode = value;\n            if (this.needPersistence) {\n                await this.setValue(LocaleManager.LANG_CODE_KEY, value);\n            }\n        }\n    }\n}","import {DeviceManager} from \"../managers/DeviceManager\";\nimport {SoundManager} from \"../managers/SoundManager\";\nimport {ErrorInfo, ErrorManager} from \"../managers/ErrorManager\";\nimport {NetworkManager} from \"../managers/NetworkManager\";\nimport {GameDispatcher} from \"../pixi\";\nimport {LocaleManager} from \"../managers\";\n\nexport abstract class AbstractApp {\n\n    readonly onRouteChange = new GameDispatcher();\n\n    device!: DeviceManager;\n    sound!: SoundManager;\n    error!: ErrorManager;\n    network!: NetworkManager;\n    locale! :LocaleManager;\n\n    private _tasksQueue: (() => void)[] = [];  // Очередь задач\n    private _isAppActive = true;  // Флаг активности приложения\n    private _isExecuting = false;  // Флаг для контроля выполнения\n\n    private _currentRoute:string | null = null;\n    private _currentRouteQuery:Record<string, string> | null = null;\n    private _forceChangeRouteCallback: ((route:string, query: Record<string, string>) => void) | null = null;\n\n    get isDevMode():boolean {\n        throw new Error('Need to be implemented');\n    }\n\n    get currentRoute() {\n        return this._currentRoute;\n    }\n\n    get currentRouteQuery() {\n        return this._currentRouteQuery;\n    }\n\n    set forceChangeRouteCallback(value: ((route: string, query: Record<string, string>) => void) | null) {\n        this._forceChangeRouteCallback = value;\n    }\n\n    onRouteChanged(route:string, query: Record<string, string>){\n        if (route !== this._currentRoute) {\n            this._currentRoute = route;\n            this._currentRouteQuery = query;\n            this.onRouteChange.dispatch();\n        }\n    }\n\n    forceChangeRoute(route:string, query: Record<string, string>) {\n        if (this._forceChangeRouteCallback) {\n            this._forceChangeRouteCallback(route, query);\n        }\n    }\n\n    log(...args: any[]) {\n        if (this.isDevMode) {\n            for (const arg of args) {\n                console.log(arg);\n            }\n            // console.trace('Logged from:');\n        }\n    }\n\n    logError(...args: any[]) {\n        if (this.isDevMode) {\n            for (const arg of args) {\n                console.error(\"ERROR LOG: \" + arg);\n            }\n            console.trace('Logged from:');\n        }\n    }\n\n    async init(managers: {\n        locale?:LocaleManager,\n        error?: ErrorManager,\n        device?: DeviceManager,\n        sound?: SoundManager,\n        network?: NetworkManager,\n    }) {\n        this.error = managers.error || new ErrorManager(this);\n        this.error.init((errorInfo: ErrorInfo)=>{\n            if (errorInfo.isUncaught) {\n                this.logError('ERROR:onUncaughtError: ', JSON.stringify(errorInfo));\n            } else {\n                this.log('ERROR:onCaughtError:', JSON.stringify(errorInfo));\n            }\n            this.onError(errorInfo);\n        });\n\n        this.device = managers.device || new DeviceManager();\n        await this.device.init();\n\n        this.sound = managers.sound || new SoundManager(this, true);\n        await this.sound.init();\n\n        this.network = managers.network || new NetworkManager();\n        await this.network.init();\n\n        this.locale = managers.locale || new LocaleManager(this, true, [LocaleManager.en]);\n        await this.locale.init();\n\n        this.device.onActivateEvent.add(this.onActivate, this);\n        this.device.onDeactivateEvent.add(this.onDeactivate, this);\n    }\n\n    protected onError(errorInfo: ErrorInfo) {\n        // todo\n        // if (errorInfo.isUncaught) {\n        //     // Main.rootNavigator.showDialog(new ErrorDialog(Locale.getText(Locale.app_error), Main.device.forceExit.bind(Main.device)));\n        // }\n        // errorInfo.version = AppConfig.GAME_VERSION;\n        // errorInfo.playerId = Main.user?.userData?.objectId;\n        // errorInfo.screenState = Main.rootNavigator?.currentScreen?.getStateDescription();\n        // Main.server.request(ServerService.FUNCTION_UNCAUGHT_ERROR, error,\n        //     () => {\n        //         // success callback\n        //     },\n        //     (error: ParseRequestError) => {\n        //         // error callback\n        //     }\n        // );\n        // // todo: firebase crashlytics\n    }\n\n    navigateToURL(url: string) {\n        window.open(url, '_system');\n    }\n\n    executeWhenApplicationIsActive(callback: Function): void {\n        // Если приложение активно\n        if (this._isAppActive) {\n            this._tasksQueue.push(() => {\n                if (callback) {\n                    callback();\n                }\n            });\n            // Если в данный момент нет выполняющихся задач, запускаем первую\n            if (!this._isExecuting) {\n                this.processQueue();\n            }\n        } else {\n            // Если приложение не активно, добавляем задачу в очередь\n            this._tasksQueue.push(() => {\n                if (callback) {\n                    callback();\n                }\n            });\n        }\n    }\n\n    private onActivate() {\n        this.log('App.onActivate');\n        this._isAppActive = true;\n        this.processQueue();  // После возобновления нужно продолжить обработку очереди\n        void this.sound.onActivate();\n    }\n\n    private onDeactivate(){\n        this.log('App.onDeactivate');\n        this._isAppActive = false;\n        void this.sound.onDeActivate();\n    }\n\n    private processQueue(): void {\n        if (this._tasksQueue.length > 0) {\n            this._isExecuting = true;\n            // Получаем и выполняем первую задачу в очереди\n            const task = this._tasksQueue.shift();\n            if (task) {\n                requestAnimationFrame(() => {\n                    task();\n                    this._isExecuting = false;\n                    this.processQueue();  // Обрабатываем следующую задачу в очереди\n                });\n            }\n        }\n    }\n\n}"],"mappings":"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","names":["Signal","PIXI","PIXI","PIXI","PIXI","PIXI","ScaleMode","Align","Easing","Easing","PIXI","Rectangle","PIXI","Assets","Texture","PIXI","PIXI","Container","Container","PIXI","Container","Graphics","Container","Graphics","Container","Container","Rectangle","Assets","PIXI","Assets","Texture","PIXI","Point","Rectangle","PIXI","Rectangle","Point","Color","Container","Graphics","Sprite","Text","Texture","Sprite","Texture","Input","Container","defaultTextStyle","Text","Color","Sprite","Texture","Graphics","Container","import_typed_signals","Container","Graphics","isMobile","Ticker","Point","Rectangle","Rectangle","Point","Container","Ticker","Graphics","isMobile","Text"]}